Fabuła:
Lucy zapytała George'a, jaki jest jego szczęśliwy numer. Po krótkiej kontemplacji George odpowiedział, że ma kilka szczęśliwych liczb. Po krótkim zamieszaniu Lucy zapytała George'a, jakie są jego pierwsze n
Szczęśliwe Liczby. George poprosił cię, jego kumpel, o napisanie mu programu do wykonania pracy za niego.
Wyzwanie:
Napisz program / funkcję, która otrzyma od standardowego argumentu wejścia / funkcji ciąg lub liczbę całkowitą n
. Program / funkcja zwróci / wyśle pierwsze n
szczęśliwe liczby . Szczęśliwe liczby są definiowane przez sito w następujący sposób.
Zacznij od dodatnich liczb całkowitych:
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, ...
Teraz usuwaj co drugi numer:
1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, ...
Drugi pozostały numer to 3 , więc usuwaj co trzeci numer:
1, 3, 7, 9, 13, 15, 19, 21, 25, ...
Kolejny pozostały numer to 7 , więc usuwaj co siódmy numer:
1, 3, 7, 9, 13, 15, 21, 25, ...
Następnie usuń co dziewiąty numer i tak dalej. Wynikowa sekwencja to szczęśliwe liczby.
Zwycięski:
Jak zwykle dla codegolf, wygrywa najmniej bajtów.
Jak zwykle zgłoszenia korzystające ze standardowych luk są dyskwalifikowane.
źródło
Odpowiedzi:
Python 2, 79
Magia iteracji po liście, gdy pętla ją modyfikuje!
Lista
L
zaczyna się od wszystkich liczb całkowitych1
do wystarczająco wysokiej wartości. Kod iteracje nad każdym elementemr
zL
, biorąc podmenu każdymr
-tym elemencie, i usunięcie każdej z tych wartości. W rezultacie usunięte wartości nie są powtarzane. Na koniec wydrukuj pierwszen
elementy.Wyrażenie
map(A.remove,B)
to sztuczka, na którą czekałem od dawna. WzywaA.remove
każdy elementB
, co powoduje usunięcie wszystkich elementówB
zA
. W rzeczywistości bierze różnicę listy, choć wymagaB
podlistyA
. Wymaga Python 2, ponieważ Python 3 tak naprawdę nie ocenia mapy.Pierwsza pętla musi być w specjalnej obudowie, aby przekonwertować
r
z1
na2
, asr+=r<2
.Wystarczająco wysoka górna granica
2**n
powoduje, że program działa bardzo wolno dla dużych wartościn
. Używanien*n+1
wystarcza, ale kosztuje postać. Pamiętaj, żen*n
to nie działan=1
.źródło
n**2
liczb, a nie2**n
map
twoich niesamowitych zastosowań . Zastanawiałem się, czy jest lepszy sposób ...n**2+1
chyba że sprawan=1
może zostać wybaczona.map(A.index,B)
do znalezienia indeksów elementów B w A,map(A.count,B)
do znalezienia liczby elementów B w A,map(A.extend,B)
do dodania spłaszczonej listy B do A. Umysł porusza się.Haskell,
7169 bajtówDefiniuje funkcję
f
. Wyrażenie1:s[3,5..]3
ocenia na nieskończoną listę szczęśliwych liczb if
po prostu bierze pierwsząn
z nichtake n
.Mógłbym ogolić 5 bajtów z sita przy użyciu równoległego rozumienia listy
ale wymagałoby to przekazania
-XParallelListComp
do GHC flagi ogromnego kompilatora, aby umożliwić rozszerzenie.Objaśnienie sita
Podstawowa idea polega na tym, że
s(n:k)p
produkuje tę(p-1)
szczęśliwą liczbęn
, upuszcza każdą tęn
liczbę z nieskończonego ogonak
(przesunięty o,p
aby uwzględnić liczby wyprodukowane wcześniej) i powraca do tej listy z akumulatorem(p+1)
. Wf
, inicjalizujemy proces liczbami nieparzystymi zaczynającymi się od3
i halsując1
do przodu, uzyskując dokładnie szczęśliwe liczby.źródło
Python 2,
71 6967Na początku myślałem, że będzie to duże wyzwanie dla krojenia tablic Pythona. Jednak natknąłem się na przeszkodę, gdy odkryłem, że plasterkom z krokiem innym niż 1 można przypisać tylko kolejny plaster o identycznej długości. Ale po googlowaniu „python remove slice”, moja wiara została przywrócona: znalazłem funky
del
, która doskonale sobie z tym radzi.Stara wersja
-2 bajty dzięki Sp3000.
źródło
> <> ,
121114111 bajtówMam tylko kilka słów do powiedzenia ...
... „Ach mój mózg boli.”
Wyjaśnienie
> <> to ezoteryczny język programowania 2D i zdecydowanie nie nadaje się do tego zadania z powodu braku tablic. W rzeczywistości jedynym typem danych w> <> jest dziwna mieszanka int / float / char i wszystko dzieje się na stosie.
Oto podsumowanie:
Oto próbny przykład, który pokazuje z grubsza, jak działa przesiewanie (oto
k
szczęśliwa liczba, z którą przesiewamy):źródło
nao
można to interpretować jako „wydrukuj to teraz”.CJam - 25
Wypróbuj online
Wyjaśnienie:
Ta implementacja nie usuwa liczb kolejno z tablicy, ale oblicza każdą liczbę na podstawie liczby, które zostałyby usunięte przed nią.
Dla każdego indeksu i (od 0 do n-1) i każdej poprzedniej szczęśliwej liczby l, w odwrotnej kolejności, zwiększamy i o i / (l-1), z wyjątkiem l = 1 używamy 1 zamiast 0, a także dodajemy 1 na końcu.
Np. Dla i = 4 mamy pierwsze 4 liczby [1 3 7 9] i obliczamy:
4 + 4 / (9-1) = 4
4 + 4 / (7-1) = 4
4 + 4 / (3 -1) = 6
6 + 6/1 = 12
12 + 1 = 13
źródło
Pyth:
2322 bajtówWypróbuj online: Pyth Compiler / Executor
Wyjaśnienie:
Redukcja faktycznie oblicza więcej niż
Q
szczęśliwe liczby (polecenie usuwania nazywa się Q + 1 razy, Q-1 powinno wystarczyć).źródło
R, 58 bajtów
Z podziałami linii:
Poprzednia wersja, 62 bajty
Poprzednia wersja, 78 bajtów
źródło
n=as.numeric(readline())
nafunction(n){...}
. Tworzy to obiekt funkcji, który można przypisać i wywołać. Upuść nawiasy klamrowe wfor
pętli.n=scan(n=1)
?CJam,
3230 bajtówPobiera dane wejściowe ze STDIN.
Objaśnienie kodu :
Wypróbuj online tutaj
źródło
Python 2,
105101 bajtówPo prostu prosta implementacja.
Pyth,
39363532 bajtówPodobne do powyższego podejścia, ale rzeczy są indeksowane 0, a nie indeksowane 1. Wypróbuj online .
Dzięki @Jakube za wskazanie oszczędności bajtów.
źródło
Mathematica, 80 bajtów
Proste wdrożenie definicji. Podobnie jak inne odpowiedzi, zaczyna się od zakresu od
1
do, a następnie filtruje.n2
źródło
Perl,
86817886:
AKTUALIZACJA: oczywiście
grep{...}
jest lepsza niżmap{...?$_:()}
81:AKTUALIZACJA: OK, teraz jest to jedna linia. Mogę przestać. (?) 78:
źródło
Oktawa,
1398372Nie golfowany:
źródło
J,
6052 bajtówObjaśnienie (od prawej do lewej):
2,1+2*i.@*:@>:
wydaje się o wiele za długi, ale mogę go skrócić tylko o 1 bajt zamiany,*:
dzięki!
czemu lista rośnie wykładniczo.źródło
JavaScript (ES6) 96
99Edytuj Odliczanie w pierwszej pętli - dzięki @DocMax
Nie golfił
Przetestuj w konsoli Firefox / FireBug
Wydajność
źródło
F=n=>{for(o=[1],i=n*n;--i;)o[i]=2*i+1;for(;++i<n;o=o.filter((x,j)=>++j%o[i]));return o.slice(0,n)}
Matlab, 104 bajty
Dzięki @flawr za bardzo odpowiednie komentarze i sugestie.
Przykład z wiersza polecenia Matlab:
źródło
Bash + coreutils, 136
Miałem nadzieję pograć w golfa bardziej, ale no cóż. Nie codziennie, gdy włączasz potok do funkcji rekurencyjnej w skrypcie powłoki:
Wydajność:
Bash + coreutils, 104
Krótszy przy użyciu prostszej implementacji:
źródło
Idź, 326
Proste wdrożenie za pomocą goroutine i rur do robienia sit.
źródło
MATLAB, 62 znaki
Na początku źle zinterpretowałem wyzwanie - moja poprawiona wersja jest teraz krótsza.
źródło
Rakieta 196 bajtów
Produkuje szczęśliwe liczby do n:
Wersja bez golfa:
Testowanie:
Wydajność:
źródło