Siput di Sumur

47

Latar Belakang

Ada teka-teki umum yang berbunyi seperti ini:

Seekor siput berada di dasar sumur 30 kaki. Setiap hari siput mampu memanjat 3 kaki. Pada malam hari ketika mereka tidur, mereka meluncur turun 2 kaki. Berapa hari yang dibutuhkan siput untuk keluar dari sumur?

Jawaban intuitifnya adalah

30 hari, karena siput naik 1 kaki per hari selama 30 hari untuk mencapai puncak,

tetapi sebenarnya jawabannya adalah

28 hari, karena begitu siput 27 kaki di udara (setelah 27 hari), mereka hanya akan memanjat 3 kaki yang tersisa ke atas pada hari ke 28.

Tantangan

Tantangan ini menggeneralisasikan teka-teki ini. Diberikan tiga bilangan bulat positif sebagai input, mewakili tinggi total, tinggi pendakian, dan tinggi jatuh, kembalikan jumlah hari yang diperlukan untuk keluar dari sumur.

Jika siput tidak dapat keluar dari sumur, Anda dapat mengembalikan 0, mengembalikan nilai palsu, atau melemparkan pengecualian. Anda juga dapat menulis kode yang akan berhenti jika dan hanya jika ada solusi.

Jika mau, Anda dapat menganggap tinggi jatuh sebagai bilangan bulat negatif.

Uji Kasus

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

Mencetak gol

Ini adalah , jadi jawaban tersingkat di setiap bahasa menang.

musicman523
sumber
Terkait
Bukan pohon
8
Saya mungkin akan memberikan hadiah jika seseorang menjawab dalam Gray Snail. The Halaman Esolangs hanya sebuah rintisan kosong, tapi ada beberapa informasi dan compiler online yang tersedia , serta contoh program untuk 99 botol masalah bir .
musicman523
4
Saya pikir ini hanya akan menjadi formula sederhana, tetapi pekerjaannya secara mengejutkan menarik.
xnor
Anda masih memiliki "berapa jam ....". Jawabannya adalah 27 * 24 + 12 (dengan asumsi 12 jam 'hari').
Francis Davey
2
@WheatWizard Saya akan menghadiahkan hadiah untuk jawaban Gray Snail tersingkat
musicman523

Jawaban:

21

Grey Snail , 1206 byte untuk I / O numerik, 149 byte untuk I / O unary

Untuk kesenangan. Komposisi program pertama:

  • 451 byte, mengonversi angka menjadi titik-titik
  • 121 byte, fungsi inti (versi yang terpisah ditulis di bawah)
  • 634 byte, mengubah titik menjadi angka

Ambil input dan output numerik. Input adalah A, B, Cmasing-masing. Dibandingkan dengan O(1)jawaban lain (dekat) , kode ini memiliki kompleksitas O(n). Tetapi untuk jumlah yang besar, itu mungkin menghabiskan memori Anda terlebih dahulu.

Tunggu jika tidak ada solusi yang ditemukan.

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]

fadalah fungsi (mungkin) rekursif untuk mengubah bilangan bulat menjadi titik-titik. Argumen disimpan dalam [p]dan output dalam [o].

Uadalah pengujian fungsi S1>=S2, menyimpan parameter B, Asementara menyimpan A-Bke A.

Kode mulai dari Dadalah sebuah rintisan yang mengubah titik menjadi angka.

Prinsip dasarnya adalah sama dengan jawaban C saya (merobek output palsu untuk solusi yang tidak mungkin).

Versi mandiri, 149 156 157 167 170 230 byte, hanya mendukung I / O unary

Input harus berupa titik, misalnya ..........untuk 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]

Umenghitung A=A-B, dan melompat ke Dkapan A<=0. Jika tidak $memberikan A+Cke Adan panggilan U.

Tunggu jika tidak ada solusi yang ditemukan.

Trik: menyalahgunakan kemampuan "kompiler" untuk menafsirkan string kosong. Anda dapat merobek kondisi dalam GOTOpernyataan untuk membuat lompatan tanpa syarat dan trik yang sama berhasil POP.

Catatan: Saya dapat golf lebih dari 3 byte tetapi dengan melakukannya, jawaban saya dan WheatWizard akan memiliki logika yang sama persis. Hasilnya mungkin solusi GraySnail terpendek dan saya mencoba untuk membuktikannya.

