Ślimak w studni

47

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 , więc wygrywa najkrótsza odpowiedź w każdym języku.

musicman523
źródło
Powiązane
Nie drzewo,
8
Prawdopodobnie przyznam nagrodę, jeśli ktoś odpowie w Gray Snail. Strona Esolangs to tylko pusty odcinek, ale dostępne są pewne informacje i dostępny kompilator online , a także przykładowy program dla 99 butelek problemu piwa .
musicman523
4
Myślałem, że to tylko prosta formuła, ale sprawa jest zaskakująco interesująca.
xnor
Nadal masz „ile godzin ....”. Odpowiedź brzmi: 27 * 24 + 12 (przy założeniu, że 12-godzinny „dzień”).
Francis Davey,
2
@WheatWizard Przyznam nagrodę za najkrótszą odpowiedź Gray Snail
musicman523

Odpowiedzi:

21

Grey Snail , 1206 bajtów na numeryczne operacje we / wy, 149 bajtów na jednoargumentowe operacje we / wy

Dla zabawy. Skład pierwszego programu:

  • 451 bajtów, konwertując liczbę na kropki
  • 121 bajtów, podstawowa funkcja (oddzielna wersja jest napisana poniżej)
  • 634 bajty, konwertując kropki na liczby

Weź numeryczne dane wejściowe i wyjściowe. Wejście jest A, B, Codpowiednio. 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.

INPUT p
POP Z r .!
f
POP Z o .
q
POP Z p [p]
GOTO [Z]
0
POP Z n .
GOTO w
1
POP Z n ..
GOTO w
2
POP Z n ...
GOTO w
3
POP Z n ....
GOTO w
4
POP Z n .....
GOTO w
5
POP Z n ......
GOTO w
6
POP Z n .......
GOTO w
7
POP Z n ........
GOTO w
8
POP Z n .........
GOTO w
9
POP Z n ..........
GOTO w
w
POP Z o .[o][o][o][o][o][o][o][o][o][o][n]
GOTO [r] [p] 
GOTO q
!
POP Z A .[o]
INPUT p
POP Z r .@
GOTO f
@
POP Z B .[o]
INPUT p
POP Z r .#
GOTO f
#
POP Z C .[o]
POP H N .[B]
U
POP Z A [A]
POP Z B [B]
GOTO D [A] 
GOTO $ [B] 
GOTO U
$
POP Z A .[A][C]
POP Z H ..[H]
POP Z B .[N]
GOTO U
D
POP Z r .
POP Z M .
POP Z N ...........
POP Z z .[N]
POP Z V .[H]
+
GOTO l[V] [H] 
POP Z H [H]
POP Z z [z]
GOTO ( [z] 
GOTO +
(
GOTO ) [H] 
POP Z z .[N]
POP Z M ..[M]
POP Z V .[H]
GOTO +
)
POP Z r .0[r]
POP Z M ..[M]
POP Z H .[M]
POP Z M .
POP Z V .[H]
POP Z z .[N]
GOTO +
l
POP Z r .0[r]
GOTO -
l.
POP Z r .1[r]
GOTO -
l..
POP Z r .2[r]
GOTO -
l...
POP Z r .3[r]
GOTO -
l....
POP Z r .4[r]
GOTO -
l.....
POP Z r .5[r]
GOTO -
l......
POP Z r .6[r]
GOTO -
l.......
POP Z r .7[r]
GOTO -
l........
POP Z r .8[r]
GOTO -
l.........
POP Z r .9[r]
GOTO -
-
GOTO / [M] 
POP Z H .[M]
POP Z M .
POP Z V .[H]
POP Z z .[N]
GOTO +
/
OUTPUT [r]

fjest (być może) funkcją rekurencyjną przekształcającą liczby całkowite w kropki. Argument jest zapisywany [p]i wyprowadzany w [o].

Uto funkcja testująca S1>=S2, przechowująca parametr B, Apodczas zapisywania A-Bdo A.

