Biorąc pod uwagę liczbę całkowitą n
(gdzie n < 10001
) jako dane wejściowe, napisz program, który wyświetli pierwsze n
liczby Ulam . Liczba Ulam jest zdefiniowana następująco:
- U 1 =
1
, U 2 =2
. - Bo
n > 2
U n jest najmniejszą liczbą całkowitą większą niż U n-1, która jest sumą dwóch różnych wcześniejszych wyrazów w dokładnie jeden sposób.
Na przykład U 3 to 3
(2 + 1), U 4 to 4
(3 + 1) (zauważ, że (2 + 2) się nie liczy, ponieważ warunki nie są odrębne), a U 5 to 6
(U 5 to nie 5 ponieważ 5 można przedstawić jako 2 + 3 lub 4 + 1). Oto kilka pierwszych liczb Ulam:
1, 2, 3, 4, 6, 8, 11, 13, 16, 18, 26, 28, 36, 38, 47, 48, 53, 57, 62, 69, 72, 77, 82, 87, 97, 99
To jest golf golfowy, więc wygrywa najkrótszy wpis.
code-golf
number
number-theory
sequence
Absynt
źródło
źródło
n
musimy obsłużyć?Odpowiedzi:
CJam,
474137 bajtówWypróbuj online.
Przykładowy przebieg
Jak to działa
Ta podstawowa idea jest następująca:
Zacznij od tablicy
A := [ 0 U₁ U₂ ... Uₖ ]
.Oblicz
S
, tablicę wszystkich sumx + y
takich, żex,y ∊ A
ix < y
.Odrzuć wszystkie nie unikalne kwoty z
S
. Ponieważ każda liczba Ulam większa niż 2 jest zarówno sumą dwóch mniejszych, jak i sumą zera i samego siebie, to odrzuca liczby UlamU₃, U₄, ... Uₖ
.Pozostała tablica jest
[ U₁ U₂ Uₖ₊₁ ... ]
, więc następny numer Ulama jest trzecim najmniejszym elementem. Dołącz goA
i wróć do kroku 1.źródło
100
zajmuje już kilka sekund. Przypuszczam, że obliczenie maksymalnego wejścia 1e5 zajęłoby wieki?J - 46 znaków
Funkcja
n
jako argument.Wyjaśnione przez wybuch:
źródło
+_*
...T-SQL,
301300288287Popełniłem lekkie nadużycie SQL.
Wypróbuj w SQL Server 2008 tutaj .
@N przechowuje całkowitą liczbę wejściową. Zmień przykład „100” na n. „10000” prawdopodobnie ostatecznie skończy, ale nie pozwoliłem, by biegło do końca. Liczba znaków dla tego wpisu dotyczy jednej cyfry. Dane wyjściowe są w postaci wyników zapytania.
źródło
Haskell,
7067 znakówstosowanie:
źródło
GolfScript (
4137 bajtów)Demo online
Produkty kartezjańskie w GolfScript są dość długie, więc to podejście jest inne. Długoterminowy wzrost liczby Ulamów jest taki, że
n
th liczba Ulam jest około13.5n
, ale w pierwszych 10000 kategoriach największy stosunek międzyn
tą liczbą Ulam an
jest tuż poniżej13.3
. Tak podanen
że możemy filtrować pierwsze14n
liczby, aby znaleźć te, które należą do sekwencji.Z podziękowaniami dla Dennisa za 41-> 37.
źródło
n = 1000
zajmuje mniej niż minutę dzięki GolfScript; port do CJam kończy sięn = 1000
w 8 sekund in = 10000
1h 20 m. - Możesz zapisać cztery bajty, łącząc swoje podejście z moim, a mianowicie włączając 0 do tablicy i odrzucając ją później. To pozwala na użycie zestawu unii zamiast bloku i eliminuje potrzebę zmiennej:~.14*,4,\{1$.{2$1$-.@<*}%&,2=*|}/1><`
14
.14
jest po prostuE
. Ale musisz przeczytać STDIN, przekonwertować liczbę całkowitą na singleton przed wykonaniem set union (2$
prześlę raport o błędzie na ten temat) i nie będzie działać w wewnętrznej pętli, ponieważ CJam modyfikuje stos po każdej iteracji ... I Próbowałem kilku różnych sztuczek, ale najkrótsza miała dokładnie 37 bajtów:li4,1$E*{__{I1$-_@<*}%&,2=I*a|}fI1><`
JavaScript ES6,
100 ... 9390 znakówUruchom to w konsoli internetowej lub Scratchpad najnowszej przeglądarki Firefox (Nightly lub release).
EDYCJA 8 Dużo grał w golfa !!! i doprowadził do
94 znaków9390 znaków (dzięki @openorclose). (Moje pierwsze sub 100)Oto moja wersja, która jest znacznie szybsza,
ale ma 3 znaki dłuższe (107 znaków)i ma dokładnie taką samą liczbę znaków jak powyżeji jest znacznie mniejsza niż metoda brutalnej siły poniżej !, (dzięki edc65):Będę próbował dalej grać w golfa. Ale wyciskamy to z zakresu JS: P.
Oto kilka liczb, kiedy uruchamiam to wewnątrz tagu skryptu na stronie internetowej:
To jest moje pierwsze zgłoszenie, które jest mocno zainspirowane odpowiedzią @ rink.attendant.6 w JavaScript.
Wiem, że można to pograć jeszcze bardziej. Zamierzam również opublikować niewzmocnione rozwiązanie, które może być jeszcze krótsze.
EDYCJA 1 : Grał trochę bardziej w golfa i naprawił dla n = 1
Muszę powiedzieć, że zazdroszczę Haskellowi i J tak super przydatnych skrótów dla każdego rodzaju wymagań -_-
źródło
u=n=>{for(s=[,1,1],r=[i=1,l=2];c=l<n;!c?s[r[l++]=i]=1:0,i++)for(j of r)c-=j<i/2&s[i-j];return n>1?r:[1]}
a może nawet więcejreturn
. 100:u=n=>(s=>{for(r=[i=1,l=2];c=l<n;i+=!c?s[r[l++]=i]=1:1)for(j of r)c-=j<i/2&s[i-j]})([,1,1])|n>1?r:[1]
u=n=>(s=>{for(r=[i=l=1];c=l<n;i+=c&&i-2?1:s[r[l++]=i]=1)for(j of r)c-=j<i/2&s[i-j]})([,1])||r
u=n=>(s=>{for(r=[i=l=1];c=l<n;i+=c&&i-2?1:s[r[l++]=i]=1)r.map(j=>c-=j<i/2&s[i-j])})([])||r
Chyba że gdzieś potrzebny jest [, 1]Perl - 71 bajtów
Wypróbuj online!
Licząc shebang jako jeden.
Używanie drugiej tablicy do przechowywania sum wydaje się znacznie szybsze niż skrót. Zużycie pamięci jest również mniejsze, czego nie spodziewałbym się.
Przykładowe użycie:
Przykładowe dane wyjściowe:
Przybliżone czasy działania:
źródło
n == 1e4
. Niesamowity! Wynik dlan == 1
jest niepoprawny; powinien wydrukować pojedynczy numer.Java, 259
Brute force sprawdza się w tym przypadku.
źródło
1
powinna być pojedyncza liczba.APL (Dyalog Extended) ,
3635 bajtów-1 bajt autorstwa Adáma
Wypróbuj online!
* (W ngn / APL stała może zakończyć pociąg bez użycia
⍨
. Ale ngn / APL nie ma odliczania, więc musimy gdzieś ⍨.)źródło
{(2 3∊⍨⍵⍧⍵)/⍵}
→(∊⊢⊆⍨⍧⍨∊2 3⍨)
PHP 5.4+, 164
Takie samo podejście jak moje odpowiedzi:
źródło
Galaretka , 20 bajtów
Wypróbuj online!
źródło
CoffeeScript,
119114Ostatnio ćwiczyłem CoffeeScript, aby poprawić golfowy JavaScript, więc oto moja odpowiedź JavaScript skompilowana w CoffeeScript:
Nie rozumiem dobrze pętli i rozumienia w CoffeeScript, więc być może można to pograć w golfa, ale na razie to mam. Nowe linie są liczone jako jeden znak (styl uniksowy).
źródło
JavaScript,
147154150 (136)Mocno zainspirowany wcześniej napisanym przez @ Ypnypn rozwiązaniem Java brute-force:
Dzięki za @Dennis za zgolenie od 4 do 18 bajtów mojej oryginalnej wersji
Niebezpieczna wersja (przy użyciu
for..in
pętli)Nie polecałbym uruchamiania tego, ponieważ zapętlanie przez obiekt będący pętlą używającą może spowodować, że twoja maszyna wybuchnie w płomieniach i / lub przekształci się w gniewną maszynę do zabijania, ale oto ona:
instanceof
Array
for..in
Nie golfił
źródło
z=0
w pętli, potrzebujesz go tylko raz. 2.for(j in l)for(k in l)z+=l[j]<l[k]&l[j]+l[k]==i;
jest znacznie krótszy niżl.forEach
podejście.Mathematica,
10791 bajtówJest to bardzo bezpośrednie wdrożenie specyfikacji.
Stosuję też sztuczkę Dennisa polegającą na dodawaniu sum
0
, ale haczyk polega na tym, że powoduje to, że trzeci element listy0
przed wznowieniem jest zgodny z oczekiwaniami, więc muszę usunąć ten element z listy.Obsługuje dane wejściowe
1000
w ciągu kilku sekund, ale wątpię, aby uzyskać wynik za 10k w rozsądnym czasie. Ale nie sądzę, żeby którykolwiek z pozostałych wypadł dobrze w tej kwestii.źródło
OCaml - 254 znaków
Kod używa tabeli skrótów do przechowywania sumy bieżących elementów listy i aktualizuje ją za każdym razem, gdy obliczany jest nowy element.
Stosowanie:
W ramach interpretera OCaml:
Nie golfił
źródło
Python,
137128126 znaków.To jest mój pierwszy golf i zredukowałem go z ~ 250 postaci, jestem bardzo szczęśliwy, ale chętnie podpowiemy, jak poprawić!
źródło
for b in U:t[a+b]+=a!=b
oraz linie 8 i 9 zwhile t[i]-2:i+=1
for
U,i=[1,2],2
naU,i=[1],2
iinput()-2
nainput()-1
it=_*3*i
dot=_*3*i;U+=[i]
i usuwaj;U+=[i]
na końcu dlaC #, 257
Podejście brutalnej siły przy użyciu LINQ:
Bez golfa, z uprzężą testową
źródło
Pyth,
2725 bajtówWypróbuj online tutaj .
Edycja: grał w golfa 2 bajty, wykonując sumowanie przed grupowaniem. Poprzednia wersja:
<uaGh-mssdfq1lT.gsk.cG2GQS2
źródło
C, 478 bajtów
W Tio teraz za 9 sekund znajdzie 10000 wartości (i tam wydrukuje pierwsze 100 wartości). Sztuką jest użycie nieliniowego wyszukiwania w wewnętrznej pętli, ale wyszukiwanie binarne ... Poniżej znajdują się funkcje dobrze wcięte i w pełni czytelne (w końcu dla mnie):
źródło
APL (NARS), 278 znaków, 556 bajtów
byłoby to tłumaczenie w APL C jednego, które wysłałem. Wydaje się, że nie rozumiem, kiedy użyć ∇∇ zamiast ∇ ... możliwe ∇∇ jest używane, gdy istnieje jeden argument to jedna funkcja (a nie inny typ). „u bs x, a, b” powinno być wyszukiwaniem bin w tablicy „u” dla wartości „x” w zakresie a..b; zwróci 1, indexWhereFind lub 0, indexWhereEndOfsearch. Z funkcją argumentu 200 p weź + - minuta tutaj ...
źródło
∇∇
in dop odnosi się do samego operatora, podczas gdy∇
odnosi się do pochodnej funkcji składającej się z operatora z jego operandem (operandami). Tak więc w operatorze monadycznym∇
oznacza to samo, co(⍺⍺∇∇)
w operatorze dyadycznym(⍺⍺∇∇⍵⍵)
.