Con ốc trong giếng


47

Lý lịch

Có một câu đố phổ biến giống như thế này:

Một con ốc ở dưới đáy giếng 30 feet. Mỗi ngày ốc sên có thể leo lên 3 feet. Vào ban đêm khi họ ngủ, họ trượt xuống 2 feet. Mất bao nhiêu ngày để con ốc ra khỏi giếng?

Câu trả lời trực quan là

30 ngày, vì ốc sên leo lên 1 feet mỗi ngày trong 30 ngày để đạt đến đỉnh,

nhưng thực ra câu trả lời là

28 ngày, vì một khi con ốc sên ở độ cao 27 feet (sau 27 ngày), chúng sẽ đơn giản leo lên 3 feet còn lại để lên đỉnh vào ngày thứ 28.

Thử thách

Thách thức này khái quát câu đố này. Cho ba số nguyên dương làm đầu vào, biểu thị tổng chiều cao, chiều cao leo và chiều cao rơi, trả về số ngày cần thiết để trèo ra khỏi giếng.

Nếu con ốc không thể trèo ra khỏi giếng, bạn có thể trả về 0, trả về giá trị giả hoặc ném ngoại lệ. Bạn cũng có thể viết mã sẽ dừng lại khi và chỉ khi một giải pháp tồn tại.

Nếu bạn muốn, bạn có thể lấy chiều cao rơi làm số nguyên âm.

Các trường hợp thử nghiệm

(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) -> Không
(81, 14, 14) -> Không

Chấm điểm

Đây là , vì vậy câu trả lời ngắn nhất trong mỗi ngôn ngữ sẽ thắng.



8
Có lẽ tôi sẽ thưởng một khoản tiền thưởng nếu ai đó trả lời trong Ốc sên xám. Các trang Esolangs chỉ là một cuống rỗng, nhưng có một số thông tin và một trình biên dịch trực tuyến có sẵn , cũng như một chương trình mẫu cho 99 chai vấn đề bia .
sĩ523

4
Tôi nghĩ rằng đây sẽ chỉ là một công thức đơn giản, nhưng casework là thú vị đáng ngạc nhiên.
xnor

Bạn vẫn còn "bao nhiêu giờ ....". Câu trả lời là 27 * 24 + 12 (giả sử 12 giờ 'ngày').
Francis Davey

2
@WheatWizard Tôi sẽ trao phần thưởng cho câu trả lời ngắn nhất của Ốc sên xám
sĩ523

Câu trả lời:


21

Ốc sên xám , 1206 byte cho I / O số, 149 byte cho I / O đơn

Cho vui. Thành phần của chương trình đầu tiên:

  • 451 byte, chuyển đổi số thành dấu chấm
  • 121 byte, chức năng cốt lõi (một phiên bản riêng biệt được viết bên dưới)
  • 634 byte, chuyển đổi dấu chấm thành số

Lấy đầu vào số và đầu ra. Đầu vào là A, B, Ctương ứng. So với O(1)câu trả lời (gần) khác , mã có độ phức tạp O(n). Nhưng đối với số lượng lớn, nó có thể ăn hết bộ nhớ của bạn đầu tiên.

Hang nếu không tìm thấy giải pháp.

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]

flà một hàm đệ quy (có thể) để chuyển đổi số nguyên thành dấu chấm. Đối số được lưu trong [p]và đầu ra trong [o].

Ulà một chức năng kiểm tra S1>=S2, lưu trữ tham số trong B, Akhi lưu A-Bvào A.

Mã bắt đầu từ Dlà một sơ khai chuyển đổi dấu chấm thành số.

Nguyên tắc cơ bản là giống với câu trả lời C của tôi (tách ra đầu ra giả cho các giải pháp không thể).

Phiên bản độc lập, 149 156 157 167 170 230 byte, chỉ hỗ trợ I / O đơn nguyên

Đầu vào cần phải là dấu chấm, ví dụ ..........cho 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]

Utính toán của A=A-B, và nhảy đến Dkhi A<=0. Nếu không $gán A+Cđến Avà cuộc gọi U.

Hang nếu không tìm thấy giải pháp.

Thủ thuật: lạm dụng khả năng của trình biên dịch để giải thích chuỗi rỗng. Bạn có thể tách ra các điều kiện trong GOTOcâu lệnh để thực hiện các bước nhảy vô điều kiện và cùng một thủ thuật hoạt động POP.

