W Gödel, Escher, Bach Douglas Hofstadter wprowadza ciąg liczb całkowitych, który jest powszechnie nazywany ciągiem liczbowym:
2, 4, 5, 6, 8, 9, 10, 11, 13, 14, 15, 16, 17, 19, 20, 21, 22, 23, 24, 25, ...
Możesz czerpać przyjemność z samodzielnego definiowania sekwencji jako części wyzwania, ale jeśli nie możesz lub nie chcesz tego rozgryźć , możesz znaleźć ją w OEIS jako sekwencja A030124 i nieco jaśniejsza definicja na Wikipedii .
Napisz program lub funkcję, która podana n
przez STDIN, ARGV lub argument funkcji wypisuje listę pierwszych n
liczb sekwencji do STDOUT w dowolnym rozsądnym formacie listy.
To jest golf golf, wygrywa najkrótsze rozwiązanie w bajtach.
code-golf
number
number-theory
sequence
Martin Ender
źródło
źródło
Haskell,
676160565553 znakówpowrót do pierwszego algorytmu.
to rozwiązanie oblicza sekwencję dopełniacza przez zsumowanie początkowych elementów sekwencji. następnie oblicza sekwencję jako wszystkie liczby między numerami sekwencji dopełniacza.
(#)
to funkcja, która oblicza liczby między sekwencją dopełniacza.h
jest samą sekwencją.g
to funkcja, która odpowiada na pytanie.funkcja g jest zdefiniowana tak, aby pobierała potrzebną ilość elementów z h.
subtelności:
h
jest w rzeczywistości sekwencją figur rysunku, z wyjątkiem pierwszych 2 elementów.nie jest obliczana sekwencja dopełniacza, ale sekwencja dopełniacza z dodanym 1 dla każdego elementu.
te dwie subtelności są powodem
scanl(+)8h
(który jest kodem sekwencji dopełniacza (z wyjątkiem pierwszych 2 elementów) z dodanymi 1-ami)8
. dotyczy trzeciego elementu sekwencji dopełniacza z dodanym 1.powodem, dla którego obliczenia nie brakuje dwóch pierwszych elementów, jest to, że zostały one dodane
g
w2:4:h
.przykład:
źródło
Ruby,
5448Próbny
Edycja: Grałem w tę grę jeszcze raz, kiedy zdałem sobie sprawę, że nie muszę przechowywać pełnej sekwencji dopełnień w pamięci. Oto, jak to działa teraz: używamy
x
do śledzenia największej obliczonej liczby w sekwencji dopełniacza ib
jest pulą kandydatów do sekwencji.n
razy wyprowadzamy najmniejszy pozostały elementb
i dodajemy go,x
aby obliczyć następną liczbę w sekwencji dopełniacza. Następnie usuwamy obie liczby z puli kandydatów, więc zawsze wypisujemy najmniejszą liczbę, która nie została jeszcze dodana do żadnej sekwencji.Ruby golf tricks: Stabby lambda składnia jest krótsza niż definicja metody. Wymóg, że dane wyjściowe są przekazywane do STDOUT zamiast jako wartość zwracana, zainspirował mnie do użycia faktu, że wartość zwracana
p(x)
tox
, czego zwykle nie pamiętam, ponieważ nie jest tak w wersji Ruby używanej w Anarchy Golf.źródło
2..2*n
. Muszę użyć,n*n
ponieważ robię to skutecznie,b = [x]^b
więc potrzebuję największego elementu,b
aby był większy niż największa wartośćx
, aleb -= [x]
wystarczy, żeb
zawiera on największą możliwą wartość sekwencji wyjściowej.GolfScript (
2421 bajtów)Demo online
Zaczęło się to zupełnie inaczej, ale ostatecznie zbiegło się na porcie GolfScript rozwiązania Ruby histocrata , zanim Dennis przedstawił kilka sugestii, które zmierzają w nieco innym kierunku. W szczególności wydrukowanie liczb w miarę ich identyfikacji pozwala zaoszczędzić sporo czasu, gromadząc je w tablicy do drukowania na końcu; Powodem jest to, że w żadnym momencie nie musimy się martwić o więcej niż 3 przedmioty na stosie.
Sekcja
źródło
^
się\-
, można zastąpić).*
z3*
. Nie zaoszczędzi to żadnych bajtów, ale drastycznie skraca czas działania i zużycie pamięci. - Powinieneś być w stanie zapisać jeden bajt, trzymając liczbę całkowitą na górze tablicy. Pętla będzie miała tę samą liczbę bajtów, ale inicjalizacja będzie o jeden bajt krótsza.~.3*,1>\{(\(.p@+\|}*;
J - 28 znaków
Funkcja
n
jako argument.Uruchamiamy funkcję z
n
lewym argumentem wielokrotnie na prawym argumencie, dopóki nie wywoła żadnej zmiany. Argument na początek to lista2 4
.W samej funkcji bierzemy sumy częściowe
+/\
i pełne+/
, a następnie zwiększamy je oba za pomocą&:>:
. Następnie generujemy każdą liczbę całkowitą od 2 do jednej więcej niż pełna suma (2+i.
) i ustawiamy odejmowanie (-.
) sumy cząstkowe, pozostawiając z definicji dłuższą sekwencję cyfr i liczb. Wreszcie, skracamy lub cyklicznie rozszerzamy listę do długościn
.Rezultat jest taki , który
2 4
zostaje3 7
usunięty z2..8
wyjścia2 4 5 6 8
. Po kolejnej rundzie2 4 5 6 8
staje3 7 12 18 26
sięW ten sposób wielokrotnie rozszerzamy sekwencję figura-figura. The
$
długości jest po prostu nietrywialnym sposobem oszczędzania znaków na czekaniu, aż sekwencja wzrośnie do długościn
lub większej, i wysyłaniun
pierwszych wartości, gdy przestaną się zmieniać. Nie musimy też długo czekać: możemy uzyskać aż 46336 terminów z czterech aplikacji czasownika wewnętrznego.Ta sama funkcja w k:
{{x#y@&~_lin[y:1+!1+/y;1+\y]}[x]/2 4}
{{x#y@&~(y:2+!1+/y)in\:1+\y}[x]/2 4}
źródło
Java -
183158To była najbardziej gra w golfa i jestem z tego dumny! (Chociaż nie jest nigdzie u góry list przebojów (ponieważ jest to Java))
Podziękowania dla Petera Taylora za sugestie
większy -
źródło
Byte.valueOf
oszczędza trzy, a ponieważ pytanie nie określa zakresu danych wejściowych, myślę, że powinno być do zaakceptowania. Poza pętlamim
służy tylko do inicjalizacjin
, więck++<m
może byćm-->0
,k
całkowicie eliminując .int[] n
można zainicjowaćint n[]
i połączyć z poprzednim inicjatorem.n
nigdy nie przechowuje wartości innych niż1
,n[...]!=0
może tak byćn[...]>0
. Inicjator może następnie stać się częścią inicjalizacyjną pierwszejfor
pętli.u
i po prostu użyjesz++w
, nie musisz ustawiaćn[q]
lubn[w]
. Jest jeden błąd, w którym uciekasz przed końcemn
kiedym==2
, który wydaje się być najlepiej naprawiony przez inicjalizacjęn=new int[2*m*m]
, ale myślę, że jest to do 157 bajtów.for(int q=1,w=2,m=...,n[]=...;m-->0;){...
zapisywał średnik.Python 2 - 77 bajtów
Kod:
Działa tak samo jak rozwiązanie @ histocrat, tyle że dane wejściowe pochodzą ze standardowego wejścia.
źródło
Python 2 - 68
źródło
Galaretka , 15 bajtów
Wypróbuj online!
Błąd pamięci na wejściu 6.
Jak to działa
Bardziej wydajna wersja, 16 bajtów
Wypróbuj online!
Wykorzystuje pomysł z tym J odpowiedź . Skracaj do żądanej długości każdej iteracji i weź punkt stały. Myślałem o użyciu
S
(suma) zamiastṀ‘
(maks. + 1), ale nie mogę zagwarantować jego poprawności.źródło