Przedmowa
W znanej kolędie Dwanaście dni świąt Bożego Narodzenia narrator otrzymuje codziennie kilka prezentów. Piosenka jest kumulatywna - w każdym wersecie dodawany jest nowy prezent, o jeden wyższy od prezentu przed nim. Jedna kuropatwa, dwie gołębie żółwiowe, trzy francuskie kury i tak dalej.
W dowolnym wierszu N możemy obliczyć łączną sumę prezentów do tej pory w piosence, znajdując N- tą liczbę czworościenną , która daje wyniki:
Verse 1: 1
Verse 2: 4
Verse 3: 10
Verse 4: 20
Verse 5: 35
Verse 6: 56
Verse 7: 84
Verse 8: 120
Verse 9: 165
Verse 10: 220
Verse 11: 286
Verse 12: 364
Na przykład po wersecie 4 mieliśmy 4 * (1 kuropatwa) , 3 * (2 turkawki) , 2 * (3 kury francuskie) i 1 * (4 wzywające ptaki) . Sumując je, otrzymujemy 4(1) + 3(2) + 2(3) + 1(4) = 20
.
Wyzwanie
Twoim zadaniem jest napisanie programu lub funkcji, która przy dodatniej liczbie całkowitej reprezentującej liczbę prezentów 364 ≥ p ≥ 1 , określa, który dzień (wiersz) Bożego Narodzenia jest.
Na przykład, jeśli p = 286 , jesteśmy w 11. dniu świąt Bożego Narodzenia. Jeśli jednak p = 287 , rozpoczęło się kolejne ładowanie prezentów, co oznacza, że jest to 12 dzień.
Matematycznie znajduje to kolejną liczbę czworościenną i zwraca jej pozycję w całej sekwencji liczb czworościennych.
Zasady:
- To jest golf golfowy , więc wygrywa najkrótsze rozwiązanie (w bajtach).
- Obowiązują standardowe luki w grze w golfa.
- Jeśli chodzi o dni, twój program musi mieć indeks 1.
- Twoje zgłoszenie musi być pełnym programem lub funkcją - ale nie fragmentem kodu.
Przypadki testowe
1 -> 1
5 -> 3
75 -> 7
100 -> 8
220 -> 10
221 -> 11
364 -> 12
źródło
x=>{while(x>p)p+=r+=++i;return i}
jestem pewien, że można go skrócić w języku takim jak JavaScript.Odpowiedzi:
Galaretka ,
76 bajtów-1 bajt dzięki Dennisowi (użyj minimum wektorowego
«
i pierwszego indeksui
)TryItOnline
W jaki sposób?
Nie wszystko tak wydajne - oblicza od 1 do n-tej liczby czworościennej w kolejności na liście i zwraca indeks oparty na 1 pierwszej, która jest równa lub większa.
Poprzednia 7 byters użyciem obniżony zakres
[0,1,2,3,...,n-1]
mniej i liczenia tetrahedrals niż n:Ḷ+\⁺<µS
,Ḷ+\⁺<ḅ1
,Ḷ+\⁺<ċ1
iḶ+\⁺<¹S
źródło
Python , 27 bajtów
Wypróbuj online!
Bezpośrednia formuła z pewnym dopasowaniem krzywej, taka sama jak oryginalna znaleziona przez Level River St.
Przesunięte równanie
i**3-i==n*6
jest zbliżone doi**3==n*6
dużegoi
. To rozwiązujei=(n*6)**(1/3)
. W razie potrzeby zabiera głos w dół, kompensując efekt off-by-one.Ale istnieje 6 danych wejściowych na granicach, gdzie błąd umieszcza go poniżej liczby całkowitej, którą powinien być powyżej. Wszystkie te można naprawić poprzez nieznaczne zwiększenie wykładnika bez wprowadzania dalszych błędów.
Python , 38 bajtów
Wzór
n=i*(i+1)*(i+2)/6
na liczby czworościenne można ładniej zapisaći+1
jakon*6=(i+1)**3-(i+1)
. Tak więc znajdujemy najniższąi
dla któreji**3-i<n*6
. Za każdym razem, gdy zwiększamyi
od 1, rekurencyjne wywołania zwiększają1
wynik. Zaczynając od,i=1
zamiasti=0
kompensować zmianę.źródło
**.33359
działa na jeden dodatkowy bajt.lambda n:n**.3336//.5501
oszczędza kilka bajtów.J , 12 bajtów
Może to być bardziej golfowy sposób, ale jest to świetna okazja, aby użyć wbudowanej funkcji inwersji J.
Wypróbuj online!
Jak to działa
źródło
Python , 22 bajty
Mocno zainspirowany odpowiedzią Python @ xnor .
Wypróbuj online!
źródło
Galaretka , 7 bajtów
Wypróbuj online!
Jak to działa
źródło
JavaScript (ES6), 33 bajty
Na podstawie rekurencyjnej formuły:
Drugie wyrażenie można również zapisać jako ...
... którego tu używamy.
a(i - 1)
jest faktycznie przechowywany wk
zmiennej i przekazywany do następnej iteracji dok >= n
.Przypadki testowe
Pokaż fragment kodu
źródło
Rubinowy, 26 bajtów
Edycja: wersja alternatywna, wciąż 26 bajtów
Orginalna wersja
Wykorzystuje to,
T(x) = x(x+1)(x+2)/6 = ((x+1)**3-(x+1))/6
co jest bardzo blisko(x+1)**3/6
.Funkcja po prostu mnoży przez 6, znajduje nieco ulepszoną wersję pierwiastka kostki (tak, wymagane jest 5 miejsc po przecinku) i zwraca wynik obcięty do liczby całkowitej.
Program testowy i wyjście
źródło
0.3336
wydaje się działać w oryginalnej wersji. (Edytuj: Nieważne, Dennis zaznacza, że zapomniałem o 364.)JavaScript,
3633 bajtów-3 bajty dzięki Lukeowi (funkcja curry)
Jest to nienazwana funkcja lambda, którą można przypisać
func
i wywołaćfunc(220)()
zgodnie z opisem w tym poście . Moja oryginalna funkcja bez curry wygląda następująco:Ta odpowiedź wykorzystuje fakt, że x- ta liczba czworościenna może być znaleziona za pomocą następującej funkcji:
Przesyłanie polega na rekurencyjnym zwiększaniu
i
i znajdowaniutetrahedral(i)
, aż będzie większe lub równen
(podanej liczbie prezentów).Po wywołaniu z jednym argumentem zgodnie z oczekiwaniami
i = undefined
, a zatem nie jest większy niżn
. Oznacza to, żef(n,-~i)
jest wykonywany i-~undefined
ocenia1
, co uruchamia rekurencję.Fragment testowy:
źródło
n=>g=i=>n<=i/6*++i*++i?i-2:g(~-i)
. Nazwałbyś to takf(2)()
.i=>n<=i
Piękny ;-)MATL ,
1211 bajtówWypróbuj online!
Wyjaśnienie
źródło
05AB1E , 10 bajtów
Wypróbuj online!
Wyjaśnienie
źródło
[N2Ý+P6÷¹Q#N>
miły.Pyke, 11 bajtów
Wypróbuj tutaj!
źródło
Mathematica, 26 bajtów
Nienazwana funkcja przyjmująca nieujemną liczbę całkowitą i zwracająca nieujemną liczbę całkowitą (tak, działa również na dzień
0
). Chcemy znaleźć najmniejszą liczbę całkowitą,i
dla której dane wejściowe#
są co najwyżeji(i+1)(i+2)/6
, czyli wzór na liczbę prezentów podanych w pierwszychi
dniach. Poprzez łagodną algebraiczną sztuczkę nierówność# ≤ i(i+1)(i+2)/6
jest równoważna(i+1) + 6# ≤ (i+1)^3
. Struktura0//.i_/;i+6#>i^3:>i+1
zaczyna się od a0
i dodaje,1
dopóki testi+6#>i^3
jest spełniony; następnie(...)-1&
odejmuje1
na końcu (zamiast wydawać bajty z nawiasami wewnątrz nierówności).Jeśli pozwolimy, aby 12 Dni Świąt Bożego Narodzenia trwało dalej, możemy obsłużyć około 65536 dni przed wbudowanym limitem rekurencji, aby
//.
zatrzymać proces ... to około 4,7 * 10 ^ 13 dni lub około dziesięciokrotnie wiek wszechświata do tej pory ....źródło
J , 9 bajtów
Wypróbuj online!
Jest to bardziej nieefektywne niż użycie odwrotności silni, ale zdarza się, że jest krótsze.
Na przykład, jeśli wejściowa liczba całkowita wynosi n = 5, określ zakres
[2, n+1]
.Są to pierwsze 5 liczb czworościennych. Następnym krokiem jest określenie, do którego przedziału (dnia) n należy. Istnieje n +1 = 6 przedziałów.
Zatem n = 5 należy do przedziału 3, który jest,
(4, 10]
a wynikiem jest 3.Wyjaśnienie
źródło
Python, 43 bajty
Zaoszczędź 5 bajtów dzięki @FlipTack i kolejne 3 dzięki @xnor !
źródło
f(220)=11
, co powinno byćf(220)=10
.and-~f(n,i+1)
zaand f(n,i+1)or i
. O dziwo, zwykle jest krótszy, gdy rekurencyjnie zliczasz zmienną, aby jej nie zwrócić, ale zamiast tego rekurencyjnie zwiększać wynik.Japt , 12 bajtów
Przetestuj online! lub Zweryfikuj wszystkie przypadki testowe jednocześnie
Jak to działa
Jest to uproszczenie formuły czworościennej, z której korzysta kilka innych odpowiedzi:
Podstawiając
x - 1
dox
, możemy znacznie uprościć ten:Dlatego poprawny wynik jest o jeden mniejszy od najmniejszej liczby całkowitej
x
takiej, która(x^3 - x) / 6
jest większa lub równa wartości wejściowej.Roztwór 13-bajtowy, zainspirowany @ XNOR za odpowiedź :
Jeszcze kilka rozwiązań @ETHproductions i bawiłem się
Sprawdź to tutaj .
źródło
SmileBASIC, 43 bajty
I
jest dniem,R
jesti
trzecią liczbą trójkątną iP
jesti
czwartą liczbą czworościenną (liczbą prezentów).Myślę, że podobna odpowiedź
x=>{while(x>p)p+=r+=++i;return i}
może być w innym języku: może być całkiem dobra.źródło
?I
na końcu, prawda?Python 3,
4846 bajtówźródło
221
spowoduje awarię.Mathematica,
3125 bajtówźródło
Haskell,
2123 bajtówEdycja: Jak wskazał xnor, oryginalne rozwiązanie (
floor.(/0.82).(**0.4)
) nie działało między świętami Bożego Narodzeniaźródło
Partia, 69 bajtów
Ręcznie oblicza liczby czworościanów.
źródło
Pyth 11 bajtów
Wypróbuj online!
właściwie przetłumaczono odpowiedź Dennisa na Pytha
źródło
R, 19 znaków
na podstawie odpowiedzi Xnora w
Python
.źródło
QBIC , 19 bajtów
To kradnie formułę @xnor:
Próbowałem obniżyć rozdzielczość do .3336, aby zapisać bajt, ale to nie powiedzie się na końcowym przypadku testowym.
źródło
Bash + bc, 44 bajty
źródło