หอยทากในบ่อ


47

พื้นหลัง

มีปัญหาลับสมองที่จะทำสิ่งนี้:

หอยทากอยู่ที่ก้นบ่อ 30 ฟุต หอยทากทุกวันสามารถปีนขึ้นไปได้ถึง 3 ฟุต ในเวลากลางคืนเมื่อพวกเขานอนหลับพวกเขาเลื่อนกลับลงมา 2 ฟุต หอยทากใช้เวลากี่วันในการออกจากบ่อ?

คำตอบที่เข้าใจง่ายคือ

30 วันเพราะหอยทากปีนขึ้นไปที่ 1 ฟุตต่อวันเป็นเวลา 30 วันเพื่อไปถึงจุดสูงสุด

แต่จริงๆแล้วคำตอบคือ

28 วันเพราะเมื่อหอยทากอยู่ในอากาศ 27 ฟุต (หลังจาก 27 วัน) พวกเขาจะปีนขึ้นไปอีก 3 ฟุตที่เหลือในวันที่ 28

ท้าทาย

ความท้าทายนี้ทำให้ปัญหานี้กลายเป็นปัญหาทั่วไป เมื่อรับอินพุตจำนวนเต็มบวกสามตัวแทนความสูงทั้งหมดความสูงปีนและความสูงของฤดูใบไม้ร่วงให้คืนค่าจำนวนวันที่ใช้ในการปีนออกจากบ่อน้ำ

หากหอยทากไม่สามารถปีนออกจากหลุมคุณอาจกลับ 0 กลับค่าเท็จหรือโยนข้อยกเว้น คุณอาจเขียนโค้ดที่จะหยุดหากว่ามีวิธีแก้ไขอยู่หรือไม่

หากคุณต้องการคุณอาจใช้ความสูงของการตกเป็นจำนวนเต็มลบ

กรณีทดสอบ

(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) -> ไม่มี
(81, 14, 14) -> ไม่มี

เกณฑ์การให้คะแนน

นี่คือดังนั้นคำตอบที่สั้นที่สุดในแต่ละภาษาจะเป็นผู้ชนะ



8
ฉันอาจจะได้รับรางวัลถ้าใครบางคนตอบในหอยทากสีเทา หน้า Esolangsเป็นเพียงต้นขั้วว่างเปล่า แต่มีข้อมูลบางส่วนและเรียบเรียงออนไลน์ที่มีอยู่เช่นเดียวกับโปรแกรมตัวอย่างสำหรับ 99 ขวดเบียร์ของปัญหา
musicman523

4
ฉันคิดว่านี่จะเป็นสูตรง่ายๆ แต่งาน casework นั้นน่าสนใจอย่างน่าประหลาดใจ
xnor

คุณยังมี "กี่ชั่วโมง .... " คำตอบคือ 27 * 24 + 12 (สมมติว่าเป็น 'วัน' 12 ชั่วโมง)
ฟรานซิสดาวี่

2
@Weateat ฉันจะมอบรางวัลให้กับคำตอบของหอยทากสีเทาที่สั้นที่สุด
musicman523

คำตอบ:


21

หอยทากสีเทา 1206 ไบต์สำหรับ I / O ตัวเลข 149 ไบต์สำหรับยูนารี I / O

เพื่อความสนุก. องค์ประกอบของโปรแกรมแรก:

  • 451 ไบต์แปลงตัวเลขเป็นจุด
  • 121 ไบต์ฟังก์ชั่นหลัก (รุ่นแยกเขียนด้านล่าง)
  • 634 ไบต์แปลงจุดเป็นตัวเลข

รับอินพุตและเอาต์พุตตัวเลข การป้อนข้อมูลเป็นA, B, Cตามลำดับ เมื่อเทียบกับคนอื่น ๆ (ใกล้) คำตอบรหัสมีความซับซ้อนของO(1) O(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]

fเป็นฟังก์ชั่นวนซ้ำเพื่อแปลงจำนวนเต็มเป็นจุด อาร์กิวเมนต์จะถูกบันทึกในและผลผลิตใน[p][o]

Uคือการทดสอบฟังก์ชั่นS1>=S2การจัดเก็บค่าพารามิเตอร์ในB, Aขณะที่ประหยัดลงไปA-BA

รหัสเริ่มต้นจากDต้นขั้วคือการแปลงจุดเป็นตัวเลข

