Wprowadzenie
W naszym ostatnim wysiłku zebrania katalogów najkrótszych rozwiązań dla standardowych ćwiczeń programistycznych, oto pierwsze w historii waniliowe wyzwanie PPCG FizzBuzz. Jeśli chcesz zobaczyć inne wyzwania katalogu, jest „Hello World!” i „Czy ta liczba jest liczbą pierwszą?” .
Wyzwanie
Napisz program, który drukuje liczby dziesiętne od 1 do 100 włącznie. Ale dla wielokrotności trzech drukowanych liter „Fizz” zamiast liczby i dla wielokrotności pięciu drukowanych liter „Buzz”. W przypadku liczb będących wielokrotnością zarówno trzech, jak i pięciu drukuj „FizzBuzz”.
Wynik
Wynikiem będzie lista liczb (i Fizzes, Buzzes i FizzBuzzes) oddzielonych znakiem nowej linii (albo \n
lub \r\n
). Końcowy znak nowej linii jest dopuszczalny, ale wiodący znak nowej linii nie. Oprócz wyboru nowej linii wynik powinien wyglądać dokładnie tak:
1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
16
17
Fizz
19
Buzz
Fizz
22
23
Fizz
Buzz
26
Fizz
28
29
FizzBuzz
31
32
Fizz
34
Buzz
Fizz
37
38
Fizz
Buzz
41
Fizz
43
44
FizzBuzz
46
47
Fizz
49
Buzz
Fizz
52
53
Fizz
Buzz
56
Fizz
58
59
FizzBuzz
61
62
Fizz
64
Buzz
Fizz
67
68
Fizz
Buzz
71
Fizz
73
74
FizzBuzz
76
77
Fizz
79
Buzz
Fizz
82
83
Fizz
Buzz
86
Fizz
88
89
FizzBuzz
91
92
Fizz
94
Buzz
Fizz
97
98
Fizz
Buzz
Jedynym wyjątkiem od tej reguły jest stałe wyjście interpretera twojego języka, którego nie można stłumić, takie jak powitanie, kody kolorów ANSI lub wcięcia.
Dalsze zasady
Nie chodzi o znalezienie języka z najkrótszym podejściem do grania w FizzBuzz, chodzi o znalezienie najkrótszego podejścia w każdym języku. Dlatego żadna odpowiedź nie zostanie oznaczona jako zaakceptowana.
Zgłoszenia są oceniane w bajtach w odpowiednim wcześniej istniejącym kodowaniu, zwykle (ale niekoniecznie) UTF-8. Niektóre języki, takie jak Foldery, są trudne do zdobycia - w razie wątpliwości zapytaj na Meta.
Nic nie można wydrukować do STDERR.
W przeciwieństwie do naszych zwykłych zasad, możesz swobodnie używać języka (lub wersji językowej), nawet jeśli jest nowszy niż to wyzwanie. Jeśli ktoś chce to nadużyć, tworząc język, w którym pusty program generuje dane wyjściowe FizzBuzz, gratuluje utorowania drogi dla bardzo nudnej odpowiedzi.
Pamiętaj, że musi być tłumacz, aby można było przetestować zgłoszenie. Dozwolone jest (a nawet zachęcane) samodzielne pisanie tego tłumacza dla wcześniej niewdrożonego języka.
Jeśli twój wybrany język jest trywialną odmianą innego (potencjalnie bardziej popularnego) języka, który ma już odpowiedź (pomyśl dialekty BASIC lub SQL, powłoki uniksowe lub trywialne pochodne Brainfuck, takie jak Alphuck i ???), rozważ dodanie notatki do istniejącego odpowiedz, że to samo lub bardzo podobne rozwiązanie jest również najkrótsze w innym języku.
Ponieważ dane wyjściowe są stałe, możesz zakodować dane wyjściowe na stałe (ale może to nie być najkrótsza opcja).
Możesz korzystać z istniejących rozwiązań, pod warunkiem uznania oryginalnego autora programu.
Standardowe luki są w przeciwnym razie niedozwolone.
Na marginesie, proszę nie głosować nudnych (ale ważnych) odpowiedzi w językach, w których nie ma wiele do golfa; są one nadal przydatne w tym pytaniu, ponieważ próbuje skompilować katalog tak kompletny, jak to możliwe. Jednak przede wszystkim oceniaj odpowiedzi w językach, w których autorzy musieli włożyć wysiłek w grę w golfa.
Katalog
var QUESTION_ID=58615;var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe";var COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk";var OVERRIDE_USER=30525;var answers=[],answers_hash,answer_ids,answer_page=1,more_answers=true,comment_page;function answersUrl(index){return"https://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+index+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(index,answers){return"https://api.stackexchange.com/2.2/answers/"+answers.join(';')+"/comments?page="+index+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:true,success:function(data){answers.push.apply(answers,data.items);answers_hash=[];answer_ids=[];data.items.forEach(function(a){a.comments=[];var id=+a.share_link.match(/\d+/);answer_ids.push(id);answers_hash[id]=a});if(!data.has_more)more_answers=false;comment_page=1;getComments()}})}function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:true,success:function(data){data.items.forEach(function(c){if(c.owner.user_id===OVERRIDE_USER)answers_hash[c.post_id].comments.push(c)});if(data.has_more)getComments();else if(more_answers)getAnswers();else process()}})}getAnswers();var SCORE_REG=/<h\d>\s*([^\n,<]*(?:<(?:[^\n>]*>[^\n<]*<\/[^\n>]*>)[^\n,<]*)*),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/;var OVERRIDE_REG=/^Override\s*header:\s*/i;function getAuthorName(a){return a.owner.display_name}function process(){var valid=[];answers.forEach(function(a){var body=a.body;a.comments.forEach(function(c){if(OVERRIDE_REG.test(c.body))body='<h1>'+c.body.replace(OVERRIDE_REG,'')+'</h1>'});var match=body.match(SCORE_REG);if(match)valid.push({user:getAuthorName(a),size:+match[2],language:match[1],link:a.share_link,});else console.log(body)});valid.sort(function(a,b){var aB=a.size,bB=b.size;return aB-bB});var languages={};var place=1;var lastSize=null;var lastPlace=1;valid.forEach(function(a){if(a.size!=lastSize)lastPlace=place;lastSize=a.size;++place;var answer=jQuery("#answer-template").html();answer=answer.replace("{{PLACE}}",lastPlace+".").replace("{{NAME}}",a.user).replace("{{LANGUAGE}}",a.language).replace("{{SIZE}}",a.size).replace("{{LINK}}",a.link);answer=jQuery(answer);jQuery("#answers").append(answer);var lang=a.language;lang=jQuery('<a>'+lang+'</a>').text();languages[lang]=languages[lang]||{lang:a.language,lang_raw:lang.toLowerCase(),user:a.user,size:a.size,link:a.link}});var langs=[];for(var lang in languages)if(languages.hasOwnProperty(lang))langs.push(languages[lang]);langs.sort(function(a,b){if(a.lang_raw>b.lang_raw)return 1;if(a.lang_raw<b.lang_raw)return-1;return 0});for(var i=0;i<langs.length;++i){var language=jQuery("#language-template").html();var lang=langs[i];language=language.replace("{{LANGUAGE}}",lang.lang).replace("{{NAME}}",lang.user).replace("{{SIZE}}",lang.size).replace("{{LINK}}",lang.link);language=jQuery(language);jQuery("#languages").append(language)}}
body{text-align:left!important}#answer-list{padding:10px;width:290px;float:left}#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"> <div id="language-list"> <h2>Shortest Solution by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr> </thead> <tbody id="languages"> </tbody> </table> </div> <div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr> </thead> <tbody id="answers"> </tbody> </table> </div> <table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr> </tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr> </tbody> </table>
źródło
Nothing can be printed to STDERR.
Czy to prawda tylko podczas działania, czy też podczas kompilacji (zakładając, że jest to osobny krok?)Odpowiedzi:
Python 2, 56
źródło
i=1;exec"print'FizzBuzz'[i%-3&4:12&8-i%5]or i;i+=1;"*100
. Czy ktoś chce użyć wyrażeń wyszukiwania z użyciem siły, aby zoptymalizować bit-bash?Sześciokąt , 91 bajtów
Dzięki za nagrodę :)
Wow, nigdy bym nie pomyślał, że uda mi się pokonać rozwiązanie sześciokątne Martina . Ale - kto by to pomyślał - załatwiłem sprawę. Po kilku dniach awarii, ponieważ nie miałem ani heksagonu, ani testera EsotericIDE, aby sprawdzić moje rozwiązanie. Pomyliłem kilka aspektów specyfikacji, więc stworzyłem kilka niewłaściwych „rozwiązań”, używając tylko długopisu i papieru oraz edytora tekstu. No cóż, w końcu pokonałem lenistwo i sklonowałem oba repozytoria, pobrałem VisualStudio i skompilowałem je. Wow, jakie to przydatne narzędzia! Jak widać, jestem daleki od bycia kimś, kogo nazwałbyś programistą (to znaczy, daj spokój! Nie miałem nawet zainstalowanego VisualStudio i prawie nie mam pojęcia, jak skompilować program);)
Znalezienie działającego rozwiązania zajęło mi jeszcze trochę czasu i jest dość zatłoczone i chaotyczne, ale tutaj jest w pełnej krasie:
Fizzbuzz w sześciokącie wielkości 6:
Układ sześciokątny:
I piękne wykonanie, dzięki Hexagony Colorer Timwi :
Oto animacja GIF o długości 110 sekund z szybkością 2 klatek na sekundę, pokazująca przebieg programu podczas pierwszych 6 liczb
1, 2, Fizz, 4, Buzz, Fizz
, pierwszych 220 tyknięć programu (kliknij obraz, aby wyświetlić pełny rozmiar):O mój Boże, dzięki oprogramowaniu do komponowania Natron animacja wskaźnika była wciąż nużąca, ale możliwa do zarządzania. Zapisanie 260 zdjęć pamięci było mniej zabawne. Niestety EsotericIDE nie może tego zrobić automatycznie. Tak czy inaczej, ciesz się animacją!
W końcu po owinięciu głowy wokół modelu pamięci i raczej sprzecznym z intuicją owijaniu ścieżek, które przekraczają granice sześciokąta, nie jest tak trudno pracować z Sześciokątem. Ale gra w golfa może być uciążliwa. ;)
To była zabawa!
źródło
3}1"$.!$>)}g4_'{$))}\<$\.\.@\;F\$/;z;u;<%<_>_..$>B/<>}))'%<>{>;e"-</_%;\/{}/>.\)(z;i;..>('
Teraz jest dodatkowy (po Z, które można „anulować” za pomocą a) lub umieszczając tam Z. Teraz jest to a), które wypycha wszystkie polecenia na pomarańczowej ścieżce 1 zaznacza później i wróciło z brakiem operacji, który był na linii 3. Btw Zainstalowałem również Visual Studio tylko z powodu Hexagony Colorer i Esoteric IDE: PLabirynt , 94 bajty
Sub-100! To było zabawne.
Wyjaśnienie
Zacznijmy od krótkiego podkładu w Labiryncie - możesz go pominąć, jeśli znasz już podstawy:
Labirynt ma dwa stosy - główny i pomocniczy. Oba stosy mają na dole nieskończoną liczbę zer, np.
+
Na pustym stosie dodaje dwa zera, w ten sposób wypychając zero.O sterowaniu przepływem w Labiryncie decydują skrzyżowania, które spoglądają na górę stosu, aby ustalić, gdzie iść dalej. Negatyw oznacza skręt w lewo, zero oznacza bieg prosto, a dodatni oznacza skręt w prawo ... ale jeśli uderzymy w ścianę, odwrócimy kierunek. Na przykład, jeśli możliwy jest tylko ruch prosto i skręt w lewo, ale górna część stosu jest dodatnia, to skoro nie możemy skręcić w prawo, skręcamy w lewo.
Cyfry w labiryncie pop
x
i push10*x + <digit>
, co ułatwia budowanie dużych liczb. Oznacza to jednak, że potrzebujemy instrukcji, aby nacisnąć 0, aby rozpocząć nowy numer, który znajduje się_
w Labiryncie.Przejdźmy teraz do właściwego kodu!
Czerwony
Wykonanie rozpoczyna się od
"
lewego górnego rogu, który jest NOP. Dalej jest)
, która zwiększa górę stosu, przesuwając 1 w pierwszym przejściu i zwiększającn
w każdym kolejnym przejściu.Następnie powielać
n
z:
. Ponieważn
jest pozytywna, skręcamy w prawo, wykonując}
(przesuwamy górę głównego stosu na pomocniczy) i:
. Uderzamy w ślepy zaułek, więc odwracamy się, wykonujemy}
i:
jeszcze raz, pozostawiając stosy jakPo raz kolejny
n
jest pozytywny i skręcamy w prawo, wykonując,_101/
który dzielin
przez 101. Jeślin
jest to 101, ton/101 = 1
skręcamy w@
, który kończy program. W przeciwnym razie nasza obecna sytuacja toOrange 1 (mod 3)
3
zamienia górne zero na 3 (10*0 + 3 = 3
) i%
wykonuje modulo. Jeślin%3
jest pozytywny, skręcamy w prawo w żółty"
. W przeciwnym razie wykonujemy70.105.122:..
, które wyjściaFizz
. Zauważ, że nie musimy naciskać nowych zer,_
ponieważn%3
w tym przypadku było zero, więc możemy wykorzystać nieskończone zera na dole stosu. Obie ścieżki spotykają się ponownie w kolorze jasnoniebieskim.Jasny niebieski
Górna część stosu jest obecnie
n%3
, co może być dodatnie, więc_;
popycha zero i natychmiast je wyskakuje, aby upewnić się, że idziemy prosto, zamiast skręcać w@
. Następnie używamy=
do zamiany górnych stosów głównych i pomocniczych, dając:Orange 2 (mod 5)
Jest to sytuacja podobna do poprzedniej, z tym wyjątkiem, że
66.117.122:..
wyprowadza,Buzz
jeślin%5
wynosi zero.Ciemny niebieski
Poprzednia sekcja pozostawia stosy jak
{
przesuwa się zn%3
powrotem do głównego stosu i*
mnoży dwa moduły.Jeśli któryś z modułów jest równy zero, iloczyn wynosi zero, więc przechodzimy prosto w żółty.
=
zamienia wierzch stosów i_
przesuwa zero, aby upewnić się, że idziemy prosto, dającW przeciwnym razie, jeśli oba moduły są niezerowe, to produkt jest niezerowy i zmieniamy kolor na zielony.
=
zamienia szczyty stosów, dającpo czym używamy
:
do powielanian
, skręcamy w prawo, a następnie używamy!
do wyjścian
.Purpurowy
W tym momencie główny stos zawiera jeden lub dwa przedmioty, w zależności od wybranej ścieżki. Musimy pozbyć się zera z żółtej ścieżki, a do tego używamy
+
, con + 0
w obu przypadkach działa w określonej kolejności. W końcu\
wypisuje nowy wiersz i wracamy do początku.Każda iteracja przesuwa dodatkową wartość
(n%5)*(n%3)
na stos pomocniczy, ale w przeciwnym razie robimy to samo od nowa.źródło
Perl 5, 49 bajtów
46 bajtów skryptu + 3 bajty
-E"..."
Użycie
say
(co wymaga-E"..."
) może zmniejszyć to do 46 bajtów, ponieważsay
automatycznie zawiera nowy wiersz (Dzięki @Dennis !):Perl 5, 50 bajtów
źródło
say
.-E"..."
8 bajtów? Spacja + kreska + opcja + argument (+ cytowanie).-E
0 bajtów, ale ponieważ odpowiedź primo została oceniona z wyłączeniem cytatów, zdecydowałem się na sprawiedliwe i uwzględnianie cytatów w moich i +1 dla-E
. Powodem, dla którego jest akceptowany jako bezpłatny, jest to, że Perl jest zwykle uruchamianyperl -e
iperl -E
nie ma już bajtów (pomyślałem-M5.010
lub teżuse 5.010
może być darmowy, ale być może nie czytam ponownie posta). Podczas dodawania-p
lub-n
liczone jest to jako +1, tak jak w przypadku bieganiaperl -pe
. Mam nadzieję, że to pomaga! Meta referencja: meta.codegolf.stackexchange.com/a/7539Rubinowy, 50 bajtów
Wymaga wersji 1.8, która wydaje się być popularna wśród golfistów:
We współczesnym języku Ruby, wymienić
?d
z100
rozwiązania 51-bajtowy.To wydaje się być rekordem świata.
źródło
?d
jest po prostu100
.FizzBuzz
Ciąg ma przełamane w nim, ten jest ważny w Ruby.string[i, s]
to plasterek, rozpoczynający się od znakui
(indeksowany 0), kontynuującys
znaki, ignorujący indeksy wskazujące poza ciągiem. Jeśli argument „puts
już” ma nową linię, zostaje odcięty. Formuła powinna być łatwa do odczytania? Wykonuje całą pracę tutaj. Nie znalazłbym tego bez pomocy naprawdę profesjonalnych golfistów Ruby.?e.times
zamiast tego można zapisać 2 bajty .[i=n**4%-15,i+13]
część? Nie mogę się obejśći==-14
plasterek jest poza granicami, otrzymujemynil
. Jeślii==-9
pokroimyi+13==4
znaki zaczynające się od 9 znaku od końca, tak'Fizz'
. Jeślii==-5
podzielimy 8 znaków zaczynając od 5. znaku od końca, tak'Buzz\n'
. (Próbujemy pokroić 8, ale jest tylko 5, więc otrzymujemy 5.) Et cetera.Java, 130 bajtów
Dotyczy to najnowszych wersji Java (7+). W starszych możesz trochę się ogolić za pomocą tej
enum
sztuczki, ale nie sądzę, żeby logika stała się krótsza (86 w środkumain
).źródło
class F{public static
->interface F{static
in java 8enum F{;public...
, więc tak naprawdę nie oszczędzasz bajtów.Pyth, 30
Wypróbuj tutaj
Wyjaśnienie:
źródło
Retina ,
31713913413270636055 bajtówWypróbuj online!
Wyjaśnienie
Jest
.
to globalna cicha flaga, która wyłącza niejawne dane wyjściowe na końcu programu.100{
opakowuje resztę programu w pętlę, która jest wykonywana dla 100 iteracji. Na koniec sam etap wstawia tylko_
na początku łańcucha, co skutecznie zwiększa jednostronny licznik pętli.Więcej konfiguracji.
*\(
opakowuje pozostałą część programu w grupę, drukuje wynik końcowym przesuwem linii, ale także umieszcza całą grupę w suchym biegu, co oznacza, że jego wynik zostanie odrzucony po wydrukowaniu, dzięki czemu nasz licznik pętli nie zostanie faktycznie zmodyfikowany .a
jest niestandardowym modyfikatorem wyrażenia regularnego, który zakotwicza wyrażenie regularne w całym ciągu znaków (co oszczędza bajt przy użyciu^
i$
jawnie).Zajmuje się sam etap atomowy
Fizz
. Podzielność według3
można łatwo sprawdzić jednostronnie: wystarczy sprawdzić, czy liczbę można zapisać jako powtórzenie___
. W takim przypadku poprzedzamyFi;
ciąg. Średnik jest taki, że przed liczbą nadal znajduje się granica słowa przed liczbą. Gdybyśmy zmienili linię naFizz___...
pozycję pomiędzyz
i_
nie bylibyśmy uważani za granicę, ponieważ regex traktuje zarówno litery, jak i podkreślenia jako znaki słowne. Jednak średnik pozwala także usunąćzz
powielania zFizz
iBuzz
.Robimy dokładnie to samo, jeśli chodzi o podzielność przez
5
iBu;
, chociaż nie musimy_
tym razem utrzymywać wartości s. Więc uzyskalibyśmy wyniki takie jakTo sprawia, że bardzo łatwo jest usunąć podkreślenia tylko w tych wierszach, które zawierają
Fizz
, jednocześnie wypełniajączz
s:Oznacza to, że przekształcamy każdy średnik w,
zz
ale_
zaraz po nim konsumujemy wszystkie . W tym momencie skończyliśmy z FizzBuzz w jednym. Ale wyzwanie wymaga wyniku dziesiętnego.&
wskazuje warunek: ten etap jest wykonywany tylko wtedy, gdy ciąg zawiera znak podkreślenia. W związku z tymFizz
,Buzz
iFizzBuzz
iteracje pozostają nietknięte. We wszystkich innych iteracjach (tj. Tych, których nie można podzielić przez 3 ani 5), po prostu liczymy liczbę znaków, konwertując wynik na dziesiętny.źródło
gs2 , 1
Cytat z Mauris, twórca GS2:
Aktualizacja : Dodano 27-bajtową odpowiedź , która nie jest używana
f
.źródło
Perl 5, 45 bajtów
Wymaga
-E
opcji, liczonej jako jedna. Należy to uruchomić z wiersza poleceń, tj .:Cytaty z całego polecenia są zbędne, jeśli ktoś unika za pomocą spacji, ani innych znaków, które mogą działać jako separatory wiersza poleceń (
|
,<
,>
,&
, itd.).Perl 5, 48 bajtów
Jeśli opcje wiersza poleceń są liczone jako jeden, każdy
-l
zapisuje jeden bajt (przez zastąpienie$/
). Jednak według klasycznych zasad Perlgolfa liczy się to 3: jeden za-
, jeden zal
i jeden za niezbędną przestrzeń.źródło
say
, z-E
przełącznikiem, który ma odległość 1 do edycji-e
, więc należy liczyć jako 1 bajt.say
, założyłem, że-E
można go użyć zamiast tego,-e
by obniżyć cię do 44 zamiast 46. Nie sądzę, że to sprawiedliwe, że oceniam w przeciwieństwie do ciebie, jaki jest preferowany mechanizm oceniania? Zwykleprint
tego unikam! Czy byłoby to najbliższe konsensusowi ?say
, jeśli kod można zapisać w jednym wierszu z pominięciem separatorów systemu operacyjnego, wynik 1 dla-E
. Jeśli potrzebujesz użyć cudzysłowów, np.-E"$a||$b"
Ocena 3. Jeśli nie możesz uzyskać w jednym wierszu, zdobądź 5 za-M5.01
. Ale w tym momencie prawdopodobnie lepiej byłoby użyć-l
. Nie zgadzam się, że domyślnie powinien być bezpłatny, z dwóch powodów: 1) ulepszenie jest trywialne i nieciekawe, oraz 2) nie ma wersji interpretera, dla której jest domyślnie włączony.wosk pszczeli ,
1048981 bajtówGęstsze pakowanie pozwoliło na odcięcie 8 kolejnych bajtów.
Najkrótsze rozwiązanie (81 bajtów), ten sam przebieg programu, różne pakowanie.
Zmiana koncepcji pozwoliła mi zmniejszyć kod o 15 bajtów. Chciałem pozbyć się testu podwójnego mod 5 w rozwiązaniu, więc zaimplementowałem flagę.
Krótkie wyjaśnienie:
jeśli
n%3=0
Fizz zostanie wydrukowany, a flaga ustawiona. Flaga jest realizowana po prostu przez wypchnięcie najwyższej wartości lstack na gstack (instrukcjaf
).Jeśli
n%5=0
, to albon%3=0
(przypadek FizzBuzz) albon%3>0
(przypadek Buzz). W obu przypadkach Buzz zostaje wydrukowany, a flaga resetuje się, przesuwając stos, aż będzie pusty (instrukcja?
).Teraz interesujące przypadki:
Jeśli
n%5>0
, to albo mieliśmyn%3=0
(drukowanie skrzynki Fizz, n nie może być wydrukowane) lubn%3>0
(Fizz nie został wydrukowany, więc n należy wydrukować). Czas sprawdzić flagę. Uzyskuje się to poprzez przesunięcie długości gstacka na gstack (instrukcjaA
). Jeślin%3 was 0
wtedy długość gstack wynosi> 0. Jeślin%3 was >0
długość gstacka wynosi 0. Prosty skok warunkowy gwarantuje, że n zostanie wydrukowane tylko wtedy, gdy długość gstacka wynosiła 0.Ponownie, po wydrukowaniu dowolnego z n, Fizz i / lub Buzz i nowej linii, gstack jest dwukrotnie otwierany, aby upewnić się, że jest pusty. gstack jest albo pusty
[]
, co prowadzi do[0]
instrukcji poA
(wypchnięcie długości gstacka na gstack), albo zawiera jedno zero ([0]
wynik n% 3), co prowadzi do[0 1]
, ponieważ [0] ma długość 1. Wyskakiwanie z pusty stos nie zmienia stosu, więc można bezpiecznie pop dwukrotnie.Jeśli przyjrzysz się bliżej, zobaczysz, że w zasadzie spasowałem
w
co pomaga pozbyć się całej zmarnowanej przestrzeni pomiędzy
A
i<
na końcu następnego rzędu w starszym rozwiązaniu poniżej:Nowe rozwiązanie koncepcyjne (89 bajtów), w tym animowane objaśnienie:
Układ sześciokątny:
Animacja pierwszych 326 tyknięć przy 2 fps, z lokalnymi i globalnymi stosami i wysyłana do STDOUT.
Dla porównania poniżej znajdują się nakładki ścieżkowe starszego, bardziej złożonego rozwiązania. Może to również ładniejsze rozwiązanie, z wizualnego punktu widzenia;)
źródło
> <> ,
68666564 bajtówJedyną sztuczką jest pomnożenie reszty jako warunku drukowania liczb. W ten sposób, jeśli jeden z nich ma wartość 0, nie wydrukujemy numeru.
Możesz spróbować tutaj .
Zapisano jeden bajt dzięki Sp3000, a drugi dzięki randomra. Wielkie dzięki!
źródło
o
koniec drugiego wiersza do pustego miejsca na początku wiersza.foooo Buzz
?gs2 ,
2827 (bezf
)Klątwa:
Wyjaśnienie:
Osadzanie 3 i 5 w stałej łańcucha nie działa, ponieważ
\x05
kończy literały łańcucha.Uwaga: Ten problem można rozwiązać za pomocą wbudowanego gs2 w 1 bajcie
f
.źródło
C, 85 bajtów
-2 dzięki wrażliwym.
źródło
gcc
nie rozpoznaje nowej linii w ciągu jako \ n. Daje mi to błąd kompilacji. Czy muszę przekazać jakikolwiek parametr do kompilatora? BTW, przegapiłeś wpis<=
w swoim poście (policzyłem 88 bajtów z <= ... więc zakładam, że go brakuje).main(i)
spróbowaći;main()
. Następnie możesz się pozbyći--
na początkufor()
pętli. Nie potrzebujesz też podziału linii. To powinno obniżyć liczbę bajtów do 85.(i%3&&i%5)*i
zi%3*i%5?i:0
Idę do łóżkaCJam, 35 bajtów
Wypróbuj online w interpretatorze CJam .
Jak to działa
źródło
100{):I3%!"Fizz"*I5%!"Buzz"*+Ie|N}/
MUMPS,
5654 bajtówO co
w:$X<3 i
chodzi, pytasz?$X
jest magiczną zmienną („wewnętrzną”), która przechowuje poziomą pozycję kursora wyjściowego (jako liczbę znaków od lewej krawędzi terminala).w
to skrócona formaWRITE
polecenia. Składniacommand:condition args
jest warunkowa - „jeślicondition
, to zróbcommand args
”.Więc jesteśmy sprawdzeniu, czy kursor wyjściowa została przesunięta więcej niż dwa znaki (co oznaczałoby, że co najmniej jedna
"Fizz"
lub"Buzz"
został napisany do terminala), a jeśli nie, pisząci
do terminalu.$X
Zmienna - i stąd ten rodzaj głębokiego nierozłączności z terminala - to funkcja pierwszej klasy świnki. Yikes.źródło
Galaretka ,
2420 bajtówWypróbuj online!
Jak to działa
źródło
pieprzenie mózgu, 206 bajtów
Sformatowany:
Wypróbuj online
Układ pamięci to
gdzie
f
cykle po 3,b
cykle po 5,d1
to cyfra jedności,d2
to dziesiątka cyfry,s
to flaga określająca, czy drukować dziesiątka cyfra,d
cykle po 10,c
to miejsce kopiowaniad
,t
to przestrzeń robocza, która zawiera 0 lub niepotrzebne dane, lub flaga oznaczająca brak -divisible-by-3, ia
określa zakończenie programu przez przesunięcie wskaźnika po wydrukowaniu Buzz 20 razy.źródło
C #,
128126125124 bajtów89 bajtów bez kodu tablicy kontrolnej.
Wykonano przy użyciu formatowania warunkowego C # .
Przy dwóch separatorach sekcji
;
Fizz lub Buzz są drukowane, jeśli ich wartość wynosi zero.Zaoszczędź w sumie 4 bajty dzięki @RubberDuck, @Timwi i @Riokmij.
źródło
Write
i dodanie nowej linii bezpośrednio do ciągu, prawda?i%3*i%5>0?i:0
Zamiast tego jest też o jeden bajt krótszyi%3*i%5==0?0:i
.for
wyciągu, używającfor(var i=0;i++<100;)
$"{(i%3*i%5>0?i:0):#}...\n"
)class A{static void Main(){for(var i=0;i<100;)System.Console.Write($"{(++i%3*i%5<1?0:i):#}{i%3:;;Fizz}{i%5:;;Buzz}\n");}}
Clojure,
11310610110091 bajtówMój pierwszy golf!
Nie golfowany:
źródło
println
taki sam sposób, jak w rozwiązaniu Java , np.(doall(map #(let[t(=(mod % 3)0)](println(str(if t"Fizz""")(if(=(mod % 5)0)"Buzz"(if t""%)))))(range 1 101)))
(if t"Fizz""")
można to uprościć(if t"Fizz")
. :)pieprzenie mózgu ,
411 350 277258 bajtówEdycje:
-61 bajtów, przechowując wartości „Fizz Buzz” jako
„BuziF”„BuziG” i powtarzając sekcję drukowania liczb.-71 bajtów poprzez ponowne wykonanie sekcji drukowania liczb modulo, podział licznika pętli i licznika oraz ponowne użycie komórki nowej linii jako wartości mod, między innymi
-19 bajtów, wiedząc, że nie ma żadnych zer w żadnym numerze FizzBuzz. Dodano także wyjaśnienie
+[-[>+<<]>-]>--[>+>++>++>++++++>+>>>++++++[<<<]>-]<+++++[>+>+>->>->++>>>-->>>++[<<<]>>>-]>[>]+++>>[>+<<<-[<]<[>+++>+<<-.+<.<..[<]<]>>-[<<]>[.>.>..>>>>+[<]+++++<]>[>]>>[[->+>-[>+>>]>[+[-<+>]>+>>]<<<<<<]>[-<+>]>,>[>]<[>-[<+>-----]<---.,<]++++++++++>]<.<<<<,>-]
Wypróbuj online!
Zamiast sprawdzać, czy sama liczba jest podzielna przez 5 lub 3, miałem dwa liczniki śledzące moduł liczby, zmniejszające je dla każdej liczby i drukujące odpowiednie słowo, gdy osiągnęły 0.
Jak to działa:
źródło
PowerShell,
78686154 bajtówEdycja: Zapisane 10 bajtów dzięki feersum
Edit2: Zrozumiałem, że dzięki sztuczce feersum nie muszę już formułować $ t jako ciągu bloków kodu
Edycja3: Zaoszczędź kolejne 7 bajtów dzięki Danko Durbićowi
Podobny w duchu do standardowej odpowiedzi Kod Rosetta , ale trochę pograł w golfa.
Wyjaśnienie
1..100|%{...}
Utwórz kolekcję od 1 do 100, a następnie dla każdego obiektu w tej kolekcji(...,$_)
utwórz nową kolekcję dwóch elementów: 0)$t=...
ustaw zmienną$t
równą łańcuchowi; 1)$_
nasz bieżący numer pętli"Fizz"*!($_%3)
weź nasz aktualny numer, zmodyfikuj go o 3, a następnie NIE wynik. Pomnóż przez to „Fizz” i dodaj go do ciągu (i podobnie dla 5). Program PowerShell traktuje dowolną niezerową liczbę jako$TRUE
, a zatem NIE dla niezerowej liczby wynosi 0, co oznacza, że tylko jeśli nasza bieżąca liczba jest wielokrotnością 3, „Fizz” zostanie dodany do łańcucha.[!$t]
indeksuje do właśnie utworzonej kolekcji na podstawie wartości ciągu$t
- niepuste, wydrukuj go, w przeciwnym razie wydrukuj nasz aktualny numerAlternatywnie również 54 bajty
Dzięki TesselatingHeckler
Podobna koncepcja używa
-replace
operatora inline i wyrażenia regularnego do zamiany pustego ciągu na^$
nasz aktualny numer. Jeśli ciąg nie jest pusty, nie jest zamieniany.Alternatywnie również 54 bajty
Jest to ta sama struktura pętli jak powyżej, ale wewnątrz niej sortuje parę (n, ciąg) i opiera się na fakcie, że pusty ciąg sortuje przed liczbą, ale ciąg FizzBuzz sortuje po liczbie. Następnie indeksuje wynik drugiego sortowania.
źródło
||
operatora, tak jak w C #, prawdopodobnie moglibyśmy zejść do 43 bajtów z czymś podobnym do1..100|%{"Fizz"*!($_%3)+"Buzz"*!($_%5)||$_}
... wątpliwego, ponieważ|
jest to tak ważny operator specjalny w PowerShell, ale mogę marzyć ...1..100|%{'Fizz'*!($_%3)+'Buzz'*!($_%5)-replace'^$',$_}
na 54?if($t){$t}else{$_}
coś w stylu($t,$_)[!$t]
1..100|%{(($t="Fizz"*!($_%3)+"Buzz"*!($_%5)),$_)[!$t]}
również 54, jak sugestia @ TessellatingHecklerJavaScript, 62 bajty
Myślę, że teraz jest to najkrótsze rozwiązanie Javascript.
źródło
console.log
; jest to o wiele mniej denerwujące niż naciskanie przycisku „OK” na 100 wyskakujących oknach z rzędu. Czy mógłbyś to zmienić? Będzie to tylko 62 bajty, wciąż trzy lepsze niż moje.C, 74 bajty
0
Argumentprintf
zamiast""
jest podejrzany, ale wydaje się działać na większości platform próbuję go włączyć.puts
segfaults, gdy próbujesz tego samego. Bez niego otrzymujesz 75 bajtów.Istnieją 73-bajtowe rozwiązania, które działają na anarchii golfa , i znalazłem jeden, który szuka w odpowiednich miejscach w Internecie, ale polegają one na zachowaniu specyficznym dla platformy. (Jak można się domyślić, jest to coś w rodzaju
puts("Buzz"±...)
.)źródło
./fizzbuzz $(seq 40)
: PScratch,
203185 bajtówLiczba bajtów liczona od golfowej reprezentacji tekstowej według tego meta postu . Scratch nie zajmuje dużo miejsca.
say
Scratch jest najbardziej zbliżony do standardowego: duszek wyświetla dymek zawierający to, co mówi. W praktycewait n secs
do odczytania tego wyniku potrzebny byłby blok, ale do celów tego wyzwania kod ten spełnia wymagania.źródło
y =
(w obu przypadkach)set y to ...
brakuje wartościR,
8883777170 bajtówJestem pewien, że można to poprawić... i to dzięki kredytowi @flodel. Kolejne kilka bajtów zaoszczędzonych dzięki sugestii @njnnja i kolejnej @ J.Doeźródło
x=1:100;i=!x%%3;j=!x%%5;x[i]="Fizz";x[j]="Buzz";x[i&j]="FizzBuzz";cat(x,sep="\n")
write
aniżelicat
choćwrite
Połączenie może trwać 1 zamiast pustego ciągu takx=y=1:100;y[3*x]='Fizz';y[5*x]='Buzz';y[15*x]='FizzBuzz';write(y[x],1)
jest trywialne 1 bajt w golfa na 70 bajtów.Haskell, 84 bajty
Zbliżają się do henkma za 81 bajtów , ale nie całkiem tam jeszcze.
d = drop.(*4).mod n
jest kluczem tutaj:d 3 "Fizz"
jestdrop (n`mod`3 * 4) "Fizz"
. To jest,"Fizz"
gdyn `mod` 3
wynosi 0 i""
inaczej.źródło
(%)=drop.(*4).mod n;main=mapM putStrLn[max(show n)$3%"Fizz"++5%"Buzz"|n<-[0..100]]
.n
nie ma zasięgu. Hmmain=mapM putStrLn[max(show n)$3%"Fizz"++5%"Buzz"|n<-[0..100],(%)<-[drop.(*4).mod n]]
PHP, 54 bajty
Obowiązuje od wersji 5.5. Jest
õ
to znak 245, nieco odwrócony\n
.Zakładam domyślne ustawienia interpretera, ponieważ są one bez ini. Jeśli nie masz pewności, możesz wyłączyć lokalne ini za pomocą
-n
jak wphp -n fizzbuzz.php
.Wersja, która będzie działać bezbłędnie z absolutnie dowolnym plikiem konfiguracyjnym, ma 62 bajty :
źródło
short_open_tag
jest wyłączony,E_NOTICE
włączony. Żadne z nich nie są ustawieniami domyślnymi.Kod maszynowy 80386 + DOS, 75 bajtów
Hexdump kodu:
Kod źródłowy (składnia TASM):
Ten kod liczy od 1 do 100 cali
ax
, budując komunikat wyjściowy od końca do początku. Koniec wiadomości (nowa linia i$
znak, którego DOS używa do flagi końca wiadomości) pojawia się na początku kodu:Jest wykonywany jako nieszkodliwa instrukcja (
or ax, 240ah
). Mógłbym umieścić go w bardziej konwencjonalnym miejscu, na przykład po zakończeniu kodu, ale posiadanie go pod adresem 0x100 ma tę zaletę.Kod wykorzystuje również 2 dodatkowe liczniki:
dl
dh
Kiedy licznik osiągnie 0, wypycha ciąg
Fizz
lubBuzz
do końca komunikatu wyjściowego. Jeśli tak się stanie,bx
zostanie zmniejszona ibh
wyniesie zero. Jest to używane jako warunek wyprowadzenia liczby w postaci dziesiętnej.Uwaga: używam tutaj danych 32-bitowych. To nie zadziała na komputerze wcześniejszym niż 386.
źródło
mov [mem], 'Fizz'
aby przechowywaćFizz
w tej kolejności w pamięci, pasując dodb
dyrektyw. Zobacz na przykład mój nadmiernie skomplikowany „wydajny” YASM FizzBuzz .std
, a następniestosb
/stosd
? Trzeba by wymienićtest bh,bh
sięcmp di, 100h
czy coś. Zamiast zapisywać / przywracać licznik w AL, możesz trzymać go w BL i po prostu clobber eax kiedy tylko chcesz. Np.sub bx, 4
/ Mamov dword ptr [bx], 'zzuB'
3 + 7 bajtów, prawda?mov eax, 'zzuB' / stosd
ma 6 + 2 bajty (prefiks wielkości operandu na obu). Byłoby miło, gdyby odpowiedź obejmowała demontaż, aby rozmiary instrukcji były widoczne.stosd
ale sam nie byłem w stanie znaleźć żadnej redukcji wyniku. Od czasustosd
zmniejszeniaDI
nie stracisz,sub di, 4
a na końcu maszDI
4 bajty wyłączone. Byłem w stanie-6 bytes
użyć kilku innych drobnych poprawek, które ostatecznie opublikowałem jako osobną odpowiedź (tylko dlatego, że nie mogłem zmieścić się w całym komentarzu). Sława!dc
6462 bajtyNie golfowany:
źródło