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

13

Согласно Википедии , сильно функция Дарбу

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

Другими словами, функция f строго дарбу, если даны 3 произвольных действительных числа a , b и y , всегда можно найти x между (различными) a и b таким, что f(x)=y .

Для целей этой задачи мы рассмотрим строго функции Дарбу над рациональными числами.

Ваша задача - написать программу или функцию, которая:

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

Вход и выход может быть одним из следующих:

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

Вход всегда будет иметь расширение завершающей базы b . Что касается вывода, которое может иметь теоретически не заканчивающееся расширение базы b зависимости от вашего выбора функции, вы можете выбрать любое из следующего:

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

Обратите внимание, что по природе этой проблемы соглашение о том, что числа могут считаться представимыми стандартными типами чисел , не применяется, за исключением второго ввода, описанного в варианте 2 выше.

Чтобы избежать лазеек с функциями, которые определены только на не заканчивающихся рациональных числах, ваша заявка должна иметь возможность производить выходные данные, сколь угодно близкие к желаемому значению на практике . Формально, учитывая рациональные числа a , b , y и ε , должно быть рациональное число x которое заканчивается в выбранной вами базе так, что a<x<b и |f(x)y|<ε .


Чтобы дать вам некоторые идеи, вот описание функции Conway Base 13 :

  • Переведите x в основание 13 и удалите десятичную точку.
  • Если результат имеет вид [x]A[y]C[z]13 , где [y] и [z] состоят только из цифр от 0 до 9, то f(x)=[y].[z] .
  • [x]B[y]C[z]13[y][z]f(x)=[y].[z]
  • f(x)=0

x123.45613123.45713f(x)=7.89123.456A7C8913

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

Дверная ручка
источник
b
ссылка math.stackexchange, а также оригинальный вопрос, на который это пошло несколько примеров
Джузеппе
xx
@NickKennedy Спасибо, я пропустил это - я отредактировал вопрос, чтобы уточнить.
Ручка двери
1
Хм, я совершенно уверен, что могу точно определить функцию Дарбу, которая является постоянной или тождественной на всех входных терминалах ...
Кристиан Сиверс

Ответы:

4

Сетчатка 0.8.2 , 43 50 байт

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

Попробуйте онлайн! Ввод / вывод в виде двоичной строки. Кодируйте двоичное число yрядом с другим двоичным числом aследующим образом:

  1. Если aне содержит ., суффикс один.
  2. Если aсодержит нечетное число цифр после .суффикса a 0.
  3. Если yотрицательный, то суффикс, 11иначе суффикс 10.
  4. Для каждой цифры в yсуффиксе 0следует эта цифра.
  5. Если yсодержит ., суффикс 11в этой точке, иначе суффикс после всех цифр в y.

Объяснение:

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

Сопряжение цифр начинается с двоичной точки. Если число является допустимой кодировкой, то декодируйте последнюю 1xпару цифр в a, .а вторую последнюю - в необязательный -знак. Цифры до этого игнорируются.

0(.)
$1

Это должно просто оставить пары, которые начинаются с 0, поэтому удалите 0s.

Нил
источник
Я иногда получаю такие результаты, как -.. Означают ли это нули или они не должны быть произведены?
Эрик Outgolfer
@EriktheOutgolfer Я думаю, я мог бы изменить *s на +s, что будет гарантировать, по крайней мере, одну цифру до и после .?
Нил
На самом деле я не могу гарантировать цифры после .. Я думаю, что я все еще могу гарантировать цифру до того, .как.
Нил
Дополнительный терминал 0 в числе с .не меняет своего значения, но такое изменение входа вашей функции изменяет выход. Возможно, вам разрешено это исправить, если предположить, что у input нет таких нулей. Кроме того, если вы группируете пары справа, как это «теоретически работает для любого реального ввода»?
Кристиан Сиверс
@ChristianSievers (извините, я не заметил свой входной почтовый ящик ранее) я основал свой ответ на описании функции base 13 в вопросе, который, по-видимому, также требует завершающего представления. Также вы правы, что я предполагал, что не будет конечных нулей. (Таким образом, целые всегда должны быть 11добавлены в шаге 2.)
Нил
1

Желе , 71 байт

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

Попробуйте онлайн!

Полная программа, которая принимает число базы-10 в качестве входных и выходных данных и реализует функцию базы 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.

jimmy23013
источник
1
Я проклял Т-образную вещь, опубликовав этот ответ.
jimmy23013