Kod zaczynający się od Djest 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 156 157 167 170 230 bajty, obsługują tylko jednoargumentowe operacje we / wy

Dane wejściowe muszą być kropkami, np . ..........Dla 10.

INPUT A
INPUT B
INPUT C
POP N H .
GOTO U
$
POP N A .[A][C]
POP Z H ..[H]
U
POP Z A [A]
POP Z N ..[N]
GOTO D [A] 
GOTO $ .[B] [N]
GOTO U
D
OUTPUT .[H]

Uoblicza A=A-Bi przeskakuje do Dkiedy A<=0. W przeciwnym razie $przypisuje A+Csię Ai dzwoni U.

Zawieś, jeśli nie zostanie znalezione rozwiązanie.

Sztuczki: nadużywaj zdolności „kompilatora” do interpretowania pustego łańcucha. Możesz zerwać warunki w GOTOinstrukcji, aby wykonać bezwarunkowe skoki i ta sama sztuczka działa POP.

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ć.

Keyu Gan
źródło
Zrobiłeś to pierwszy
Евгений Новиков
Hej, właśnie pomyślałem, że dam ci znać, że znowu sprawiłem, że moje są krótsze niż twoje. Jest tylko o bajt krótszy i czerpie inspirację z twojego najnowszego golfa.
Wheat Wizard
@WheatWizard Mam 155-bajtowe rozwiązanie oparte na starej odpowiedzi. Ale jeśli chodzi o sport, nie będę tego postrzegał jako mojej odpowiedzi.
Keyu Gan,
@KeyuGan Nie, śmiało. Nie dbam o przedstawiciela, chodzi o grę. Cieszę się, że mnie pokonano. Jeśli mój kod można zagrać w golfa, to moja wina, że ​​go nie widziałem. :)
Wheat Wizard
@WheatWizard Me ani. Jestem pewien, że to najlepszy czas, jaki kiedykolwiek miałem na PPCG.
Keyu Gan,
20

Uwaga: liczba bajtów jest kwestionowana przez Martina Endera w komentarzach. Wydaje się, że nie ma wyraźnego konsensusu co do tego, co zrobić z nazwanymi, rekurencyjnymi wyrażeniami lambda w odpowiedziach w języku C #. Zadałem więc na ten temat pytanie w Meta .

C # (.NET Core) , 32 31 bajtów

f=(a,b,c)=>a>b?1+f(a-b+c,b,c):1

Wypró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.

  • 1 bajt zapisany dzięki LiefdeWen!
Charlie
źródło
1
Można zapisać bajt bajt zmienia a<=bsię a>bi wymieniając się z następujących części
LiefdeWen
3
Dokładnie ten sam kod działa w ES6f=(a,b,c)=>a<=b?1:1+f(a-b+c,b,c)
Tushar
Musisz policzyć kod, który przypisuje funkcję do nazwy, jeśli polegasz na tym, że nazwa ta jest fużywana w wywołaniu rekurencyjnym.
Martin Ender
4
Nie gram w C #, więc nie jestem całkowicie pewien, jaki jest konsensus, ale spodziewałbym się, że będzie to wymagało pełnego oświadczenia z deklaracją fi średnikiem, jeśli zostanie nazwany. Pierwszą rzeczą, jaką znalazłem, jest to, ale nie ma tutaj wyraźnego konsensusu.
Martin Ender
2
@MartinEnder Zwykle robię tak, jak Carlos tutaj, ponieważ deklaracja jest tylko f=...niepewna, czy na końcu powinniśmy dodać średnik.
TheLethalCoder
13

SZARY ŚLIMAK, 219 206 169 167 159 156 146 bajtów (jednoargumentowy IO)

INPUT a
INPUT u
INPUT d
POP U c 
GOTO 1
3
POP f a [a][d]
POP U c ..[c]
1
GOTO 2 [a] 
GOTO 3 [U] [u]
POP f U ..[U]
POP f a [a]
GOTO 1
2
OUTPUT [c].

