99 ข้อบกพร่องในรหัส


47

99 ข้อบกพร่องในรหัส

การดัดแปลงของ "99 ขวดเบียร์บนกำแพง" สำหรับวิทยาศาสตร์คอมพิวเตอร์ที่มีข้อบกพร่องเพิ่มขึ้นแทนที่จะลดขวดมักจะโพสต์อีกครั้งในอินเทอร์เน็ต ตัวอย่างเช่นเสื้อยืดที่นี่

ฉันคิดว่ามันน่าสนใจที่จะเห็นการเรียกซ้ำและการสร้างตัวเลขสุ่มในภาษาที่หลากหลายและการค้นหาวิธีที่มีประสิทธิภาพที่สุดในการทำมัน

มีความท้าทายเล็กน้อยอื่น ๆ เกี่ยวกับเบียร์ 99 ขวด แต่ดูเหมือนจะไม่มีอะไรเพิ่มขึ้นและลดลง!

ท้าทาย

โปรแกรมหรือฟังก์ชั่นของคุณไม่ควรป้อนข้อมูลแล้วพิมพ์

99 ข้อบกพร่องในรหัส

99 ข้อบกพร่องในรหัส

เอาหนึ่งและแก้ไขมัน

X ข้อบกพร่องในรหัส

(บรรทัดว่าง)

โดยที่ X คือเลขจำนวนเต็มก่อนหน้าลบ 1 บวกด้วยจำนวนเต็มแบบสุ่มในช่วง [-15,5]
คุณสามารถรวมลบ 1 เข้ากับจำนวนเต็มแบบสุ่มดังนั้นจึงอนุญาตให้มีช่วง [-16,4]
ช่วงสามารถเป็นแบบพิเศษได้ดังนั้นลบหนึ่งบวก (-16,6) หรือ (-17,5)

จำนวนเต็มแบบสุ่มไม่จำเป็นต้องมีการกระจายอย่างเท่าเทียมกันพวกเขาเพียงแค่ต้องเป็นไปได้ทั้งหมด

โปรแกรมเริ่มต้นด้วย 99 บั๊กเสมอ

คุณสามารถละเว้นข้อผิดพลาดทางไวยากรณ์ของ "1 ข้อบกพร่อง"

โปรแกรมควรหยุดเมื่อจำนวนข้อบกพร่องเป็น 0 หรือลบและพิมพ์

0 ข้อบกพร่องในรหัส

ไม่ควรมีจำนวนข้อบกพร่องติดลบ ตอนจบน่าจะดูเหมือน

ข้อบกพร่อง Y ในรหัส

ข้อบกพร่อง Y ในรหัส

เอาหนึ่งและแก้ไขมัน

0 ข้อบกพร่องในรหัส

(บรรทัดว่าง)

0 ข้อบกพร่องในรหัส

บรรทัดใหม่ต่อท้ายเป็นที่ยอมรับ

  • รหัสของคุณอาจเป็นโปรแกรมเต็มรูปแบบหรือฟังก์ชั่น
  • ไม่มีอินพุต
  • เอาต์พุตควรเป็น stdout หรือส่งคืน
  • คำเตือน / ข้อผิดพลาดในบันทึก / STDERR นั้นใช้ได้ตราบใดที่ STDOUT มีข้อความที่ต้องการ ดูที่นี่สำหรับข้อมูลเพิ่มเติม

นี่คือโค้ดกอล์ฟเพื่อให้โค้ดที่สั้นที่สุดเป็นไบต์ชนะ

ตัวอย่างผลลัพธ์

วางตัวอย่างเอาต์พุต bin สำหรับ rig -11 bug ในแต่ละครั้ง


1
ที่เกี่ยวข้อง: 1 2 (ความแตกต่าง: ในการท้าทายนี้ผลลัพธ์อาจยาวโดยพลการ)
user202729

16
สถานการณ์ที่สมจริงยิ่งขึ้นจะเป็นถ้าสัญญาณของตัวเลขสุ่มพลิก!
Stewie Griffin

9
ฉันผิดหวังที่ข้อกำหนดไม่รวมอยู่ในโปรแกรมจะต้องมีข้อผิดพลาดเมื่อพบจำนวนลบเช่น crashing, overflow ไปจนถึง max int หรือคล้ายกัน;)
อัลโล

3
"จำนวนเต็มแบบสุ่มไม่จำเป็นต้องกระจายเท่า ๆ กันพวกมันต้องเป็นไปได้ทั้งหมด" ทำให้ฉันนึกถึงxkcd.com/221
Ivo Beckers

2
มันเป็นความอัปยศ99ไม่มีการสร้างตัวเลขสุ่ม
Jonathan Allan

คำตอบ:


18

R , 182 140 138 135 ไบต์

n=99;while(n)cat(n,b<-" bugs in the code
",n,b,"take one down and patch it around
",n<-max(0,n-sample(21,1)+5),b,"
",c(n,b)[!n],sep="")

ลองออนไลน์!

ในขณะที่การสร้างตัวเลขสุ่มทำได้ค่อนข้างดี R นั้นยอดเยี่ยมกับการพิมพ์และสตริง JayCe พบประมาณหนึ่งพันล้านไบต์และยังคงหาวิธีใหม่ในการเล่นกอล์ฟนี้!


1
JayCe พบว่าไบต์ทั้งหมดเหล่านั้นอยู่ที่ไหน มันเป็นเพียงแค่สิ่งที่เกิดขึ้นหรือว่า JayCe กำลังมองหาพวกเขาหรือไม่?
Stewie Griffin



ไม่ใช่การ+5คิดต้นทุนคุณอีก 2 ไบต์ใช่ไหม ทำไมไม่เพียงsample(26,6))?
theestestecologist

