99 lỗi trong mã


47

99 lỗi trong mã

Sự thích nghi của "99 chai bia trên tường" cho khoa học máy tính nơi các lỗi tăng lên thay vì các chai giảm thường được đăng lại trên internet. Ví dụ áo thun ở đây .

Tôi nghĩ sẽ rất thú vị khi thấy đệ quy tiềm năng và tạo số ngẫu nhiên trên nhiều loại ngôn ngữ và tìm ra những cách hiệu quả nhất để làm điều đó.

Có một vài thách thức khác phải làm với 99 chai bia nhưng dường như không có con số nào ngày càng giảm!

Thử thách

Chương trình hoặc chức năng của bạn sẽ không nhận đầu vào và sau đó in

99 lỗi trong mã

99 lỗi trong mã

Lấy một cái xuống và vá nó xung quanh

X lỗi trong mã

(dòng trống)

Trong đó X là số nguyên trước trừ đi 1 cộng với một số nguyên ngẫu nhiên trong phạm vi [-15,5].
Bạn có thể hợp nhất âm 1 vào số nguyên ngẫu nhiên, do đó cho phép phạm vi [-16,4].
Phạm vi có thể là độc quyền, vì vậy trừ đi một cộng (-16,6) hoặc (-17,5).

Các số nguyên ngẫu nhiên không cần phải được phân bổ đều mà tất cả đều có thể.

Chương trình luôn bắt đầu với 99 lỗi.

Bạn có thể bỏ qua lỗi ngữ pháp của "1 lỗi".

Chương trình sẽ dừng khi số lỗi là 0 hoặc âm và in

0 lỗi trong mã

Không bao giờ nên có một số lỗi tiêu cực. Kết thúc sẽ giống như

Lỗi Y trong mã

Lỗi Y trong mã

Lấy một cái xuống và vá nó xung quanh

0 lỗi trong mã

(dòng trống)

0 lỗi trong mã

Một dòng mới được chấp nhận.

  • Mã của bạn có thể là một chương trình đầy đủ hoặc một chức năng.
  • Không có đầu vào.
  • Đầu ra phải là thiết bị xuất chuẩn hoặc trả về.
  • Cảnh báo / lỗi trong nhật ký / STDERR là được miễn là STDOUT có văn bản được yêu cầu. Xem ở đây để biết thêm.

Đây là mã golf, vì vậy mã ngắn nhất tính bằng byte sẽ thắng.

Ví dụ đầu ra

Dán ví dụ đầu ra bin được xử lý cho -11 lỗi mỗi lần


1
Liên quan: 1 2 (sự khác biệt: trong thử thách này, đầu ra có thể dài tùy ý).
dùng202729

16
Một kịch bản thực tế hơn sẽ là nếu dấu của số ngẫu nhiên được lật!
Stewie Griffin

9
Tôi thất vọng, rằng các yêu cầu không bao gồm rằng chương trình phải có lỗi một khi gặp phải số âm, như bị sập, tràn đến max int hoặc tương tự;).
allo

3
"Các số nguyên ngẫu nhiên không cần phải được phân phối đồng đều, tất cả đều có thể." làm tôi nhớ đến xkcd.com/221
Ivo Beckers

2
Thật xấu hổ 99 không có thế hệ số ngẫu nhiên.
Jonathan Allan

Câu trả lời:


18

R , 182 140 138 135 byte

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="")

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

Mặc dù khá hợp lý khi tạo số ngẫu nhiên, R rất tệ về chuỗi và in. JayCe đã tìm thấy khoảng một tỷ byte, và tiếp tục tìm ra những cách mới để chơi gôn này!


1
JayCe đã tìm thấy tất cả các byte đó ở đâu? Đó chỉ là sự tình cờ hay JayCe đã tích cực tìm kiếm chúng?
Stewie Griffin



Không phải là +5chi phí cho bạn thêm 2 byte? tại sao không chỉ sample(26,6))?
bác sĩ lâm sàng

2
@theforestecologist Chào mừng bạn đến với PPCG! Tôi đề nghị bạn xem xét kỹ hơn câu hỏi ... có một dấu trừ ở phía trướcsample
JayCe

11

Java 8, 161 160 byte

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 byte nhờ @Jonathan ALLan .

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