หลักการพื้นฐานเหมือนกันกับคำตอบ C ของฉัน (ริปเอาท์พุทที่ผิดพลาดสำหรับการแก้ปัญหาที่เป็นไปไม่ได้)

รุ่นสแตนด์อโลน 149 156 157 167 170 230 ไบต์สนับสนุนเฉพาะ I / O ที่มีขนาดต่างกัน

ความต้องการการป้อนข้อมูลที่จะเป็นจุดเช่นสำหรับ..........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]

UคำนวณA=A-Bและกระโดดไปเมื่อD A<=0มิฉะนั้น$กำหนดA+CไปและโทรAU

หยุดทำงานหากไม่พบวิธีแก้ไข

เคล็ดลับ:ใช้ความสามารถของ "คอมไพเลอร์" ในการตีความสตริงที่ว่างเปล่า คุณสามารถตัดออกเงื่อนไขในGOTOคำสั่งที่จะทำให้กระโดดไม่ จำกัด POPและเคล็ดลับการทำงานเดียวกัน

หมายเหตุ:ฉันอาจเล่นกอล์ฟได้มากกว่า 3 ไบต์ แต่หากทำเช่นนั้นคำตอบของฉันและ WheatWizard จะมีตรรกะแบบเดียวกันแน่นอน ผลลัพธ์น่าจะเป็นโซลูชัน GraySnail สั้นที่สุดและฉันพยายามพิสูจน์


คุณทำมันเป็นครั้งแรก
гвгенийНовиков

เฮ้ฉันแค่คิดว่าฉันจะให้คุณรู้ว่าฉันทำให้ฉันสั้นกว่าของคุณอีกครั้ง มันสั้นลงเพียงหนึ่งไบต์และได้แรงบันดาลใจจากสนามกอล์ฟล่าสุดของคุณ
ข้าวสาลีตัวช่วยสร้าง

@WheatWizard ฉันมีโซลูชัน 155- ไบต์ตามคำตอบเก่าของคุณ แต่สำหรับกีฬาฉันจะไม่คิดว่ามันเป็นคำตอบของฉัน
Keyu Gan

@KeyuGan ไม่ไปเลย ฉันไม่สนใจตัวแทนเกี่ยวกับเกม ฉันมีความสุขที่ได้พ่ายแพ้ หากรหัสของฉันสามารถเล่นกอล์ฟเป็นความผิดของฉันที่ไม่เห็น :)
ตัวช่วยสร้างข้าวสาลี

@WheatWizard ฉันไม่ได้ ฉันแน่ใจว่าเป็นเวลาที่ดีที่สุดที่ฉันเคยมีใน PPCG
Keyu Gan

20

หมายเหตุ: Martin Ender ถูกตรวจสอบจำนวนไบต์ในความคิดเห็น ดูเหมือนว่าไม่มีความเห็นเป็นเอกฉันท์เกี่ยวกับการแสดงออกแลมบ์ดาแบบเรียกซ้ำในคำตอบ C # ดังนั้นฉันจึงได้ถามคำถามใน Metaเกี่ยวกับเรื่องนี้

C # (.NET Core) , 32 31 ไบต์

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

ลองออนไลน์!

แนวทางแบบเรียกซ้ำ หากหอยทากหนีไม่พ้นมันจะจบลงด้วยข้อความต่อไปนี้:Process is terminating due to StackOverflowException.

  • บันทึก 1 ไบต์ขอบคุณ LiefdeWen!

1
คุณสามารถบันทึกไบต์เปลี่ยนa<=bเป็นa>bและสลับส่วนต่อไปนี้
LiefdeWen

3
รหัสเดียวกันที่แน่นอนทำงานใน ES6f=(a,b,c)=>a<=b?1:1+f(a-b+c,b,c)
Tushar

คุณจะต้องนับรหัสที่กำหนดฟังก์ชั่นให้กับชื่อหากคุณต้องพึ่งพาชื่อนั้นว่าเป็นfสายเรียกซ้ำ
Martin Ender

4
ฉันไม่เล่นกอล์ฟใน C # ดังนั้นฉันจึงไม่แน่ใจว่าฉันทามติทั้งหมด แต่ฉันคาดหวังว่าสิ่งนี้จะต้องมีคำแถลงเต็มรูปแบบพร้อมคำประกาศfและเครื่องหมายอัฒภาคหากมีชื่อ สิ่งแรกที่ฉันพบคือสิ่งนี้แต่ไม่มีมติที่ชัดเจนที่นี่
Martin Ender