Lưu ý: Tôi có thể đánh gôn thêm 3 byte nhưng bằng cách đó, câu trả lời của tôi và WheatWizard sẽ có cùng logic. Kết quả có lẽ là giải pháp GraySnail ngắn nhất và tôi đang cố gắng chứng minh điều đó.


Bạn đã làm cho nó đầu tiên
Евгений Новиков

Này, tôi chỉ nghĩ rằng tôi sẽ cho bạn biết rằng tôi đã làm cho tôi ngắn hơn của bạn một lần nữa. Nó chỉ ngắn hơn một byte và nó lấy một số cảm hứng từ golf mới nhất của bạn.
Phù thủy lúa mì

@WheatWizard Tôi có một giải pháp 155 byte dựa trên câu trả lời cũ của bạn. Nhưng đối với thể thao, tôi sẽ không xem đó là câu trả lời của mình.
Keyu Gan

@KeyuGan Không, đi tiếp. Tôi không quan tâm đến đại diện của nó về trò chơi. Tôi rất vui khi bị đánh. Nếu mã của tôi có thể bị đánh gôn là lỗi của tôi vì đã không nhìn thấy nó. :)
Thuật sĩ lúa mì

@WheatWizard Tôi cũng không. Tôi chắc chắn đó là thời gian tốt nhất tôi từng có trên PPCG.
Keyu Gan

20

Lưu ý: số byte đang được Martin Ender đặt câu hỏi trong các bình luận. Dường như không có sự đồng thuận rõ ràng về việc phải làm gì với các biểu thức lambda đệ quy được đặt tên trong các câu trả lời C #. Vì vậy, tôi đã hỏi một câu hỏi trong Meta về nó.

C # (.NET Core) , 32 31 byte

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

Hãy thử trực tuyến!

Một cách tiếp cận đệ quy. Nếu con ốc không thể thoát ra, nó kết thúc bằng thông báo sau:Process is terminating due to StackOverflowException.

  • Lưu 1 byte nhờ LiefdeWen!

1
Bạn có thể tiết kiệm một byte byte thay đổi a<=bđể a>bvà trao đổi các phần sau đây
LiefdeWen

3
Mã chính xác hoạt động trong ES6f=(a,b,c)=>a<=b?1:1+f(a-b+c,b,c)
Tushar

Bạn sẽ phải đếm mã gán hàm cho tên nếu bạn đang dựa vào tên đó fđể thực hiện cuộc gọi đệ quy.
Martin Ender

4
Tôi không chơi gôn trong C # vì vậy tôi không hoàn toàn chắc chắn sự đồng thuận là gì, nhưng tôi đã mong muốn điều này sẽ yêu cầu một tuyên bố đầy đủ với một tuyên bố fvà dấu chấm phẩy nếu nó được đặt tên. Điều đầu tiên tôi tìm thấy là điều này nhưng không có sự đồng thuận rõ ràng ở đây.
Martin Ender

2
@MartinEnder Tôi thường chỉ làm như Carlos đã làm ở đây, vì tuyên bố chỉ là f=...tôi không chắc chắn về việc chúng ta có nên thêm dấu chấm phẩy vào cuối hay không.
TheLethalCoder

13

GRAY SNAIL, 219 206 169 167 159 156 146 byte (IO đơn phương)

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

Tôi nghĩ rằng tôi có thể chơi golf này xuống một chút.


Xin chúc mừng!
Keyu Gan

11

JavaScript (ES6), 31 28 27 byte

Đã lưu một vài byte nhờ @Arnauld

Tôi đã không nhận ra chúng ta có thể thất bại với một ngoại lệ. Khá chắc chắn rằng điều này là tối ưu:

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

Gán cho một biến với ví dụ f=, sau đó gọi như thế f(climb)(fall)(height). Ném InternalError: too much recursionnếu leo ​​là không thể.


JavaScript (ES6), 38 byte

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

Hàm đệ quy trả về số ngày hoặc NaNkhông bao giờ.

Các trường hợp thử nghiệm


2
Điều đó là hiển nhiên: Nếu ốc sên thực hiện quá nhiều đệ quy , thì việc leo trèo là không thể. :)
Tushar

1
Có lẽ 27 với một cú pháp currying đảo ngược? d=>u=>g=h=>h>u?1+g(h-u+d):1
Arnauld