Giải trình:

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

Có vẻ như bạn không sử dụng rcho bất cứ điều gì?
OOBalance

1
Loại bỏ ,rdường như vẫn hoạt động: Hãy thử trực tuyến!
Kamil Drakari

@OOBalance Rất tiếc .. Không chắc tại sao tôi lại nhận được điều đó ..>.> Cảm ơn bạn đã chú ý.
Kevin Cruijssen

1
i - = ... + 5 lưu một (mặc dù tôi nghĩ rằng phạm vi nên là [-16 4] chứ không phải [-15,5])
Jonathan Allan

1
@OOBalance có r không được sử dụng, vì anh ta đang sử dụng java ;-)
Anand Rockzz

10

PowerShell , 137 135 133 131 byte

$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"

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

Phần "lỗi trong mã" được lưu vào $bđể sử dụng sau. Đặt $athành 99, nhập một forvòng lặp trên $a. Đầu tiên chúng ta tạo một mảng gồm hai chuỗi ," "*2, với chuỗi là "X bugs in the code".

Tiếp theo chỉ là chuỗi "Take one down and patch it around". Sau đó, chúng tôi tăng $abằng cách chọn một Randomsố nguyên từ phạm vi [-16,4]. Sau đó, chúng tôi kẹp $aở mức tối thiểu bằng 0 bằng cách sử dụng if if($a-lt0){$a=0}. Sau đó là chuỗi "Y bugs in the code".

Cuối cùng, sau khi vòng lặp kết thúc, chúng tôi đặt chuỗi "0 bugs in the code"lên đường ống. Tất cả các chuỗi đó được thu thập từ đường ống và một ẩn Write-Outputcho chúng ta những dòng mới giữa chúng miễn phí.

Đã lưu hai byte bằng forvòng lặp thay vì whilevòng lặp.
Lưu hai byte bằng cách di chuyển $bvào phần riêng của nó.
Đã lưu hai byte nhờ vào Adrian Blackburn.


Bạn có thể thay thế $ a = (0, $ a) [$ a-gt0]; với If ($ a-lt0) {$ a = 0} cho một vài byte
Adrian

@AdrianBlackburn Cảm ơn!
admBorkBork

9

JavaScript (Node.js) , 127 byte

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

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


Giải trình :

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

Cảm ơn @tsh về ý tưởng đệ quy và triển khai (đã lưu một số byte)

Bất kỳ đề xuất để chơi golf này hơn nữa đều được chào đón.



1
Tại sao bị 0+loại bỏ? Nó dường như được yêu cầu đầu ra.
tsh

@tsh: Phải không? Tôi đã không đọc phần đó.
Muhammad Salman


6

Python 2 , 151 byte

Thủ thuật hay j=i+max(-i,randint(-16,4))của Jo King, khai thác cho phép phân phối không đồng đều

Đã lưu vài byte nhờ 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

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


1
Bạn có thể lưu một byte bằng cách sử dụng j=max(0,i+randint(-16,4)).
Mnemonic

Ngoài ra, đó là 'lỗi trong các mã'.
Mnemonic

Sử dụng 0 để so sánh wiil làm cho không phải tất cả các số có thể. Cảm ơn vì không có gì 'the': D
Dead Possum

Thủ thuật tương tự như câu trả lời của tôi, 151 byte
Jo King

Dù sao họ cũng không thể. Bạn không được phép xuống dưới 0.
Mnemonic

6

Than , 81 byte

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

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Giải trình:

≔⁹⁹θ

Bắt đầu với 99 lỗi trong mã.

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

Lưu chuỗi nén "% d lỗi trong mã \ n".

W›θ⁰«

Lặp lại trong khi có một số lỗi tích cực còn lại.

ײ﹪ζθ

In số lượng lỗi trong mã hai lần.

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

In "Lấy một xuống và vá nó xung quanh".

≧⁺⁻⁴‽²¹θ

Thêm một số lỗi ngẫu nhiên trong khoảng từ -17 (độc quyền) và 4 (đã bao gồm).

﹪ζ×θ›θ⁰

In số lỗi còn lại hoặc 0 nếu âm.

Để lại một dòng trống giữa các câu thơ.

»﹪ζ⁰

