Kuyudaki Salyangoz


47

Arka fon

Böyle bir şey gider ortak bir bilmece var:

Bir salyangoz 30 ayak kuyusunun dibinde. Her gün salyangoz 3 metreye tırmanabilir. Geceleri uyudukları zaman 2 metre geriye kayıyorlar. Salyangozun kuyunun dışına çıkması kaç gün sürer?

Sezgisel cevap

30 gün, çünkü salyangoz 30 gün boyunca günde 1 ayağa tırmanıyor,

ama aslında cevap

28 gün, çünkü salyangoz bir kez havada 27 feet (27 gün sonra) kaldıklarında, 28. günde geriye kalan 3 feet yukarı tırmanacaklar.

Meydan okuma

Bu zorluk bu bilmeceyi genelleştirir. Girdi olarak üç pozitif tamsayı verildiğinde, toplam yüksekliği, tırmanma yüksekliğini ve düşme yüksekliğini temsil eden kuyudan çıkması için gereken gün sayısını döndürün.

Salyangoz kuyudan çıkamıyorsa, 0 döndürebilir, sahte bir değer döndürebilir veya bir istisna atabilirsiniz. Ayrıca, yalnızca bir çözüm varsa ve duracak olan bir kod da yazabilirsiniz.

İsterseniz, düşme yüksekliğini negatif bir tamsayı olarak alabilirsiniz.

Test Kılıfları

(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) -> Yok
(81, 14, 14) -> Yok

puanlama

Bu , yani her dilde en kısa cevap kazanır.



8
Biri Gray Salyangoz'da cevaplarsa muhtemelen ödül alırım. Esolangs sayfa sadece boş saplama, ancak orada bazı bilgiler ve kullanılabilir bir online derleyici yanı sıra bira sorunun 99 şişe için örnek bir programdır .
musicman523

4
Bunun basit bir formül olacağını düşünmüştüm, ama vaka işi şaşırtıcı derecede ilginç.
xnor

Hala "kaç saatiniz var ...". Cevap 27 * 24 + 12'dir (12 saatlik bir 'gün' varsayılır).
Francis Davey

2
@WheatWizard En kısa Gri Salyangoz yanıtına ödül vereceğim
musicman523

Yanıtlar:


21

Gri Salyangoz , sayısal G / Ç için 1206 bayt, tekli G / Ç için 149 bayt

Eğlence için. İlk programın bileşimi:

  • 451 bayt, sayıyı noktalara dönüştürme
  • 121 bayt, çekirdek işlevi (aşağıda ayrı bir sürüm yazılmıştır)
  • 634 bayt, noktaları sayıya dönüştürme

Sayısal giriş ve çıkış yapın. Girdi olup A, B, Csırasıyla. Diğer (yakın) O(1)cevapla karşılaştırıldığında, kodun karmaşıklığı vardır O(n). Fakat çok sayıda kişi için önce belleğinizi tüketebilir.

Bir çözüm bulunamazsa askıya alın.

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]

ftamsayıları noktalara dönüştürmek için (belki) özyinelemeli bir işlevdir. Argüman kaydedilir [p]ve girilir [o].

Uiçine kaydederken S1>=S2parametrenin depolandığı bir fonksiyon testidir .B, AA-BA

Baştan kod D, noktaları sayılara dönüştüren bir saplamadır.

Temel prensibi benim C cevabı ile aynıdır (imkansız çözümler için sahte çıktı çıkarmak).

Bağımsız sürüm, 149 156 157 167 170 230 bayt, yalnızca normal G / Ç’leri destekler

Girdi ihtiyaçlar örneğin noktalar, olmak ..........üzere 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]

Uhesaplar A=A-Bve Dne zaman atlar A<=0. Aksi $atar A+Cetmek Ave çağrı U.

Bir çözüm bulunamazsa askıya alın.