@Arnauld Cảm ơn, điều đó hoạt động tốt đáng ngạc nhiên ...
ETHproductions

Tôi có nhầm lẫn khi đếm byte - trong một biến có chức năng được gán t được bao gồm, biến còn lại không?
Tên hiển thị

@Orangesandlemons trong phiên bản hàng đầu, bạn có g=ở giữa vì biến này lưu trữ chức năng trung gian cần thiết cho cuộc gọi đệ quy. Câu trả lời dài hơn thực hiện một cuộc gọi đệ quy f, điều này bắt buộc tên đó phải được bao gồm trong số byte.
sĩ523

10

Excel, 51 46 byte

-1 byte nhờ @ Scarabee .

-4 vì INT (x) = FLOOR (x, 1)

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

Đầu vào được lấy từ các ô A1, B1 và ​​C1 tương ứng. Trả về FALSEcho các kịch bản không hợp lệ.


ceiling(x)luôn bằng -floor(-x), vì vậy tôi nghĩ bạn có thể tiết kiệm 1 byte bằng cách thay thế CEILING((A1-B1)/(B1-C1)+1,1)bằng -FLOOR((B1-A1)/(B1-C1)+1,1).
Scarabee

7

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

Chỉ trên GCC 32 bit và tất cả các tối ưu hóa đã tắt.

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

Trả về 0 khi giải pháp là không thể. Một phiên bản sửa đổi của giải pháp đệ quy gốc.

Lấy cảm hứng từ giải pháp @Jonah J và giải pháp @CarlosAlejo C #.

Tôi sẽ cập nhật phiên bản mở rộng sau (sau khi tôi hoàn thành câu trả lời của Ốc sên xám).


Đẹp quá bạn có thể vui lòng bao gồm các giải pháp phân tích (không nén)?
koita_pisw_sou

1
@koita_pisw_sou Chắc chắn.
Keyu Gan

Nó không "trở lại" bất cứ điều gì cả. Bạn gán cho một tham số cục bộ, có giá trị bay hơi sau khi hàm trả về. Con ốc bị mắc kẹt trong chiếc limbo vĩnh cửu.
Cody Gray

@CodyGray nó sử dụng một hành vi ổn định nhưng không xác định trong GCC. Tôi có thể chỉ cho bạn một liên kết sau.
Keyu Gan


7

Java (OpenJDK 8) , 35 byte

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

Hãy thử trực tuyến!

Toán thắng!

Tín dụng


1
Đã được một lúc, nhưng a-c-1a+~c.
Kevin Cruijssen

1
Cảm ơn @KevinCruijssen Đã lâu rồi, nhưng golf là golf, bất kể khi nào nó xảy ra :-)
Olivier Grégoire

Suy nghĩ của tôi chính xác. Trong một vài lần, tôi đã đánh gôn khoảng một nửa số byte ban đầu của mình khi tôi xem một số câu trả lời đầu tiên của mình. ;)
Kevin Cruijssen

5

Python 2 , 37 byte

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

Hãy thử trực tuyến!

Cuối cùng có phiên bản đệ quy của tôi dưới phép tính tiêu chuẩn của tôi (tôi đã chuyển một số đếm cho hàm của mình thay vì thêm một phiên bản trước khi gọi nó).

Con trăn 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]

Hãy thử trực tuyến!

Cạo 3 byte bằng cách giao dịch "__ và 1" cho "__> 0".

Sử dụng thủ thuật boolean, về cơ bản thực thi:

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
Bạn phải đặt f=trước mã của mình (giải pháp đầu tiên) và số byte của bạn trở thành 37, vì nó là đệ quy, vì vậy bạn không thể để nó ẩn danh. f=chỉ có thể được thả cho lambda khi nó không được xem xét lại.
Ông Xcoder

Lưu ý và giải quyết. Cảm ơn vì đã cho tôi biết.
Coty Johnathan Saxman

4

R, 43 byte

Mượn từ các câu trả lời khác:

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

Đưa ra lỗi nếu không có giải pháp.


Câu trả lời tốt đẹp. Chào mừng đến với PPCG!
sĩ523

3

J, 25 byte

Đầu tiên, một giải pháp tốt, đó là một mánh gian lận, vì nó giả định rằng "bất cứ điều gì khác ngoài kết quả số nguyên dương" đều bằng "Không":

>.>:%/2-/\