Sau câu thơ cuối, in lại 0 lỗi trong mã.


Cần cuối cùng lặp lại "0 lỗi trong mã"!
Sam Dean

1
@SamDean Xin lỗi tôi đã bỏ qua điều đó, đã sửa.
Neil

6

JavaScript, 189 176 168 162 byte

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

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

Cảm ơn Muhammad Salman vì sự console.logthay thế còn thiếu và Oliver đã cải thiện bài kiểm tra x

Cảm ơn l4m2 vì đã chơi golf 8 byte


Tôi không phải là chuyên gia về nút, nhưng tôi tin rằng "Chương trình sẽ dừng khi số lỗi là 0 hoặc âm" có nghĩa là bạn cần x<=0?console.log("\n"+0+a):f(x)ở cuối.
NoOneIsHãy

1
Được rồi xin lỗi. Một điều nữa: nếu bạn cần lặp lại trong một hàm ẩn danh, bạn cần đặt tên rõ ràng cho nó (+2 byte)
NoOneIsHere

1
"console.log" cuối cùng có thể được thay thế bằng "c" không?
Sam Dean

1
Ngoài ra @NoOneIsHere là đúng. Bạn cần ftuyên bố đó . Bình chọn cho đến khi cập nhật để sửa lỗi đó. (Ngoài ra liên kết của tôi cũng cần cập nhật)
Muhammad Salman

2
Điểm tôi đang cố gắng thực hiện ở đây là mã của bạn không hoạt động nếu hàm không được gọi f, mà bạn không thể giả sử.
NoOneIsHãy

6

Python 3 , 156 138 byte

Cảm ơn câu trả lời Python 2 của Jonathan cho idmánh khóe

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)

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

Giải trình:

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

Octave , 149 148 byte

Lưu một byte bằng cách thay đổi randi(21)%iđến 21*rand%.f. %.fđảm bảo đầu ra là một số float với số thập phân bằng không (tức là và số nguyên).

Chèn một loạt các ngắt dòng thay vì dấu phẩy và dấu chấm phẩy để dễ đọc. Nó cảm thấy sai, nhưng nó không dài hơn một lớp lót.

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)

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

Giải trình:

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.

