Sekwencja Sylvester, OEIS A000058 , jest sekwencją całkowitą zdefiniowaną następująco:
Każdy członek jest produktem wszystkich poprzednich członków plus jeden. Pierwszym członkiem sekwencji jest 2.
Zadanie
Utwórz najmniejszy możliwy program, który zajmuje n i oblicza n-ty ciąg Sekwensu Sylwestra. Obowiązują standardowe wejścia, wyjścia i luki. Ponieważ wynik rośnie bardzo szybko, nie należy oczekiwać, że którykolwiek z terminów spowoduje przepełnienie w wybranym języku.
Przypadki testowe
Możesz użyć zerowania lub jednego indeksowania. (Tutaj używam indeksowania zerowego)
>>0
2
>>1
3
>>2
7
>>3
43
>>4
1807
n
zwracanth
numer sekwencji, jest akceptowana?Odpowiedzi:
Brain-Flak ,
7668585246 bajtówWypróbuj online!
Zamiast tego używa tej relacji:
który pochodzi z tej relacji zmodyfikowanej na podstawie tej podanej w sekwencji:
a(n+1) = a(n) * (a(n) - 1) + 1
.Wyjaśnienie
Aby uzyskać dokumentację tego, co robi każde polecenie, odwiedź stronę GitHub .
W Brain-Flak są dwa stosy, które nazywam odpowiednio stosem 1 i stosem 2.
Dane wejściowe są przechowywane w Stosie 1.
Dla algorytmu generowania:
Alternatywna wersja 46-bajtowa
Używa tylko jednego stosu.
Wypróbuj online!
źródło
Galaretka , 5 bajtów
Wykorzystuje to indeksowanie 0 i definicję ze specyfikacji wyzwania.
Wypróbuj online! lub zweryfikuj wszystkie przypadki testowe .
Jak to działa
źródło
Sześciokąt , 27 bajtów
Rozłożony:
Wypróbuj online!
Wyjaśnienie
Rozważmy sekwencję
b(a) = a(n) - 1
i zróbmy małą aranżację:Ta sekwencja jest bardzo podobna, ale możemy odroczyć przyrost do samego końca, co powoduje zapisanie bajtu w tym programie.
Oto kod źródłowy z adnotacjami:
Utworzono za pomocą HexagonyColorer Timwi .
A oto schemat pamięci (czerwony trójkąt pokazuje początkową pozycję i orientację wskaźnika pamięci):
Utworzono za pomocą EsotericIDE firmy Timwi .
Kod zaczyna się na szarej ścieżce, która otacza lewy róg, więc początkowy bit liniowy jest następujący:
Następnie kod uderza w
<
gałąź, która wskazuje początek (i koniec) głównej pętli. Dopóki krawędź N ma wartość dodatnią, zielona ścieżka będzie wykonywana. Ta ścieżka owija się wokół siatki kilka razy, ale w rzeczywistości jest całkowicie liniowa:Nie
.
ma operacji, więc rzeczywisty kod to:Po zmniejszeniu
N
do0
tej wartości wykonywana jest czerwona ścieżka:źródło
J,
181412 bajtówTa wersja dzięki randomra. Później postaram się napisać szczegółowe wyjaśnienie.
J, 14 bajtów
Ta wersja dzięki milom. Użyłem przysłówka mocy
^:
zamiast programu, jak poniżej. Więcej wyjaśnień w przyszłości.J, 18 bajtów
0-indeksowane.
Przykłady
Wyjaśnienie
Oto program, który wygląda następująco:
(Otrzymanej po zastosowaniu
(9!:7)'┌┬┐├┼┤└┴┘│─'
czym5!:4<'e'
)Rozkład:
Używając górnej gałęzi jako gerunda
G
, a dolnej jako selektoraF
, jest to:Wykorzystuje funkcję stałą
2:
kiedy0 = * n
, to znaczy, gdy znak jest równa zero (a więcn
jest zero). W przeciwnym razie korzystamy z tego widelca:Który stanowi jeden plus następująca seria:
Rozkładając się dalej, jest to iloczyn produktu (
*/
) w porównaniu z odniesieniem własnym ($:
) w stosunku do zakresu (i.
).źródło
2(]*:-<:)^:[~]
14 bajtów przy użyciu formułya(0) = 2
ia(n+1) = a(n)^2 - (a(n) - 1)
. Aby obliczyć większe wartości,2
na początku trzeba będzie zaznaczyć jako rozszerzoną liczbę całkowitą.v`$:@.u
formatu rekurencyjnego. Zawsze korzystałem z^:v
formatu, który często jest bardziej złożony. @miles Nigdy też nie użyłem tej(]v)
sztuczki. Zrozumienie tego zajęło mi dobre 5 minut.2(]*:-<:)~&0~]
(lub2:0&(]*:-<:)~]
). I łącząc je 13 bajtów]0&(]*:-<:)2:
.0&(]*:-<:)2:
. (Przepraszam, nie powinienem grać w golfa w komentarzach.)Perl 6 , 24 bajtów
Wyjaśnienie
Stosowanie:
źródło
$_
? Co to za czary?Haskell, 26 bajtów
Przykład użycia:
f 4
->1807
.źródło
Java 7,
4642 bajtówUżywa indeksowania 0 ze zwykłą formułą. Zamieniłem
n*n-n
nan*(n-1)
chociaż, ponieważ Java nie posiada poręczną operatora energii, af()
rozmowy były coraz długo.źródło
f(n)*~-f(n)
powinno działać.return--n<0
oszczędza jeszcze jeden bajt.Haskell, 25 bajtów
źródło
SILOS , 60 bajtów
Wypróbuj online!
Port moją odpowiedź w C .
źródło
Brain-Flak ,
158154 bajtówDziurawa Zakonnica mnie tu pobiła
Wypróbuj online!
Wyjaśnienie
Umieść dwa pod wejściem a (0)
Gdy wartość wejściowa jest większa od zera, odejmij jedną od wartości wejściowej i ...
Bezgłośnie...
Umieść jeden na drugim stosie, aby działał jako katalizator mnożenia <> (()) <>
Podczas gdy stos nie jest pusty
Przesuń górę listy i skopiuj
Pomnóż katalizator przez kopię
Dodaj jeden
Przenieś sekwencję z powrotem na właściwy stos
Usuń wszystkie oprócz dolnego elementu (tj. Ostatni utworzony numer)
źródło
C, 32 bajty
Wykorzystuje indeksowanie 1. Przetestuj na Ideone .
źródło
Właściwie 9 bajtów
Wypróbuj online!
Zamiast tego używa tej relacji:
który pochodzi z tej relacji zmodyfikowanej na podstawie tej podanej w sekwencji:
a(n+1) = a(n) * (a(n) - 1) + 1
.źródło
R,
44 4241 bajtów2 bajty oszczędzają dzięki JDL
1 bajt zapisany dzięki user5957401
źródło
n
nie jest to warunek ujemny, warunek można zredukować zn>0
do justn
.f(n-1)
ma 6 bajtów. Myślę, że oszczędzasz bajt, przypisując go do czegoś. tj.ifelse(n,(a=f(n-1))^2-a+1,2)
Oaza , 4 bajty (niekonkurujące)
Prawdopodobnie mój ostatni język z rodziny golfistów! Nie konkuruje, ponieważ język jest późniejszy niż wyzwanie.
Kod:
Alternatywne rozwiązanie dzięki Zwei :
Wersja rozszerzona:
Wyjaśnienie:
Wykorzystuje kodowanie CP-1252 . Wypróbuj online!
źródło
b<*>2
skorzystałem za(n-1)*(a(n-1)+1)-1
b
ponieważ zostanie to automatycznie wypełnione (zamiast danych wejściowych) :).Python,
3836 bajtów2 bajty dzięki Dennisowi.
Ideone to!
Zamiast tego używa tej relacji zmodyfikowanej w stosunku do podanej w sekwencji:
a(n+1) = a(n) * (a(n) - 1) + 1
Wyjaśnienie
0**n*2
zwraca2
kiedyn=0
i gdzie0
indziej, ponieważ0**0
jest zdefiniowany jako1
Python.źródło
Cheddar , 26 bajtów
Wypróbuj online!
Całkiem idiomatycznie.
Wyjaśnienie
źródło
CJam, 10 bajtów
Wykorzystuje indeksowanie 0. Wypróbuj online!
źródło
05AB1E , 7 bajtów
Wyjaśnił
Używa indeksowania zerowego.
Wypróbuj online!
źródło
Prolog, 49 bajtów
źródło
SILOS 201 bajtów
Krępuj się próbować go w Internecie!
źródło
Galaretka , 7 bajtów
Wypróbuj online!
Zamiast tego używa tej zależności podanej w sekwencji:
a(n+1) = a(n)^2 - a(n) + 1
Wyjaśnienie
źródło
C, 46 bajtów
Ideone to!
Służy
p
jako tymczasowe przechowywanie produktu.Zasadniczo zdefiniowałem dwie sekwencje
p(n)
orazr(n)
, gdzier(n)=p(n-1)+1
ip(n)=p(n-1)*r(n)
.r(n)
jest wymaganą sekwencją.źródło
R,
50 4644 bajtówZamiast śledzić całą sekwencję, po prostu śledzimy produkt, który przestrzega podanej kwadratowej reguły aktualizacji, o ile
n> 1n> 0. (Sekwencja ta wykorzystuje „zaczynają się odjednegozera” konwencją)Korzystanie z konwencji początkowej zerowej pozwala zaoszczędzić kilka bajtów, ponieważ możemy użyć if (n) zamiast if (n> 1)
źródło
Meduza , 13 bajtów
Wypróbuj online!
Wyjaśnienie
Zacznijmy od podstaw:
To jest hak, który definiuje funkcję
f(x) = (x-1)*x
.To składa się z poprzedniego haka z funkcją przyrostu, więc daje nam funkcję
g(x) = (x-1)*x+1
.Na koniec generuje to funkcję,
h
która jest iteracją poprzedniej funkcjig
, tyle razy ile podano na wejściu liczb całkowitych.I na koniec, zastosujemy tę iterację do wartości początkowej
2
. Up
góry po prostu drukuje wynik.Alternatywa (także 13 bajtów)
To odracza przyrost do samego końca.
źródło
C,
43,34, 33 bajtów1-indeksowany:
Test główny:
źródło
Brachylog , 13 bajtów
Wypróbuj online!
Zamiast tego używa tej relacji:
który pochodzi z tej relacji zmodyfikowanej na podstawie tej podanej w sekwencji:
a(n+1) = a(n) * (a(n) - 1) + 1
.źródło
Mathematica, 19 bajtów
Lub 21 bajtów:
źródło
Array
Roztwór magiczne. Szkoda,##0
to nie jest rzecz. ;)Labirynt , 18 bajtów
Kredyty dla Sp3000, który niezależnie znalazł to samo rozwiązanie.
Wypróbuj online!
źródło
Faktycznie ,
1412 bajtówUżyto 0-indeksowania. Sugestie dotyczące gry w golfa mile widziane. Wypróbuj online!
Ungolfing:
źródło
GolfScript ,
1210 bajtów2 bajty dzięki Dennisowi.
Wypróbuj online!
Zastosowania
a(n) = a(n-1) * (a(n-1)-1) + 1
.źródło
(
jest skrótem od1-
;)
jest skrótem od1+
.