giải trình

  • 2-/\sử dụng các cửa sổ có độ dài 2 trên đầu vào 3 mục của chúng tôi, đặt dấu trừ giữa mỗi mục, cho đầu vào 30 3 2, ví dụ: trả về27 1
  • %/ đặt ký hiệu phân chia giữa mỗi thành phần của danh sách, trong trường hợp của chúng tôi, danh sách chỉ có hai mục, vì vậy nó có nghĩa là "chia 27 cho 1"
  • >: tăng 1
  • >. lấy trần

giải pháp chính thức

Đây là giải pháp chính thức chuyển đổi âm và vô cực thành 0, phần mà tôi không thể tìm ra giải pháp ngắn gọn thỏa mãn cho:

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.Với mục đích viết các trường hợp thử nghiệm, tôi chỉ đơn giản chọn Noneđể chỉ ra rằng không có câu trả lời. Bạn cũng sẽ xem xét thêm một lời giải thích và một liên kết Dùng thử trực tuyến?
sĩ523

@ musicman523 đã sửa và thực hiện.
Giô-na



2

Toán học, 47 40 39 byte

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

-7 byte từ @KeyuGan


Bạn cần phải xử lý đầu vào theo 69, 3, 8được tính là 3 byte theo như tôi nghĩ.
Keyu Gan

Tất cả đã được sửa! thử ngay bây giờ
J42161217

bạn có thể sử dụng Maxđể thay thế Iftuyên bố. 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}

Ném ngoại lệ nếu ốc không thể trèo ra

Hãy thử trực tuyến!


1
@Jonah đã sửa nó
Alex

Lý do đằng sau các Proc là gì? h-a<1?1:(1.0*(h-a)/[a-b,0].max+1).ceilvượt qua các trường hợp thử nghiệm và lưu 9 byte.
Galen

2

Mẻ, 66 byte

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

Trường hợp thử nghiệm cuối cùng thứ hai không in gì, và trường hợp thử nghiệm cuối cùng thực sự bị hỏng CMD.EXE...


2

05AB1E , 19 byte

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

Giải trình:

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

Đối với các giá trị không hợp lệ, giá trị này có thể trả về bất kỳ giá trị nào nhỏ hơn 1. Tuy nhiên, trong 05AB1E, chỉ có 1 là đúng vì vậy điều này đáp ứng yêu cầu rằng đầu ra cho giá trị không hợp lệ phải là sai.

Hãy thử trực tuyến!


2

PHP, 60 byte

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

in Ncho None. Chạy với -r.



2

Japt , 12 byte

@UµV-W §W}aÄ

Kiểm tra nó trực tuyến!

Đầu ra undefinedkhông bao giờ, sau khi có thể đóng băng trình duyệt của bạn trong một thời gian, vì vậy hãy cẩn thận.

Tôi không tin điều này là tối ưu. oWV-W lhoạt động trên tất cả trừ ba trường hợp cuối ...


Đến với điều này cho 11 byte bằng cách thay đổi thứ tự của các đầu vào.
Shaggy

2

Haskell , 30 29 byte

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

Hãy thử trực tuyến!

Ngắn hơn câu trả lời Haskell hiện có. Có lẽ người khác có thể đánh bại tôi.

Điều này sử dụng một cách tiếp cận đệ quy để giải quyết vấn đề. Mỗi lần đệ quy về cơ bản là một ngày di chuyển cho ốc. Nếu khoảng cách từ trái đến cuối nhỏ hơn khoảng cách vẫn được yêu cầu, chúng tôi sẽ kết thúc đệ quy.


