99 błędów w kodzie


47

99 błędów w kodzie

Adaptacja „99 butelek piwa na ścianie” dla informatyki, w której błędy rosną zamiast spadać, jest często publikowana w Internecie. Przykładowa koszulka tutaj .

Myślę, że będzie interesujące zobaczyć potencjalną rekurencję i generowanie liczb losowych w wielu różnych językach i znaleźć najbardziej efektywne sposoby na zrobienie tego.

Istnieje 99 innych wyzwań związanych z 99 butelkami piwa, ale żadna z nich nie wydaje się mieć coraz większej liczby!

Wyzwanie

Twój program lub funkcja nie powinny pobierać żadnych danych wejściowych, a następnie drukować

99 błędów w kodzie

99 błędów w kodzie

Zdejmij jedną i załataj ją

X błędów w kodzie

(pusta linia)

Gdzie X to poprzednia liczba całkowita minus 1 plus losowa liczba całkowita z zakresu [-15,5].
Możesz scalić minus 1 z losową liczbą całkowitą, umożliwiając w ten sposób zakres [-16,4].
Zakresy mogą być wyłączne, więc minus jeden plus (-16,6) lub (-17,5).

Losowe liczby całkowite nie muszą być równomiernie rozmieszczone, muszą być wszystkie możliwe.

Program zawsze zaczyna się od 99 błędów.

Możesz zignorować błąd gramatyczny „1 błędów”.

Program powinien zatrzymać się, gdy liczba błędów wynosi 0 lub jest ujemna, i wydrukować

0 błędów w kodzie

Nigdy nie powinno być ujemnej liczby błędów. Zakończenie powinno wyglądać

Błędy Y w kodzie

Błędy Y w kodzie

Zdejmij jedną i załataj ją

0 błędów w kodzie

(pusta linia)

0 błędów w kodzie

Końcowa nowa linia jest dopuszczalna.

  • Twój kod może być pełnym programem lub funkcją.
  • Brak danych wejściowych.
  • Wyjście powinno być standardowe lub zwrócone.
  • Ostrzeżenia / błędy w logach / STDERR są w porządku, o ile STDOUT ma wymagany tekst. Zobacz tutaj, aby uzyskać więcej informacji.

To jest code-golf, więc wygrywa najkrótszy kod w bajtach.

Przykładowy wynik

Przykładowy wynik wklejania pojemnika za każdym razem poprawiany dla błędów -11


1
Powiązane: 1 2 (różnica: w tym wyzwaniu wyjście może być dowolnie długie).
user202729

16
Bardziej realistycznym scenariuszem byłoby odwrócenie znaku liczby losowej!
Stewie Griffin

9
Jestem rozczarowany, że wymagania nie obejmują tego, że program musi mieć błąd po napotkaniu liczby ujemnej, takiej jak awaria, przepełnienie do maksymalnej wartości int lub podobnej;).
allo

3
„Losowe liczby całkowite nie muszą być równomiernie rozmieszczone, muszą być wszystkie możliwe”. przypomniał mi o xkcd.com/221
Ivo Beckers

2
Szkoda, że 99 nie ma generowania liczb losowych.
Jonathan Allan

Odpowiedzi:


18

R , 182 140 138 135 bajtów

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

Wypróbuj online!

chociaż jest dość dobry w generowaniu liczb losowych, R jest straszny w przypadku ciągów i drukowania. JayCe znalazł około miliarda bajtów i wciąż szuka nowych sposobów na golfa!


1
Gdzie JayCe znalazł te wszystkie bajty? Czy to tylko przypadek, czy JayCe aktywnie ich szukał?
Stewie Griffin



Czy to nie +5kosztuje jeszcze 2 bajty? dlaczego nie sample(26,6))?
theforestecologist

2
@forestececologist Witamy w PPCG! Proponuję przyjrzeć się bliżej temu pytaniu ... z przodu jest znak minussample
JayCe

