Fabuła
Mam więc książkę, którą chcę oddzielić od stołu przy pomocy innych książek. Chcę wiedzieć, ile książek potrzebuję do osiągnięcia tego przy długości książek.
Oto wizualizacja, którą narysował dla mnie mój przyjaciel z Wolfram:
Więcej informacji na ten temat w Wolfram i Wikipedii .
Wyzwanie
Biorąc pod uwagę liczbę całkowitą , wypisz, ile książek potrzebnych było, aby najwyższa książka znajdowała się n w odległości od książki w poziomie. lub
Znajdź najmniejszą wartość całkowitą m dla wejścia n w następującej nierówności.
m ∑ i = 1 1
Edycja: dla ułamków użyj co najmniej zmiennoprzecinkowego pojedynczej precyzji IEEE. przepraszam za edycję wyzwania po opublikowaniu
( OEIS A014537 )
Przypadki testowe
1 4
2 31
3 227
5 12367
10 272400600
Odpowiedzi:
Oktawa ,
414033 bajtów1 bajt zapisany dzięki @Dennis
Wypróbuj online!
Wyjaśnienie
Wykorzystuje to fakt, że liczby harmoniczne mogą być ograniczone przez funkcję logarytmiczną.
Ponadto,
>=
porównanie może zostać zastąpiona>
, ponieważ Liczby harmoniczne nie może być nawet całkowite (dzięki, @Dennis!).źródło
Python 3 , 35 bajtów
Wypróbuj online!
źródło
Łuska , 8 bajtów
Wypróbuj online!
Ponieważ Husk używa liczb wymiernych, kiedy jest to możliwe, nie ma to problemów z liczbą zmiennoprzecinkową
Wyjaśnienie
źródło
JavaScript, 30 bajtów
Funkcja rekursywna, więc wyskoczy dość wcześnie.
Wypróbuj online
źródło
Haskell, 38 bajtów
źródło
Szybki , 65 bajtów
Wypróbuj online!
Nie golfił
źródło
R , 39 bajtów
Wypróbuj online!
Brutalna siła!
źródło
JavaScript (ES6), 34 bajty
Nie golfił
Przypadki testowe
Pokaż fragment kodu
źródło
eval
oświadczenie?eval
i
return
ed na końcu, kosztem jeszcze kilka bajtów.Galaretka , 8 bajtów
To jest bardzo wolne.
Wypróbuj online!
źródło
Haskell,
714948 bajtów@BMO uratowało mi aż 22 bajty!
źródło
Julia 0.6 ,
3027 bajtówWypróbuj online!
Działa tylko do
n = 6
, ponieważ Julia nie ma optymalizacji ogona.-3 bajty dzięki Dennisowi .
źródło
TI-BASIC, 27 bajtów
Monituje użytkownika o dane wejściowe i wyświetla dane wyjściowe po zakończeniu. Uwaga:
⁻¹
jest tokenem -1 (odwrotnym).źródło
Ans
sięN
od razu, toInput N
czyPrompt N
jest to metoda wprowadzania że oszczędza na jeden bajtAns→N
. IM
może być zastąpiony przezAns
, dzięki czemu1→M
staje się1
iM+1→M
stajeAns+1
. (Ale jestem sceptycznie nastawiony do wyjścia,Ans
które nie jest wyświetlane - zobacz to - więc może zakończenie:Ans
jest odpowiednie: wtedy wartość zostanie pokazana zamiast „Gotowe”.)Ans→N
że czuję się zabawnie. Niezłe optymalizacje. Skorzystałem również z twoich rad dotyczących produkcji, aby być bezpiecznym. Nadal wychodzi z -3 bajtami netto: D05AB1E , 11 bajtów
Wypróbuj online!
Wyjaśnienie
źródło
Pyth , 10 bajtów
Wypróbuj online!
Niezwykle wolno.
Pyth , 10 bajtów
Wypróbuj online!
źródło
Japt , 12 bajtów
Ta sama długość co, ale nieco bardziej wydajna niż opcja rekurencyjna.
Spróbuj
Wyjaśnienie
źródło
J, 22 bajty
-6 bajtów dzięki frownyfrog
Wypróbuj online!
oryginalna odpowiedź
Odpowiedź Luisa w J:
Nie golfił
Najbardziej ciekawy, czy można go radykalnie poprawić ( mile na kaszel )
Wyjaśnienie
Wypróbuj online!
źródło
1+]i.~[:<.
->1+]I.~
->I.~0,
I.~0+/\@,
PHP, 35 bajtów
Uruchom go za pomocą CLI:
źródło
Wolfram Language (Mathematica) , 40 bajtów
Wypróbuj online!
źródło
Java 8, 49 bajtów
Wyjaśnienie:
Wypróbuj online. (Przekroczono limit czasu dla przypadków testowych powyżej
n=7
.)źródło
tinylisp , 98 bajtów
Ostatni wiersz to nienazwana funkcja lambda, która pobiera liczbę długości książek i zwraca liczbę potrzebnych książek. Wypróbuj online!
Wyjaśnienie
Jedynym typem danych typu tinylisp są liczby całkowite, więc szereg harmonicznych obliczamy jako ułamek, śledząc licznik i mianownik. Na każdym kroku
N
jest licznikiem,D
mianownikiem ik
indeksem sumy. Chcemy, aby nowa suma częściowa byłaN/D + 1/k
, lub(N*k + D)/(D*k)
. W związku z tym powracamy z nowym licznikiemN*K + D
, nowym mianownikiemD*k
i nowym indeksemk+1
.Rekurencja powinna zostać zatrzymana, gdy suma częściowa będzie większa lub równa
#
pożądanej liczbie długości książek. W tym momencie zaszliśmy o jedną książkę za daleko, więc wracamyk-1
. Warunkiem jest1/2 * N/D < #
; mnożąc mianownik, otrzymujemyN < D*#*2
, co jest najbardziej golfowym sposobem na napisanie go.Funkcja rekurencyjnego pomocnika
_
wykonuje wszystkie te obliczenia; główną funkcją jest tylko jeden argument, który wywołuje wrapper_
z poprawnymi wartościami wyjściowymi dlak
,N
iD
.źródło