Sử dụng p((x+=21*rand-17)*(x>0)thay vì maxlưu một byte, nhưng đầu ra dòng cuối cùng -0 bugs ...thay vì 0 bugs. Nó hoạt động với randi(21)-17, nhưng sau đó nó có cùng độ dài như trên. Hãy thử trực tuyến!


5

COBOL (GnuCOBOL), 317 294 279 270 byte

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"

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

Ung dung

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

Lưu ý: câu cuối cùng vẫn được in, bởi vì COBOL thực thi toàn bộ chương trình và sau perform untilvòng lặp, nó "rơi xuống" nhãn a , thực hiện các câu lệnh của nó. Hành vi này tương tự như switch casekhông có break.

PS: Các số không được hiển thị chính xác theo yêu cầu, nhưng COBOL không tốt trong việc tự động chuyển đổi số thành biểu diễn văn bản đẹp.


1
Chào. Chào mừng đến với PPCG.
Muhammad Salman

Tôi nghĩ rằng trừ 4 nên cộng 4. Tôi đoán bạn đã đi (i- (rand-4) == (i-rand + 4). Nhưng không có dấu ngoặc nên dấu hiệu cần thay đổi. những con số bị loại bỏ hay đó là một đặc điểm của ngôn ngữ? Nhưng làm việc tốt với ngôn ngữ không thân thiện với vàng!
Sam Dean

1
@SamDean Cảm ơn! Tôi đã sửa lỗi đó. Tôi phải thừa nhận rằng tính toán ngẫu nhiên thực tế được lấy cảm hứng từ câu trả lời của Kevin Cruijssen . Nhưng anh ta sử dụng một toán tử gán gán ( -=in i-=Math.random()*21-4), hàm ý dấu ngoặc đơn xung quanh toàn bộ toán hạng tay phải. Tôi quên làm cho chúng rõ ràng, nhưng bây giờ nó đã được sửa, tôi nghĩ vậy.
MC Hoàng đế

@MCEmaoh có vẻ tốt với tôi bây giờ!
Sam Dean

Bạn không thể sử dụng +4 và lưu dấu ngoặc?
raznagul

4

VBA: 212 163 byte

Giải pháp này dựa trên một giải pháp do Chronocidal đăng ngày hôm qua. Đây là bài viết đầu tiên của tôi và tôi không có đủ danh tiếng để bình luận về bài đăng của anh ấy.

Bản sửa đổi này chứa hai cải tiến.

  1. Sử dụng While/Wendthay vì For/Nextlưu một vài ký tự.
  2. Gọi một Sub được đặt tên bằng một ký tự đơn ngắn hơn GoSubvà các dòng Exit SubReturncần thiết để hỗ trợ nó.

Chỉnh sửa:
3. Đã xóa khoảng trắng và các ký tự mà trình soạn thảo VBA sẽ tự động thêm lại. Xem Mẹo chơi golf trong VBA
4. Đã thêm các đề xuất của @EricF, sau đó thấy thuật toán bin dán của anh ấy thậm chí còn nhỏ hơn nên tôi đã thay thế thuật toán của mình khoảng trắng. Một thay đổi chính đã được nối vbLFvào chuỗi đầu ra để Debug.Printkhông phải gọi thường xuyên. Thanh danh cho 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

Đây là một thử thách thú vị. Nếu bạn biết một trình thông dịch trực tuyến như TIO cho VB6 / VBScript / VBA, vui lòng để lại nhận xét.

Nếu bạn muốn kiểm tra mã này và cài đặt Microsoft Excel, Word, Access hoặc Outlook (chỉ dành cho Windows), hãy nhấn Alt + F11 để mở VBA IDE. Chèn một mô-đun mã mới (Alt + I, M) và xóa Option Explicit. Sau đó dán mã và nhấn F5 để chạy nó. Kết quả sẽ xuất hiện trong Cửa sổ ngay lập tức (nhấn Ctrl + G nếu bạn không nhìn thấy nó).


4
Chào mừng đến với trang web!
Thuật sĩ lúa mì

1
Bạn có thể giảm xuống còn 197 ký tự nếu kết hợp các chuỗi, sử dụng cthay vì c>0điều kiện While của bạn và sử dụng c=Iif(c<0,0,c)thay vì If c<0 [...]: pastebin.com/nFGtGqdE
ErikF

4

LaTeX , 368 304 293 287 245 240 byte

Mặc dù không thực sự cạnh tranh so với các chương trình khác về byte, tôi chỉ muốn xem làm thế nào để làm điều này trong 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}

Dễ đọc hơn:

\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}

Cải tiến (mỗi lần chỉnh sửa):

  1. "x lỗi trong mã" hiện là một hàm thay vì 4 dòng
  2. Viết lại \ifmệnh đề cho \repeatnhư là một\else
  3. Rõ ràng \value{b}=xhoạt động để khởi tạo nhưng không phải trong vòng lặp (thay vì \setcounter{b}{x})
  4. Rõ ràng \relaxnên được sử dụng cho điểm 3, nhưng điều đó cũng có thể đạt được bằng cách chèn một khoảng trắng. Đã xóa các \elselệnh TeX đã sử dụng thay vì LaTeX vì các lệnh này ngắn hơn và được thay thế \'bằng ~.
  5. Một số mã không cần phải được thư giãn vì một số lý do.

1
Chào mừng đến với PPCG.
Muhammad Salman

Chào mừng đến với PPCG! Tôi đã không chạy mã của bạn nhưng không nên \ifnum\value{b}<1thay vì <0?
JayCe

@JayCe: Nó không thực sự quan trọng, một khi b là 0, dù sao thì nó cũng thoát khỏi vòng lặp. Có thể chỉ là ít trực quan hơn khi b bằng 0, trường hợp khác được in thực sự, nhưng thực tế không có sự khác biệt nào tôi nghĩ.
Simon Klaver

@JayCe đã rút ngắn mã, bây giờ nó không còn quan trọng nữa;)
Simon Klaver

4

C,  169  165 byte

Cảm ơn @ceilingcat vì đã lưu bốn byte!

*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);}

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


3

SAS, 210 byte

%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

Ung dung:

%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