11

Java 8, 161 160 bajtów

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 bajt dzięki @JonathanAllan .

Wypróbuj online.

Wyjaśnienie:

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

Wygląda na to, że nie używasz rdo niczego?
OOBalance

1
,rWydaje się, że usuwanie nadal działa: Wypróbuj online!
Kamil Drakari

@OOBalance Ups .. Nie jestem pewien, dlaczego to tam dostałem ..>.> Dzięki za zauważenie.
Kevin Cruijssen

1
i - = ... + 5 zapisuje jeden (chociaż myślę, że zasięg powinien wynosić [-16 4], a nie [-15,5])
Jonathan Allan

1
@OOBalance tak r nie jest używany, ponieważ używa java ;-)
Anand Rockzz

10

PowerShell , 137 135 133 131 bajtów

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

Wypróbuj online!

Sekcja „błędy w kodzie” jest zapisywana do $bpóźniejszego wykorzystania. Ustawia $ana 99, włącza forpętlę $a. Najpierw tworzymy tablicę dwóch ciągów znaków ," "*2, przy czym ciąg znaków to "X bugs in the code".

Dalej jest tylko ciąg "Take one down and patch it around". Następnie zwiększamy $a, wybierając Randomliczbę całkowitą z zakresu [-16,4]. Następnie ograniczamy się $ado minimum zero za pomocą if if($a-lt0){$a=0}. Następnie ciąg "Y bugs in the code".

Na koniec, po zakończeniu pętli, umieszczamy ciąg "0 bugs in the code"na rurociągu. Wszystkie te ciągi znaków są zbierane z potoku, a domniemany Write-Outputdaje nam nowe linie między nimi za darmo.

Zapisano dwa bajty za pomocą forpętli zamiast whilepętli.
Zaoszczędzono dwa bajty, przechodząc $bdo własnej sekcji.
Zaoszczędził dwa bajty dzięki Adrianowi Blackburnowi.


Możesz wymienić $ a = (0, $ a) [$ a-gt0]; z If ($ a-lt0) {$ a = 0} na kilka bajtów
Adrian

@AdrianBlackburn Thanks!
AdmBorkBork

9

JavaScript (Node.js) , 127 bajtów

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

Wypróbuj online!


Objaśnienie:

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

Dzięki @tsh za pomysł rekursji i implementacji (zapisano niektóre bajty)

Wszelkie sugestie dotyczące gry w golfa są mile widziane.



1
Dlaczego został 0+usunięty? Wydaje się, że jest to wymagane wyjście.
tsh

@tsh: Czy to jest? Nie przeczytałem tej części.
Muhammad Salman


6

Python 2 , 151 bajtów

Niezła sztuczka j=i+max(-i,randint(-16,4))Jo Kinga, wykorzystująca dozwoloną nierównomierną dystrybucję

Zaoszczędzono kilka bajtów dzięki 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

Wypróbuj online!


1
Możesz zapisać bajt za pomocą j=max(0,i+randint(-16,4)).
Mnemoniczny

Ponadto, jest to „błędy w kodzie”.
Mnemoniczny

Używając 0 do porównania wiil, nie wszystkie liczby są możliwe. Dzięki za nic „the”: D
Dead Possum

Ta sama sztuczka, co moja odpowiedź, 151 bajtów
Jo King

I tak nie są możliwe. Nie możesz spaść poniżej zera
Mnemoniczny

6

Węgiel drzewny , 81 bajtów

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

Wypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:

≔⁹⁹θ

Zacznij od 99 błędów w kodzie.

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

Zapisz skompresowany ciąg „% d błędów w kodzie \ n”.

W›θ⁰«

Powtarzaj, dopóki pozostanie dodatnia liczba błędów.

ײ﹪ζθ

Wydrukuj dwukrotnie liczbę błędów w kodzie.

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

Wydrukuj „Zdejmij i załataj”.