Keyu Gan
sumber
Anda membuatnya lebih dulu
Евгений Новиков
Hei, aku hanya berpikir aku akan memberitahumu bahwa aku telah membuat milikku lebih pendek dari milikmu lagi. Ini hanya satu byte lebih pendek dan menarik beberapa inspirasi dari golf terbaru Anda.
Wheat Wizard
@WheatWizard Saya memiliki solusi 155-byte berdasarkan jawaban lama Anda. Tetapi untuk sportivitas, saya tidak akan melihatnya sebagai jawaban saya.
Keyu Gan
@KeyuGan Tidak, silakan. Saya tidak peduli tentang rep semua tentang permainan. Saya senang dipukuli. Jika kode saya dapat di-golf adalah kesalahan saya karena tidak melihatnya. :)
Wheat Wizard
@WheatWizard Me juga. Saya yakin ini adalah waktu terbaik yang pernah saya miliki di PPCG.
Keyu Gan
20

Catatan: jumlah byte dipertanyakan oleh Martin Ender dalam komentar. Tampaknya tidak ada konsensus yang jelas tentang apa yang harus dilakukan dengan nama, ekspresi lambda rekursif dalam jawaban C #. Jadi saya telah mengajukan pertanyaan di Meta tentang hal itu.

C # (.NET Core) , 32 31 byte

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

Cobalah online!

Pendekatan rekursif. Jika siput tidak dapat melarikan diri, itu berakhir dengan pesan berikut:Process is terminating due to StackOverflowException.

  • 1 byte disimpan berkat LiefdeWen!
Charlie
sumber
1
Anda dapat menyimpan byte byte yang diubah a<=bke a>bdan menukar bagian-bagian berikut
LiefdeWen
3
Kode yang sama persis berfungsi di ES6f=(a,b,c)=>a<=b?1:1+f(a-b+c,b,c)
Tushar
Anda harus menghitung kode yang menetapkan fungsi ke nama jika Anda mengandalkan nama itu funtuk panggilan rekursif.
Martin Ender
4
Saya tidak bermain golf di C # jadi saya tidak sepenuhnya yakin apa konsensus itu, tapi saya akan mengharapkan ini membutuhkan pernyataan lengkap dengan deklarasi fdan tanda titik koma jika namanya. Hal pertama yang saya temukan adalah ini tetapi tidak ada konsensus yang jelas di sini.
Martin Ender
2
@ MartinEnder Saya biasanya hanya melakukan seperti yang dilakukan Carlos di sini, karena deklarasi hanya f=...saya tidak yakin apakah atau tidak kita harus menambahkan titik koma pada akhirnya.
TheLethalCoder
13

GREY SNAIL, 219 206 169 167 159 156 146 byte (IO unary)

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

Saya pikir saya bisa bermain golf ini sedikit.

Wisaya Gandum
sumber
Selamat!
Keyu Gan
11

JavaScript (ES6), 31 28 27 byte

Disimpan beberapa byte berkat @Arnauld

Saya tidak menyadari kita bisa gagal kecuali. Cukup yakin ini optimal:

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

Tetapkan ke variabel dengan misalnya f=, lalu panggil like f(climb)(fall)(height). Melempar InternalError: too much recursionjika pendakian tidak mungkin.


JavaScript (ES6), 38 byte

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

Fungsi rekursif yang mengembalikan jumlah hari, atau NaNuntuk tidak pernah.

Uji kasus

Produksi ETH
sumber
2
Itu sudah jelas: Jika siput melakukan rekursi terlalu banyak , maka memanjat tidak mungkin. :)
Tushar
1
Mungkin 27 dengan sintaks kari terbalik? d=>u=>g=h=>h>u?1+g(h-u+d):1
Arnauld
@Arnauld Terima kasih, itu bekerja dengan sangat baik ...
ETHproduksi
Saya bingung menentukan kembali byte byte dalam satu variabel fungsi ditugaskan t termasuk, yang lain tidak?
Nama tampilan
@Orangesandlemons di versi teratas, Anda memiliki g=di tengah karena variabel ini menyimpan fungsi perantara yang diperlukan untuk panggilan rekursif. Jawaban yang lebih lama melakukan panggilan rekursif f, yang mengamanatkan bahwa nama tersebut dimasukkan dalam jumlah byte.
musicman523
10

