Sekwencja Sterna- Brocota jest sekwencją podobną do Fibonnaci, którą można skonstruować w następujący sposób:
- Zainicjuj sekwencję za pomocą
s(1) = s(2) = 1
- Ustaw licznik
n = 1
- Dołącz
s(n) + s(n+1)
do sekwencji - Dołącz
s(n+1)
do sekwencji - Przyrost
n
, wróć do kroku 3
Jest to równoważne z:
Między innymi właściwościami sekwencję Sterna-Brocota można wykorzystać do wygenerowania każdej możliwej dodatniej liczby wymiernej. Każda liczba wymierna zostanie wygenerowana dokładnie raz i zawsze będzie wyświetlana w najprostszych słowach; na przykład 1/3
jest 4 liczba wymierna w sekwencji, ale równoważne numery 2/6
, 3/9
etc nie pojawi się w ogóle.
Możemy zdefiniować n-tą liczbę wymierną jako r(n) = s(n) / s(n+1)
, gdzie s(n)
jest n-ta liczba Sterna-Brocota, jak opisano powyżej.
Wyzwanie polega na napisaniu programu lub funkcji, która wygeneruje n-ty wymierny numer wygenerowany przy użyciu sekwencji Stern-Brocot.
- Algorytmy opisane powyżej mają indeks 1; jeśli twój wpis jest indeksowany jako 0, proszę podać w swojej odpowiedzi
- Opisane algorytmy służą wyłącznie celom ilustracyjnym, dane wyjściowe można uzyskać w dowolny sposób (inny niż kodowanie stałe)
- Dane wejściowe mogą odbywać się za pośrednictwem STDIN, parametrów funkcji lub dowolnego innego uzasadnionego mechanizmu wprowadzania danych
- Ouptut może być do STDOUT, konsoli, zwracanej wartości funkcji lub dowolnego innego rozsądnego strumienia wyjściowego
- Dane wyjściowe muszą być ciągiem znaków w postaci
a/b
, gdziea
ib
są odpowiednimi wpisami w sekwencji Sterna-Brocota. Ocena frakcji przed wyjściem jest niedopuszczalna. Na przykład dla danych wejściowych12
wartość wyjściowa powinna wynosić2/5
, a nie0.4
. - Standardowe luki są niedozwolone
To jest golf golfowy , więc wygra najkrótsza odpowiedź w bajtach.
Przypadki testowe
Przypadki testowe są tutaj indeksowane 1.
n r(n)
-- ------
1 1/1
2 1/2
3 2/1
4 1/3
5 3/2
6 2/3
7 3/1
8 1/4
9 4/3
10 3/5
11 5/2
12 2/5
13 5/3
14 3/4
15 4/1
16 1/5
17 5/4
18 4/7
19 7/3
20 3/8
50 7/12
100 7/19
1000 11/39
Wpis OEIS: A002487
Doskonałe wideo z Numphile omawiające sekwencję: Nieskończone ułamki
True/2
nie jest prawidłową frakcją (o ile mi wiadomo ). Nawiasem mówiąc, True
nie zawsze 1
- niektóre języki używają -1
zamiast tego, aby uniknąć potencjalnych błędów przy stosowaniu operatorów bitowych. [potrzebne źródło]
True
jest równoważne 1
i True/2
byłoby 1/2
.
True
s zamiast1
s?