2
@MartinEnder ฉันมักจะทำตามที่คาร์ลอสได้ทำที่นี่เนื่องจากการประกาศเป็นเพียงf=...ฉันไม่แน่ใจว่าเราควรจะเพิ่มเซมิโคลอนในตอนท้ายหรือไม่
TheLethalCoder

13

GREY SNAIL, 219 206 169 167 159 156 146 ไบต์ (unary 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].

ฉันคิดว่าฉันสามารถเล่นกอล์ฟนี้ลงได้เล็กน้อย


ขอแสดงความยินดี!
Keyu Gan

11

JavaScript (ES6), 31 28 27 ไบต์

บันทึกไม่กี่ไบต์ด้วย @Arnauld

ฉันไม่ได้ตระหนักว่าเราอาจล้มเหลวด้วยข้อยกเว้น ค่อนข้างแน่ใจว่าสิ่งนี้ดีที่สุด:

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

กำหนดให้กับตัวแปรเช่นนั้นเรียกเช่นf= f(climb)(fall)(height)โยนInternalError: too much recursionถ้าปีนเป็นไปไม่ได้


JavaScript (ES6), 38 ไบต์

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

ฟังก์ชันเรียกซ้ำที่ส่งคืนจำนวนวันหรือNaNไม่เคย

กรณีทดสอบ


2
เห็นได้ชัดว่า: หากหอยทากทำการเรียกซ้ำมากเกินไปการไต่ขึ้นนั้นเป็นไปไม่ได้ :)
Tushar

1
อาจจะ 27 กับไวยากรณ์การกลับรายการใช่หรือไม่ d=>u=>g=h=>h>u?1+g(h-u+d):1
Arnauld

@Arnauld ขอบคุณที่ใช้งานได้ดีอย่างน่าประหลาดใจ ...
ETHproductions

ฉันมันสับสนอีกนับไบต์ - หนึ่งในตัวแปรที่ฟังก์ชั่นที่ได้รับมอบหมาย t รวมอยู่อื่น ๆ ไม่ได้หรือไม่
ชื่อที่แสดง

@Orangesandlemons ในเวอร์ชั่นสูงสุดคุณg=อยู่ตรงกลางเพราะตัวแปรนี้เก็บฟังก์ชันกลางที่จำเป็นสำหรับการเรียกซ้ำ คำตอบอีกต่อไปจะเรียกซ้ำซึ่งเรียกfว่าชื่อจะรวมอยู่ในการนับไบต์
musicman523

10

Excel, 51 46 ไบต์

-1 ขอบคุณไบต์ @ Scarabee

-4 เพราะ INT (x) = FLOOR (x, 1)

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

นำเข้าจากเซลล์ A1, B1 และ C1 ตามลำดับ ส่งคืนFALSEสำหรับสถานการณ์ที่ไม่ถูกต้อง


ceiling(x)อยู่เสมอเท่ากับ-floor(-x)ดังนั้นฉันคิดว่าคุณสามารถประหยัด 1 ไบต์โดยการแทนที่ด้วยCEILING((A1-B1)/(B1-C1)+1,1) -FLOOR((B1-A1)/(B1-C1)+1,1)
Scarabee

7

C (gcc) 39 43 44 46 47 58 60 ไบต์

เฉพาะ GCC 32 บิตและ optimizaitons ทั้งหมดถูกปิด

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

ส่งคืน 0 เมื่อไม่สามารถแก้ปัญหาได้ เวอร์ชันที่แก้ไขของโซลูชันแบบเรียกซ้ำดั้งเดิม

แรงบันดาลใจจาก @Jonah J solution และ @CarlosAlejo C # solution

ฉันจะอัปเดตเวอร์ชันที่ขยายเพิ่มเติมในภายหลัง


ทำได้ดีนี่! คุณช่วยกรุณารวมโซลูชันการวิเคราะห์ (ไม่บีบอัด) ได้หรือไม่?
koita_pisw_sou

1
@koita_pisw_sou แน่นอน
Keyu Gan

มันไม่ได้ "คืน" อะไรเลย คุณกำหนดให้กับพารามิเตอร์ท้องถิ่นที่มีค่าระเหยเมื่อฟังก์ชั่นกลับมา หอยทากติดอยู่ในบริเวณขอบรกนิรันดร์
โคดี้เกรย์

@CodyGray ใช้ความเสถียร แต่ไม่ได้กำหนดไว้ใน GCC ฉันจะแสดงลิงค์ให้คุณในภายหลัง
Keyu Gan