Excel, 51 46 byte

-1 byte terima kasih kepada @ Scarabee .

-4 karena INT (x) = LANTAI (x, 1)

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

Input diambil dari Sel A1, B1 dan C1 masing-masing. Pengembalian FALSEuntuk skenario yang tidak valid.

Wernisch
sumber
ceiling(x)selalu sama untuk -floor(-x), jadi saya pikir Anda bisa menyimpan 1 byte dengan mengganti CEILING((A1-B1)/(B1-C1)+1,1)dengan -FLOOR((B1-A1)/(B1-C1)+1,1).
Scarabee
7

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

Hanya pada GCC 32-bit dan semua optimizaiton dimatikan.

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

Kembalikan 0 ketika solusi tidak mungkin. Versi modifikasi dari solusi rekursif asli.

Terinspirasi oleh solusi @Jonah J dan solusi @CarlosAlejo C #.

Saya akan memperbarui versi yang diperluas nanti (setelah saya menyelesaikan jawaban Gray Snail saya).

Keyu Gan
sumber
Yang bagus! dapatkah Anda memasukkan solusi analitis (tidak dikompresi)?
koita_pisw_sou
1
@koita_pisw_sou Tentu.
Keyu Gan
Itu tidak "mengembalikan" apa pun. Anda menetapkan parameter lokal, yang nilainya menguap begitu fungsi kembali. Siput terjebak dalam limbo abadi.
Cody Gray
@CodyGray menggunakan perilaku stabil tapi tidak terdefinisi dalam GCC. Saya bisa menunjukkan Anda tautan nanti.
Keyu Gan
@CodyGray codegolf.stackexchange.com/questions/2203/tips-for-golfing-in-c Assign instead of return
Keyu Gan
7

Java (OpenJDK 8) , 35 byte

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

Cobalah online!

Matematika menang!

Kredit

Olivier Grégoire
sumber
1
Sudah lama, tapi a-c-1a+~c.
Kevin Cruijssen
1
Terima kasih @KevinCruijssen Sudah lama, tetapi golf adalah golf, tidak peduli kapan itu terjadi :-)
Olivier Grégoire
Pikiranku persis. Pada beberapa kesempatan saya bermain golf tentang membagi dua byte asli saya ketika saya melihat beberapa jawaban pertama saya. ;)
Kevin Cruijssen
5

Python 2 , 37 byte

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

Cobalah online!

Akhirnya mendapatkan versi rekursif saya di bawah perhitungan standar saya (saya melewati hitungan ke fungsi saya daripada menambahkannya sebelum memanggilnya).

Python 2 , 4346 byte

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

Cobalah online!

Dicukur 3 byte dengan berdagang "__ dan 1" untuk "__> 0".

Menggunakan tipuan boolean, pada dasarnya mengeksekusi:

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
sumber
2
Anda harus meletakkan f=di depan kode Anda (solusi pertama), dan jumlah byte Anda menjadi 37, karena itu bersifat rekursif, sehingga Anda tidak dapat membiarkannya tanpa nama. f=dapat dijatuhkan untuk lambda hanya jika tidak recusive.
Tn. Xcoder
Dicatat dan diatasi. Terima kasih telah memberi tahu saya.
Coty Johnathan Saxman
4

R, 43 byte

Meminjam dari jawaban lain:

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

Memberikan kesalahan jika tidak ada solusi.

r2evans
sumber
Jawaban bagus. Selamat datang di PPCG!
musicman523
3

J, 25 byte

Pertama solusi yang bagus, yang merupakan cheat, karena mengasumsikan bahwa "apa pun selain hasil bilangan bulat positif" sama dengan "Tidak ada":

>.>:%/2-/\

penjelasan

  • 2-/\gunakan jendela panjang 2 di 3 input item kami, menempatkan tanda minus di antara masing-masing, yang untuk input 30 3 2, misalnya, kembali27 1
  • %/ letakkan simbol pembagian di antara setiap elemen daftar, dalam kasus kami daftar hanya memiliki dua item, jadi itu berarti "membagi 27 dengan 1"
  • >: selisih dengan 1
  • >. ambil langit-langit

solusi resmi