Püf noktaları: "derleyici" nin boş dize yorumlama becerisini kötüye kullanma. GOTOKoşulsuz atlamalar yapmak için koşulları aynı şekilde ifade edebilirsiniz ve aynı hile işe yarar POP.

Not: Daha fazla 3 byte golf oynayabilirim ama bunu yaparak, benimki ve WheatWizard'ın cevabı aynı mantığa sahip olacaktı. Sonuç muhtemelen en kısa GraySnail çözümüdür ve bunu kanıtlamaya çalışıyorum.


Önce sen yaptın
Евгений Новиков

Hey, ben sadece seninkinden daha kısa bir süredir benim yaptığımı söyleyeyim dedim. Sadece bir bayt kısalır ve en son golfünüzden ilham alır.
Buğday Sihirbazı,

@WheatWizard Eski cevabınıza dayanarak 155 baytlık bir çözüme sahibim. Ancak spor için, cevabım olarak görmeyeceğim.
Keyu Gan

@KeyuGan Hayır, devam et. Temsilcisi umurumda değil, hepsi oyunla ilgili. Dövüldüğüm için mutluyum. Eğer kodum golf edilebiliyorsa, onu görmemem benim suçum. :)
Buğday Sihirbazı

@WheatWizard Ben de. PPCG'de geçirdiğim en iyi zaman olduğuna eminim.
Keyu Gan

20

Not: Bayt sayısı yorumlarda Martin Ender tarafından sorgulanıyor. C # cevaplarında, özyinelemeli lambda ifadeleri ile ne yapılması gerektiği konusunda net bir fikir birliği yok gibi görünüyor. Bu yüzden Meta hakkında bir soru sordum .

C # (.NET Core) , 32 31 bayt

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

Çevrimiçi deneyin!

Özyinelemeli bir yaklaşım. Salyangoz kaçamazsa, aşağıdaki mesajla biter:Process is terminating due to StackOverflowException.

  • LiefdeWen sayesinde 1 bayt kurtarıldı!

1
Sen değişen bir bayt bayt kaydedebilirsiniz a<=biçin a>başağıdaki parçalar ve takas
LiefdeWen

3
Tam olarak aynı kod ES6'da çalışıyorf=(a,b,c)=>a<=b?1:1+f(a-b+c,b,c)
Tushar

fÖzyinelemeli çağrı için bu adaya güveniyorsanız, işlevi bir ada atanan kodu saymanız gerekir .
Martin Ender

4
C # 'da golf oynamıyorum, bu yüzden fikir birliğinin ne olduğundan tam olarak emin değilim, ancak fisminin beyanı ve noktalı virgül ile tam bir ifade gerektirmesini beklerdim. Bulduğum ilk şey bu ama burada net bir fikir birliği yok.
Martin Ender

2
@MartinEnder Genellikle Carlos'un yaptığı gibi yapıyorum, çünkü bildiri sadece sonuna kadar noktalı f=...virgül ekleyip eklemememiz konusunda emin değilim.
TheLethalCoder

13

GREY SNAIL, 219 206 169 167 159 156 156 146 bayt (birleşik 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].

Galiba bunu biraz aşağıya golf oynayabilirim.


Tebrikler!
Keyu Gan

11

JavaScript (ES6), 31 28 27 bayt

@Arnauld sayesinde birkaç byte kaydedildi

Bir istisna ile başarısız olabileceğimizi farketmemiştim. Bunun optimal olduğuna eminim:

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

Örneğin bir değişkene atayın f=, sonra çağrı yapın f(climb)(fall)(height). InternalError: too much recursionTırmanış mümkün değilse fırlatır .


JavaScript (ES6), 38 bayt

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

Gün sayısını döndüren veya NaNhiçbir zaman almayan özyinelemeli bir işlev .

Test durumları


2
Bu açık: Salyangoz çok fazla özyineleme yaparsa , tırmanış mümkün değildir. :)
Tushar