Có thể lưu một vài byte nếu cảnh báo trong nhật ký được cho phép (đặt &avào &bbiến macro, nhưng điều đó tạo ra cảnh báo ban đầu).


Một vài người khác có cảnh báo vì vậy tôi sẽ đi cùng với họ.
Sam Dean


3

ABAP , 295 byte

... bởi vì tại sao quái không!

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.

Nó chắc chắn không cạnh tranh được so với các ngôn ngữ khác, nhưng tôi thậm chí đã cố gắng giảm nó xuống từ 330 byte tôi đã viết ban đầu, vì vậy tôi coi đó là một chiến thắng cá nhân.

Vì ABAP không cho phép các dòng dài hơn 255 ký tự, tôi đã phải thay thế một khoảng trắng bằng dấu ngắt dòng. Trên Windows, bước đầu này đã tăng kích thước lên 296 byte do CRLF, nhưng nó chạy tốt với chỉ có LF trong đó. ABAP chắc chắn đòi hỏi nhiều không gian mặc dù, vì vậy đây không phải là vấn đề lớn.

WRITE chỉ đơn giản là bỏ văn bản GUI, vì vậy tôi đoán đó là loại giống như thiết bị xuất chuẩn? Tôi có thể có thể lưu một số byte ở đây bằng cách sử dụng một cấu trúc hoặc bảng, nhưng do cách SAP xử lý các cấu trúc hỗn hợp (chứa ký tự và số), cách tiếp cận tôi tưởng tượng sẽ chỉ hoạt động trên các hệ thống phi Unicode ... Cá nhân tôi cho rằng không đi, mặc dù có quyền truy cập vào cả hai.

Mô-đun chức năng cho các số ngẫu nhiên là mô-đun duy nhất tôi có thể tìm thấy trong hệ thống của chúng tôi, tôi cho rằng có thể có một tên có tham số hoặc tên ngắn hơn. Không ý kiến!

Mã nhiều hơn hoặc ít hơn, bao gồm các ý kiến:

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.

Cảm ơn các thử thách!
Gửi ông chủ của tôi: Xin đừng sa thải tôi, tôi chỉ đang tự học!


3

Sạch sẽ , 245 234 byte

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"

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


Bất kỳ cơ hội bạn có thể loại bỏ các trích dẫn ở đầu và cuối?
Sam Dean

1
@SamDean Oh đó chỉ là một tùy chọn trình biên dịch mà tôi đã quên. Tôi sẽ ném vào đó.
Οurous

3

C #, 184 181 byte

Câu trả lời Code Golf đầu tiên của tôi!

(Dựa trên câu trả lời Java từ @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;};

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


1
Chào mừng bạn đến với PPCG :)
Shaggy


2

T-SQL, 188 byte

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 cho phép trả về bên trong chuỗi ký tự, do đó sẽ giúp.

CONCAT()thực hiện chuyển đổi ngầm định thành văn bản để tôi không phải lo lắng về CASThoặc CONVERT.


2

JavaScript, 138 byte