≧⁺⁻⁴‽²¹θ

Dodaj losową liczbę błędów od -17 (wyłączne) do 4 (włącznie).

﹪ζ×θ›θ⁰

Wydrukuj liczbę pozostałych błędów lub 0, jeśli jest ujemna.

Pozostaw pustą linię między wierszami.

»﹪ζ⁰

Po ostatnim wierszu wydrukuj ponownie 0 błędów w kodzie.


Potrzebujesz tego ostatniego powtórzonego „0 błędów w kodzie”!
Sam Dean

1
@SamDean Przepraszamy, przeoczyłem to, naprawione.
Neil

6

JavaScript, 189 176 168 162 bajtów

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

Wypróbuj online!

Dziękujemy Muhammadowi Salmanowi za brakujący console.logzamiennik i Oliverowi za ulepszenie testu X.

Dzięki za l4m2 za grę w golfa o 8 bajtów


Nie jestem ekspertem od węzłów, ale uważam, że „Program powinien zatrzymać się, gdy liczba błędów wynosi 0 lub jest ujemna” oznacza, że ​​potrzebujesz x<=0?console.log("\n"+0+a):f(x)na końcu.
NoOneIsHere

1
Ok przepraszam. Jeszcze jedno: jeśli chcesz ponownie uruchomić anonimową funkcję, musisz jawnie nazwać ją (+2 bajty)
NoOneIsHere

1
czy tego ostatniego „console.log” nie można zastąpić „c”?
Sam Dean

1
Również @NoOneIsHere ma rację. Potrzebujesz tej fdeklaracji. Zagłosowano aż do aktualizacji, aby to naprawić. (Również mój link wymaga aktualizacji)
Muhammad Salman

2
Chodzi mi o to, że twój kod nie działa, jeśli funkcja nie jest wywołana f, czego nie możesz założyć.
NoOneIsHere

6

Python 3 , 156 138 bajtów

Dzięki odpowiedzi Jonathana na Python 2 za idpodstęp

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)

Wypróbuj online!

Wyjaśnienie:

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

Oktawa , 149 148 bajtów

Zapisano jeden bajt, zmieniając randi(21)i %ido 21*randi %.f. %.fzapewnia, że ​​wyjście jest zmiennoprzecinkowe z zerowymi liczbami dziesiętnymi (tj. i liczbami całkowitymi).

Wstawiono kilka podziałów linii zamiast przecinków i średników, aby ułatwić czytelność. Czuje się źle, ale nie trwa dłużej niż jedna linijka.

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)

Wypróbuj online!

Wyjaśnienie:

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.