2
@theforestecologist ยินดีต้อนรับสู่ PPCG! ฉันขอแนะนำให้คุณดูคำถามให้ละเอียดยิ่งขึ้น ... มีเครื่องหมายลบอยู่ข้างหน้าsample
JayCe

11

Java 8, 161 160 ไบต์

v->{String s="",t=" bugs in the code\n";for(int i=99;i>0;s+=i+t+i+t+"Take one down and patch it around\n"+((i-=Math.random()*21+4)<0?0:i)+t+"\n");return s+0+t;}

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

ลองออนไลน์

คำอธิบาย:

v->{                   // Method with empty unused parameter and String return-type
  String s="",         //  Result-String, starting empty
         t=" bugs in the code\n";
                       //  Temp-String we use multiple times
  for(int i=99;i>0;    //  Start `i` at 99, and loop as long as it's larger than 0
    s+=                //   Append to the result-String:
       i+t             //    The first line of the verse
       +i+t            //    The second (duplicated) line of the verse
       +"Take one down and patch it around\n"
                       //    The third line of the verse
       +((i-=Math.random()*21-4)
                       //    Decrease `i` by a random integer in the range [-16, 4]
         <0?0:i)       //    If `i` is now negative, set it to 0
        +t+"\n");      //    And append the fourth line of the verse
  return s             //  Return the result,
         +0+t;}        //  appended with an additional line for 0 at the very end

ดูเหมือนว่าคุณไม่ได้ใช้rเพื่ออะไร
OOBalance

1
การลบ,rดูเหมือนจะยังใช้งานได้: ลองออนไลน์!
Kamil Drakari

@OOBalance โอ๊ะ .. ไม่แน่ใจว่าทำไมฉันถึงได้อยู่ที่นั่น .. >.> ขอบคุณที่สังเกต
Kevin Cruijssen

1
i - = ... + 5 บันทึกหนึ่ง (แม้ว่าฉันคิดว่าช่วงควรเป็น [-16 4] ไม่ใช่ [-15,5])
Jonathan Allan

1
@OOBalance ใช่ r ไม่ได้ใช้เพราะเขาใช้ java ;-)
Anand Rockzz

10

PowerShell , 137 135 133 131 ไบต์

$b=' bugs in the code';for($a=99;$a){,"$a$b"*2;"Take one down and patch it around";$a+=-16..4|Random;if($a-lt0){$a=0}"$a$b`n"}"0$b"

ลองออนไลน์!

ส่วน "ข้อบกพร่องในรหัส" จะถูกบันทึกไว้$bเพื่อใช้ในภายหลัง ชุด$aไป99, เข้าสู่วงในfor $aครั้งแรกที่เราสร้างอาร์เรย์สองสตริงกับสตริงเป็น," "*2"X bugs in the code"

"Take one down and patch it around"ถัดไปเป็นเพียงสตริง จากนั้นเราก็เพิ่มขึ้น$aโดยการเลือกจำนวนเต็มจากช่วงRandom [-16,4]หลังจากนั้นเรายึดที่จะเป็นที่ต่ำสุดเป็นศูนย์ใช้ถ้า$a จากนั้นสตริงif($a-lt0){$a=0}"Y bugs in the code"

ในที่สุดหลังจากวนรอบเสร็จแล้วเราใส่สตริง"0 bugs in the code"ลงในไปป์ไลน์ สตริงทั้งหมดเหล่านี้ถูกรวบรวมจากไปป์ไลน์และนัยWrite-Outputทำให้เรามีบรรทัดใหม่ระหว่างพวกเขาฟรี

บันทึกสองไบต์โดยใช้การforวนซ้ำแทนการwhileวนซ้ำ
บันทึกสองไบต์ด้วยการย้าย$bไปยังส่วนของตนเอง
บันทึกสองไบต์ด้วย Adrian Blackburn


คุณสามารถแทนที่ $ a = (0, $ a) [$ a-gt0]; ด้วย If ($ a-lt0) {$ a = 0} สำหรับสองไบต์
Adrian

@AdrianBlackburn ขอบคุณ!
AdmBorkBork

9

JavaScript (Node.js) , 127 ไบต์

f=(i=99,t=` bugs in the code
`)=>i>0?i+t+`Take one down and patch it around
`+((i+=0|Math.random()*21-15)<0?0:i)+t+`
`+f(i):0+t

ลองออนไลน์!


คำอธิบาย:

f = (                                          // start of our recursive function
    i=99,t=` bugs in the code                 // parameters, 1. num bugs , 2. text
`)                                           // using string literal end text with \n
=>                                          // start function
    i > 0 ?                                // if i is greater than 0
        i + t +                           // return value of i, value of t and  
    `Take one down and patch it around   // and this text 
    `                                   // + new line
    + (( i +=                          // and add 
        0|Math.random()*21-15) < 0 ?  // remove decimal from value obtained by multiplying
                                     // random number (between 0 and 1) multiplied by 21 
                                    // and then subtracting 15 from it
                                   // if that value is less than 0
        0 :                       // add 0 to i
        i                        // otherwise add value of i  
        )                       // end the parenthesis 
    + t                        // add value of t to that
    + `\n`                    // along with a new line 
    + f(i)                   // and repeat the process (this is recursive)
    :                       // if i > 0 condition not met then
        0 + t              // return 0 + t. Zero is there so the last line can be 
                          // repeated

ขอบคุณ @tsh สำหรับแนวคิดเรื่องการเรียกซ้ำและการใช้งาน (บันทึกไว้บางไบต์)

ข้อเสนอแนะเกี่ยวกับการเล่นกอล์ฟนี้เพิ่มเติมยินดีต้อนรับ



1
ทำไม0+ลบออก? ดูเหมือนว่าจะต้องมีการส่งออก
tsh

@tsh: มันคืออะไร? ฉันไม่ได้อ่านส่วนนั้น
มูฮัมหมัดซาลมาน


6