7

Java (OpenJDK 8) , 35 ไบต์

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

ลองออนไลน์!

คณิตศาสตร์ชนะ!

เครดิต


1
จะได้รับในขณะที่ แต่→a-c-1 a+~c
Kevin Cruijssen

1
ขอบคุณ @KevinCruijssen ไม่นานมานี้ แต่สนามกอล์ฟเป็นกอล์ฟไม่ว่าจะเกิดอะไรขึ้น :-)
Olivier Grégoire

ความคิดของฉันอย่างแน่นอน ในบางครั้งฉันเล่นกอล์ฟเกี่ยวกับการลดลงครึ่งหนึ่งไบต์เดิมของฉันเมื่อฉันดูคำตอบแรกของฉัน ;)
Kevin Cruijssen

5

Python 2 , 37 ไบต์

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

ลองออนไลน์!

ในที่สุดก็มีเวอร์ชันซ้ำของฉันด้านล่างการคำนวณมาตรฐานของฉัน (ฉันผ่านการนับไปยังฟังก์ชั่นของฉันแทนการเพิ่มหนึ่งก่อนที่จะเรียกมัน)

Python 2 , 4346 ไบต์

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

ลองออนไลน์!

โกน 3 ไบต์ด้วยการซื้อขาย "__ และ 1" สำหรับ "__> 0"

การใช้ boolean trickery ดำเนินการเป็นหลัก:

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=โค้ดของคุณ (วิธีแก้ปัญหาแรก) และจำนวนไบต์ของคุณกลายเป็น 37 เพราะเป็นแบบเรียกซ้ำดังนั้นคุณจึงไม่สามารถปล่อยให้มันเป็นแบบไม่ระบุชื่อได้ f=สามารถทิ้งให้แลมบ์ดาได้ก็ต่อเมื่อไม่สามารถทำซ้ำได้
นาย Xcoder

สังเกตและแก้ไข ขอบคุณสำหรับการให้ฉันรู้ว่า.
Coty Johnathan Saxman

4

R, 43 ไบต์

การยืมจากคำตอบอื่น ๆ :

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

ให้ข้อผิดพลาดหากไม่มีวิธีแก้ไข


คำตอบที่ดี ยินดีต้อนรับสู่ PPCG!
musicman523

3

J, 25 ไบต์

ก่อนอื่นทางออกที่ดีซึ่งเป็นสูตรโกงเพราะถือว่า "สิ่งอื่นใดที่ไม่ใช่จำนวนเต็มบวกผล" เท่ากับ "ไม่มี":

>.>:%/2-/\

คำอธิบาย

  • 2-/\ใช้หน้าต่างของความยาว 2 ข้ามการป้อนข้อมูลรายการของเรา 3 วางเครื่องหมายลบระหว่างแต่ละคนซึ่งสำหรับการป้อนข้อมูล30 3 2เช่นผลตอบแทน27 1
  • %/ ใส่สัญลักษณ์หารระหว่างแต่ละองค์ประกอบของรายการในกรณีของเรารายการมีเพียงสองรายการดังนั้นมันจึงหมายถึง "หาร 27 ด้วย 1"
  • >: เพิ่มขึ้น 1
  • >. ใช้เพดาน

ทางออกอย่างเป็นทางการ

นี่คือวิธีแก้ปัญหาอย่างเป็นทางการที่แปลงเนกาทีฟและอินฟินิตี้เป็น 0 ซึ่งส่วนที่ฉันไม่สามารถหาวิธีแก้ปัญหาคำย่อที่น่าพอใจสำหรับ:

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.สำหรับจุดประสงค์ในการเขียนกรณีทดสอบฉันเลือกที่Noneจะระบุว่าไม่มีคำตอบ คุณจะพิจารณาเพิ่มคำอธิบายและลิงค์ลองออนไลน์หรือไม่
musicman523

@ musicman523 แก้ไขแล้วเสร็จ
Jonah



2

Mathematica, 47 40 39 ไบต์

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

-7 ไบต์จาก @KeyuGan


คุณต้องจัดการกับอินพุตเป็น69, 3, 8และนับเป็น 3 ไบต์เท่าที่ฉันคิด
Keyu Gan

แก้ไขทั้งหมดแล้ว! ลองตอนนี้
J42161217