Berikut ini adalah solusi resmi yang mengubah negatif dan tak terhingga menjadi 0, yang bagian saya tidak dapat menemukan solusi singkat yang memuaskan untuk:

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

TIO

Jonah
sumber
If the snail cannot climb out of the well, you may return 0, return a falsy value, or throw an exception.Untuk keperluan penulisan kasus-kasus tes, saya hanya memilih Noneuntuk menunjukkan bahwa tidak ada jawaban. Apakah Anda juga mempertimbangkan untuk menambahkan penjelasan dan tautan Cobalah Online?
musicman523
@ musicman523 diperbaiki dan dilakukan.
Jonah
3

PHP> = 7.1, 60 byte

mencetak 0 tanpa melarikan diri

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

PHP Sandbox Online

PHP> = 7.1, 67 byte

tidak mencetak apapun tanpa melarikan diri

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

PHP Sandbox Online

Jörg Hülsermann
sumber
2

Mathematica, 47 40 39 byte

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

-7 byte dari @KeyuGan

J42161217
sumber
Anda harus berurusan dengan input sebagai 69, 3, 8dan dihitung sebagai 3 byte sejauh yang saya pikir.
Keyu Gan
semua diperbaiki! coba sekarang
J42161217
Anda dapat menggunakan Maxuntuk mengganti Ifpernyataan. If[#<=#2,1,Max[⌈(#-#3)/(#2-#3)⌉,0]]&
Keyu Gan
2

Ruby , 49 47 byte

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

Melempar pengecualian jika siput tidak bisa keluar

Cobalah online!

Alex
sumber
1
@Jonah memperbaikinya
Alex
Apa alasan di balik proc? h-a<1?1:(1.0*(h-a)/[a-b,0].max+1).ceilmelewati test case, dan menyimpan 9 byte.
Galen
2

Batch, 66 byte

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

Kasing uji terakhir kedua tidak mencetak apa pun, dan kasing tes terakhir benar-benar jatuh CMD.EXE...

Neil
sumber
2

05AB1E , 19 byte

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

Penjelasan:

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

Untuk nilai yang tidak valid, ini dapat mengembalikan nilai kurang dari 1. Namun, pada 05AB1E, hanya 1 yang benar sehingga memenuhi persyaratan bahwa output untuk nilai yang tidak valid harus palsu.

Cobalah online!

Okx
sumber
2

PHP, 60 byte

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

mencetak Nuntuk None. Jalankan dengan -r.

Titus
sumber
2

05AB1E , 12 byte

.×ηO<²›1k2÷>

Cobalah online!

Mencetak 0jika tidak mungkin.

Masukkan format:

[climb, -fall]
height
Erik the Outgolfer
sumber
2

Japt , 12 byte

@UµV-W §W}aÄ

Uji secara online!

Output undefineduntuk tidak pernah, setelah mungkin membekukan browser Anda untuk sementara waktu, jadi harap berhati-hati.

Saya tidak yakin ini optimal. oWV-W lbekerja pada semua kecuali tiga kasus terakhir ...

Produksi ETH
sumber
Datang dengan ini selama 11 byte dengan mengubah urutan input.
Shaggy
2

Haskell , 30 29 byte

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

Cobalah online!

Lebih pendek dari jawaban Haskell yang ada. Mungkin orang lain bisa mengalahkan saya.

Ini menggunakan pendekatan rekursif untuk memecahkan masalah. Setiap rekursi pada dasarnya adalah hari pergerakan untuk siput. Jika jarak yang tersisa ke ujung kurang dari jarak yang masih dibutuhkan, kami mengakhiri rekursi kami.

