Chociaż zadano pokrewne wyzwania , to jedno jest inne, aby uzasadnić swoje własne pytanie.
Wyzwanie
Biorąc pod uwagę dodatnią liczbę całkowitą, zwróć najdłuższą sekwencję kolejnych dodatnich nieparzystych liczb całkowitych, których suma jest podaną liczbą całkowitą. Jeśli taka sekwencja nie istnieje, możesz zgłosić błąd w dowolny sposób, który ma sens dla twojego języka, w tym zwrócić wartość fałszowania lub zgłosić wyjątek.
Przypadki testowe
1 -> [1] 2 -> [] 3 -> [3] 4 -> [1, 3] 5 -> [5] 6 -> [] 9 -> [1, 3, 5] (zwróć uwagę, że [9] nie jest prawidłową odpowiedzią) 15 -> [3, 5, 7] 104 -> [23, 25, 27, 29] (zauważ, że [51, 53] nie jest prawidłową odpowiedzią)
Punktacja
To jest golf golfowy , więc wygrywa najkrótsza odpowiedź w każdym języku.
Odpowiedzi:
Haskell,
6765636258 bajtówZaoszczędzono 4 bajty dzięki Julianowi Wolfowi
Wypróbuj online!
I sprawdzić, czy liczba ta może być wyrażona jako on różnicy dwóch kwadratów:
m^2-n^2
. Mogę następnie skonstruować listę kolejnych liczb nieparzystych:[2n+1,2n+3...2m-1]
. Zauważ, że ponieważn
wybrano minimum , zostanie wydrukowana najdłuższa listaźródło
x
obun
im
Python 2 ,
6662 bajtówWychodzi z RuntimeError (przekroczona maksymalna głębokość rekurencji), jeśli nie ma rozwiązania.
Wypróbuj online!
źródło
Galaretka ,
1110 bajtów-1 bajt dzięki Dennis (niejawnie budynku z zakresu
Ẇ
- wymienićRm2Ẇ
zẆḤ’
)Monadyczny link zwracający listę sum, jeśli to możliwe, a
0
jeśli nie.Wypróbuj online!
W jaki sposób?
źródło
ẆḤ’
zapisuje bajt.JavaScript (ES7),
87868581 bajtówZwraca rozdzielaną przecinkami listę liczb całkowitych lub
0
jeśli nie ma rozwiązania.W jaki sposób?
Najpierw szukamy najmniejszego idealny kwadrat s takie, że x + y = N inny kwadratem.
Jeśli istnieje s , n jest różnicą x - s 2 doskonałych kwadratów, którą można zapisać jako różnicę 2 sekwencji kolejnych liczb nieparzystych. Następnie tworzymy wynikową listę.
Przykład:
Dla n = 104 :
Znajdujemy s = 11² = 121, co spełnia x = n + s = 225 = 15²
Następnie:
15² = 1 + 3 + 5 + 7 + 9 + 11 + 13 + 15 + 17 + 19 + 21 + 23 + 25 + 27 + 29
11² = 1 + 3 + 5 + 7 + 9 + 11 + 13 + 15 + 17 + 19 + 21
104 = 15² - 11² = 23 + 25 + 27 + 29
Pokaż fragment kodu
źródło
n^2
zawsze jest równa sumie pierwszychn
liczb nieparzystych? Ciekawe05AB1E ,
98 bajtów-1 bajt dzięki Emignie
Wyjaśnienie:
W przypadku nieprawidłowego wejścia nic nie wyświetla.
Wypróbuj online!
źródło
ʒOQ}
zamiastDO¹QÏ
zapisuje bajt.Haskell ,
6160 bajtówDzięki @maple_shaft za golenie 1 bajtu
Wypróbuj online!
Wykorzystuje fakt, że najdłuższym przebiegiem zawsze będzie przebieg rozpoczynający się od najniższej liczby.
Chciałem zrobić coś z arytmetyką zamiast brutalnego forsowania
k
, alefromInteger
wydaje się, że to zabija.źródło
[1,3..n]
na[1,3..]
r?n=[r,r+2..n]
. Wypróbuj online!Python , 67 bajtów
Wypróbuj online!
I skopiowane moją odpowiedź z poprzedniego rzędu suma wyzwanie i zmienił
+1
się+2
. Kto wiedział, że ten golfowy kod może być tak modułowy?Dziwnie prosta strategia: wyszukaj przedział
R
z żądaną sumą.R
.Ponieważ dolny koniec przedziału tylko się zwiększa, dłuższe przedziały znajdują się przed krótszymi. Jeśli nie można znaleźć możliwego interwału, kończy się z IndexError.
źródło
JavaScript (ES6),
6564 bajtówZwraca tablicę, jeśli istnieje rozwiązanie, lub 0 dla braku rozwiązania.
Jest to bardzo nieefektywny, ale golfowy rozwiązanie problemu.
Szuka pierwszego rozwiązania za pomocą
a-i
ii=1
, nawet jeśli nie działa na stos rekurencyjny. Jeśli to rozwiązanie się nie zaczniei+2
, wówczas rekurencyjnie szukamy pierwszego rozwiązania za pomocąa
ii+2
.Bez golfa
Przypadki testowe:
Pokaż fragment kodu
Aby dowiedzieć się, jak to jest nieefektywne, rozwiązanie
f(104)
wymaga 69 535 połączeń rekurencyjnych. Stos nigdy nie ma więcej niż 51 poziomów głębokości, więc nie ma problemu z przepełnieniem stosu.Rozwiązanie
f(200)
wymaga 8,6 miliona połączeń rekurencyjnych, z głębokością stosu 99 poziomów. (Jego rozwiązaniem jest[11,13,15,17,19,21,23,25,27,29]
.)Oto wizualna reprezentacja uruchomionego programu:
Pokaż fragment kodu
źródło
Python 2.7,
10910897 bajtów11 bajtów w dół, dzięki Erik the Outgolfer.
To mój pierwszy golfowy kod!
Jak to działa
Użyłem tej dobrze znanej tożsamości
1 + 3 + 5 + ... + (2n - 1) = n²
Weźmy przypadek
15
Ogólnie rzecz biorąc, jeśli istnieją x warunki zaczynające się od
2n + 1
, npJest równa
2nx + x²
Jeśli
N
wejściowa liczba całkowita, problem sprowadza się do znalezienia maksimumx
takiego, żeJest to równanie kwadratowe z rozwiązaniem
Najdłuższa sekwencja to jedna z największymi
x
. Program dokonuje iteracjin
od0
doN
i kiedy stwierdzi, żex
jest liczbą całkowitą, tworzy listę(2n + 1) + (2n + 3) + (2n + 5) ... (2n + (2x-1))
i zwraca ją.źródło
Python 3,
19081 bajtówDzięki @ovs i @ musicman523
źródło
print
brakuje połączenia w nawiasachl.append(i)
, używając po prostul+[i]
w wywołaniu rekurencyjnym. Możesz usunąćl.pop(0)
, używającl[1:]
w połączeniu rekurencyjnym. Możesz usunąć wywołaniec
na samym dole, używając zamiast tego argumentów słów kluczowych. Możesz usunąć>0
wiersz 2. Na koniec możesz zamienić swoje wyrażeniaif
ielse
na wyrażenia, używając formy trójskładnikowej, która prowadzi do 92 bajtów jako wyrażenia lambda. Wypróbuj online!i
aby uzyskać w sumie 81 bajtów .sum(l)>q else
na,q<sum(l)else
aby zapisać 1 bajt.QBIC , 47 bajtów
Próbuje policzyć wszystkie liczby nieparzyste od jednego, aż do jego sumy
n
. Jeśli mijan
, zresetuj pętlę, zwiększ od 1 do 3 i spróbuj ponownie. Wyjdź, drukując 0, jeśli na początku pętli nasz numer> n
.Wyjaśnienie
źródło
R , 90 bajtów
Wypróbuj online!
Używa funkcji rekurencyjnej, która testuje skumulowaną sumę sekwencji y: x zamienioną na sekwencję liczb nieparzystych. y jest zwiększane przy każdej rekurencji, dopóki nie przekroczy x. Pierwsza sekwencja sumująca się z celem zostanie zwrócona.
źródło
Python 2 , 89 bajtów
Nienazwana funkcja przyjmująca dodatnią liczbę całkowitą
n
i zwracająca wynik, jeśli istnieje, i zwraca wartośćIndexError
inną.Wypróbuj online!
Tworzy listę wszystkich odpowiednich liczb nieparzystych, z
r(1,n+1,2)
którymi jestrange(start=1, stop=n+1, step=2)
; tworzy wszystkie odpowiednie pod-plastry (oraz kilka pustych) przez cięcie, że odi
włącznie zj
wyłącznym z[i:j]
drugieji
w [0, n), z użyciemr(n)
ij
w [0, n], za pomocąr(n+1)
(na pustych podczasi>=j
lubi
jest poza zakresem); filtry dla tych z poprawną sumą za pomocąif sum(v)==n
; zwraca pierwszy (i stąd najdłuższy) taki plasterek za pomocą[0]
.źródło
Python 2 ,
9190 bajtów-1 bajt dzięki @CMcAvoy
Wypróbuj online!
źródło
Pyth, 11 bajtów
Wypróbuj tutaj.
źródło
PHP , 73 bajty
żadne rozwiązanie nie jest nieskończoną pętlą
Wypróbuj online!
PHP , 83 bajty
nic nie drukuje bez rozwiązania
każdy mod wejściowy 4 == 2 nie ma rozwiązania
Wypróbuj online!
źródło
Python 2 ,
122121119115 bajtów-1 bajt dzięki musicman523. -4 bajty dzięki Step Hen. ha ha
Wypróbuj online!
źródło
range
, wypróbuj online!Python 3 , 93 bajty
Wypróbuj online!
Jedyną rzeczą, którą zrobiłem, było zauważenie, że
(s+e)*(2+e-s)==4*n
jest to równoważnesum(range(s,e+1,2))==n
, i chociaż są one tego samego rozmiaru, kiedyr=range
to pierwsze można umieścić bliżejif
oświadczenia.źródło
Python 3 , 185 bajtów
Wypróbuj online!
Jeśli chodzi o to, jak to działa, starałem się znaleźć nieco bardziej eleganckie rozwiązanie niż proste wyszukiwanie brutalnej siły. Zmieniłem formułę na sumę sekwencji arytmetycznej i zastosowałem wzór kwadratowy, aby uzyskać wyrażenie
(1-a+((a-1)**2+4*s)**(.5))/2
, które pojawia się w kodzie. To, co wylicza, oblicza się, biorąc pod uwagę pożądaną sumęs
i pierwszy termin dla sekwencji arytmetyczneja
, długość sekwencji. Te długości są przechowywane w słowniku jako wartości do pierwszych haseł jako klucze.Następnie wszystkie wartości niecałkowite są usuwane ze słownika, ponieważ reprezentują one niepoprawne sekwencje. Stamtąd identyfikowana jest największa wartość
max(d.keys(), key=(lambda k: d[k]))
i tworzona jest sekwencja liczb nieparzystych w tej pozycji i na tej długościlist(range(int(m),int(m+2*d[m]),2))
.Szukam pomocy w grze w golfa, jeśli coś zobaczysz. Bardziej interesowało mnie, jak dobrze radzę sobie z nietrywialnym algorytmem; moja odpowiedź jest prawie dwa razy dłuższa niż najlepsze rozwiązanie Python.
źródło
Mathematica, 56 bajtów
Function
z pierwszym argumentem#
.Table[n,{n,1,#,2}]
oblicza listę dodatnich liczb nieparzystych mniejszych lub równych#
.Subsequences
zwraca wszystkie podsekwencje tej listy uporządkowane według długości. Następnie bierzemyCases
pasującex_/;Tr@x==#
sekwencje, to znaczyx
takie sekwencje , że ich sumaTr@x
jest równa wejściowej#
. Następnie przyjmujemyLast
taką sekwencję.źródło
JavaScript (ES6), 72 bajty
Zwraca ciąg nieparzystych liczb oddzielonych spacjami lub zgłasza nieprawidłowe dane wejściowe. Wersja 84-bajtowa, która zwraca tablicę (w razie potrzeby pustą):
Objaśnienie: Luźno oparty na rozwiązaniu awk @ Cabbie407 dla Sumów kolejnych liczb całkowitych, z wyjątkiem tego, że byłem w stanie zaoszczędzić kilka bajtów za pomocą rekurencji.
źródło
PHP, 78 bajtów
nieskończona pętla, jeśli nie ma rozwiązania. wstaw
?$b>$argn+2?$n=[]:1:0
po$s-$argn
zamiast wydrukować pustą tablicę.Uruchom
-nR
lub wypróbuj online .źródło
C # (.NET Core) , 129 bajtów
Wyświetla liczby w ciągu, rozdzielane spacjami (każdy inny znak wymagałby tylko zmiany
" "
). Dane wejściowe bez rozwiązania zwracają pusty ciąg znaków (chociaż jeśli ciągłe działanie bez błędu jest prawidłowym sposobem wskazania braku rozwiązania, można usunąć 17 bajtów, usuwającif(b==e)return"";
).Algorytm to:
źródło
(i)=>
asi=>
C++, 157 -> 147 Bytes
-10 Bytes thanks to DJMcMayhem
will return 0 if there's no answer, 1 otherwise
the last line it prints is the answer
ungolfed:
this is my first code golf ^^
źródło
int v=0;
zamiast,int v;....v=0;
a jeślistd::cout<<k<<"\n";
Kotlin, 152 bajty
Wypróbuj online (Zaczekaj 4-5 sekund, kompilator działa wolno)
Bez golfa
źródło
Excel VBA, 139 bajtów
Sub
routine that takes inputn
of expected type integer and reports the longest sequence of consecutive odd numbers to cell[A1]
źródło