คุณอาจใช้Maxเพื่อแทนที่Ifคำสั่ง If[#<=#2,1,Max[⌈(#-#3)/(#2-#3)⌉,0]]&
Keyu Gan

2

Ruby , 49 47 ไบต์

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

โยนข้อยกเว้นถ้าหอยทากไม่สามารถปีนออกมาได้

ลองออนไลน์!


1
@Jonah แก้ไขมัน
Alex

เหตุผลที่อยู่เบื้องหลัง proc คืออะไร? h-a<1?1:(1.0*(h-a)/[a-b,0].max+1).ceilผ่านกรณีทดสอบและบันทึก 9 ไบต์
กาเลน

2

แบตช์ 66 ไบต์

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

กรณีทดสอบครั้งที่สองไม่ได้พิมพ์อะไรและกรณีทดสอบล่าสุดล้มเหลวจริง ๆCMD.EXE...


2

05AB1E , 19 ไบต์

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

คำอธิบาย:

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

สำหรับค่าที่ไม่ถูกต้องสิ่งนี้อาจส่งคืนค่าใด ๆ ที่น้อยกว่า 1 อย่างไรก็ตามใน 05AB1E มีเพียง 1 เท่านั้นที่เป็นจริงดังนั้นจึงเป็นไปตามข้อกำหนดที่ว่าผลลัพธ์สำหรับค่าที่ไม่ถูกต้องควรเป็นเท็จ

ลองออนไลน์!




2

Japt , 12 ไบต์

@UµV-W §W}aÄ

ทดสอบออนไลน์!

เอาต์พุตundefinedไม่เคยหลังจากอาจทำให้เบราว์เซอร์ของคุณค้างได้ชั่วขณะหนึ่งดังนั้นโปรดใช้ความระมัดระวัง

ฉันไม่เชื่อว่านี่เป็นสิ่งที่ดีที่สุด oWV-W lทำงานได้ทั้งหมดยกเว้นสามกรณีสุดท้าย ...


มากับสิ่งนี้สำหรับ 11 ไบต์โดยการเปลี่ยนลำดับของอินพุต
Shaggy

2

Haskell , 30 29 ไบต์

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

ลองออนไลน์!

สั้นกว่าคำตอบ Haskell ที่มีอยู่ บางทีคนอื่นสามารถเอาชนะฉันได้

วิธีนี้ใช้วิธีเรียกซ้ำเพื่อแก้ไขปัญหา การเรียกซ้ำแต่ละครั้งนั้นเป็นวันของการเคลื่อนไหวของหอยทาก หากระยะทางจากซ้ายไปยังจุดสิ้นสุดนั้นน้อยกว่าระยะทางที่เราต้องการ