Korzystanie p((x+=21*rand-17)*(x>0)zamiast maxzapisuje bajt, ale ostatni wiersz wyjścia -0 bugs ...zamiast 0 bugs. Działa z randi(21)-17, ale wtedy ma taką samą długość jak powyższa. Wypróbuj online!


5

COBOL (GnuCOBOL), 317 294 279 270 bajtów

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"

Wypróbuj online!

Bez golfa

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

Uwaga: ostatnie zdanie jest nadal drukowane, ponieważ COBOL wykonuje cały program, a po perform untilpętli „przewraca” etykietę a , wykonując swoje instrukcje. To zachowanie jest podobne do switch casebez break.

PS: Liczby nie są wyświetlane dokładnie tak, jak jest to wymagane, ale COBOL nie jest tak dobry w automatycznej konwersji liczb do ładnej reprezentacji tekstowej.


1
Cześć. Witamy w PPCG.
Muhammad Salman

Myślę, że minus 4 powinien być plus 4. Zgaduję, że poszedłeś (i- (rand-4) == (i-rand + 4). Ale nie ma nawiasów, więc znak musi się zmienić. liczby są usuwane, czy jest to cecha języka? Ale fajna praca z językiem nieprzyjaznym dla złota!
Sam Dean

1
@SamDean Thanks! Naprawiłem ten błąd. Muszę przyznać, że faktyczny losowy wynik został zainspirowany odpowiedzią Kevina Cruijssena . Ale używa złożonego operatora przypisania ( -=in i-=Math.random()*21-4), co oznacza nawias wokół całego operandu po prawej stronie. Zapomniałem wyrazić je wyraźnie, ale myślę, że teraz jest to naprawione.
MC Emperor

@MCEmperor wygląda teraz dla mnie dobrze!
Sam Dean

Nie możesz użyć +4 i zapisać nawiasów?
raznagul

4

VBA: 212 163 bajtów

To rozwiązanie jest oparte na rozwiązaniu opublikowanym wczoraj przez Chronocidal. To mój pierwszy post i nie mam wystarczającej reputacji, aby skomentować jego post.

Ta wersja zawiera dwa ulepszenia.

  1. Używanie While/Wendzamiast For/Nextzapisuje kilka znaków.
  2. Wywołanie Sub nazwie z pojedynczego znaku jest krótszy niż GoSuba Exit Subi Returnprzewody potrzebne do jego obsługi.

Edycja:
3. Usunięto białe znaki i znaki, które edytor VBA automatycznie doda z powrotem. Zobacz Wskazówki dotyczące gry w golfa w VBA
4. Dodałem sugestie @EricF, a następnie zobaczyłem, że jego algorytm bin wklejania był jeszcze mniejszy, więc zastąpiłem mój algorytm jego i usunąłem Biała przestrzeń. Kluczową zmianą było dołączanie vbLFdo ciągu wyjściowego, więc Debug.Printnie trzeba było go tak często wywoływać. Uznanie dla 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

To było zabawne wyzwanie. Jeśli znasz tłumacza internetowego, takiego jak TIO dla VB6 / VBScript / VBA, zostaw komentarz.

Jeśli chcesz przetestować ten kod i mieć zainstalowany program Microsoft Excel, Word, Access lub Outlook (tylko Windows), naciśnij klawisze Alt + F11, aby otworzyć VBA IDE. Wstaw nowy moduł kodu (Alt + I, M) i wyczyść Option Explicit. Następnie wklej kod i naciśnij F5, aby go uruchomić. Wyniki powinny pojawić się w oknie natychmiastowym (naciśnij Ctrl + G, jeśli go nie widzisz).


4
Witamy na stronie!
Wheat Wizard

1
Możesz sprowadzić go do 197 znaków, jeśli połączysz łańcuchy, użyj czamiast c>0jako warunek While i użyj c=Iif(c<0,0,c)zamiast If c<0 [...]: pastebin.com/nFGtGqdE
ErikF

4

LaTeX , 368 304 293 287 245 240 bajtów

Chociaż nie bardzo konkurencyjny w porównaniu do innych programów pod względem bajtów, chciałem tylko zobaczyć, jak to zrobić w 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}

Bardziej czytelny:

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

Ulepszenia (na edycję):

  1. „x błędów w kodzie” jest teraz funkcją zamiast 4 linii
  2. Przepisz \ifklauzulę \repeatjako\else
  3. Najwyraźniej \value{b}=xdziała przy inicjalizacji, ale nie w pętli (zamiast \setcounter{b}{x})
  4. Najwyraźniej \relaxnależy użyć punktu 3, ale można to również osiągnąć wstawiając spację. Usunięto \elseużywane polecenia TeX zamiast LaTeX, ponieważ są one krótsze i zastąpione \'przez~ .
  5. Z jakiegoś powodu część kodu nie musiała być rozluźniona.

1
Witamy w PPCG.
Muhammad Salman

Witamy w PPCG! Nie uruchamiać kod, ale nie powinno być \ifnum\value{b}<1zamiast <0?
JayCe

@JayCe: To naprawdę nie ma znaczenia, gdy b jest 0, to i tak ucieka z pętli. Może to być po prostu mniej intuicyjne, że gdy b jest 0, to w przeciwnym razie drukowana jest skrzynka, ale w rzeczywistości nie ma różnicy.
Simon Klaver

@JayCe skrócił kod, teraz to już nie ma znaczenia;)
Simon Klaver

