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 .
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).
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:
- 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 wymierne , , i , musi istnieć liczba wymierna która kończy się w wybranej przez ciebie bazie, tak aby i .
Aby dać ci kilka pomysłów, oto opis funkcji Conway base 13 :
- Konwertuj na podstawę 13 i usuń przecinek dziesiętny.
- Jeśli wynik ma postać , gdzie i składają się tylko z cyfr od 0 do 9, to .
- Jeśli wynik ma postać , gdzie i składają się tylko z cyfr od 0 do 9, to .
- W przeciwnym razie .
Ta funkcja jest silnie Darboux. Załóżmy na przykład, że chcemy znaleźć między i tak, że . Wartość podstawy 13 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. :)