บันทึก 1 (b#c)a=1+sum[(b#c)$a+c-b|a>b]ไบต์มีสัญกรณ์มัด:
Laikoni

@Laikoni ไม่รู้ว่าสามารถทำได้ ขอบคุณสำหรับทิป.
ข้าวสาลีตัวช่วยสร้าง

คุณสามารถวาง parens ไปรอบ ๆb!cในรายการความเข้าใจ
Zgarb

2

QBIC , 31 23 ไบต์

เพิ่งสังเกตเห็นความต้องการเปลี่ยนไป รุ่นนี้ไม่ได้ตรวจสอบว่าหอยทากจะไปถึงจุดสูงสุดของบ่อหรือไม่

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

คำอธิบายด้านล่างสำหรับเวอร์ชันดั้งเดิมที่ตรวจสอบว่ามีวิธีแก้ไขปัญหาหรือไม่ครอบคลุมส่วนที่เกี่ยวข้องทั้งหมดของรหัสนี้ด้วย


คำตอบเดิม 31 ไบต์:

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

คำอธิบาย

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

ลองออนไลน์! (ตกลงไม่ใช่จริง ๆ : นี่คือการแปลรหัส QBIC เป็น QBasic ทำงานใน repl.it (ค่อนข้างขาด) สภาพแวดล้อม QBasic)


2

Excel VBA, 47 ไบต์

ฟังก์ชันหน้าต่าง VBE แบบไม่ระบุชื่อทันทีที่รับอินพุตจากช่วง[A1:C1]จากActiveSheetวัตถุแสดงผลไปยังหน้าต่างทันที VBE

โซลูชันที่ใช้สูตร Excel เป็นหลักดูเหมือนว่าจะเล็กกว่าโซลูชัน VBA ใด ๆ ที่ฉันสามารถหาได้ :(

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

1

Haskell, 47 55ไบต์ (48 หากต้องการ tuple)

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

การแปรปรวน tuple

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

คำอธิบาย

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. คุณสามารถแทนที่d>c||c<sเพียงกับ0<1ที่คุณมีอยู่แล้วโดยปริยายทำในคำอธิบายของคุณเพราะเป็นเพียงคำพ้องความหมายของotherwise True2. การเรียกซ้ำในเวอร์ชัน tuple ของคุณยังคงเป็นอยู่ 3. คุณสามารถกำหนดฟังก์ชั่นของคุณ(d#c)sแทนf d c sการบันทึกอีกสองไบต์
Laikoni

1
นอกจากนี้คุณยังต้องแทนc<=s c<s
Laikoni

1
การจัดเรียงใหม่และการใช้0แทนการ-1อนุญาตโดย OP ให้ผลตอบแทน 38 ไบต์: ลองออนไลน์!
Laikoni

1
คุณสามารถใช้ตัวระบุ infix เพื่อบันทึกไบต์ใด ๆ ?
musicman523

ผมไม่ทราบว่าถ้าผมควรโพสต์ Anser แก้ไขเพราะมันเป็น esentialy @ คำตอบของ Laikoni
Sergii Martynenko จูเนียร์

1

Python 3, 41 ไบต์

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

ข้อผิดพลาดสำหรับไม่

Outgolf @veganaiZe


1
ยินดีต้อนรับสู่ PPCG! คำตอบแรกที่ดี :)
musicman523

2
ฉันไม่รู้จัก Python มากนัก แต่คุณสามารถเปลี่ยนint(b>=a)เป็น1-(b<a)2 ไบต์ได้ไหม?
ETHproductions


1

C # (. NET Core) 37 ไบต์

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

แลมบ์ดาแบบไม่เรียกซ้ำ สูตรการใช้งานพบว่าที่นี่ อาจสั้นลง 6 ไบต์หาก "ผลลัพธ์เชิงลบใด ๆ " เป็นวิธีที่ถูกต้องในการส่งคืนความล้มเหลว ปัจจุบันส่งคืน 0 แทน


มันเป็นเวลานาน แต่h-f-1ก็เป็นh+~fไปได้
Kevin Cruijssen

1

Python v2 & v3, 44 ไบต์

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

^ การเรียกซ้ำไม่สิ้นสุด (ข้อผิดพลาด) สำหรับกรณีไม่มี


คุณสามารถใช้แลมบ์ดา นอกจากนี้ดูเหมือนว่าคล้ายกับ (Java) (x-z-1)//(y-z)+1คำตอบของฉันเพื่อให้ฉันไปแนะนำการปรับปรุงในสูตร: ฉันไม่ได้ทำ Python มากนักดังนั้นฉันอาจจะผิด ...
Olivier Grégoire

คุณสามารถกำจัดf=จำนวนไบต์ลบช่องว่างรอบ ifs และ elses และเปลี่ยนเป็น Python 2 โดยที่การหารจำนวนเต็มเป็นหนึ่งเดียว/
musicman523

ขอบคุณ @ musicman523 ฉันลงเอยเพื่อรับคำแนะนำทั้งหมดของคุณ
veganaiZe

1
ฉันรู้ว่ารหัส "สะอาด" (ไม่มีการเรียกซ้ำไม่สิ้นสุด) มีปัญหามุมตัวพิมพ์จำนวนมากเมื่อใช้กับอินพุตอื่น (เช่น 4, 3, 8) @ musicman523 ฉันคิดว่าฉันเริ่มเห็น "บทพิสูจน์" ที่คุณพูดถึง
veganaiZe

1

HP-15C โปรแกรมคำนวณได้, 26 ไบต์

หมายเลขสามหมายเลขถูกโหลดเข้าในสแต็กก่อนสั่งรันโปรแกรม ความสูงของการตกจะถูกป้อนเป็นจำนวนลบ หากหอยทากไม่สามารถปีนออกจากหลุมได้ผลที่ได้คือจำนวนลบหรือข้อผิดพลาด # 0 (ข้อผิดพลาดการหารศูนย์)

รหัส Op ในรูปหกเหลี่ยม:

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

ความหมายของคำสั่ง:

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

คุณสามารถลองโปรแกรมด้วยโปรแกรมจำลอง HP-15Cนี้


นี่มันเจ๋งมาก! ยินดีต้อนรับสู่ PPCG :)
musicman523


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.