4

C,  169  165 bajtów

Dzięki @ceilingcat za zapisanie czterech bajtów!

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

Wypróbuj online!


3

SAS, 210 bajtów

%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

Nie golfowany:

%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

Można zapisać kilka bajtów, jeśli ostrzeżenia w dzienniku są dozwolone (wstawić &ado &bmakrozmiennej, ale generuje to wstępne ostrzeżenie).


Kilka innych ma ostrzeżenia, więc pójdę z nimi, są dozwolone.
Sam Dean


3

ABAP , 295 bajtów

... bo dlaczego, u licha, nie!

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.

Z pewnością nie jest konkurencyjny w porównaniu do innych języków, ale udało mi się nawet zmniejszyć go z 330 bajtów, które napisałem na początku, więc liczę to jako osobistą wygraną.

Ponieważ ABAP nie zezwala na wiersze dłuższe niż 255 znaków, musiałem zastąpić spację podziałem wiersza. W systemie Windows początkowo zwiększyło to rozmiar do 296 bajtów z powodu CRLF, ale działa dobrze tylko z LF. ABAP z pewnością wymaga wielu spacji, więc to nie jest wielka sprawa.

WRITE po prostu zrzuca tekst GUI, więc myślę, że to coś w stylu stdout? Prawdopodobnie mógłbym tutaj zaoszczędzić trochę bajtów, używając struktury lub tabeli, ale ze względu na to, jak SAP obsługuje struktury mieszane (zawierające znaki i liczby), moje wyobrażenie działało tylko w systemach innych niż Unicode ... Które osobiście uważam za nie- idź, pomimo dostępu do obu.

Moduł funkcyjny dla liczb losowych jest jedynym, który udało mi się znaleźć w naszym systemie, przypuszczam, że mógłby istnieć taki o krótszej nazwie lub parametrach. Brak pomysłu!

Mniej lub bardziej czytelny kod, w tym komentarze:

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.

Dzięki za wyzwanie!
Do mojego szefa: Proszę, nie zwalniaj mnie, tylko się uczę!


3

Czysty , 245 234 bajtów

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"

Wypróbuj online!


Czy jest szansa, że ​​możesz usunąć cytaty na początku i na końcu?
Sam Dean

1
@SamDean Och, to tylko opcja kompilatora, o której zapomniałem.
Wrzucę to

3

C #, 184 181 bajtów

Moja pierwsza odpowiedź na Code Golf!

(Na podstawie odpowiedzi 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;};

Wypróbuj online!


1
Witamy w PPCG :)
Shaggy


2

T-SQL, 188 bajtów

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 pozwala na zwroty wewnątrz literałów łańcuchowych, więc to pomaga.

CONCAT()dokonuje niejawnej konwersji na tekst, więc nie muszę się martwić CASTani CONVERT.


2

JavaScript, 138 bajtów

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

Od mojego brata.

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 bajty

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

Wypróbuj online


Poprzednia wersja: 94 bajty

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

Galaretka , 61 bajtów

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

Łącze niladyczne, które działa również jako pełny program.

Wypróbuj online! (dane wyjściowe są opróżniane po zakończeniu wykonywania, ale drukuje akapit po akapicie)

W jaki sposób?

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

$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 bajtów

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} Dodano brakującernd()*

Uwagi:
Używa GoSubdo wydrukowania trzykrotnej linii, ponieważ jest ona nieco krótsza niż przypisanie linii do zmiennej i Debug.Printjej wstawienie.
Debug.Printbez żadnych argumentów wypisuje pustą linię (nie potrzeba Null ani pustego łańcucha) WorksheetFunction.MaxLinia byłaby za długa, więc użyłem „jeśli mniej niż”, aby zapobiec negatywom.

 