Lưu 1 byte với ký hiệu infix : (b#c)a=1+sum[(b#c)$a+c-b|a>b].
Laikoni

@Laikoni Không biết điều đó có thể được thực hiện. Cảm ơn vì tiền hỗ trợ.
Phù thủy lúa mì

Bạn có thể thả các parens xung quanh b!ctrong phần hiểu danh sách.
Zgarb

2

QBIC , 31 23 byte

Chỉ cần chú ý các yêu cầu thay đổi. Phiên bản này không kiểm tra xem ốc có bao giờ đạt đến đỉnh giếng không.

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

Giải thích bên dưới, đối với phiên bản gốc kiểm tra xem có tồn tại giải pháp hay không, cũng bao gồm tất cả các phần có liên quan của mã này.


Câu trả lời gốc, 31 byte:

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

Giải trình

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

Hãy thử trực tuyến! (OK, không thực sự: đây là bản dịch của QBIC sang mã QBasic chạy trong repl.it (hơi thiếu) môi trường QBasic)


2

VBA Excel, 47 byte

Hàm cửa sổ tức thời VBE ẩn danh nhận đầu vào từ phạm vi [A1:C1]từ ActiveSheetđầu ra đối tượng đến cửa sổ ngay lập tức VBE

Giải pháp dựa trên công thức Excel chủ yếu này dường như nhỏ hơn bất kỳ giải pháp VBA thuần túy nào mà tôi có thể đưa ra :(

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

1

Haskell, 47 55 byte (48 nếu cần bộ)

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

biến đổi tuple

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

Giải trình

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. Bạn có thể thay thế d>c||c<schỉ bằng 0<1, như bạn đã ngầm hiểu trong phần giải thích của mình, vì đó otherwisechỉ là một từ đồng nghĩa với True. 2. Cuộc gọi đệ quy trong phiên bản tuple của bạn vẫn bị ngắt. 3. Bạn có thể định nghĩa hàm của mình (d#c)sthay vì f d c sđể lưu thêm hai byte.
Laikoni

1
Bạn cũng cần c<=sthay thế c<s.
Laikoni

1
Sắp xếp lại và sử dụng 0thay vì -1được cho phép bởi OP mang lại 38 byte: Hãy thử trực tuyến!
Laikoni

1
Bạn có thể sử dụng một định danh infix để lưu bất kỳ byte nào không?
sĩ523

Tôi không biết, nếu tôi nên đăng anser đã chỉnh sửa vì đó là câu trả lời của @ Laikoni
Sergii Martynenko Jr

1

Python 3, 41 byte

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

Lỗi không bao giờ

Outgolf @veganaiZe


1
Chào mừng đến với PPCG! Câu trả lời đầu tiên rất hay :)
sĩ523

2
Tôi không biết nhiều Python, nhưng bạn có thể thay đổi int(b>=a)để 1-(b<a)tiết kiệm 2 byte?
Sản phẩm ETH


1

C # (.NET Core) , 37 byte

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

Lambda không đệ quy. Sử dụng công thức tìm thấy ở đây . Có thể rút ngắn 6 byte nếu "bất kỳ kết quả âm tính" nào là cách hợp lệ để trả về thất bại; hiện trả về 0 thay thế.


Đã được một lúc, nhưng h-f-1có thể h+~f.
Kevin Cruijssen

1

Python v2 & v3, 44 byte

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

^ Đệ quy vô hạn (lỗi) cho trường hợp Không có.


Bạn có thể sử dụng lambda. Ngoài ra, điều này có vẻ giống với câu trả lời (Java) của tôi vì vậy cho phép tôi đề xuất cải tiến trong công thức : (x-z-1)//(y-z)+1. Tôi không làm nhiều Python, vì vậy tôi có thể sai ...
Olivier Grégoire

Bạn có thể loại bỏ f=từ đếm byte, loại bỏ một số không gian xung quanh IFS và elses, và chuyển sang Python 2 nơi phân chia số nguyên là một single/
musicman523

Cảm ơn @ nhạcman523. Tôi cuối cùng đã lấy tất cả lời khuyên của bạn.
veganaiZe

1
Tôi nhận ra rằng mã "sạch" (không có đệ quy vô hạn) của tôi có rất nhiều vấn đề trong trường hợp góc khi được sử dụng với các đầu vào khác (ví dụ: 4, 3, 8). @ musicman523 Tôi nghĩ rằng tôi đang bắt đầu thấy "bằng chứng" mà bạn nói đến.
veganaiZe

1

Máy tính lập trình HP-15C, 26 byte

Ba số được tải vào ngăn xếp theo thứ tự trước khi chạy chương trình. Chiều cao rơi được nhập dưới dạng số âm. Nếu ốc không thể trèo ra khỏi giếng, kết quả là số âm hoặc lỗi # 0 (lỗi chia 0).

Mã Op trong 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

Ý nghĩa chỉ dẫn:

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

Bạn có thể thử chương trình với trình giả lập HP-15C này .


Điều này thật tuyệt! Chào mừng bạn đến PPCG :)
musicman523

1

Lisp thông thường, 49 byte

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

Hãy thử trực tuyến!

Hàm đệ quy, ngăn xếp tràn nếu không tìm thấy giải pháp.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.