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
źródło
Odpowiedzi:
JavaScript
117111 bajtówDzięki @theonlygusti za pomoc w golfie przy 5 bajtach
Jak to działa
Po pierwsze, funkcja generuje wszystkie liczby tribonacciego, aż znajdzie jedną większą niż wartość wejściowa
Następnie przeszukuje listę numerów do tyłu. Jeśli liczba jest mniejsza niż wartość wejściowa, dodaje 2 ^ (indeks tej liczby) do wartości zwracanej i zmniejsza dane wejściowe o tę liczbę.
Wreszcie zwraca wynik.
Wypróbuj online
źródło
a[++i]<x
z warunkiem warunku, aby zapisać bajt?x>0
zx
. Zapisz kolejne 2 bajty.Python 2 ,
110102 bajtów-3 bajty dzięki Rod (fajna sztuczka do rzucania wartości logicznej
i
na wartość int za+i
pomocą repr`+i`
działa)Wypróbuj online!
źródło
'01'[i]
z`+i`
i
jest wartością logiczną, a nie int. Edytuj - Ohhh+i
, schludnie.JavaScript (ES6),
9793 bajtówTutaj używamy
reduce()
funkcji rekurencyjnej. Zakładamy, że dane wyjściowe są 31-bitowe (co jest największą niepodpisaną wielkością, z którą JS może z łatwością pracować dla operacji bitowych).Pod względem wydajności wyraźnie nie jest to zbyt wydajne.
Dla ciekawskich:
F()
dla N + 1reduce()
iteracji iteracjami N szybko zbliża się do stałej Tribonacciego (≈ 1,83929). Dlatego każdy dodatkowy bit na wyjściu kosztuje około dwa razy więcej czasu niż poprzedni.F()
funkcja nazywa się dobrą 124 milionami razy.Test
Uwaga: Wykonanie może zająć 1 lub 2 sekundy.
Pokaż fragment kodu
źródło
Mathematica,
7874 bajtówLinearRecurrence[{1,1,1},{1,2,3},#]
generuje listę, o długości równej wejściowej, liczb tribonacci 1-2-3. ({1,1,1}
Przedstawia sumę poprzednich trzech terminów, podczas gdy{1,2,3}
są wartościami początkowymi.) Następnie#~NumberDecompose~
znajduje najbardziej zachłanny sposób, aby zapisać dane wejściowe jako sumę elementów listy (jest to ta sama funkcja, która rozkłada kwotę pieniężną na wielokrotności dostępne waluty, na przykład). Na koniecFold[#+##&,...]
konwertuje wynikową listę binarną na liczbę całkowitą (base-10).Poprzednie zgłoszenie:
Jak to często bywa (choć nie wyżej), ta wersja gry w golfa jest super wolna na wejściach większych niż 20, ponieważ generuje (z niezoptymalizowaną rekurencją) listę plemion, których długość jest wejściowa; zastąpienie finału
#
bardziej rozsądnym ograniczeniemRound[2Log@#+1]
skutkuje znacznie lepszą wydajnością.źródło
123Tribonacci[]
wbudowanego?Haskell, 95 bajtów
Przykład użycia:
f 63
->104
. Wypróbuj online! .Jak to działa:
!
buduje sekwencję 1-2-3-Tribonacci. Biorąc pod uwagę1
,2
a3
jako parametrów startowych, bierzemy pierwszen
elementy sekwencji. Następnie krotnie z prawej funkcji#
, które odejmuje następny elemente
zn
i ustawia bit w wartości zwracanejr
, jeślie
jest potrzebna lub pozwala bitu rozbrojony. Ustawienie bitu podwaja sięr
i dodaje1
, a pozostawienie go rozbrojonego to tylko podwojenie.źródło
Galaretka , 31 bajtów
Wypróbuj online!
Jestem prawie pewien, że istnieje O wiele krótszy sposób na osiągnięcie tego w Jelly.
W jaki sposób?
źródło
Perl 6 ,
9391 bajtów-2 bajty dzięki b2gills
Jak to działa
Najpierw generuje sekwencję 1-2-3-Tribonacciego do pierwszego elementu większego niż wejście:
Na tej podstawie znajduje podzbiór sekwencji, który składa się na dane wejściowe:
Na tej podstawie konstruuje listę wartości logicznych określającą, czy każdy element sekwencji jest częścią sumy:
I na koniec interpretuje tę listę wartości True = 1, False = 0 jako podstawę 2 i zwraca ją jako liczbę (podstawa 10):
źródło
*>$^n
i.sum==$n
. Również przestrzeń nie jest potrzebne międzymy
i@f
JavaScript (ES6),
6160 bajtówOblicza liczby 1-2-3-Tribonacciego, aż osiągnie pierwotną liczbę, a następnie, gdy rekurencja rozwija się, próbuje odjąć każdą z nich kolejno, podwajając wynik w miarę upływu czasu.
Edycja: Zapisano 1 bajt dzięki @Arnauld.
źródło
n=>(g=(x,y,z)=>(n>x&&g(y,z,x+y+z)*2)+!(n<x||![n-=x]))(1,2,3)
zapisać bajt?n<x||
ale![]
to po prostu genialne.Partia,
151148145 bajtówPort mojej odpowiedzi JavaScript. Edycja: Zapisałem 3 bajty, przekazując moje argumenty podprogramu w odwrotnej kolejności, a kolejne 3 bajty, używając poszczególnych
@
s w każdym wierszu zamiast@echo off
.źródło
Galaretka ,
191817 bajtówWypróbuj online!
tło
Zamiast konwertować liczbę całkowitą na bazę 1,2,3-Tribonacciego, a następnie z wartości binarnej na liczbę całkowitą, zrobimy coś odwrotnego: konwertuje liczby całkowite na liczbę binarną, a następnie z wartości 1,2,3-podstawy Trionacciego na liczbę całkowitą, i zwracamy najwyższy, który pasuje do danych wejściowych. Można to łatwo osiągnąć.
Zilustrujemy proces wprowadzania 63 , w szczególności etap, w którym testowany jest 104 . W systemie dwójkowym, od najbardziej znaczącej do najmniej znaczącej cyfry, 104 jest równe
gdzie drugi rząd reprezentuje wartości pozycyjne tych cyfr.
Możemy rozszerzyć sekwencję 1,2,3-Tribonacciego w prawo, zauważając, że dodane cyfry są zgodne z tą samą rekurencyjną formułą. Dla trzech cyfr to daje
Teraz, aby obliczyć wartość podstawowej liczby 1,2,3-Tribonacciego, możemy użyć wzoru rekurencyjnego. Ponieważ każda liczba jest sumą trzech liczb po jej prawej stronie (w powyższej tabeli), możemy usunąć pierwszą cyfrę i dodać ją do pierwszych trzech cyfr pozostałej tablicy. Po 7 krokach, które są równe liczbie cyfr binarnych 104 , rzadko zostawiamy tylko trzy cyfry.
Teraz, ponieważ pierwsza i ostatnia pozostała cyfra mają wartość pozycyjną 0 , wynikiem jest środkowa cyfra, tj . 63 .
Jak to działa
źródło
Galaretka ( widelec ),
1716 bajtówZaoszczędzono 1 bajt dzięki @Dennis, który grał w golfa, nawet go nie uruchamiając.
Opiera się to na rozwidleniu Galaretki, gdzie rozczarowuję, że wciąż pracuję nad wdrożeniem wydajnego atomu rozwiązania Frobeniusa. Dla tych, którzy są zainteresowani, chciałbym dopasować szybkość Mathematiki
FrobeniusSolve
i na szczęście wyjaśnienie ich metody znajduje się w artykule „Dokonywanie zmian i znajdowanie reprodukcji: wyważanie plecaka” Daniela Lichtblau.Wyjaśnienie
źródło
ḣ3S;µ¡¶3RṚdzæFṪḄ
zadziała? Nie mam zainstalowanego widelca, więc nie mogę przetestować.³
odwołuje się do pierwszego argumentu.jelly.py
po ostatnim zatwierdzeniu miałem kilka innych rzeczy.DC ,
110102 bajtówCóż, wydaje się, że wielkie umysły nie myślą podobnie. Najwyraźniej algorytm, który wymyśliłem, aby obejść ograniczenia,
dc
jest dokładnie taki sam, jak ten zastosowany w odpowiedzi @ LliwTelrac. Ciekawy.Wypróbuj online!
źródło
Python 2 , 93 bajty
To jest port mojej odpowiedzi na żelki .
Wypróbuj online!
źródło
narzędzia bash + BSD (OS X itp.), 53 bajty
narzędzia bash + GNU (działa również pod BSD), 59 bajtów
Wejścia i wyjścia w obu powyższych przypadkach są binarne.
Wypróbuj wersję GNU w TIO. (Przykład powiązany z pokazuje 111111, który ma 63 binarnie, i 1101000, który ma 104 binarnie.)
Nie sądzę, że TIO oferuje opcję BSD, ale jeśli masz dostępnego Maca, możesz wypróbować je oba. (Program 59-bajtowy jest znacznie szybszy niż program 53-bajtowy).
Niestety,
seq
nie można go po prostu wrzucić do rozwiązania BSD zamiastjot
, ponieważ format wyjściowy dlaseq
jest różny dla wyjść powyżej 999999. (Zaczyna to stanowić problem dla danych wejściowych około 32, ponieważ 32 ^ 4> 1000000).Możesz zamienić
jot
powyżejseq -f%.f
na, aby to działało z narzędziami GNU, ale dla tych samych 59 bajtów możesz użyć powyższego rozwiązania GNU, które jest znacznie szybsze.źródło