Myślę, że mogę trochę pograć w golfa.

Kreator pszenicy
źródło
Gratulacje!
Keyu Gan,
11

JavaScript (ES6), 31 28 27 bajtów

Zaoszczę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:

u=>d=>g=h=>h>u?1+g(h-u+d):1

Przypisz do zmiennej za pomocą np. f=Następnie wywołaj like f(climb)(fall)(height). Rzuca, InternalError: too much recursionjeśli wspinaczka jest niemożliwa.


JavaScript (ES6), 38 bajtów

f=(h,u,d=0)=>h>u?u>0?1+f(h-u,u-d):+f:1

Funkcja rekurencyjna, która zwraca liczbę dni lub NaNnigdy.

Przypadki testowe

ETHprodukcje
źródło
2
To oczywiste: jeśli ślimak wykonuje zbyt dużą rekurencję , wówczas wspinaczka jest niemożliwa. :)
Tushar,
1
Może 27 z odwróconą składnią curry? d=>u=>g=h=>h>u?1+g(h-u+d):1
Arnauld
@Arnauld Dzięki, to działa zaskakująco dobrze ...
ETHprodukcje
Jestem zdezorientowany, jeśli chodzi o liczbę bajtów - w jednej zmiennej jest przypisana funkcja t jest uwzględniona, a druga nie?
Wyświetl nazwę
@Orangesandlemons w najwyższej wersji, masz g=w środku, ponieważ ta zmienna przechowuje funkcję pośrednią potrzebną do wywołania rekurencyjnego. Dłuższa odpowiedź powoduje wywołanie rekurencyjne f, które nakazuje uwzględnienie nazwy w liczbie bajtów.
musicman523
10

Excel, 51 46 bajtów

-1 bajt dzięki @ Scarabee .

-4, ponieważ INT (x) = FLOOR (x, 1)

=IF(B1<A1,IF(C1<B1,-INT((B1-A1)/(B1-C1)-1)),1)

Dane wejściowe pobrane odpowiednio z komórek A1, B1 i C1. Zwraca FALSEza nieprawidłowe scenariusze.

Wernisch
źródło
ceiling(x)jest zawsze równa -floor(-x), więc myślę, że możesz zaoszczędzić 1 bajt, zastępując CEILING((A1-B1)/(B1-C1)+1,1)go -FLOOR((B1-A1)/(B1-C1)+1,1).
Scarabee
7

C (gcc), 39 43 44 46 47 58 60 bajty

Tylko w 32-bitowym GCC i wszystkie optymalizacje wyłączone.

f(a,b,c){a=a>b?b>c?1+f(a-b+c,b,c):0:1;}

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).

Keyu Gan
źródło
Niezłe! czy możesz dołączyć rozwiązanie analityczne (nieskompresowane)?
koita_pisw_sou
1
@koita_pisw_sou Pewnie.
Keyu Gan,
W ogóle nic nie „zwraca”. Przypisujesz parametr lokalny, którego wartość wyparowuje po powrocie funkcji. Ślimak utknął w wiecznej otchłani.
Cody Gray
@CodyGray używa stabilnego, ale niezdefiniowanego zachowania w GCC. Mogę pokazać ci link później.
Keyu Gan
@CodyGray codegolf.stackexchange.com/questions/2203/tips-for-golfing-in-c Assign instead of return
Keyu Gan
7

Java (OpenJDK 8) , 35 bajtów

(a,b,c)->b<a?c<b?(a+~c)/(b-c)+1:0:1

Wypróbuj online!

Matematyka wygrywa!

Kredyty

Olivier Grégoire
źródło
1
Minęło trochę czasu, ale a-c-1a+~c.
Kevin Cruijssen
1
Dzięki @KevinCruijssen Minęło trochę czasu, ale golf jest golfem, bez względu na to, kiedy to się stanie :-)
Olivier Grégoire
Dokładnie moje myśli. Kilkakrotnie grałem w golfa o połowę w stosunku do moich pierwotnych bajtów, kiedy spojrzałem na niektóre z moich pierwszych odpowiedzi. ;)
Kevin Cruijssen
5

