Реалізуйте сильно функцію Дарбу


13

За даними Вікіпедії , сильно функція Дарбу є

той, для якого зображення кожного (не порожнього) відкритого інтервалу є цілою реальною лінією

Іншими словами, функція сильно Дарбу, якщо дано 3 довільні дійсні числа , і , завжди можна знайти між (різними) і такими, що .fabyxabf(x)=y

Для цілей цього виклику ми розглянемо натомість функції Дарбу замість раціональних.

Ваше завдання полягає в тому, щоб написати програму або функцію, яка:

  • дає раціональне число як вихід для кожного введення раціонального числа,
  • завжди дає однаковий вихід для заданого вводу, і
  • має сильно властиві Дарбу.

Вхід і вихід можуть бути будь-якими з таких:

  • тип чисел з довільною точністю, якщо у вашій мові є (або є бібліотека для одного, наприклад, GMP).
  • рядкове подання числа, яке, можливо, ви завжди будете містити з десятковою комою і принаймні одну цифру з обох сторін. Він може бути в будь-якій базі , але вхід і вихід повинні бути в одній базі. Ви можете використовувати будь-який набір символів для цифр і десяткових знаків (але знову ж таки, вони повинні відповідати вводу та виводу).b2

Вхід завжди матиме кінцеве розширення бази . Що стосується виходу, який може мати теоретично неперервне розширення бази залежно від вибору функції, ви можете вибрати будь-яке з наступного:bb

  • вихідні цифри назавжди.
  • візьміть додаткове ціле число як вхід і виведіть принаймні стільки цифр.
  • вивести принаймні стільки цифр, скільки є на вході (який може містити проміжні нулі).

Зауважимо, що за характером цього виклику умова про те, що числа можна вважати представними стандартними типами чисел , не застосовується, за винятком другого вводу, описаного у варіанті 2 вище.

Щоб уникнути лазівки з функціями, визначеними лише на нестаціонарних раціоналах, ваше представлення повинне бути здатне виробляти вихід довільно, близький до потрібного значення на практиці . Формально, з огляду на раціональні числа , , та , у вибраному вами базі повинно бути раціональне число яке закінчується таким, що та .abyεxa<x<b|f(x)y|<ε


Щоб дати вам декілька ідей, ось опис функції Conway base 13 :

  • Перетворіть в базу 13 і видаліть десяткову точку.х
  • Якщо результат має вигляд , де [ y ] і [ z ] складаються лише з цифр від 0 до 9, тоді f ( x ) = [ y ] . [ z ] .[x]А[у]С[z]13[у][z]f(x)=[y].[z]
  • Якщо результат має вигляд [x]B[y]C[z]13 , де [y] і [z] складаються лише з цифр від 0 до 9, тоді f(x)=[y].[z] .
  • В іншому випадку f(x)=0 .

Ця функція сильно Дарбу. Скажімо, наприклад, що ми хочемо знайти деякий х між 123.45613 та 123.45713 таким, що f(x)=7.89 . Базове значення 123.456A7C8913 задовольнило б цю вимогу.

Ваше подання може бути реалізацією цієї функції, хоча я підозрюю, що існують і інші сильні функції Дарбу, які набагато коротше реалізувати. :)


Чи вважається, що числа мають кінцеве розширення бази ? b
Nitrodon

math.stackexchange посилання, а також оригінальне запитання, це придумка для деяких прикладів
Джузеппе

Якщо ми реалізуємо алгоритм Conway base 13, ми могли б взяти дані в базі 13, але тоді також доведеться виводити в базі 13. Оскільки вихід функції зазвичай в десятковій частині, ми закінчимо повторне тризначне число. Як це слід виводити? Чи виводимо перші цифри, де x вказано у запитанні (ще не вказано)? Або нам потрібно вказати, що це повторюється? xx
Нік Кеннеді

@NickKennedy Спасибі, я пропустив це - я відредагував питання, щоб уточнити.
Дверна ручка

1
Хм, я цілком впевнений, що я можу визначити постійну функцію Дарбу, яка є постійною або тотожність на всіх завершених входах ...
Крістіан Сіверс

Відповіді:


4

