Zaimplementuj funkcję zdecydowanie Darboux

13

Według Wikipedii silną funkcją Darboux jest

taki, dla którego obraz każdego (niepustego) interwału otwartego jest całą rzeczywistą linią

Innymi słowy, funkcja jest mocno Darboux jeśli podano 3 dowolnych liczb rzeczywistych , i zawsze jest możliwe znalezienie między (odrębny) i tak, że .fabyxabf(x)=y

Na potrzeby tego wyzwania rozważymy zamiast tego funkcje Darboux nad racjonalnymi.

Twoim wyzwaniem jest napisanie programu lub funkcji, która:

  • podaje liczbę wymierną jako wynik dla każdego wejścia liczby wymiernej,
  • zawsze daje to samo wyjście dla danego wejścia, oraz
  • ma silnie właściwość Darboux.

Dane wejściowe i wyjściowe mogą być następujące:

  • typ liczb o dowolnej dokładności, jeśli twój język ma jeden (lub bibliotekę dla jednego, np. GMP).
  • ciąg znaków reprezentujący liczbę, który możesz założyć, zawsze będzie zawierał przecinek dziesiętny i co najmniej jedną cyfrę po każdej stronie. Może być w dowolnej bazie , ale wejście i wyjście musi być w tej samej bazie. Możesz użyć dowolnego zestawu znaków dla cyfr i kropki dziesiętnej (ale znowu, muszą one być spójne między wejściem a wyjściem).b2

Wejście będzie zawsze miało końcową ekspansję bazy . Jeśli chodzi o dane wyjściowe, które mogą mieć teoretycznie niekończące się rozszerzenie bazy zależności od wyboru funkcji, możesz wybrać dowolną z następujących opcji:bb

  • wyprowadzaj cyfry na zawsze.
  • weź dodatkową liczbę całkowitą jako wejście i wyjście co najmniej tyle cyfr.
  • wypisuje co najmniej tyle cyfr, ile jest na wejściu (które mogą zawierać końcowe zera).

Należy zauważyć, że ze względu na charakter tego wyzwania nie ma zastosowania konwencja, że liczby mogą być reprezentowane przez standardowe typy liczb , z wyjątkiem drugiego wejścia opisanego w opcji 2 powyżej.

Aby uniknąć luk w funkcjach, które są zdefiniowane tylko w nieracjonalnych uzasadnieniach, twoje przesłanie musi być w stanie wygenerować wyjście arbitralnie zbliżone do pożądanej wartości w praktyce . Formalnie, biorąc pod uwagę liczby wymiernea , b , y i ε , musi istnieć liczba wymierna x która kończy się w wybranej przez ciebie bazie, tak aby za<x<b i |fa(x)-y|<ε .


Aby dać ci kilka pomysłów, oto opis funkcji Conway base 13 :

  • Konwertuj x na podstawę 13 i usuń przecinek dziesiętny.
  • Jeśli wynik ma postać [x]ZA[y]do[z]13 , gdzie [y] i [z] składają się tylko z cyfr od 0 do 9, to fa(x)=[y].[z] .
  • Jeśli wynik ma postać [x]b[y]do[z]13 , gdzie [y] i [z] składają się tylko z cyfr od 0 do 9, to fa(x)=-[y].[z] .
  • W przeciwnym razie fa(x)=0 .

Ta funkcja jest silnie Darboux. Załóżmy na przykład, że chcemy znaleźć x między 123,45613 i 123,45713 tak, że fa(x)=7,89 . Wartość podstawy 13 123,456ZA7do8913 spełniałaby ten wymóg.

Twoje zgłoszenie może być implementacją tej funkcji, chociaż podejrzewam, że istnieją inne funkcje zdecydowanie Darboux, które są o wiele krótsze do wdrożenia. :)

Klamka
źródło
Czy zakłada się, że liczby mają rozszerzenie końcowe ? b
Nitrodon
math.stackexchange link, a także oryginalne pytanie, które jest duplikatem niektórych przykładów
Giuseppe
Jeśli zaimplementujemy algorytm Conway base 13, moglibyśmy wziąć dane wejściowe do bazy 13, ale wtedy musielibyśmy również dane wyjściowe w bazie 13. Ponieważ dane wyjściowe funkcji są zwykle dziesiętne, otrzymamy powtarzającą się liczbę tridecimal. Jak powinno to być generowane? Czy wypisujemy pierwsze cyfr, gdzie x jest określone w pytaniu (choć jeszcze nie)? Czy też musimy wskazać, że się powtarza? xx
Nick Kennedy
@NickKennedy Dzięki, przeoczyłem to - zredagowałem pytanie, aby wyjaśnić.
Klamka
1
Hmm, jestem całkiem pewien, że potrafię zdefiniować silną funkcję Darboux, która jest stała, lub tożsamość na wszystkich wejściowych danych końcowych ...
Christian Sievers