Python 2 , 37 bajtów

f=lambda x,y,z:x-y<1or 1+f(x-y+z,y,z)

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 , 4346 bajty

#43 bytes
lambda x,y,z:y/x>0 or[1-(x-y)/(z-y),0][z/y]
#46 bytes
lambda x,y,z:y/x and 1or[1-(x-y)/(z-y),0][z/y]

Wypróbuj online!

Ogolono 3 bajty, zamieniając „__ i 1” na „__> 0”.

Za pomocą sztuczek logicznych zasadniczo wykonuje:

if floor(y/x) > 0:
    return True # == 1
elif floor(z/y) == 1:
    return 0
elif floor(z/y) == 0:
    return 1-floor((x-y)/(z-y))
    # Python 2 implicitly treats integer division as floor division
    # equivalent: 1 + math.ceil((y-x)/(z-y))
    # because: -floor(-x) == ceil(x)
Coty Johnathan Saxman
źródło
2
Musisz 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.
Pan Xcoder,
Zauważone i zaadresowane. Dzięki, że dałeś mi znać.
Coty Johnathan Saxman
4

R, 43 bajty

Pożyczanie od innych odpowiedzi:

g=function(a,b,c)`if`(b<a,1+g(a-b+c,b,c),1)

Podaje błąd, jeśli nie ma rozwiązania.

r2evans
źródło
Niezła odpowiedź. Witamy w PPCG!
musicman523,
3

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”:

>.>:%/2-/\

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 na 30 3 2przykł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ź sufit

oficjalne 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:

0:`[@.(>&0*<&_)>.>:%/2-/\

TIO

Jonasz
ź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 prostu Nonezaznaczyć, że nie było odpowiedzi. Czy zastanowiłbyś się również nad dodaniem wyjaśnienia i linkiem Wypróbuj online?
musicman523
@ musicman523 naprawiony i zrobiony.
Jonah
3

PHP> = 7,1, 60 bajtów

drukuje 0 dla braku ucieczki

[,$h,$u,$d]=$argv;echo$h>$u?$u>$d?ceil(($h-$d)/($u-$d)):0:1;

PHP Sandbox Online

PHP> = 7,1, 67 bajtów

nie drukuje niczego bez ucieczki

for([,$h,$u,$d]=$argv;($u>$d?:$h<=$u)&&0<$h+$t*$d-$u*++$t;);echo$t;

PHP Sandbox Online

Jörg Hülsermann
źródło
2

Mathematica, 47 40 39 bajtów

If[#==#2,1,⌈(#-#3)/(#2-#3)⌉~Max~0]&

-7 bajtów z @KeyuGan

J42161217
źródło
Trzeba radzić sobie z wejściem jak 69, 3, 8i liczony jest jako 3 bajty miarę myślę.
Keyu Gan,
wszystko naprawione! spróbuj teraz
J42161217,
możesz użyć Maxdo zastąpienia Ifinstrukcji. If[#<=#2,1,Max[⌈(#-#3)/(#2-#3)⌉,0]]&
Keyu Gan,
2

Rubinowy , 49 47 bajtów

->h,a,b{h-a<1?1:(1.0*(h-a)/[a-b,0].max+1).ceil}

Zgłasza wyjątek, jeśli ślimak nie może się wydostać

Wypróbuj online!

Alex
źródło
1
@Jonah naprawił to
Alex
Jakie jest uzasadnienie procedury? h-a<1?1:(1.0*(h-a)/[a-b,0].max+1).ceilprzechodzi przypadki testowe i zapisuje 9 bajtów.
Galen,
2

Partia, 66 bajtów

@set/an=%4+1,a=%1-%2+%3
@if %1 gtr %2 %0 %a% %2 %3 %n%
@echo %n%

Drugi ostatni przypadek testowy nic nie wydrukował, a ostatni przypadek testowy faktycznie się zawiesił CMD.EXE...

Neil
źródło
2

05AB1E , 19 bajtów

0[¼²+D¹<›i¾q}³-D1‹#

Wyjaśnienie:

0                   Initialise stack with 0
 [                  while(true)
  ¼                   increment the counter variable
   ²+                 add the second input to the top of the stack
     D¹<›i            if it is greater than or equal to the first input
          ¾             push the counter variable
           q            terminate the program
             }        end if
              ³-      subtract the third input from the top of the stack
                D     duplicate top of stack
                 1‹   if it is less than 1
                   #  break the loop

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!

Okx
źródło
2

PHP, 60 bajtów

[,$h,$v,$d]=$argv;echo$h>$v?$v>$d?ceil(($h-$d)/($v-$d)):N:1;

wydruki Ndla None. Uruchom z -r.

Tytus
źródło
2

05AB1E , 12 bajtów

.×ηO<²›1k2÷>

Wypróbuj online!

Wydruki 0 jeśli jest to niemożliwe.

Format wejściowy:

[climb, -fall]
height
Erik the Outgolfer
źródło
2

Japt , 12 bajtów

@UµV-W §W}aÄ

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 ldziała na wszystkich oprócz trzech ostatnich przypadków ...

ETHprodukcje
źródło
Przyszedł do tego przez 11 bajtów, zmieniając kolejność danych wejściowych.
Kudłaty
2

Haskell , 30 29 bajtów

(b!c)a=1+sum[(b!c)$a+c-b|a>b]

Wypró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ę.

Kreator pszenicy
źródło
Zapisz 1 bajt z notacją Infix: (b#c)a=1+sum[(b#c)$a+c-b|a>b].
Laikoni,
@Laikoni Nie wiedziałem, że można to zrobić. Dzięki za wskazówkę.
Wheat Wizard
Możesz upuścić pareny b!cw liście.
Zgarb
2

QBIC , 31 23 bajtów

Właśnie zauważyłem, że wymagania się zmieniły. Ta wersja nie sprawdza, czy ślimak kiedykolwiek osiągnie szczyt studni.

≈:-:>0|q=q+1┘a=a-b+:]?q

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ź:

~:>:|≈:-a>0|q=q+1┘c=c-a+b]?q\?0

Wyjaśnienie

~           IF
 :          cmd line arg 'a'  (the increment of our snail)
  >         is greater than
   :        cmd line arg 'b'  (the decrement, or daily drop)
    |       THEN
≈           WHILE
 :          cmd line arg 'c'  (the height of the well)
  -a        minus the increment (we count down the hieght-to-go)
    >0|     is greater than 0 (ie while we haven't reached the top yet)
q=q+1       Add a day to q (day counter, starts at 1)
┘           (syntactic linebreak)
c=c-a+b     Do the raise-and-drop on the height-to-go
]           WEND
?q          PRINT q (the number of days)
\?0         ELSE (incrementer <= decrementer) print 0 (no solution)

Wypróbuj online! (OK, niezupełnie: jest to tłumaczenie kodu QBIC na kod QBasic uruchamiany w środowisku repl.it (nieco brakuje) QBasic)

Steenbergh
źródło
2

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 VBE

To 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ć :(

?[If(B1>C1,-Int((B1-A1)/(B1-C1)-1),Int(A1=B1))]
Taylor Scott
źródło
1

Haskell, 47 55 bajtów (48, jeśli wymagana jest krotka)

f d c s|d<=c=1|c<s= -1|d>c||c<s=1+(f(d-c+s)c s)

wariacja krotki

f(d,c,s)|d<=c=1|c<s= -1|d>c||c<s=1+(f(d-c+s)c s)

Wyjaśnienie

f d c s       function that does all the heavy lifting =)
              d - depth
              c - climb per day
              s - slide per night

 |d<=c=1             recursion terminator. 1 day of climbing 
 |c<s= -1            possibility check. top can't be reached
 |otherwise=1+(f(d-c+s)c s)  1 day plus the rest of the distance
Sergii Martynenko Jr
źródło
1
1. Możesz zamienić d>c||c<stylko na 0<1, jak już domyślnie robisz w swoim wyjaśnieniu, ponieważ otherwisejest to tylko synonim True. 2. Połączenie rekurencyjne w twojej krotce jest nadal curry. 3. Możesz zdefiniować swoją funkcję jako (d#c)szamiast f d c szapisywania dwóch kolejnych bajtów.
Laikoni
1
Potrzebujesz także c<=szamiast c<s.
Laikoni
1
Zmiana kolejności i używanie 0zamiast -1dozwolonych przez OP daje 38 bajtów: Wypróbuj online!
Laikoni
1
Czy możesz użyć identyfikatora infix, aby zapisać jakieś bajty?
musicman523
Nie wiem, czy powinienem opublikować edytowany anser, ponieważ jest to niezbędna odpowiedź @ Laikoni
Sergii Martynenko Jr
1

Python 3, 41 bajtów

f=lambda a,b,c:int(b>=a)or 1+f(a-b+c,b,c)

Błąd dla Nigdy

Outgolf @veganaiZe

Alix Eisenhardt
źródło
1
Witamy w PPCG! Ładna pierwsza odpowiedź :)
musicman523
2
Nie znam dużo Pythona, ale czy możesz zmienić int(b>=a)na 1-(b<a)2 bajty?
ETHprodukcje
1

C # (.NET Core) , 37 bajtów

(h,c,f)=>h>c?f<c?1+(h-f-1)/(c-f):0:1;

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.

Kamil Drakari
źródło
Minęło trochę czasu, ale h-f-1może być h+~f.
Kevin Cruijssen
1

Python v2 i v3, 44 bajtów

f=lambda x,y,z:1+f(x-(y-z),y,z)if x>y else 1

^ Nieskończona rekurencja (błąd) dla przypadku Brak.

wegańskie
źródło
Możesz użyć lambda. Ponadto, wydaje się podobny do mojego (Java) Odpowiedź na to pozwalają mi zaproponować poprawę wzoru: (x-z-1)//(y-z)+1. Nie robię dużo Pythona, więc mogę się mylić ...
Olivier Grégoire,
Możesz wyeliminować 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/
musicman523
Dzięki @ musicman523. Skończyło się na tym, że skorzystałem z wszystkich twoich rad.
veganaiZe
1
Uświadomiłem sobie, że mój „czysty” kod (bez nieskończonej rekurencji) miał wiele problemów z narożnikami, gdy był używany z innymi danymi wejściowymi (tj. 4, 3, 8). @ musicman523 Myślę, że zaczynam widzieć „dowody”, o których mówisz.
veganaiZe
1

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:

C5 C1 B4 C5 FB 74 1A C4 FA B4 C5 FD C1 C1 A3 70 C6 F0 B4 FA EB F1 FA B2 0A F1

Znaczenie instrukcji:

x↔y 
ENTER
g R⬆
x↔y 
− 
g TEST x≤0 
GTO A
R⬇
+ 
g R⬆
x↔y 
÷ 
ENTER
ENTER
f FRAC
TEST x≠0 
EEX 
0 
g R⬆
+ 
g INT 
1 
+ 
g RTN 
f LBL A
1

Możesz wypróbować program za pomocą tego symulatora HP-15C .

Ryan
źródło
To jest niesamowite! Witamy w PPCG :)
musicman523,
1

Common Lisp, 49 bajtów

(defun f(a b c)(if(> a b)(1+(f(+(- a b)c)b c))1))

Wypróbuj online!

Funkcja rekurencyjna, przepełnienie stosu, jeśli nie znaleziono rozwiązania.

Renzo
źródło