_=>(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 byte

Từ anh tôi

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

Pyth , 94 92 byte

J99WJ%jb[K"%d bugs in the code"K"Take one down and patch it around"Kk)[JJ=JeS,Z+J-O21 16;%KZ

Dùng thử trực tuyến


Phiên bản trước: 94 byte

J99WJp%jb[K"%d bugs in the code"K"Take one down and patch it around"K)[JJ=JeS,Z+J-O21 16)b;%KZ

2

Thạch , 61 byte

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

Một liên kết niladic cũng hoạt động như một chương trình đầy đủ.

Hãy thử trực tuyến! (đầu ra bị xóa sau khi thực hiện xong nhưng nó in từng đoạn)

Làm sao?

;“,Ȥ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

Perl, 132 byte

$c=" bugs in the code
";for($i=99;$i>0;$i+=~~rand(21)-16){print$t.$/,($t=$i.$c)x2,"Take one down and patch it around
"}print"0$c
"x2

2

VBA: 225 233 byte

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} Đã thêm thiếurnd()*

Lưu ý:
Sử dụng GoSubđể in dòng ba lần, vì nó ngắn hơn một chút so với việc gán dòng cho một biến và Debug.Printing nó.
Debug.Printkhông có bất kỳ đối số nào in một dòng trống (không cần Null hoặc chuỗi rỗng) Một WorksheetFunction.Maxdòng sẽ quá dài, vì vậy tôi đã sử dụng "nếu nhỏ hơn" để ngăn tiêu cực.

 

Với sự thụt lề và bình luận

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
Đó là một cách rất hiệu quả để làm số ngẫu nhiên!
Sam Dean

@SamDean Không chắc chắn làm thế nào tôi quên đưa rnd() * vào đó - Tôi nghĩ rằng tôi đã bận kiểm đếm nếu đó là ít ký tự hơn Dim c%(ví dụ: "c là một Integer") và thảInt()
Chronocidal

haha không phải lo lắng Rất vui khi thấy một câu trả lời VBA vì tôi đã không sử dụng nó trong nhiều năm!
Sam Dean

2

Python 2 ,  138 134 133 131  127 byte

-1 Cảm ơn Jo King (sắp xếp lại để sử dụng logic bugs-=min(bugs,randomNumber)hơn là bugs=max(0,bugs-randomNumber)). Điều này cho phép bỏ lực lượng bằng cách sử dụng phép chia bằng 0, tiết kiệm thêm 6 byte!

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

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


Hóa ra tôi không cần phải tạo tuple.
Jonathan Allan


@JoKing Cảm ơn! (Tôi thực sự nên phát hiện ra rằng vì nó giống như những gì tôi làm trong câu trả lời Jelly của tôi.)
Jonathan Allan

2
@JoKing ... có nghĩa là chúng ta có thể buộc bỏ việc với một phép chia không có lỗi để lưu --two-- sáu lần nữa :)
Jonathan Allan

2

Ruby: 149 byte

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

Nên hoạt động với khá nhiều phiên bản Ruby> = 1.8

Tôi nghĩ rằng có thể tối ưu hóa chuỗi nhiều hơn một chút, nhưng nói chung tôi khá hài lòng với nó - đặc biệt là câu lệnh gán / so sánh / ngắt kết hợp và lạm dụng dấu ngoặc tùy chọn.

Lưu ý: đầu ra về mặt kỹ thuật có hai dòng mới; nếu cần phải tính thì nó tăng thêm 4 ký tự.


Xin chào, và chào mừng đến với PPCG! Chúng tôi đếm các dòng mới, nhưng nếu nó hoạt động trên Linux, bạn chỉ có thể đếm \n(không \r).
NoOneIsĐây là

@NoOneIsHere Cảm ơn :) Tôi đã cập nhật câu trả lời của mình để làm rõ - Tôi đã đề cập đến các dòng mới trên đầu ra bởi vì câu hỏi chỉ ra rằng có một cái là chấp nhận được, nhưng tôi không chắc chắn về hai.
DaveMongoose

Tôi hiểu rồi. Tôi nghĩ điều đó tốt
NoOneIsHãy là

2

Zsh , 133 byte

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

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


Điều này tận dụng một vài tính năng zsh.

  • các hình thức vòng lặp thay thế : while list; do list; donecó thể được viết nhưwhile list {list}
  • Nếu một chỉ định định dạng bằng printfsố, đối số tương ứng được đánh giá là biểu thức số học. Vì thế:
    • chúng tôi nhận được giá trị nmiễn phí mà không cần sử dụng$
    • n -= RANDOM % 21 - 4, n = n > 0 ? n : 0được đánh giá lại mà không phải sử dụng $((...)), $[...]hoặc tương tự. Các >?phải được thoát.
    • Các printf $bcuối cùng đánh giá một cuộc tranh cãi có sản phẩm nào là 0 cho %d.
  • Word chia tách khi mở rộng tham số bị tắt theo mặc định, vì vậy tôi không phải trích dẫn ở $bbất cứ đâu.
    • Điều này cho phép tôi viết $b$b"Take..."thay vì "$b${b}Take...".

  • Đã lưu một vài byte bằng cách sử dụng các dòng mới thực tế thay vì \nfor((n=99;n;))thay vì n=99;while ((n)).

Tôi nghĩ nó phải là -4. "- =" trông giống như hợp chất của nó, vì vậy nó thực hiện +4 trước sau đó trừ tất cả.
Sam Dean

@SamDean oops, đã sửa.
muru
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.