Odpowiedzi:

4

Retina 0.8.2 , 43 50 bajtów

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

Wypróbuj online! I / O jest jak ciąg binarny. Zakoduj liczbę binarną yblisko innej liczby binarnej aw następujący sposób:

  1. Jeśli anie zawiera ., sufiks jeden.
  2. Jeśli apo paśmie zawiera nieparzystą liczbę cyfr ., sufiks a 0.
  3. Jeśli yjest ujemny, to w 11przeciwnym razie przyrostek 10.
  4. Dla każdej wprowadzonej cyfry ysufiks, 0po którym następuje ta cyfra.
  5. Jeśli yzawiera ., przyrostek 11w tym punkcie, w przeciwnym razie sufiks go po wszystkich cyfr y.

Wyjaśnienie:

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

Sparuj cyfry, zaczynając od punktu binarnego. Jeśli liczba jest prawidłowym kodowaniem, wówczas dekoduj ostatnią 1xparę cyfr na a, .a drugą na -znak opcjonalny . Wcześniejsze cyfry są ignorowane.

0(.)
$1

Powinno to po prostu pozostawić pary zaczynające się od 0, więc usuń 0s.

Neil
źródło
Czasami otrzymuję dane wyjściowe takie jak -.. Czy oznaczają one zera, czy nie powinny być tworzone?
Erik the Outgolfer
@EriktheOutgolfer Chyba mógłbym zmienić *s na +s, co gwarantowałoby co najmniej jedną cyfrę przed i po .?
Neil
Właściwie nie mogę zagwarantować cyfr po .. Myślę jednak, że wciąż mogę zagwarantować cyfrę przedtem ..
Neil
Dodatkowy zacisk 0 w liczbie z .nie zmienia jego wartości, ale taka zmiana wejścia twojej funkcji zmienia wynik. Być może możesz to naprawić, zakładając, że dane wejściowe nie mają takich zer. Ponadto, jeśli pogrupujesz pary od prawej, jak to „teoretycznie działa dla dowolnego rzeczywistego wkładu”?
Christian Sievers
@ChristianSievers (Przepraszam, nie zauważyłem wcześniej mojej skrzynki odbiorczej) Oparłem swoją odpowiedź na opisie funkcji podstawowej 13 w pytaniu, które wydaje się również wymagać przedstawienia końcowego. Masz również rację, że zakładałem, że nie będzie żadnych zer końcowych. (Więc liczby całkowite zawsze muszą być 11dołączane w kroku 2.)
Neil
1

Galaretka , 71 bajtów

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

Wypróbuj online!

Pełny program, który przyjmuje liczbę podstawową 10 jako dane wejściowe i wyjściowe i implementuje funkcję podstawy 13 Conwaya, ale używa zasad 7 i 10 zamiast 10 i 13. Zarówno dane wejściowe, jak i wyjściowe używają przecinka jako separatora dziesiętnego. Wyjście będzie miało wiodące - dla liczb ujemnych.

Nick Kennedy
źródło
Przykład na łączu TIO ma cyfrę 9 na wejściu i wyjściu, więc jak te liczby podstawowe 7?
Christian Sievers
@ChristianSievers przepraszam oznaczało bazę 10 dla wejścia i wyjścia. Baza 7 jest używana w kodzie, ale jest konwertowana z powrotem na bazę 10.
Nick Kennedy
Dobrze, teraz mogę zmienić dane wejściowe i zrozumieć, jak to wpływa na wynik!
Christian Sievers
1

Siatkówka ,28 25 26 28 bajtów

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

Wypróbuj online!

Wyjaśnienie

.*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

Może generować zera wiodące i końcowe oraz liczby bez części całkowitej.

Mogłabym grać w golfa o 2 lub 3 bajty więcej, gdybym mógł użyć 4+. Ale nie jestem pewien, jak zdefiniować wynik teoretyczny, jeśli dane wejściowe mają nieskończony strumień 4s.

jimmy23013
źródło
1
Przeklinając mnie w kształcie litery T, opublikowałem tę odpowiedź.
jimmy23013