Сітківка 0,8.2 , 43 50 байт

^.*\.(..)*1(.)((..)+)1.((..)*)$
$2$*-$3.$5
0(.)
$1

Спробуйте в Інтернеті! I / O - це двійковий рядок. Кодуйте двійкове число, yблизьке до іншого двійкового числа, aтаким чином:

  1. Якщо aне містить .суфікса.
  2. Якщо aмістить непарну кількість цифр після .суфікса a 0.
  3. Якщо yнегативний, то суфікс 11інакше суфікс 10.
  4. Для кожної цифри в yсуфіксі, що 0супроводжується цією цифрою.
  5. Якщо в цьому пункті yміститься .суфікс a , 11інакше суфікс - після всіх цифр y.

Пояснення:

^.*\.(..)*1(.)((..)+)1.((..)*)$
$2$*-$3.$5

З'єднайте цифри, починаючи з двійкової точки. Якщо число є допустимим кодуванням, то декодуйте останню 1xпару цифр до a, .а другу останню - за необов'язковим -знаком. Цифри до цього ігноруються.

0(.)
$1

Слід просто залишити пари, які починаються з цього 0, тому видаліть 0s.


Я іноді отримую такі результати, як -.. Вони означають нулі або вони не повинні бути вироблені?
Ерік Аутгольфер

@EriktheOutgolfer Я думаю, я міг би змінити *s на +s, що гарантувало б принаймні одну цифру до і після .?
Ніл

Насправді я не можу гарантувати цифри після .. Я думаю, що все-таки можу гарантувати цифру перед тим, як це зробити ..
Ніл

Додатковий термінал 0 в номері з .не змінює його значення, але така зміна вводу вашої функції змінює вихід. Можливо, вам дозволено це виправити, припускаючи, що вхід не має таких 0. Крім того, якщо ви групуєте пари справа, як це "теоретично працює на будь-який реальний вклад"?
Крістіан Сіверс

@ChristianSievers (Вибачте, що раніше не помічав свою папку "Вхідні") Я відповів своїм описом на описі базової функції 13 у запитанні, яка, мабуть, також вимагає завершення представлення. Також ви маєте рацію, що я припускав, що не буде ніяких задніх нулів. (Отже, цілі числа завжди повинні бути 11додані на кроці 2.)
Ніл

1

Желе , 71 байт

L7*©ṛḅ7WµṪ×⁵d®µ⁴‘¤Ð¡ḊṖ
DF7,8ṣṪ¥ƒṣ9ḅ7×ɗÇƭ€j”,
DFf7r9¤ṫ-Ḍ⁼Ɱ“OY‘TịØ+³çƲ0Ẹ?

Спробуйте в Інтернеті!

Повна програма, яка приймає число базового 10 як вхід і вихід і реалізує функцію Conway base 13, але використовуючи бази 7 і 10, а не 10 і 13. І введення, і вихід використовують коску як десятковий роздільник. Вихід матиме провідне - для від'ємних чисел.


Приклад на посиланні TIO має цифру 9 на вході та виході, то як ці базові 7 числа?
Крістіан Сіверс

@ChristianSievers шкода означала базу 10 для введення та виводу. База 7 використовується в коді, але перетворена на базу 10.
Нік Кеннеді

Чудово, тепер я можу змінити вхід і зрозуміти, як це впливає на вихід!
Крістіан Сіверс

1

Сітківка ,28 25 26 28 байт

.*11|22
.
D^`\.
^3
-
4(.)
$1

Спробуйте в Інтернеті!

Пояснення

.*11|22     Delete up to the last 11 and prepend a dot. Also change 22 to a dot.
.
D^`\.       Keep only the last dot, if there is one.
^3          Change 3 at the beginning to a minus sign.
-
4(.)        4 is the escape character.
$1

Він може виводити провідні та кінцеві нулі та числа без цілої частини.

Це могло б бути в гольфі на 2 або 3 байти більше, якщо я міг би використовувати 4+. Але я не впевнений, як визначити теоретичний результат, якщо вхід має нескінченний потік 4s.


1
Мене прокляла річ у формі Т, розмістивши цю відповідь.
jimmy23013
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.