Z wcięciami i komentarzami

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
To bardzo skuteczny sposób na robienie liczb losowych!
Sam Dean

@SamDean Nie wiem, jak zapomniałem dołączyć rnd() * tam - myślę, że byłem zajęty liczeniem, jeśli było mniej znaków Dim c%(tj. „C jest liczbą całkowitą”) i upuszczamInt()
Chronocidal

haha, nie martw się! Miło widzieć odpowiedź VBA, ponieważ nie korzystałem z niej od lat!
Sam Dean

2

Python 2 ,  138 134 133 131  127 bajtów

-1 Dzięki Jo King (przearanżuj, aby użyć logiki bugs-=min(bugs,randomNumber)zamiast bugs=max(0,bugs-randomNumber)). Pozwoliło to na wymuszenie wyjścia za pomocą błędu dzielenia przez zero, co pozwoliło zaoszczędzić kolejne 6 bajtów!

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

Wypróbuj online!


Okazuje się, że wcale nie muszę tworzyć krotek.
Jonathan Allan


@JoKing Thanks! (Naprawdę powinienem to zauważyć, ponieważ bardziej przypomina to, co robię w mojej odpowiedzi na żelki).
Jonathan Allan

2
@JoKing ... co oznacza, że ​​możemy zmusić do wyjścia z dzieleniem przez błąd zerowy, aby zapisać - dwa-- sześć więcej :)
Jonathan Allan

2

Rubin: 149 bajtów

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

Powinien działać w prawie każdej wersji Ruby> = 1.8

Wydaje mi się, że można nieco zoptymalizować ciągi, ale ogólnie jestem z tego bardzo zadowolony - w szczególności kombi przypisanie / porównanie / instrukcja break i nadużywanie nawiasów opcjonalnych.

Uwaga: wyjście ma technicznie dwa końcowe znaki nowej linii; jeśli trzeba to uwzględnić, zwiększa się o 4 znaki.


Witaj i witaj w PPCG! Liczymy końcowe znaki nowego wiersza, ale jeśli działa w systemie Linux, możesz tylko policzyć \n(nie \r).
NoOneIsHere

@NoOneIsHere Dzięki :) Zaktualizowałem moją odpowiedź, aby wyjaśnić - miałem na myśli nowe wiersze na wyjściu, ponieważ pytanie określa, że ​​posiadanie jednego jest dopuszczalne, ale nie byłem pewien co do dwóch.
DaveMongoose

Widzę. Myślę, że to w porządku
NoOneIsHere

2

Zsh , 133 bajty

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

Wypróbuj online!


Wykorzystuje to kilka funkcji Zsh.

  • Alternatywna postać pętli :while list; do list; done można zapisaćwhile list {list}
  • Jeśli specyfikator formatu w printf jest liczbowy, odpowiedni argument jest oceniany jako wyrażenie arytmetyczne. Więc:
    • otrzymujemy wartość nza darmo bez użycia$
    • n -= RANDOM % 21 - 4, n = n > 0 ? n : 0jest obliczana ponownie, bez konieczności stosowania $((...)), $[...]lub podobne. The>i? musiał być uciekł.
    • Na printf $bkońcu ocenia pusty argument jako 0 dla %d.
  • Dzielenie słów przy rozszerzaniu parametrów jest domyślnie wyłączone, więc nie muszę cytować $b nigdzie .
    • To pozwala mi pisać $b$b"Take..."zamiast "$b${b}Take...".

  • Zaoszczędziłem kilka bajtów, używając rzeczywistych znaków nowego wiersza zamiast \ni for((n=99;n;))zamiast n=99;while ((n)).

Myślę, że powinno być -4. „- =” wygląda jak jego związek, więc najpierw robi +4, a następnie wszystko odejmuje.
Sam Dean

@SamDean ups, poprawione.
muru
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.