tło
Sekwencja 1-2-3-Tribonacciego
Wyobraź sobie przez sekundę, że możesz utworzyć sekwencję Fibonacciego, zastępując standardową formułę iteracji następującą:
Zasadniczo zamiast sumować dwa ostatnie, aby uzyskać następne, sumujesz ostatnie trzy. To jest podstawa sekwencji 1-2-3-Tribonacciego.
Kryterium Browna
Kryterium Browna stanowi, że możesz reprezentować dowolną liczbę całkowitą jako sumę elementów sekwencji, pod warunkiem że:
Dla wszystkich
n
większych niż 1
Co to oznacza dla wyzwania
Możesz opisać każdą dodatnią liczbę całkowitą jako sumę elementów sekwencji 1-2-3-Tribonacciego utworzonych przez następujące warunki początkowe:
Jest to znane jako, że dla każdej wartości w tej sekwencji stosunek między wyrazami nigdy nie jest większy niż 2 (stosunek wynosi średnio około 1,839).
Jak pisać w tym systemie reprezentacji numerycznej
Powiedzmy, że używasz reprezentacji little-endian. Ułóż elementy sekwencji w taki sposób:
1 2 3 6 11 20 37 68
Następnie bierzesz swój numer do reprezentacji (w naszych testach, powiedzmy, że to jest 63
) i znajdujesz wartości danych 1-2-3-Tribonacci, które sumują się do 63 (najpierw używając największych wartości!) . Jeśli liczba jest częścią sumy, umieść pod nią 1, 0 jeśli nie.
1 2 3 6 11 20 37 68
0 0 0 1 0 1 1 0
Możesz to zrobić dla dowolnej liczby całkowitej - najpierw sprawdź, czy najpierw używasz największych wartości poniżej podanego wejścia!
Definicja (wreszcie)
Napisz program lub funkcję, która wykona następujące czynności, biorąc pod uwagę pewną dodatnią liczbę całkowitą n
(zapisaną w dowolnej standardowej bazie) między 1 a maksymalną wartością twojego języka:
- Przelicz wartość na zdefiniowaną reprezentację numeryczną 1-2-3-Tribonacciego.
- Używając tej binarnej reprezentacji i czytaj ją tak, jakby była binarna. Oznacza to, że cyfry pozostają takie same, ale co oznaczają zmiany.
- Weź ten numer binarny i przekonwertuj go na bazę pierwotnego numeru.
- Wprowadź lub zwróć ten nowy numer.
Jednak dopóki dane wyjściowe są prawidłowe, nie musisz wykonywać tych kroków. Jeśli magicznie znajdziesz jakąś formułę, która jest krótsza (i matematycznie równoważna), nie krępuj się jej użyć.
Przykłady
Niech funkcja f
będzie funkcją opisaną w definicji i niech []
reprezentuje podjęte kroki (jako little-endian, choć nie powinno to mieć znaczenia) (nie musisz wykonywać tego procesu, to tylko opisany proces):
>>> f(1)
[1]
[1]
[1]
1
>>> f(5)
[5]
[0, 1, 1]
[6]
6
>>> f(63)
[63]
[0, 0, 0, 1, 0, 1, 1]
[104]
104