1
Belki 27, tersine bir kıvrılma sözdizimi vardır? d=>u=>g=h=>h>u?1+g(h-u+d):1
Arnauld,

@Arnauld Teşekkürler, bu şaşırtıcı derecede iyi çalışıyor ...
ETHproductions

Kafam karıştı, bayt sayılır, bunlardan birinde fonksiyona atanan değişken dahil, diğeri değil mi?
Görünen ad

En üst sürümde @Orangesandlemons, bu g=ortada, çünkü bu değişken özyinelemeli çağrı için gerekli ara işlevi saklar. Uzun cevap f, ismin bayt sayımına dahil edilmesini zorunlu tutan bir özyinelemeli çağrı yapar .
musicman523

10

Excel, 51 46 bayt

@ Scarabee sayesinde -1 bayt .

-4 çünkü INT (x) = KAT (x, 1)

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

Girdi sırasıyla Hücreler A1, B1 ve C1'den alınmıştır. İade FALSEgeçersiz senaryolar için.


ceiling(x)her zaman için eşit -floor(-x)seni değiştirerek 1 byte kurtarabilecek düşünüyorum bu yüzden, CEILING((A1-B1)/(B1-C1)+1,1)ile -FLOOR((B1-A1)/(B1-C1)+1,1).
Scarabee

7

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

Yalnızca 32 bit GCC ve tüm optimizasyonlarda kapalı.

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

Çözüm mümkün olmadığında 0 döndür. Özyinelemeli özyinelemeli çözümün değiştirilmiş bir versiyonu.

@Jonah J çözeltisi ve @CarlosAlejo C # çözeltisinden esinlenmiştir.

Genişletilmiş sürümü daha sonra güncelleyeceğim (Gri Salyangoz yanıtımı tamamladıktan sonra).


Güzel! Lütfen analitik (sıkıştırılmamış) çözümü dahil edebilir misiniz?
koita_pisw_sou

1
@koita_pisw_sou Tabii.
Keyu Gan

Hiçbir şey "iade" etmez. İşlev döndüğünde değeri buharlaşan yerel bir parametreye atarsınız. Salyangoz sonsuz limboda kalmış.
Cody Gray,

@CodyGray, GCC'de kararlı ama tanımsız bir davranış kullanır. Size daha sonra bir bağlantı gösterebilirim.
Keyu Gan



5

Python 2 , 37 bayt

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

Çevrimiçi deneyin!

Sonunda özyinelemeli versiyonumu standart hesaplamamın altına aldım (çağırmadan önce bir tane eklemek yerine fonksiyonuma bir sayı aktarıyordum).

Python 2 , 4346 bayt

#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]

Çevrimiçi deneyin!

"__> 0" için "__ ve 1" ticareti yaparak 3 byte'lık tıraş yapıldı.

Boole kandırıcılığını kullanarak, esas olarak:

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)

2
f=Kodunuzun önüne koymak zorundasınız (ilk çözüm) ve bayt sayınız 37 olur, çünkü özyinelemelidir, bu yüzden isimsiz bırakamazsınız. f=Bir lambda için ancak alıcı olmadığında düşürülebilir.
Bay Xcoder

Kaydetti ve adreslendi. Bilmeme izin verdiğin için teşekkürler.
Coty Johnathan Saxman,

4

R, 43 bayt

Diğer cevaplardan borçlanma:

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

Çözüm yoksa hata verir.


Güzel cevap PPCG'ye Hoşgeldiniz!
musicman523

3

J, 25 bayt

Öncelikle "olumlu bir tamsayı sonucundan başka bir şeyin" "Yok" e eşit olduğunu varsaydığı için aldatma olan güzel bir çözüm:

>.>:%/2-/\

açıklama

  • 2-/\3 öğe girişinde 2 uzunluğunda pencereler kullanın, her biri arasına eksi işareti koyarak 30 3 2, örneğin27 1
  • %/ Listenin her elemanı arasına bir bölme sembolü koyun, bizim durumumuzda listede sadece iki öğe var, yani "27'ye 1'e böl" demek
  • >: 1 oranında artış
  • >. tavanı al