Python 2 , 151 ไบต์

เคล็ดลับดี ๆj=i+max(-i,randint(-16,4))โดยโจคิงใช้ประโยชน์จากการแจกจ่ายที่ไม่สม่ำเสมอ

ไบต์คู่ที่บันทึกไว้ต้องขอบคุณ Mnemonic

from random import*
i,s=99,'bugs in the code\n'
while i:j=max(0,i+randint(-16,4));print i,s,i,s,'Take one down and patch it around\n',j,s;i=j
print i,s

ลองออนไลน์!


1
j=max(0,i+randint(-16,4))คุณสามารถบันทึกไบต์โดยใช้
ช่วยในการจำ

นอกจากนี้ก็ 'บกพร่องในรหัส'
ช่วยในการจำ

การใช้ 0 เพื่อเปรียบเทียบ Wiil ไม่สามารถใช้ตัวเลขได้ทั้งหมด ขอบคุณที่ไม่มีสิ่ง 'the': D
Dead Possum

เคล็ดลับเช่นเดียวกับคำตอบของฉัน151 bytes
Jo King

พวกเขาไม่สามารถทำได้ คุณไม่ได้รับอนุญาตให้ต่ำกว่า 0
Mnemonic

6

ถ่าน , 81 ไบต์

≔⁹⁹θ≔”⧴"pWº⁴tSn/{yBⅈ⁺”ζW›θ⁰«×²﹪ζθ”↶0⪫\`3+¤⸿Zν(z¬hLÀTj'ZXεPraF”≧⁺⁻⁴‽²¹θ﹪ζ×θ›θ⁰¶»﹪ζ⁰

ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด คำอธิบาย:

≔⁹⁹θ

เริ่มต้นด้วย 99 ข้อบกพร่องในรหัส

≔”⧴"pWº⁴tSn/{yBⅈ⁺”ζ

บันทึกสตริงที่บีบอัด "% d บั๊กในรหัส \ n"

W›θ⁰«

ทำซ้ำในขณะที่มีจำนวนข้อผิดพลาดที่เหลืออยู่

ײ﹪ζθ

พิมพ์จำนวนข้อบกพร่องในรหัสสองครั้ง