Wisaya Gandum
sumber
Hemat 1 byte dengan notasi infix: (b#c)a=1+sum[(b#c)$a+c-b|a>b].
Laikoni
@Laikoni Tidak tahu itu bisa dilakukan. Terima kasih atas tipnya.
Wheat Wizard
Anda dapat menjatuhkan parens di b!cdalam daftar pemahaman.
Zgarb
2

QBIC , 31 23 byte

Hanya memperhatikan persyaratan berubah. Versi ini tidak memeriksa apakah siput akan mencapai bagian atas sumur.

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

Penjelasan di bawah ini, untuk versi asli yang memeriksa apakah ada solusi, juga mencakup semua bagian yang relevan dari kode ini.


Asli, jawaban 31 byte:

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

Penjelasan

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

Cobalah online! (Oke, tidak juga: ini adalah terjemahan dari QBIC ke QBasic code dijalankan di repl.it (agak kurang) lingkungan QBasic)

steenbergh
sumber
2

Excel VBA, 47 Bytes

Fungsi jendela langsung VBE anonim yang mengambil input dari rentang [A1:C1]dari ActiveSheetobjek output ke jendela langsung VBE

Solusi berbasis rumus Excel ini tampaknya lebih kecil daripada solusi VBA murni yang bisa saya buat :(

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

Haskell, 47 55 byte (48 jika diperlukan tuple)

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

variasi tuple

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

Penjelasan

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
sumber
1
1. Anda dapat mengganti d>c||c<shanya dengan 0<1, seperti yang sudah Anda lakukan secara implisit dalam penjelasan Anda, karena otherwisehanya sinonim dari True. 2. Panggilan rekursif dalam versi tuple Anda masih dalam proses. 3. Anda dapat mendefinisikan fungsi Anda sebagai (d#c)sganti f d c smenyimpan dua byte lagi.
Laikoni
1
Anda juga perlu c<=sbukan c<s.
Laikoni
1
Menyusun ulang dan menggunakan 0alih-alih -1sebagaimana diizinkan oleh OP menghasilkan 38 byte: Cobalah secara online!
Laikoni
1
Bisakah Anda menggunakan pengenal infiks untuk menyimpan byte?
musicman523
Saya tidak tahu, apakah saya harus memposting anser yang sudah diedit karena jawaban
esensiy Laikoni
1

Python 3, 41 Bytes

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

Kesalahan untuk Tidak Pernah

Outgolf @veganaiZe

Alix Eisenhardt
sumber
1
Selamat datang di PPCG! Jawaban pertama yang bagus :)
musicman523
2
Saya tidak tahu banyak Python, tetapi bisakah Anda beralih int(b>=a)ke 1-(b<a)untuk menyimpan 2 byte?
ETHproduksi
1

C # (.NET Core) , 37 byte

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

Lambda non-rekursif. Formula penggunaan ditemukan di sini . Dapat dipersingkat 6 byte jika "hasil negatif" adalah cara yang valid untuk mengembalikan kegagalan; saat ini mengembalikan 0 sebagai gantinya.

Kamil Drakari
sumber
Sudah lama, tapi h-f-1bisa h+~f.
Kevin Cruijssen
1

Python v2 & v3, 44 Bytes

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

^ Rekursi tak terbatas (kesalahan) untuk Tidak ada kasus.

veganaiZe
sumber
Anda bisa menggunakan lambda. Juga, ini tampaknya mirip dengan saya (Java) jawaban sehingga memungkinkan saya untuk menyarankan perbaikan dalam rumus: (x-z-1)//(y-z)+1. Saya tidak melakukan banyak Python, jadi saya mungkin salah ...
Olivier Grégoire
Anda dapat menghilangkan f=dari jumlah byte, menghapus beberapa spasi di sekitar ifs dan elses, dan beralih ke Python 2 di mana pembagian integer adalah tunggal/
musicman523
Terima kasih @ musicman523. Saya akhirnya menerima semua saran Anda.
veganaiZe
1
Saya menyadari bahwa kode "bersih" (tanpa rekursi tak terbatas) saya memiliki banyak masalah sudut ketika digunakan dengan input lain (mis. 4, 3, 8). @ musicman523 Saya pikir saya mulai melihat "bukti" yang Anda bicarakan.
veganaiZe
1

Kalkulator yang Dapat Diprogram HP-15C, 26 Bytes

Tiga angka dimuat ke dalam tumpukan sebelum menjalankan program. Tinggi jatuh dimasukkan sebagai angka negatif. Jika siput tidak dapat keluar dari sumur, hasilnya adalah angka negatif atau kesalahan # 0 (zero Divide error).

Kode op dalam hex:

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

Makna instruksi:

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

Anda dapat mencoba program dengan simulator HP-15C ini .

Ryan
sumber
Ini luar biasa! Selamat datang di PPCG :)
musicman523
1

Gangguan Umum, 49 byte

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

Cobalah online!

Fungsi rekursif, stack overflow jika tidak ada solusi yang ditemukan.

Renzo
sumber