resmi çözüm

Negatifleri ve sonsuzları 0'a çeviren resmi bir çözüm: işte bunun için tatmin edici bir özlem bulamadım:

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

TIO


If the snail cannot climb out of the well, you may return 0, return a falsy value, or throw an exception.Test senaryolarını yazmak için basitçe Nonecevap olmadığını belirtmeyi seçtim . Ayrıca bir açıklama ve Çevrimiçi Deneyin bağlantısını eklemeyi düşünür müsünüz?
musicman523

@ musicman523 düzeltildi ve yapıldı.
Jonah



2

Mathematica, 47 40 39 bayt

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

@KeyuGan adlı kullanıcıdan -7 bayt


Girdi ile başa çıkmak gerekir 69, 3, 8ve sanırım 3 bayt olarak sayılır.
Keyu Gan

hepsi düzeltildi! şimdi dene
J42161217

deyimi Maxdeğiştirmek için kullanabilirsiniz If. If[#<=#2,1,Max[⌈(#-#3)/(#2-#3)⌉,0]]&
Keyu Gan

2

Ruby , 49 47 bayt

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

Salyangoz çıkamazsa istisna atar

Çevrimiçi deneyin!


1
@Jonah tamir etti
Alex

Proc'un arkasındaki sebep nedir? h-a<1?1:(1.0*(h-a)/[a-b,0].max+1).ceilTest durumlarını geçer ve 9 bayt kaydeder.
Galen

2

Toplu iş, 66 bayt

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

İkinci son test olayı hiçbir şey basmadı ve son test olayı gerçekten düştü CMD.EXE...


2

05AB1E , 19 bayt

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

Açıklama:

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

Geçersiz değerler için bu değer 1'den küçük herhangi bir değere geri dönebilir. Ancak, 05AB1E'de yalnızca 1 doğrudur, bu nedenle geçersiz bir değerin çıktısının sahte olması şartını yerine getirir.

Çevrimiçi deneyin!


2

PHP, 60 bayt

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

baskılar Niçin None. İle koş -r.



2

Japt , 12 bayt

@UµV-W §W}aÄ

Çevrimiçi test edin!

undefinedTarayıcınızı bir süre için dondurduktan sonra asla çıkmayan çıktılar , bu yüzden lütfen dikkatli olun.

Bunun optimal olduğuna ikna olmadım. oWV-W lSon üç dava dışında hepsi üzerinde çalışıyor ...


Bu girişleri sırasını değiştirerek 11 bayt için geldi .
Shaggy

2

Haskell , 30 29 bayt

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

Çevrimiçi deneyin!

Mevcut Haskell cevabından daha kısa. Belki başka biri beni yenebilir.

Bu problemi çözmek için özyinelemeli bir yaklaşım kullanır. Her özyineleme esasen salyangoz için bir hareket günüdür. Sona kalan mesafe hala gereken mesafeden daha azsa, özyinelememize son veririz.


