tło
Istnieje wspólna zagadka, która przebiega mniej więcej tak:
Ślimak znajduje się na dnie studni o długości 30 stóp. Każdego dnia ślimak może wspinać się na 3 stopy. W nocy, kiedy śpią, zsuwają się z powrotem o 2 stopy. Ile dni zajmuje ślimakowi wydostanie się ze studni?
Intuicyjna odpowiedź brzmi
30 dni, ponieważ ślimak wspina się 1 stopę dziennie przez 30 dni, aby dotrzeć na szczyt,
ale tak naprawdę odpowiedź brzmi
28 dni, ponieważ gdy ślimak znajdzie się 27 stóp w powietrzu (po 27 dniach), po prostu wspina się na pozostałe 3 stopy na szczyt 28 dnia.
Wyzwanie
To wyzwanie uogólnia tę zagadkę. Biorąc pod uwagę trzy dodatnie liczby całkowite jako dane wejściowe, reprezentujące całkowitą wysokość, wysokość wspinaczki i wysokość upadku, zwróć liczbę dni potrzebnych do wyjścia ze studni.
Jeśli ślimak nie może wydostać się ze studni, możesz zwrócić 0, zwrócić wartość fałszowania lub zgłosić wyjątek. Możesz także napisać kod, który zatrzyma się tylko wtedy, gdy istnieje rozwiązanie.
Jeśli chcesz, możesz przyjąć wysokość upadku jako ujemną liczbę całkowitą.
Przypadki testowe
(30, 3, 2) -> 28 (84, 17, 15) -> 35 (79, 15, 9) -> 12 (29, 17, 4) -> 2 (13, 18, 8) -> 1 (5, 5, 10) -> 1 (7, 7, 7) -> 1 (69, 3, 8) -> Brak (81, 14, 14) -> Brak
Punktacja
To jest golf golfowy , więc wygrywa najkrótsza odpowiedź w każdym języku.
źródło
Odpowiedzi:
Grey Snail , 1206 bajtów na numeryczne operacje we / wy, 149 bajtów na jednoargumentowe operacje we / wy
Dla zabawy. Skład pierwszego programu:
Weź numeryczne dane wejściowe i wyjściowe. Wejście jest
A
,B
,C
odpowiednio. W porównaniu do innych (bliskich)O(1)
odpowiedzi, kod ma złożonośćO(n)
. Ale w przypadku dużej liczby może to pochłonąć pamięć.Zawieś, jeśli nie zostanie znalezione rozwiązanie.
f
jest (być może) funkcją rekurencyjną przekształcającą liczby całkowite w kropki. Argument jest zapisywany[p]
i wyprowadzany w[o]
.U
to funkcja testującaS1>=S2
, przechowująca parametrB, A
podczas zapisywaniaA-B
doA
.Kod zaczynający się od
D
jest kodem pośredniczącym przekształcającym kropki w liczby.Podstawowa zasada jest taka sama w przypadku mojej odpowiedzi w języku C (odrywanie wyników fałszywych dla niemożliwych rozwiązań).
Wersja autonomiczna, 149
156157167170230bajty, obsługują tylko jednoargumentowe operacje we / wyDane wejściowe muszą być kropkami, np .
..........
Dla10
.U
obliczaA=A-B
i przeskakuje doD
kiedyA<=0
. W przeciwnym razie$
przypisujeA+C
sięA
i dzwoniU
.Zawieś, jeśli nie zostanie znalezione rozwiązanie.
Sztuczki: nadużywaj zdolności „kompilatora” do interpretowania pustego łańcucha. Możesz zerwać warunki w
GOTO
instrukcji, aby wykonać bezwarunkowe skoki i ta sama sztuczka działaPOP
.Uwaga: Mogę grać w golfa bardziej o 3 bajty, ale robiąc to, moja i WheatWizard miałyby dokładnie taką samą logikę. Wynikiem jest prawdopodobnie najkrótsze rozwiązanie GraySnail i próbuję to udowodnić.
źródło
C # (.NET Core) ,
3231 bajtówWypróbuj online!
Podejście rekurencyjne. Jeśli ślimak nie może uciec, kończy się następującym komunikatem:
Process is terminating due to StackOverflowException.
źródło
a<=b
sięa>b
i wymieniając się z następujących częścif=(a,b,c)=>a<=b?1:1+f(a-b+c,b,c)
f
używana w wywołaniu rekurencyjnym.f
i średnikiem, jeśli zostanie nazwany. Pierwszą rzeczą, jaką znalazłem, jest to, ale nie ma tutaj wyraźnego konsensusu.f=...
niepewna, czy na końcu powinniśmy dodać średnik.SZARY ŚLIMAK,
219206169167159156146 bajtów (jednoargumentowy IO)Myślę, że mogę trochę pograć w golfa.
źródło
JavaScript (ES6),
312827 bajtówZaoszczędź kilka bajtów dzięki @Arnauld
Nie zdawałem sobie sprawy, że możemy zawieść z wyjątkiem. Jestem pewien, że jest to optymalne:
Przypisz do zmiennej za pomocą np.
f=
Następnie wywołaj likef(climb)(fall)(height)
. Rzuca,InternalError: too much recursion
jeśli wspinaczka jest niemożliwa.JavaScript (ES6), 38 bajtów
Funkcja rekurencyjna, która zwraca liczbę dni lub
NaN
nigdy.Przypadki testowe
Pokaż fragment kodu
źródło
d=>u=>g=h=>h>u?1+g(h-u+d):1
g=
w środku, ponieważ ta zmienna przechowuje funkcję pośrednią potrzebną do wywołania rekurencyjnego. Dłuższa odpowiedź powoduje wywołanie rekurencyjnef
, które nakazuje uwzględnienie nazwy w liczbie bajtów.Excel,
5146 bajtów-1 bajt dzięki @ Scarabee .
-4, ponieważ INT (x) = FLOOR (x, 1)
Dane wejściowe pobrane odpowiednio z komórek A1, B1 i C1. Zwraca
FALSE
za nieprawidłowe scenariusze.źródło
ceiling(x)
jest zawsze równa-floor(-x)
, więc myślę, że możesz zaoszczędzić 1 bajt, zastępującCEILING((A1-B1)/(B1-C1)+1,1)
go-FLOOR((B1-A1)/(B1-C1)+1,1)
.C (gcc), 39
434446475860bajtyTylko w 32-bitowym GCC i wszystkie optymalizacje wyłączone.
Zwróć 0, gdy rozwiązanie jest niemożliwe. Zmodyfikowana wersja oryginalnego rozwiązania rekurencyjnego.
Zainspirowany rozwiązaniem @Jonah J i rozwiązaniem @CarlosAlejo C #.
Zaktualizuję rozszerzoną wersję później (po skończeniu mojej odpowiedzi Grey Snail).
źródło
Assign instead of return
Java (OpenJDK 8) , 35 bajtów
Wypróbuj online!
Matematyka wygrywa!
Kredyty
źródło
a-c-1
→a+~c
.Python 2 , 37 bajtów
Wypróbuj online!
W końcu moja wersja rekurencyjna spadła poniżej mojego standardowego obliczenia (przekazałem licznik do mojej funkcji zamiast dodawać jedną przed jej wywołaniem).
Python 2 , 43
46bajtyWypróbuj online!
Ogolono 3 bajty, zamieniając „__ i 1” na „__> 0”.
Za pomocą sztuczek logicznych zasadniczo wykonuje:
źródło
f=
podać kod (pierwsze rozwiązanie), a liczba bajtów wynosi 37, ponieważ jest rekurencyjna, więc nie możesz pozostawić go anonimowego.f=
może być upuszczony na lambda tylko wtedy, gdy nie jest on recusive.R, 43 bajty
Pożyczanie od innych odpowiedzi:
Podaje błąd, jeśli nie ma rozwiązania.
źródło
J, 25 bajtów
Najpierw fajne rozwiązanie, które jest oszustwem, ponieważ zakłada, że „cokolwiek innego niż dodatnia liczba całkowita” równa się „Brak”:
wyjaśnienie
2-/\
użyj okien o długości 2 w całym naszym 3 wejściowym elemencie, umieszczając między nimi znak minus, który na30 3 2
przykład zwraca27 1
%/
umieść symbol podziału między każdym elementem listy, w naszym przypadku lista zawiera tylko dwa elementy, więc oznacza to „podziel 27 przez 1”>:
przyrost o 1>.
weź sufitoficjalne rozwiązanie
Oto oficjalne rozwiązanie, które konwertuje negatywy i nieskończoność na 0, dla której części nie byłem w stanie znaleźć zadowalająco zwięzłego rozwiązania dla:
TIO
źródło
If the snail cannot climb out of the well, you may return 0, return a falsy value, or throw an exception.
W celu napisania przypadków testowych postanowiłem po prostuNone
zaznaczyć, że nie było odpowiedzi. Czy zastanowiłbyś się również nad dodaniem wyjaśnienia i linkiem Wypróbuj online?Perl 5 , 37 bajtów
Kod 35 bajtów +2 dla
-pa
.Wypróbuj online!
źródło
PHP> = 7,1, 60 bajtów
drukuje 0 dla braku ucieczki
PHP Sandbox Online
PHP> = 7,1, 67 bajtów
nie drukuje niczego bez ucieczki
PHP Sandbox Online
źródło
Mathematica,
474039 bajtów-7 bajtów z @KeyuGan
źródło
69, 3, 8
i⌈
liczony jest jako 3 bajty miarę myślę.Max
do zastąpieniaIf
instrukcji.If[#<=#2,1,Max[⌈(#-#3)/(#2-#3)⌉,0]]&
Rubinowy ,
4947 bajtówZgłasza wyjątek, jeśli ślimak nie może się wydostać
Wypróbuj online!
źródło
h-a<1?1:(1.0*(h-a)/[a-b,0].max+1).ceil
przechodzi przypadki testowe i zapisuje 9 bajtów.Partia, 66 bajtów
Drugi ostatni przypadek testowy nic nie wydrukował, a ostatni przypadek testowy faktycznie się zawiesił
CMD.EXE
...źródło
05AB1E , 19 bajtów
Wyjaśnienie:
W przypadku niepoprawnych wartości może to zwracać dowolną wartość mniejszą niż 1. Jednak w 05AB1E tylko 1 jest prawdą, więc spełnia to wymaganie, aby wyjście dla niepoprawnej wartości było fałszem.
Wypróbuj online!
źródło
PHP, 60 bajtów
wydruki
N
dlaNone
. Uruchom z-r
.źródło
05AB1E , 12 bajtów
Wypróbuj online!
Wydruki
0
jeśli jest to niemożliwe.Format wejściowy:
źródło
Japt , 12 bajtów
Przetestuj online!
Wyjścia
undefined
nigdy, po ewentualnym zawieszeniu przeglądarki na jakiś czas, więc bądź ostrożny.Nie jestem przekonany, że jest to optymalne.
oWV-W l
działa na wszystkich oprócz trzech ostatnich przypadków ...źródło
Haskell ,
3029 bajtówWypróbuj online!
Krótszy niż istniejąca odpowiedź Haskella. Być może ktoś inny może mnie pokonać.
Wykorzystuje to podejście rekurencyjne do rozwiązania problemu. Każda rekurencja jest zasadniczo dniem ruchu ślimaka. Jeśli pozostała odległość do końca jest mniejsza niż odległość, która jest jeszcze wymagana, kończymy naszą rekurencję.
źródło
(b#c)a=1+sum[(b#c)$a+c-b|a>b]
.b!c
w liście.QBIC ,
3123 bajtówWłaśnie zauważyłem, że wymagania się zmieniły. Ta wersja nie sprawdza, czy ślimak kiedykolwiek osiągnie szczyt studni.
Wyjaśnienie poniżej, dotyczące oryginalnej wersji, która sprawdza, czy istnieje rozwiązanie, obejmuje również wszystkie odpowiednie części tego kodu.
Oryginalna, 31-bajtowa odpowiedź:
Wyjaśnienie
Wypróbuj online! (OK, niezupełnie: jest to tłumaczenie kodu QBIC na kod QBasic uruchamiany w środowisku repl.it (nieco brakuje) QBasic)
źródło
Excel VBA, 47 bajtów
Anonimowa funkcja bezpośredniego okna VBE, która pobiera dane wejściowe z zakresu
[A1:C1]
odActiveSheet
wyjściowych obiektów do bezpośredniego okna VBETo przede wszystkim rozwiązanie oparte na formule Excel wydaje się być mniejsze niż każde rozwiązanie oparte wyłącznie na VBA, które mogę wymyślić :(
źródło
Haskell, 47
55bajtów (48, jeśli wymagana jest krotka)wariacja krotki
Wyjaśnienie
źródło
d>c||c<s
tylko na0<1
, jak już domyślnie robisz w swoim wyjaśnieniu, ponieważotherwise
jest to tylko synonimTrue
. 2. Połączenie rekurencyjne w twojej krotce jest nadal curry. 3. Możesz zdefiniować swoją funkcję jako(d#c)s
zamiastf d c s
zapisywania dwóch kolejnych bajtów.c<=s
zamiastc<s
.0
zamiast-1
dozwolonych przez OP daje 38 bajtów: Wypróbuj online!Python 3, 41 bajtów
Błąd dla Nigdy
Outgolf @veganaiZe
źródło
int(b>=a)
na1-(b<a)
2 bajty?APL (Dyalog) , 13 bajtów
Wypróbuj online!
Błędy przy dzieleniu przez zero, jeśli ślimak nie może wydostać się ze studni.
źródło
C # (.NET Core) , 37 bajtów
Nierekurencyjna lambda. Wykorzystuje wzór znaleziony tutaj . Można skrócić o 6 bajtów, jeśli „jakikolwiek wynik ujemny” jest prawidłowym sposobem na zwrócenie błędu; obecnie zwraca 0 zamiast tego.
źródło
h-f-1
może byćh+~f
.Python v2 i v3, 44 bajtów
^ Nieskończona rekurencja (błąd) dla przypadku Brak.
źródło
(x-z-1)//(y-z)+1
. Nie robię dużo Pythona, więc mogę się mylić ...f=
z liczby bajtów, usunąć niektóre spacje wokół ifs i els, i przejść do Pythona 2, gdzie dzielenie liczb całkowitych jest pojedynczym/
Programowalny kalkulator HP-15C, 26 bajtów
Trzy liczby są ładowane do stosu w kolejności przed uruchomieniem programu. Wysokość upadku jest wprowadzana jako liczba ujemna. Jeśli ślimak nie może wydostać się ze studni, wynikiem jest albo liczba ujemna, albo błąd nr 0 (błąd podziału zerowego).
Kody operacyjne szesnastkowe:
Znaczenie instrukcji:
Możesz wypróbować program za pomocą tego symulatora HP-15C .
źródło
Common Lisp, 49 bajtów
Wypróbuj online!
Funkcja rekurencyjna, przepełnienie stosu, jeśli nie znaleziono rozwiązania.
źródło
PowerShell ,
9594 bajtówWypróbuj online!
źródło