Pewnego razu czytałem to pytanie / odpowiedź na temat Quory
Czy naprawdę są programiści ze stopniem informatyki, którzy nie mogą przejść testu FizzBuzz?
Ten kod podano jako oczywistą odpowiedź
for i in range(1, 100):
if i % 3 == 0 and i % 5 == 0:
print "FizzBuzz"
elif i % 3 == 0:
print "Fizz"
elif i % 5 == 0:
print "Buzz"
else:
print i
Oczywiście FizzBuzz został zagrany w golfa na śmierć, ale nie o to chodzi w tym pytaniu. W komentarzach ktoś wspomina, że ta oczywista odpowiedź jest świetna, ponieważ łatwo jest dodać dodatkowe warunki, takie jak wydruk „Jazz” dla wielokrotności 4. (Nie zgadzam się. Rozszerzenie tego schematu wymaga O (2 ** n ) wierszy kodu.)
Twoim wyzwaniem jest napisanie najpiękniejszej wersji FizzJazzBuzz według oceny twoich rówieśników.
Kilka rzeczy do rozważenia przez wyborców:
- SUCHY
- Wydajność operacji podziału / modułu
Wiele odpowiedzi na Quora używało Pythona, ale tutaj nie ma takich ograniczeń językowych.
Przyjmę odpowiedź największą liczbą głosów za miesiąc
Przykładowe dane wyjściowe:
1
2
Fizz
Jazz
Buzz
Fizz
7
Jazz
Fizz
Buzz
11
FizzJazz
13
14
FizzBuzz
Jazz
17
Fizz
19
JazzBuzz
Fizz
22
23
FizzJazz
Buzz
26
Fizz
Jazz
29
FizzBuzz
31
Jazz
Fizz
34
Buzz
FizzJazz
37
38
Fizz
JazzBuzz
41
Fizz
43
Jazz
FizzBuzz
46
47
FizzJazz
49
Buzz
Fizz
Jazz
53
Fizz
Buzz
Jazz
Fizz
58
59
FizzJazzBuzz
61
62
Fizz
Jazz
Buzz
Fizz
67
Jazz
Fizz
Buzz
71
FizzJazz
73
74
FizzBuzz
Jazz
77
Fizz
79
JazzBuzz
Fizz
82
83
FizzJazz
Buzz
86
Fizz
Jazz
89
FizzBuzz
91
Jazz
Fizz
94
Buzz
FizzJazz
97
98
Fizz
JazzBuzz
źródło
Odpowiedzi:
Najpiękniejsza wersja, mówisz? Spróbujmy tego w ...
Język programowania Szekspira
Więc po mojej walce z SPL tutaj czułem, że muszę wykonać co najmniej jedno zgłoszenie przy każdym wyzwaniu. I to jest to.
Więc o co w tym wszystkim chodzi?
Po pierwsze, deklarujemy zmienne, których będziemy używać w całym programie, które muszą pochodzić ze sztuk Szekspira. Mając dość Romea, Julii, Ofelii i Othello, poszedłem z Arcybiskupem Canterbury i Lady Capulet . Ich opisy, a także tytuły Aktów / Scen, są odrzucane przez parser, więc możesz umieścić tam prawie wszystko, co chcesz.
Stwórzmy króla przekładów na coś nieco mniej bełkotliwego .
Akt I, Scena I
Begin Lady Capulet = 0;
Akt I jest dość prosty: inicjujemy naszą zmienną wartością 0.
Akt I, Scena II
Lady Capulet += 1; if(Lady Capulet < Math.pow((2*2*1+1)*(2*1),2)) continue; else goto Scene VIII;
Podnosimy wartość Lady Capulet i porównujemy ją ze 100 (tak, całe zdanie służy wyłącznie do uzyskania liczby 100); jeśli nie jest mniejszy, przeskakujemy do Sceny VIII (koniec); w przeciwnym razie przechodzimy do następnej Sceny.
Akt I, Scena III
if(Lady Capulet % (2+1) == 0) continue; else goto Scene IV; The Archbishop of Canterbury = 2*2*2*2*2*2*1; System.out.print((char)The Archbishop of Canterbury); The Archbishop of Canterbury += 2*2*2*2*2*1; The Archbishop of Canterbury += 2*1+1; System.out.print((char)The Archbishop of Canterbury); The Archbishop of Canterbury += 2*2*2*2*1+1; System.out.print((char)The Archbishop of Canterbury); System.out.print((char)The Archbishop of Canterbury);
Po pierwsze, widzimy, czy moduł dzielenia przez 3 wynosi 0; jeśli nie, przeskakujemy do Sceny IV; jeśli tak jest, zaczynamy wykonywać operacje arytmetyczne i przechowywać je na Archiepersonie, wysyłając je w postaci postaci, gdy znajdziemy tę, której szukamy. Tak, w końcu chodzi o to, żeby dostać
Fizz
.Akt I, Scena IV
if(Lady Capulet % (2*2) == 0) continue; else goto Scene V; The Archbishop of Canterbury = 2*2*2*2*2*2*1+2*2*1+2*1; System.out.print((char)The Archbishop of Canterbury); The Archbishop of Canterbury += 2*2*2*1; The Archbishop of Canterbury += 2*2*1+(-1); System.out.print((char)The Archbishop of Canterbury); The Archbishop of Canterbury += 2*2*2*2*1+2*2*2*1; The Archbishop of Canterbury += 1; System.out.print((char)The Archbishop of Canterbury); System.out.print((char)The Archbishop of Canterbury);
Najpierw sprawdza, czy moduł dzielenia przez 4 wynosi 0, a następnie kontynuuje dla tej samej sceny jak poprzednio
Jazz
.Akt I, Scena V.
if(Lady Capulet % (2*2+1) == 0) continue; else goto Scene VI; The Archbishop of Canterbury = 2*2*2*2*2*2*1+2*1; System.out.print((char)The Archbishop of Canterbury); The Archbishop of Canterbury += 2*2*2*2*2*1; The Archbishop of Canterbury += 2*1+1; The Archbishop of Canterbury += 2*2*2*2*1; System.out.print((char)The Archbishop of Canterbury); The Archbishop of Canterbury += 2*2+1; System.out.print((char)The Archbishop of Canterbury); System.out.print((char)The Archbishop of Canterbury); goto Scene VII;
Działa podobnie jak dwa poprzednie, sprawdzając, czy moduł dzielenia przez 5 zwraca 0, a następnie próbuje zapisać
Buzz
; jedyną różnicą jest to, że ostatecznie pomijamy Scenę.Akt I, Scena VI
System.out.print(Lady Capulet);
Aby dojść do tej Sceny, liczba przyjęta przez Lady Capulet nie może być ani Fizz, ani Jazz, ani Buzz; więc wyprowadzamy go w postaci liczbowej.
Akt I, Scena VII
The Archbishop of Canterbury = 2*2*2*1+2*1; System.out.print((char)The Archbishop of Canterbury); The Archbishop of Canterbury += 2*1+1; System.out.print((char)The Archbishop of Canterbury); goto Scene II;
Jest to jedyny sposób, w jaki udało mi się przejść do następnego wiersza: najpierw CR, potem LF; następnie wracamy do sceny II, aby kontynuować program.
Akt I, Scena VIII
End.
Dość proste.
Wciąż próbuję sprawdzić, czy mogę pokazać to działające online, ale nie mogę znaleźć kompilatora online - ten, który znam , nie łączy się dobrze z żadnym programem oprócz tego, który już został załadowany, a może jest jakiś problemu z interfejsem między klawiaturą a krzesłem ...
Aktualizacja 1:
Po komentarzu matmandana zredagowałem kolejność scen Jazz i Buzz. To musiało być zrobione.
źródło
z
i zresetować go przed każdą pętlą.> <> (Ryby)
> <> to język programowania 2D, w którym instrukcje są pojedynczymi znakami, a wskaźnik instrukcji (IP) może przesuwać się w górę, w dół, w lewo lub w prawo, w zależności od strzałek
^>v<
i luster/\
. Nie ma zmiennych ani ciągów, więc nie powtarzanie się jest trochę trudniejsze, ale myślę, że jest to miłe na swój sposób.Naciskamy
1
i uruchamiamy pętlę.:9b*)?;
sprawdza, czy liczba jest większa niż 99 (9b* = 9*11
), a jeśli tak, program zatrzymuje się;
. W przeciwnym razie wpisz 0 do rejestru i przejdźv
do części falistej.:3%?
sprawdza liczbę modulo 3. Jeśli jest niezerowa, to schodzimyv
o rząd niżej i ruszamy w lewo<
. W przeciwnym razie pomijamy strzałkę w dół i pchamy"Fizz"
, drukujemy ją (r}oooo
) i zwiększamy wartość rejestru (&1+&
) przed odbiciem od prawego lustra ściennego, aby przejść w dół o rząd. Tak czy inaczej, w końcu ruszamy w lewo wzdłuż trzeciego rzędu, dopóki nie odbijamy się od lewych lusterek ściennych. Następnie powtarzamy dlaJazz
iBuzz
.Trwa to do siódmej linii, która sprawdza wartość rejestru
&
. Jeśli jest niezerowy, to po prostu schodzimy. W przeciwnym razie drukujemy sam numern
przed zejściem w dół.Na koniec
ao
(pamiętajmy, że poruszamy się teraz w lewo!) Drukuje znak nowej linii ASCII i1+
zwiększa liczbę, zanim przejdziemy w górę^
i zrobimy pętlę>
ponownie.(Teraz czekamy na estetyczną odpowiedź Piet ...)
źródło
LOLKOD
Elegancki? Nie. Wydajny? Absolutnie nie. Piękny? Cóż, wiesz, co mówią: piękno jest w oku patrzącego.
Niektóre wyjaśnienia:
Programy LOLCODE zaczynają się
HAI
i kończąKTHXBYE
.Zmienne są dynamicznie wpisywane i przypisywane za pomocą
I HAS A <variable> ITZ <value>
. Po zdefiniowaniu zmienne można również przypisać za pomocą<variable> R <value>
.Pętle w LOLCODE są nazywane. Składnia jest następująca:
To tylko Internet mówi „pętla do i = koniec”. W LOLCODE 1.2 zmienna indeksująca musi zostać zainicjowana przed zapętleniem. Tutaj pętla nosi nazwę „house”, ponieważ sprawia, że czytanie inicjalizacji pętli wydaje się zabawne.
VISIBLE
drukuje na standardowe wyjście. Domyślnie dodawana jest nowa linia, ale dodawanie!
tłumi nową linię.Warunki są określone w następujący sposób:
Warunki muszą być albo wyrażeniami, które mają wartość logiczną, albo boolowską. W LOLCODE wywoływany jest typ boolowski,
TROOF
który ma wartościWIN
(prawda) iFAIL
(fałsz).Komentarze jednowierszowe zaczynają się od
BTW
.Nie znasz się dobrze na języku Internetz? Daj mi znać, a chętnie udzielę dalszych wyjaśnień.
źródło
Python3
źródło
Efficiency of division/modulus operations
(3, 4, 5)
. Jest trzykrotnie powielony. To jedyna najlepsza odpowiedź z tylko jednym operatorem modułu.DRY
Zamiast tego powinienem był o tym wspomnieć. Ponadto na tę odpowiedź składa się PO.Piet
Postanowiłem spróbować zagrać z Pietem i przekonać się, jaki ładny kod mogę zrobić. Staram się tu nic nie powtarzać, choć szczerze mówiąc muszę powtórzyć obliczenia modów. Jednak każdy odrębny mod (n% 3, n% 4 i n% 5) jest uruchamiany tylko raz na iterację kodu.
Mniejszy obraz jest właściwym źródłem i można go przesłać i uruchomić tutaj .
Cieszyć się!
źródło
Matematyka
W Mathematica możesz definiować i przeciążać funkcje dla bardzo specyficznych parametrów (nie tylko według typu, ale także dowolnych warunków logicznych). Zdefiniujmy kilka funkcji:
A teraz rzeczywisty program jest po prostu
Teraz, gdy powyższe rośnie tylko liniowo wraz z liczbą dzielników, wciąż nie jest zbyt SUCHE. Ale w rzeczywistości możemy używać zmiennych jako nazw w tych definicjach. Możemy więc napisać funkcję, która generuje te definicje funkcji:
Teraz wszystko, co musisz zrobić, to dodać kolejne
addFunction
połączenie i dodać nowe**zz
do ostatniej linii.źródło
DoThe @@@ Time @@@ Warp @@@ Again /@ Range[100] // TableForm
JMP
lewej stronie!Haskell
Nie bierzecie SUCHEGO poważnie. Istnieją oczywiste wzorce, które można uwzględnić w sekwencji „Fizz Jazz Buzz”.
Ten kod jest również łatwo rozszerzalny. Aby rozwiązać problem „Fizz Jazz Buzz Tizz”, wystarczy dodać
Ti
poBu
nim ciąg. Jest to o wiele mniej niż potrzeba w jakimkolwiek innym rozwiązaniu.źródło
fizzes = zip [3..] $ ((++ replicate 2 'z') <$> words "Fi Ja Bu") ++ ["Sausage"]
lub po prostu wrócić dofizzes = zip [3..] $ words "Fizz Jazz Buzz Sausage"
.replicate 2 z
trochę to rozciąga. . .Excel VBA
Może to zabrzmi głupio, ale to karabin snajperski 2D!
źródło
Jawa
Więc Java nie jest tak naprawdę uważana za „piękną”, ale to szalone subiektywne, więc poszedłem zgodnie z wytycznymi w pytaniu:
Nie oznacza to, że algorytm jako całość jest najbardziej wydajny (nie jest), ale myślę, że dobrze trafia w wypunktowane punkty.
źródło
Poinformuj 7
Inform 7 to oparty na regułach język programowania zaprojektowany do interaktywnej fikcji. Jest to jeden z najbardziej udanych języków programowania opartych na języku naturalnym. Zobacz prezentację języka Inform 7, aby zobaczyć inne przykłady i kilka drobiazgów.
Zaletą tego kodu jest to, że każda z reguł FizzBuzz jest całkowicie niezależna: dodatkowe reguły można dodać w dowolnym momencie bez potrzeby zmiany ogólnych ram. Niestety jest to trochę powtarzalne, szczególnie w przypadku fraz definicji. Mógłbym zdefiniować operator%, ale wtedy nie byłby to angielski. ;)
Ten kod można uruchomić online za pomocą Playfic .
źródło
Dyalog APL
items
można zmienić na dowolną listę liczbźródło
⎕ML
i⎕IO
?1
, co jest domyślne.DO#
Sprawdź mod, buduj ciąg, drukuj numer, jeśli jest pusty, lub ciąg, jeśli nie. Bez powtórzeń. Wystarczy dodać warunek i dane wyjściowe dla nowych wymagań.
źródło
i
-%
coś wiele razy, a także dołączas
wiele razy. (Wiele składni też jest powtarzalne, ale to prawdopodobnie wina C #).Python 2.7
Starałem się, aby było to poetyckie ...
Nie jestem zbyt dobry w poezji miłosnej ...
Byłoby też znacznie lepiej bez początkowych stałych: P
źródło
TypeError: 'str' object is not callable
.Java z klasami
Algorytm:
Klasy:
źródło
MATLAB / Octave
Oczywiście pisanie własnych pętli jest dobrą zabawą dla programistów, ale wszyscy wiedzą, jak żmudne jest śledzenie indeksowania (kto nie pisał
for(j=i;j<n;i++)
w zagnieżdżonej pętli przynajmniej raz w życiu?)MATLAB ma rozwiązanie. Naprawdę, ten kod nie jest najskuteczniejszy, a na pewno nie golfowy, ale z pewnością jest dobrą wizytówką bardziej interesujących funkcji MATLAB-a. Octave jest wersją GNU MATLAB; nie jest jednak odpowiedni do gry w golfa kodowego, ponieważ jest nieco bardziej rygorystyczny w przypadku zmiennych typów, co jest szkodliwe dla gry w golfa kodowego.
EDYCJA: do momentu podświetlenia składni dla MATLAB na SE, publikuję wersję z bardzo małą ilością komentarzy, ponieważ był to po prostu duży przerażający blok zwykłego tekstu.
źródło
for(j=i;j<n;i++)
? Moje pytanie brzmi: kto miał napisać to „co najmniej raz w życiu”? Jeśli tak, mam dla ciebie coś nowego ...for
pętli (np. Podczas zagnieżdżania pętli)? Czy jesteś facetem, którego kod kompiluje się za pierwszym razem? Jeśli tak, mam dla ciebie nowinę ...j
Nazwa zmiennej lokalnej pętli jest w porządku, alei
nazwa jest bardzo zła praktyka i że jest źródłem swój błąd. To nie przypadek :)Pyton
To oczywiście zdecydowanie za długo. rozwiązanie gnibbler jest znacznie lepsze. (chociaż zastąpienie
*..., sep=''
go''.join
byłoby piękniejsze)Jest to jednak dość wydajne pod względem operacji podziału / modułu.
źródło
sorted(lst)
, dlaczego nie po prostu ustaw go w odpowiedniej kolejności, kiedy go definiujesz?lst.sort()
Rubin
źródło
Haskell
Jeszcze inne rozwiązanie bez podziału lub modułu.
fjb
tworzy nieskończoną listę Fizzesów, Jazzów, Buzzów i / lub liczb.take
dowolna ilość, jaką chcesz, jak widać, wprint100fjb
której drukuje pierwszych 100 elementów.źródło
SQL (MySQL)
gdzie I jest tabelą z jedną kolumną (id INT) zawierającą 100 liczb całkowitych.
Nie znam smaku SQL, który może łatwo wygenerować tabelę lub użyć WARTOŚCI jako podkwerend, co może uczynić go znacznie lepszym i kompletnym.
źródło
SELECT @i:= (@i + 1) FROM mysql.help_relation, (SELECT @i:=0) v WHERE @i < 100;
SELECT DISTINCT help_keyword_id FROM mysql.help_relation WHERE help_keyword_id>0 AND help_keyword_id<=100
również działało. Ale jeśli 100 zostanie zmienione na 10000, oba zostaną zepsute.Rubin
źródło
JavaScript
Być może nie jest to najbardziej efektywny sposób, ale myślę, że jest prosty i ładny <3
Moar DRY i effin brzydki: C
źródło
JavaScript
DRYish ...;)
źródło
Całkowicie głupi C #
Połowa streszczenia brzmiała: „NIE POWTÓRZ SIEBIE”, więc wziąłem to dosłownie, jak mogłem z C #, i to przypadkowo przeszło do gry w golfa. To jest mój pierwszy golf i zrobiłem to w C #, głupie wiem, ale oto wynik:
Gra w golfa (
240232230 znaków):Nie golfowany:
Celem było skrócenie wszystkiego, czego musiałem użyć więcej niż raz i ogólnie, aby kod był krótki podczas tworzenia kompletnego programu w języku C #. W tym celu należy użyć VisualStudio i ustawić obiekt StartUp na „P”, należy również poszukać danych wyjściowych w oknie wyników debugowania.
Istnieją tutaj poważne ograniczenia:
źródło
Python 2
Chciałem napisać na to odpowiedź w schludnym Pythonie, który pokazywałby cechy języka, był zgodny z zasadą DRY i byłby dość czytelny.
Ten mały przykład pokazuje krojenie,
in
operator i pełną, ale zrozumiałą składnię trójskładnikową. W ogóle nie używa operatora modulo. Nie jest przeznaczony do wydajności w czasie wykonywania, ale nie taki był cel. Jest krótki, zrozumiały i łatwy w utrzymaniu.źródło
set(group[...])
w zasadach?Python 2.7, 111 bajtów
To mój pierwszy wkład. Próbowałem zastosować kilka sztuczek do kodowania w Pythonie (przeplatanie łańcuchów, dostęp do indeksu krotek zamiast
if
). Jeśli masz jakieś sugestie, podziel się nimi!Wyjście:
Nie mogłem też w pełni zastosować zasady DRY, ponieważ istnieją dwie
for
pętle. Prawdopodobnie jest na to lepszy sposób!źródło
for
zestawieniu. Zaktualizuję, kiedy będę mógł!Udać się
Równoległy FizzJazzBuzzer
Wypróbuj tutaj: http://play.golang.org/p/lxaZF_oOax
Wykorzystuje tylko jeden moduł na sprawdzoną liczbę i może być dowolnie rozszerzony na dowolną liczbę, no cóż ... liczb.
Musisz tylko wprowadzić zmiany w 3 różnych miejscach, aby to rozszerzyć, w
hooks
mapie,FizzJazzBuzzer
nazwę funkcji i, oczywiście, wywołanieFizzJazzBuzzer
funkcji.źródło
R
Tworzy to funkcję, która pozwala użytkownikowi określić pary słów i dzielników (i opcjonalnie maksymalną liczbę, z domyślną liczbą 100). Funkcja tworzy wektor od 1 do liczby maksymalnej, a następnie zastępuje dowolne liczby w pozycjach „fizzbuzz” literą „”, a na koniec wkleja każde słowo w żądanej pozycji. Funkcja porządkuje listę od najniższej do największej liczby, dzięki czemu najniższa liczba będzie zawsze pierwszą częścią „fizzbuzz”. Pozycje są obliczane za pomocą
seq
tworzenia wektora rozpoczynającego się od określonej liczby i rosnącego w przyrostach tej liczby, aż do osiągnięcia maksymalnej pożądanej liczby.Nie sądzę, że jest bardzo piękny, ale łatwo go ponownie użyć z różnymi parametrami.
przykłady użycia:
Dane wyjściowe
fizzbuzzer(fizz=3, buzz=5)
to:(liczby w nawiasach kwadratowych są wskaźnikami wektora, z którego funkcja wychodzi)
źródło
Haskell
Nie stosuje się arytmetyki modułowej, z wyjątkiem obliczania najmniejszej wspólnej wielokrotności, aby uniknąć powtarzania niepotrzebnej pracy. Łączenie łańcuchów należy wykonać tylko 60 razy, bez względu na to, co ustalimy dla górnej granicy.
Zastąpienie
fjbLcm
przezfjb
robi dokładnie to samo, bez użycia arytmetyki, z wyjątkiem w[1..100]
itake
.źródło
Python2
Aktualizacja: Nowa wersja nie używa żadnych operacji mod ani podziałów.
Jeśli chcesz dodać kolejne słowo do testu, po prostu wrzuć parę klucz / wartość do słownika word_dict:
Jeśli chcesz się pozbyć słowa, po prostu usuń je (używając
del
) lub alternatywnie ustaw na''
.Zobacz także odpowiedzi Gnibblera i Jakube'a w języku Python , które zostały opublikowane przed moim.
źródło
DO#
Utrzymywalność: Wystarczy dodać jedną linię do każdego elementu
Ieruję po każdym elemencie w słowniku, aby sprawdzić, czy jest to dzielnik bieżącej liczby, i dodać do ciągu, jeśli tak jest.
Po zakończeniu wydrukuj ciąg, chyba że nadal jest pusty (używając operatora koalescencji zerowej), w takim przypadku wydrukuj liczbę plus pusty ciąg, aby stał się ciągiem. (Mógłbym użyć toString, ale myślę, że to osobisty wybór)
źródło