İnfix gösterimi ile Kaydet 1 bayt: (b#c)a=1+sum[(b#c)$a+c-b|a>b].
Laikoni,

@Likonikoni bunun yapılabileceğini bilmiyordum. Bahşiş için teşekkürler.
Buğday Sihirbazı,

Parenleri b!clistedeki kavramada bırakabilirsiniz .
Zgarb

2

QBIC , 31 23 bayt

Değişen gereksinimlerin farkına vardım. Bu sürüm salyangoz hiç kuyunun üstüne gelip gelmeyeceğini kontrol etmez.

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

Bir çözüm olup olmadığını kontrol eden orijinal versiyon için aşağıdaki açıklama bu kodun tüm ilgili kısımlarını da kapsar.


Orijinal, 31 baytlık cevap:

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

açıklama

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

Çevrimiçi deneyin! (Tamam, tam olarak değil: bu, QBIC'in repl.it 'in (biraz eksik) QBasic ortamındaki çalıştırdığı QBasic koduna çevirisidir)


2

Excel VBA, 47 Bayt

Mesafeden girdi alır Anonim vbe hemen pencere fonksiyonu [A1:C1]ile ilgili ActiveSheetvbe hemen pencerede nesne çıkışları

Bu öncelikle Excel formül tabanlı çözüm, bulabildiğim tamamen VBA çözümlerinden daha küçük görünüyor :(

?[If(B1>C1,-Int((B1-A1)/(B1-C1)-1),Int(A1=B1))]

1

Haskell, 47 55 bayt (demet gerekiyorsa 48)

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

zincir değişimi

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

açıklama

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

1
1. yerine d>c||c<ssadece birlikte 0<1zaten örtük sizin açıklamasında olduğu gibi, çünkü otherwisesadece bir eş anlamlıdır True. 2. Tuple versiyonunuzdaki özyinelemeli çağrı hala curried. 3. İki bayt daha kaydetmek (d#c)syerine, işlevinizi tanımlayabilirsiniz f d c s.
Laikoni

1
Bunun c<=syerine de ihtiyacınız var c<s.
Laikoni

1
Yeniden sıralama ve kullanma 0yerine -1OP izin verdiği 38 byte verir: çevrimiçi deneyin!
Laikoni

1
Herhangi bir baytı kaydetmek için bir infix tanımlayıcısı kullanabilir misiniz?
musicman523

Bilmiyorum, eğer esastır çünkü düzenlenmiş anser yayınlamalıysam @ Laikoni'nin cevabı
Sergii Martynenko Jr



1

C # (.NET Core) , 37 bayt

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

Özyinelemeli olmayan lambda. Burada bulunan formülü kullanır . "Herhangi bir olumsuz sonuç", başarısızlık döndürmenin geçerli bir yoluysa, 6 bayt kısaltılabilir; şu anda 0 yerine döner.


Uzun zaman oldu ama h-f-1olabilir h+~f.
Kevin Cruijssen

1

Python v2 ve v3, 44 Bayt

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

^ Hiçbir durum için sonsuz özyineleme (hata).


Lamda kullanabilirsiniz. Ayrıca, bu yüzden beni formülde bir iyileşme önermek için izin benim (Java) cevap benzer görünüyor: (x-z-1)//(y-z)+1. Çok Python yapmıyorum, bu yüzden yanlış olabilirim ...
Olivier Grégoire

Sen ortadan kaldırabilir f=tamsayı bölme tek olduğu, bayt sayısından IFS ve birinin etrafında bazı boşlukları kaldırın ve Python 2'ye geçiş/
musicman523

@ Musicman523 'e teşekkür ederiz. Ben alarak sona erdi tüm senin tavsiye.
veganaiZe

1
"Temiz" (sonsuz özyineleme yok) kodumun, diğer girdilerle kullanıldığında çok sayıda köşe çalışması sorunu olduğunu fark ettim (ör. 4, 3, 8). @ musicman523 Sanırım bahsettiğiniz "kanıtları" görmeye başladım.
veganaiZe

1

HP-15C Programlanabilir Hesap Makinesi, 26 Bayt

Programı çalıştırmadan önce üç sayı yığına yüklenir. Düşme yüksekliği negatif bir sayı olarak girilir. Salyangoz kuyunun dışına çıkamazsa, sonuç negatif bir sayı veya # 0 hatasıdır (sıfır bölme hatası).

Onaltılı Op kodları:

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

Öğretim anlamları:

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

Programı bu HP-15C simülatörüyle deneyebilirsiniz .


Bu harika! PPCG'ye Hoşgeldiniz :)
musicman523

1

Ortak Lisp, 49 bayt

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

Çevrimiçi deneyin!

Özyinelemeli işlev, çözüm bulunamadıysa yığın taşması.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.