”↶0⪫\`3+¤⸿Zν(z¬hLÀTj'ZXεPraF”

พิมพ์ "ลงหนึ่งครั้งและแก้ไข"

≧⁺⁻⁴‽²¹θ

เพิ่มจำนวนข้อผิดพลาดแบบสุ่มระหว่าง -17 (พิเศษ) และ 4 (รวม)

﹪ζ×θ›θ⁰

พิมพ์จำนวนข้อบกพร่องที่เหลืออยู่หรือ 0 ถ้าเป็นลบ

เว้นบรรทัดว่างระหว่างข้อ

»﹪ζ⁰

หลังจากข้อสุดท้ายพิมพ์ 0 ข้อบกพร่องในรหัสอีกครั้ง


ต้องการที่สุดท้ายซ้ำแล้วซ้ำอีก "0 ข้อบกพร่องในรหัส"!
Sam Dean

1
@ SamDean ขอโทษฉันมองข้ามแก้ไขแล้ว
Neil

6

JavaScript, 189 176 168 162 ไบต์

f=(x=99)=>{c=console.log;m=Math;a=` bugs in the code
`;c(x+a+x+a+"Take one down and patch it around"+(x=m.max(x+m.ceil(m.random()*21-15),0))+a)
x?f(x):c(`
`+x+a)}

ลองออนไลน์!

ขอบคุณสำหรับMuhammad Salmanสำหรับการconsole.logทดแทนที่ขาดหายไปและสำหรับOliverสำหรับการปรับปรุงการทดสอบ x

ขอบคุณสำหรับl4m2สำหรับการเล่นกอล์ฟนี้ขนาด 8 ไบต์


ฉันไม่ใช่ผู้เชี่ยวชาญโหนด แต่ฉันเชื่อว่า "โปรแกรมควรหยุดทำงานเมื่อจำนวนข้อบกพร่องเป็น 0 หรือเชิงลบ" หมายความว่าคุณต้องการx<=0?console.log("\n"+0+a):f(x)ในตอนท้าย
NoOneIsHere

1
โอเคขอโทษ อีกสิ่งหนึ่ง: หากคุณต้องการเรียกคืนในฟังก์ชันที่ไม่ระบุชื่อคุณต้องตั้งชื่อให้ชัดเจน (+2 ไบต์)
NoOneIsHere

1
ไม่สามารถแทนที่ "console.log" สุดท้ายด้วย "c" ได้หรือไม่
Sam Dean

1
@NoOneIsHere ก็ถูกต้องเช่นกัน คุณต้องการfคำแถลงนั้น โหวตจนอัปเดตเพื่อแก้ไขปัญหานั้น (ลิงก์ของฉันต้องมีการอัปเดตด้วยเช่นกัน)
Muhammad Salman

2
จุดที่ฉันพยายามทำที่นี่คือรหัสของคุณไม่ทำงานหากไม่มีการเรียกใช้ฟังก์ชันfซึ่งคุณไม่สามารถคาดเดาได้
NoOneIsHere

6

Python 3 , 156 138 ไบต์

ขอขอบคุณที่โจนาธานหลาม 2 คำตอบสำหรับidเคล็ดลับ

r=n=99
z='%d bugs in the code\n'
while n:x=n;r+=id(r);n-=min(n,r%21-4);print((z%x)*2+'Take one down and patch it around\n'+z%n)
print(z%n)

ลองออนไลน์!

คำอธิบาย:

r=n=99       #Initialise r and n to 99
z='%d bugs in the code\n'  #Save n
while n:     #Loop while n is not 0
    x=n      #Save value of n
    r+=id(r) #Modify value of r, which changes the hash value
    n-=min(n,r%21-4)  #Change n's value by a random number between 4 and -16
    print((z%x)*2+'Take one down and patch it around\n'+z%n)   #Print the message
print(z%n)  #And print the final line

5

คู่ , 149 148 ไบต์

ที่บันทึกไว้หนึ่งไบต์โดยการเปลี่ยนrandi(21)และ%iไปและ21*rand ตรวจสอบให้แน่ใจว่าการส่งออกเป็นทศนิยมด้วยศูนย์ทศนิยม (เช่นและจำนวนเต็ม)%.f%.f

แทรกการขึ้นบรรทัดใหม่แทนเครื่องหมายจุลภาคและอัฒภาคเพื่อความสะดวกในการอ่าน รู้สึกผิด แต่ไม่นานกว่าหนึ่งซับ

x=99;do(p=@(i)printf('%.f bugs in the code\n',i))(x)
p(x)
disp('Take one down and patch it around')
p(max([0,x+=21*rand-17]))
disp('')until x<1
p(0)

ลองออนไลน์!

คำอธิบาย:

x=99;               % Initialize the number of bugs to 99
do ...  until x<1   % Loop until the number of bugs is less than 1
 (p=@(i)printf('%.f bugs in the code\n',i))(x)  % Create a function handle p that takes
                                                % the number of bugs as input and outputs
                                                % the string x bugs ... \n
 p(x)                % Call that function with the same number of bugs to get two lines
 ,disp('Take on down and patch it around')       % Outputs that line, including a newline
 ,p(max([0,x+=21*rand-17]))                    % Call p again, while updating the number
                                                 % of bugs. The number of bugs will be 
                                                 % the old one plus the random number, or 0
                                                 % if it would have turned negative
 ,disp('')        % A newline
p(0)              % Finally, the last single line.

ใช้p((x+=21*rand-17)*(x>0)แทนการmaxบันทึกไบต์ แต่บรรทัดสุดท้ายจะแสดงแทน-0 bugs ... 0 bugsมันใช้งานได้randi(21)-17แต่ก็มีความยาวเท่ากับด้านบน ลองออนไลน์!


5

COBOL (GnuCOBOL), 317 294 279 270 ไบต์

data division.working-storage section. 1 i pic S99 value 99.procedure division.perform until i=0 perform a 2 times display"Take one down and patch it around"compute i=i-(random*21- 4)if i<0 compute i=0 end-if perform a display""end-perform.a.display i" bugs in the code"

ลองออนไลน์!

Ungolfed

data division.                     <-- Define the variables we want to use
working-storage section.           <-- Define global variables used in this
                                       program

1 i pic S99 value 99.              <-- Define variable i with datatype signed
                                       numeric and with two digits

procedure division.                <-- Define our program

perform until i = 0                <-- Perform the following code until i = 0
    perform a 2 times              <-- Execute the procedure called 'a' twice,
                                       see below

    display "Take one down and patch it around"   <-- Display this sentence
    compute i = i -                <-- Subtract from i some random value
        (random * 21 - 4)

    if i < 0                       <-- if i < 0
        compute i=0                <-- then assign 0 to i
    end-if
    perform a                      <-- Execute the procedure 'a'
    display ""                     <-- Display an empty string; needed because
                                       of the blank line
end-perform.

a.                                 <-- Define procedure called 'a'.
    display i " bugs in the code"  <-- Display the value of i and then the
                                       given string literal

หมายเหตุ: ประโยคสุดท้ายยังคงถูกพิมพ์เนื่องจาก COBOL เรียกใช้งานโปรแกรมทั้งหมดและหลังจากperform untilวนลูปมัน "ผ่าน" ฉลากที่ดำเนินการคำสั่ง ลักษณะการทำงานนี้จะคล้ายกับโดยไม่ต้องswitch casebreak

PS: ตัวเลขจะไม่แสดงตามที่ต้องการ แต่ COBOL นั้นไม่ดีในการแปลงตัวเลขให้เป็นการแสดงข้อความที่ค่อนข้างดี


1
สวัสดี ยินดีต้อนรับสู่ PPCG
มูฮัมหมัดซาลมาน

ฉันคิดว่าลบ 4 ควรเป็นบวก 4 ฉันเดาว่าคุณไปหา (i- (rand-4) == (i-rand + 4) แต่ไม่มีวงเล็บดังนั้นสัญญาณต้องเปลี่ยนเช่นกัน ของตัวเลขจะถูกลบออกหรือว่าเป็นคุณสมบัติของภาษาหรือไม่ แต่งานที่ดีกับภาษาที่เป็นมิตรทองคำ!
Sam Dean

1
@ SamDean ขอบคุณ! ฉันแก้ไขข้อผิดพลาดนั้น ผมได้รับการยอมรับว่าเป็นจริงสุ่มคำนวณได้รับแรงบันดาลใจจากคำตอบของเควิน Cruijssen แต่เขาใช้ตัวดำเนินการมอบหมายผสม ( -=ในi-=Math.random()*21-4) ซึ่งหมายถึงวงเล็บรอบตัวถูกดำเนินการทางขวาทั้งหมด ฉันลืมที่จะทำให้พวกเขาชัดเจน แต่ตอนนี้ฉันได้รับการแก้ไขแล้ว
MC Emperor

@ MCEmperor ดูดีสำหรับฉันตอนนี้!
Sam Dean

คุณไม่สามารถใช้ +4 และบันทึกวงเล็บได้หรือไม่
raznagul

4

VBA: 212 163 ไบต์

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

การแก้ไขนี้มีการปรับปรุงสองอย่าง

  1. การใช้While/WendแทนการFor/Nextบันทึกอักขระสองสามตัว
  2. การเรียก Sub ที่ชื่อด้วยอักขระตัวเดียวจะสั้นกว่าGoSubและExit SubและและReturnบรรทัดที่ต้องใช้เพื่อรองรับ

แก้ไข:
3. ลบช่องว่างและตัวอักษรที่ตัวแก้ไข VBA จะเพิ่มกลับเข้าไปโดยอัตโนมัติดูเคล็ดลับสำหรับการเล่นกอล์ฟใน VBA
4. เพิ่มคำแนะนำโดย @EricF จากนั้นเห็นอัลกอริทึมถังขยะของเขามีขนาดเล็กลง ช่องว่าง การเปลี่ยนแปลงที่สำคัญถูกผนวกvbLFเข้ากับสตริงเอาต์พุตดังนั้นจึงDebug.Printไม่จำเป็นต้องเรียกใช้บ่อย รุ่งโรจน์เพื่อEricF


Sub b()
s=" bugs in the code"&vbLf
c=99
While c
Debug.? c &s &c &s &"Take one down and patch it around
c=c+5-Int(Rnd()*20)
c=IIf(c<0,0,c)
Debug.? c &s
Wend
End Sub

นี่เป็นความท้าทายที่สนุก ถ้าคุณรู้ว่าล่ามออนไลน์เช่นTIOสำหรับ VB6 / VBScript / VBA โปรดแสดงความคิดเห็น

หากคุณต้องการทดสอบรหัสนี้และติดตั้ง Microsoft Excel, Word, Access หรือ Outlook (Windows เท่านั้น) ให้กด Alt + F11 เพื่อเปิด VBA IDE แทรกโมดูลรหัสใหม่ (Alt + I, M) Option Explicitและล้างออก จากนั้นวางรหัสและกด F5 เพื่อเรียกใช้ ผลลัพธ์ควรปรากฏในหน้าต่างค้นหาทันใจ (กด Ctrl + G หากคุณไม่เห็น)


4
ยินดีต้อนรับสู่เว็บไซต์!
ข้าวสาลีช่วยสร้าง

1
คุณสามารถใส่ลงไปได้ถึง 197 ตัวอักษรถ้าคุณรวมสตริงใช้cแทนc>0เงื่อนไขในขณะของคุณและใช้c=Iif(c<0,0,c)แทนIf c<0 [...]: pastebin.com/nFGtGqdE
ErikF

4

LaTeX , 368 304 293 287 245 240 ไบต์

แม้ว่าจะไม่ได้แข่งขันกันมากเมื่อเทียบกับโปรแกรมอื่น ๆ ในรูปแบบไบต์ฉันแค่อยากจะดูวิธีการทำสิ่งนี้ใน LaTeX

\documentclass{proc}\newcount\b\b99\usepackage[first=-16,last=5]{lcg}\def~{\the\b\ bugs in the code\\}\def\|{\loop~~Take one down and patch it around\\\rand\advance\b\value{rand}\ifnum\b>0 ~\\\repeat\b0 ~\\~}\begin{document}\|\end{document}

อ่านเพิ่มเติมได้:

\documentclass{proc}               %shortest document class
\newcount\b                        %short variable name
\b 99                              %set the value to 99
\usepackage[first=-16,last=5]{lcg} %random number generator
%\the prints the value of the variable behind it
%\def is shorter than \newcommand and can redefine commands
\def~{\the\b\ bugs in the code\\}
\def\|{                            %the function
    \loop
        ~
        ~
        Take one down and patch it around\\
        %\rand creates a counter named rand and                                        
        %stores the random value in it
        \rand \advance\b\value{rand} 
        %if the counter is smaller than 0, it becomes 0
        \ifnum\b>0 
            ~ \\                  %extra newline as required
    \repeat
    %if b is equal or smaller than 0, set it to 0
    \b 0 
    ~ \\                          %then print like normal
    %extra print at the end
    ~
}
\begin{document}
    \|                             %calling the function
\end{document}

การปรับปรุง (ต่อการแก้ไข):

  1. "x บั๊กในโค้ด" ตอนนี้เป็นฟังก์ชันแทนที่จะเป็น 4 บรรทัด
  2. เขียน\ifข้อสำหรับ\repeatเป็น\else
  3. เห็นได้ชัดว่าใช้\value{b}=xงานได้สำหรับการเริ่มต้น แต่ไม่อยู่ในลูป (แทน\setcounter{b}{x})
  4. เห็นได้ชัดว่า\relaxควรใช้สำหรับจุด 3 แต่ก็สามารถทำได้โดยการแทรกช่องว่าง ลบ\else, เท็กซ์คำสั่งที่ใช้แทนน้ำยางเหล่านี้เป็นที่สั้นลงและถูกแทนที่โดย\'~
  5. รหัสบางอย่างไม่จำเป็นต้องผ่อนคลายด้วยเหตุผลบางอย่าง

1
ยินดีต้อนรับสู่ PPCG
มูฮัมหมัดซัลมาน

ยินดีต้อนรับสู่ PPCG! ฉันไม่ได้เรียกใช้รหัสของคุณ แต่ควรจะเป็น\ifnum\value{b}<1มากกว่า<0หรือไม่
JayCe

@ JayCe: มันไม่สำคัญเลยเมื่อ b เป็น 0 มันจะหนีออกจากวงไปแล้ว มันอาจจะใช้สัญชาตญาณน้อยลงเมื่อ b เป็น 0 กรณีอื่นถูกพิมพ์อย่างแน่นอน แต่อย่างมีประสิทธิภาพไม่มีความแตกต่างที่ฉันคิด
Simon Klaver

@JayCe สั้นลงรหัสที่ตอนนี้มันไม่สำคัญอีกต่อไป;)
ไซมอน Klaver

4

C,  169  165 ไบต์

ขอบคุณ @ceilingcat สำหรับการบันทึกสี่ไบต์!

*s=" bugs in the code";f(i,j){for(i=99;i>0;i=j)printf("%d%s\n%d%s\nTake one down and patch it around\n%d%s\n\n",i,s,i,s,(j=i+rand()%19-15)<0?0:j,s);printf("0%s",s);}

ลองออนไลน์!


3

SAS, 210 ไบต์

%macro t;%let b=bugs in the code;%let a=99;%do%until(&a<=0);%put&a &b;%put&a &b;%put Take one down, pass it around;%let a=%eval(&a-%sysfunc(ranbin(0,20,.3))+4);%if &a<0%then%let a=0;%put&a &b;%put;%end;%mend;%t

Ungolfed:

%macro t;
%let b=bugs in the code;
%let a=99;
%do%until(&a<=0);
  %put &a &b;
  %put &a &b;
  %put Take one down, pass it around;    
  %let a=%eval(&a-%sysfunc(ranbin(0,20,.3))+4);
  %if &a<0%then%let a=0;
  %put &a &b; 
  %put;
%end;
%mend;
%t

สามารถบันทึกได้สองสามไบต์หากอนุญาตให้ใช้คำเตือนในบันทึก (ใส่&aลงใน&bตัวแปรมาโคร แต่สร้างคำเตือนเริ่มต้น)


บางคนมีคำเตือนดังนั้นฉันจะไปกับพวกเขาด้วย
Sam Dean


3

ABAP , 295 ไบต์

... เพราะเหตุใดจึงไม่ห่า!

REPORT z.DATA:a(16),c TYPE qfranint.a = 'bugs in the code'.data(b) = 99.WRITE:/ b,a.WHILE b > 0.WRITE:/ b,a,/'Take one down and patch it around'.CALL FUNCTION
'QF05_RANDOM_INTEGER' EXPORTING ran_int_max = 21 IMPORTING ran_int = c.b = b + c - 17.IF b < 1.b = 0.ENDIF.WRITE:/ b,a,/,/ b,a.ENDWHILE.

แน่นอนว่ามันไม่สามารถแข่งขันได้เมื่อเทียบกับภาษาอื่น ๆ แต่ฉันก็สามารถลดขนาดมันลงจาก 330 ไบต์ที่ฉันเขียนตอนแรกดังนั้นฉันจึงนับว่าเป็นชัยชนะส่วนตัว

เนื่องจาก ABAP ไม่อนุญาตให้มีบรรทัดที่ยาวเกิน 255 ตัวอักษรฉันจึงต้องแทนที่ช่องว่างด้วยตัวแบ่งบรรทัด บน Windows เริ่มเพิ่มขนาดเป็น 296 ไบต์เนื่องจาก CRLF แต่ทำงานได้ดีโดยมี LF อยู่ในนั้น ABAP แน่นอนว่าต้องมีช่องว่างมากมาย แต่นี่ไม่ใช่เรื่องใหญ่

เขียนเพียงทิ้งข้อความ GUI ดังนั้นฉันเดาว่าเป็นเช่น stdout? ฉันอาจบันทึกบาง bytes ที่นี่โดยใช้โครงสร้างหรือตาราง แต่เนื่องจากวิธีการจัดการ SAP โครงสร้างผสม (มีตัวอักษรและตัวเลข) วิธีที่ฉันคิดจะทำงานเฉพาะในระบบที่ไม่ใช่ Unicode ... ซึ่งฉันคิดว่าไม่มี - ไปแม้จะมีสิทธิ์เข้าถึงทั้งคู่

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

รหัสที่อ่านได้มากขึ้นหรือน้อยลงความคิดเห็นรวม:

REPORT z.
  "Define a (text) and c (random)
  DATA: a(16),
        c TYPE qfranint. "A stupid data type for a random INT

  "This is shorter than using VALUE (saves 3 bytes)
  a = 'bugs in the code'.
  "This is slightly shorter than doing ',b TYPE i' and 'b = 99'. (saves 2 bytes)
  data(b) = 99.

  "first line has to be outside of loop due to our exit condition (saved me ~5 bytes)
  WRITE: / b,a. "\n xx bugs in the code

  WHILE b > 0.
    WRITE: / b,a, "\n xx bugs in the code
    /'Take one down and patch it around'.

    "This ridiculous function for random numbers...
    "To save some bytes, I leave ran_int_min at it's default
    "of 1, and set the max to 21 instead, from which I remove
    "17 later on, resulting in a range of [-16,4]
    "Compare:
    "   ' - 17'              =  5 bytes
    "   ' ran_int_min = -16' = 18 bytes
    "(saves 13 bytes)

    CALL FUNCTION 'QF05_RANDOM_INTEGER'
        EXPORTING ran_int_max = 21
        IMPORTING ran_int = c.

    "Maximum number of bugs added:     4 = 21 - 17
    "Maximum number of bugs removed: -16 =  1 - 17
    b = b + c - 17.

    IF b <= 0.
        b = 0.
    ENDIF.

    WRITE: / b,a,/,/ b,a. "\nxx bugs in the code\n\nxx bugs in the code
  ENDWHILE.

ขอบคุณสำหรับความท้าทาย!
ถึงหัวหน้าของฉัน: โปรดอย่ายิงฉันฉันแค่สอนตัวเอง!


3

ทำความสะอาด , 245 234 ไบต์

import StdEnv,Math.Random,System.Time,System._Unsafe,Text
f[n,v:l]b|n>0=n<+b<+n<+b+"Take one down and patch it around\n"<+max 0v<+b+"\n"+f[v:l]b=0<+b

f(scan(+)99[n rem 20-16\\n<-genRandInt(toInt(accUnsafe time))])" bugs in the code\n"

ลองออนไลน์!


โอกาสใดที่คุณสามารถลบเครื่องหมายคำพูดได้ตั้งแต่เริ่มต้นและสิ้นสุด
Sam Dean

1
@ SamDean โอ้นั่นเป็นเพียงตัวเลือกคอมไพเลอร์ที่ฉันลืมไป ฉันจะโยนในการที่.
Οurous

3

C #, 184 181 ไบต์

Code Golf คำตอบแรกของฉัน!

(ขึ้นอยู่กับคำตอบ Javaจาก @Kevin Cruijssen)

Func<String>c=()=>{String s="",t=" bugs in the code\n";for(int i=99;i>0;s+=i+t+i+t+"Take one down and patch it around\n"+((i-=new Random().Next(21)-4)<0?0:i)+t+"\n");return s+0+t;};

ลองออนไลน์!


1
ยินดีต้อนรับสู่ PPCG :)
Shaggy


2

T-SQL, 188 ไบต์

DECLARE @ INT=99,@b CHAR(18)=' bugs in the code
'a:PRINT CONCAT(@,@b,@,@b,'Take one down and patch it around
')SET @+=5-22*RAND()IF @<0SET @=0PRINT CONCAT(@,@b,'
')IF @>0GOTO a;PRINT '0'+@b

SQL อนุญาตให้ส่งคืนภายในตัวอักษรของสตริงดังนั้นจึงช่วยได้

CONCAT()ไม่แปลงนัยกับข้อความดังนั้นผมจึงไม่ต้องกังวลเกี่ยวกับหรือCASTCONVERT


2

JavaScript, 138 ไบต์

_=>(I=i=>`Take one down and patch it around
${l=(i>0?i:0)+` bugs in the code
`}
`+l+l+(i>0&&I(i+Math.random()*21-15|0)))(99).slice(55,-25)


2

QB64 , 134 ไบต์

จากพี่ชายของฉัน

S$="bugs in the code":I=99:WHILE I>0:?I;S$:?I;S$:?"Take one down and patch it around":I=I+INT(RND*21)-15:I=-(I>0)*I:?I;S$:?:WEND:?I;S$


2

เยลลี่ , 61 ไบต์

;“,Ȥm46Ṛṛ⁽eɼḞF»
ÇȮ“"ḃḲɠ⁼ċTṪʠ/Ạ⁺ṗḍ^ẸƘⱮṖ8»20X+_«¥©17Ç⁷®ßÇ®?
99Ç

ลิงก์ niladic ซึ่งทำงานเป็นโปรแกรมเต็มรูปแบบ

ลองออนไลน์! (เอาต์พุตถูกล้างออกหลังจากการดำเนินการเสร็จสมบูรณ์ แต่พิมพ์ย่อหน้าตามย่อหน้า)

อย่างไร?

;“,Ȥm46Ṛṛ⁽eɼḞF» - Link 1, helper to construct count-text: number
 “,Ȥm46Ṛṛ⁽eɼḞF» - compressed string (list of characters) = " bugs in the code\n"
;               - concatenate the number with that list of characters

ÇȮ“"ḃḲɠ⁼ċTṪʠ/Ạ⁺ṗḍ^ẸƘⱮṖ8»20X+_«¥©17Ç⁷®ßÇ®? - Link 2, print stuff: number
Ç                                         - call the last Link (1) as a monad
 Ȯ                                        - print and yield that
                                          - ...at this point that is then printed again
                                          -    implicitly due to the start of a new leading
                                          -    constant chain below
  “"ḃḲɠ⁼ċTṪʠ/Ạ⁺ṗḍ^ẸƘⱮṖ8»                  - compressed string (list of characters)
                                          -     = "Take one down and patch it around\n"
                                          - ...once again an implicit print, same reason
                        20                - twenty
                          X               - random int from [1,20] 
                           +              - add the left argument, the number
                                17        - seventeen
                              ¥           - last two links as a dyad:
                             «            -   minimum (of rand[1,20]+n and 17) 
                            _             -   subtract
                               ©          - copy this newNumber to the register
                                  Ç       - call last Link (1) as a monad = f(newNumber)
                                          - here we get another implicit print, same reason
                                   ⁷      - a new line character
                                          - yet another implicit print, same reason
                                    ®     - recall newNumber from the register
                                        ? - if... 
                                       ®  - ...condition: recall from register again
                                          -               (i.e. if non-zero)
                                     ß    - ...then: call this Link (2) as a monad
                                          -          = Link 2(newNumber)
                                      Ç   - ...else: call the last Link (1) as a monad
                                          -          = Link 1(0) (since newNumber=0)

99Ç - Main Link: no arguments
99  - yep, you guessed it, ninety nine
  Ç - call the last Link (2) as a monad


2

VBA: 225 233 ไบต์

Sub b()
For c = 99 To 0 Step -1
GoSub d
GoSub d
Debug.Print "Take one down and patch it around"
c = c + 5 - Int(rnd() * 20)
If c < 0 Then c = 0
GoSub d
Debug.Print
Next c
Exit Sub
d:
Debug.Print c & " bugs in the code"
Return
End Sub

{EDIT} เพิ่มรายการที่หายไปrnd()*

หมายเหตุ:
ใช้GoSubเพื่อพิมพ์บรรทัดที่มีสามแถวเนื่องจากสั้นกว่าการกำหนดบรรทัดให้กับตัวแปรและนำDebug.Printมาใช้เล็กน้อย
Debug.Printไม่มีข้อโต้แย้งใด ๆ พิมพ์บรรทัดว่าง (ไม่จำเป็นสำหรับ Null หรือสตริงว่าง) WorksheetFunction.Maxบรรทัดจะยาวเกินไปดังนั้นฉันจึงใช้ "ถ้าน้อยกว่า" เพื่อป้องกันเชิงลบ

 

ด้วยการเยื้องและแสดงความคิดเห็น

Sub b()
    For c = 99 To 0 Step -1
        GoSub d '"# bugs in the code"
        GoSub d '"# bugs in the code"
        Debug.Print "Take one down and patch it around"
        c = c + 5 - Int(rnd() * 20)
        If c < 0 Then c = 0 'Non-negative
        GoSub d '"# bugs in the code"
        Debug.Print
    Next c
    Exit Sub
d: 'This is our GoSub bit
    Debug.Print c & " bugs in the code"
    Return
End Sub

1
นั่นเป็นวิธีที่มีประสิทธิภาพมากในการทำตัวเลขสุ่ม!
Sam Dean

@ SamDean ไม่แน่ใจว่าฉันลืมที่จะรวมไว้rnd() * ในที่นั่น - ฉันคิดว่าฉันกำลังยุ่งอยู่กับการรายงานถ้ามันเป็นตัวละครน้อย Dim c%(เช่น "c เป็นจำนวนเต็ม") และวางInt()
Chronocidal

ฮ่าฮ่าไม่ต้องกังวล! ยินดีที่ได้เห็นคำตอบ VBA เพราะฉันไม่ได้ใช้มาหลายปี
Sam Dean

2

Python 2 ,  138 134 133 131  127 ไบต์

-1ขอบคุณ Jo King (จัดเรียงใหม่เพื่อใช้ตรรกะbugs-=min(bugs,randomNumber)แทนbugs=max(0,bugs-randomNumber)) สิ่งนี้ทำให้การบังคับให้ออกโดยใช้การหารด้วยข้อผิดพลาดเป็นศูนย์ประหยัดอีก6ไบต์

r=n=99
t="bugs in the code\n"
while 1:r+=id(r);b=n;n-=min(n,r%21-4);print b,t,1/b|b,t,"Take one down and patch it around\n",n,t

ลองออนไลน์!


ปรากฎว่าฉันไม่จำเป็นต้องสร้างสิ่งอันดับเลย
Jonathan Allan


@ โจกิ้งขอบคุณ! (ฉันควรจะเห็นว่าจริง ๆ เพราะมันเป็นเหมือนสิ่งที่ฉันทำในคำตอบของฉันเยลลี่)
Jonathan Allan

2
@JoKing ... ซึ่งหมายความว่าเราสามารถบังคับให้ลาออกจากที่มีการแบ่งโดยศูนย์ข้อผิดพลาดในการบันทึก --two-- อีกหก :)
โจนาธานอัลลัน

2

ทับทิม: 149 ไบต์

n=99;f=" bugs in the code\n";loop{puts"#{n}#{f}"*2+"Take one down and patch it around\n";(n+=rand -16..4)>0?puts("#{n}#{f}\n"):break};puts"0#{f}\n"*2

ควรทำงานใน Ruby รุ่นใดก็ได้> 1.8

ฉันคิดว่ามันอาจจะเป็นไปได้ที่จะเพิ่มประสิทธิภาพของสตริงอีกเล็กน้อย แต่โดยทั่วไปฉันพอใจกับมันมาก - โดยเฉพาะอย่างยิ่งคำสั่งผสมคำสั่ง / เปรียบเทียบ / คำสั่งผสม / แบ่ง

หมายเหตุ: เทคนิคการส่งออกมีการขึ้นบรรทัดใหม่สองบรรทัด; หากต้องมีการคำนึงถึงมันจะเพิ่มขึ้น 4 ตัวอักษร


สวัสดีและยินดีต้อนรับสู่ PPCG! เรานับการขึ้นบรรทัดใหม่ แต่ถ้ามันทำงานบน Linux คุณสามารถนับได้\n(ไม่\r)
NoOneIsHere

@ NoOneIsHere ขอบคุณ :) ฉันได้อัปเดตคำตอบของฉันเพื่อชี้แจง - ฉันหมายถึงการขึ้นบรรทัดใหม่ในผลลัพธ์เนื่องจากคำถามระบุว่ามีหนึ่งที่ยอมรับได้ แต่ฉันไม่แน่ใจเกี่ยวกับสอง
DaveMongoose

ฉันเห็น. ผมคิดว่าดีของ
NoOneIsHere

2

Zsh , 133 ไบต์

b="%d bugs in the code
";for ((n=99;n;)){printf $b$b"Take one down and patch it around
$b
" n n n-=RANDOM%21-4,n=n\>0\?n:0};printf $b

ลองออนไลน์!


นี่เป็นการใช้ประโยชน์จากฟีเจอร์ zsh บางอย่าง

  • รูปแบบห่วงทางเลือก : while list; do list; doneสามารถเขียนเป็นwhile list {list}
  • หากตัวระบุรูปแบบprintfเป็นตัวเลขอาร์กิวเมนต์ที่เกี่ยวข้องจะถูกประเมินเป็นนิพจน์ทางคณิตศาสตร์ ดังนั้น:
    • เราได้รับคุณค่าของnฟรีโดยไม่ต้องใช้$
    • n -= RANDOM % 21 - 4, n = n > 0 ? n : 0มีการประเมินอีกครั้งโดยไม่ต้องใช้$((...)), $[...]หรือคล้ายกัน >และ?จะต้องมีการหลบหนี
    • printf $bที่สิ้นสุดประเมินอาร์กิวเมนต์ว่างเปล่าเป็น %d0
  • การแยกคำในการขยายพารามิเตอร์ถูกปิดโดยปริยายดังนั้นฉันไม่จำเป็นต้องพูด$bทุกที่
    • นี้จะช่วยให้ช่วยให้ผมเขียนแทน$b$b"Take...""$b${b}Take..."

  • บันทึกไว้เพียงไม่กี่ไบต์โดยใช้บรรทัดใหม่ที่เกิดขึ้นจริงแทน\nและแทนfor((n=99;n;))n=99;while ((n))

ฉันคิดว่ามันควรจะเป็น -4 "- =" ดูเหมือนกับสารประกอบดังนั้นจึง +4 ก่อนแล้วจึงลบออกทั้งหมด
Sam Dean

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