Witamy w świecie kompilatora golfa. Twoim zadaniem jest napisanie programu, który generuje inny program do odtwarzania określonego wariantu FizzBuzz.
Twój kompilator
Napisz kompilator, który generuje warianty programu FizzBuzz do specyfikacji. Specyfikacja tego wariantu jest wyrażona w postaci tablicy liczb całkowitych / ciągów znaków.
- Dane wejściowe mogą mieć dowolną formę dogodną dla twojego języka. (Moje przykłady używają n: xxxx, ale jest to wyłącznie w celach ilustracyjnych.)
- Każde wejście całkowite może być użyte tylko raz na wywołanie twojego kompilatora.
- Liczba całkowita każdej pary będzie miała wartość co najmniej jednej.
- Ciąg każdej pary będzie składał się tylko z dokładnie czterech liter ASCII.
- Dane wyjściowe muszą być pojedynczym kompletnym programem, który jest zgodny z poniższymi zasadami.
- Wynik może być w dowolnej dogodnej formie, o ile jest to program tekstowy. (Więc nie ma wyrażeń lambda.)
Zachowanie jest niezdefiniowane dla danych wejściowych niezgodnych z powyższymi zasadami.
Wygenerowany program FizzBuzz
Program wygenerowany przez kompilator pobierze jedną liczbę całkowitą n jako dane wejściowe. Wyświetli sekwencję liczb od jednego do n włącznie , w razie potrzeby zamieniając liczby ciągami FizzBuzz.
- Wygenerowany program musi być w tym samym języku co kompilator.
- Wpis n może mieć dowolną formę dogodną dla twojego języka.
- n będzie miało wartość co najmniej jednego.
- Liczba będąca wielokrotnością co najmniej jednej liczby całkowitej wprowadzonej do kompilatora musi zostać zastąpiona przez wszystkie ciągi sparowane z tymi liczbami całkowitymi połączonymi ze sobą.
- Liczba, która nie ma być zastępowana ciągiem FizzBuzz, musi być wyprowadzana w postaci dziesiętnej ASCII.
Na przykład;
> GenFizzBuzz 3:Fizz 5:Buzz
> a.out 5
1
2
Fizz
4
Buzz
Punktacja
Twój wpis będzie oceniany na podstawie długości programów generowanych przez kompilator dodanych do długości twojego kompilatora. Uruchom kompilator wiele razy z każdym z poniższych parametrów i dodaj długości wygenerowanych programów wraz z długością kompilatora, aby znaleźć swój wynik.
- Po prostu policz. (Brak danych wejściowych - wygenerowany program będzie liczyć od 1 do n bez zamiany).
- Po prostu golf. (1: Golf - wygenerowany program wyświetli „Golf” n razy.)
- Klasyczny FizzBuzz. (3: Fizz, 5: Buzz)
(Pamiętaj, że Twój kompilator jest wymagany do generowania kodu dla dowolnego prawidłowego wejścia, nie tylko tych wymienionych).
Odpowiedzi:
Python 3 -
168162 + 230 = 392Och, Python, bardzo się starasz, ale pomnożenie tego
import sys;sys.argv
przez 4 naprawdę boli!Programy wyjściowe:
Oczekiwanym wejściem dla programu głównego jest możliwa do sprawdzenia sekwencja krotek Pythona lub
'()'
brak danych wejściowych. (Można było powiedzieć „wygodny”). Przykład Wejście:'()'
,'("Golf",1),'
,'("Fizz",3),("Buzz",5)'
Uwaga cytowanie na skorupkach i na końcu przecinek do jednego wejścia.Naprawiono błąd 1 rano, zmieniając z dict (niezdefiniowane porządkowanie!) Na krotki.
Oczekiwanym wejściem dla innych programów jest tylko liczba
źródło
perl6
37634084 + 115 = 199AKTUALIZACJA: zmieniono z perl5 na perl6, aby się
say
bez niego obejśćuse feature
.AKTUALIZACJA: trzy przypadki testowe zamiast pięciu
Istnieją setki już rozwiązanych rozwiązań FizzBuzz, a wiele konkursów kończy się z takim samym rezultatem, więc od tego zacząłem. Mój kompilator tworzy właśnie dostosowaną wersję tego rozwiązania. Dodano kilka dodatkowych znaków, aby uwzględnić odmianę „wystarczy policzyć”.
kompilator, oczekuje takich argumentów: „Fizz 3” „Buzz 5”
skompilowane programy, spodziewaj się takiego argumentu: 100
skompilowane programy dla starych przypadków testowych:
źródło
Pyth - 51 + (38 + 43 + 50) = 182 bajtów
Potrafi prawdopodobnie zagrać w kompilator kilka bajtów. Wszystkie linki są linkami do tłumacza online.
Kompilator - 51 bajtów
Po prostu formatuje ciąg za pomocą krotki wejściowej. Pobiera dane wejściowe takie jak:
Nic - 38 bajtów
Just Golf - 43 bajty
Klasyczny Fizz Buzz - 50 bajtów
źródło
C ++ 11 ~ 486 + (234 + 244 + 255) = 1219
Pierwsze uczestnictwo tutaj, to wyzwanie nie należy do najtrudniejszych, więc pomyślałem, że spróbuję. Korzystając z C ++, a nawet z dodatkami do C ++ 11, jest to wciąż dość pełny język, ale jestem pewien, że jest miejsce na ulepszenia.
Kompilator (486):
Zakłada argumenty w postaci
3Fizz 5Buzz
itp.Liczba (234):
Golf (244):
FizzBuzz (255):
Dodatkowe informacje
Testowane z GCC 4.8.1, bez kodów kompilatora.
Oto mały plik makefile do automatyzacji generowania przypadków testowych i uruchamiania ich (użyj
make run
):źródło
map<int,string> f
może byćmap<int,string>f
. Możesz zainicjowaćj=1
w tym samym czasie za pomocąz
.Rubin 99 + (86 + 94 + 103) = 382
Stosowanie:
źródło
Stax , 23 + 5 + 17 + 29 = 74
Uruchom i debuguj
Najkrótsza jak dotąd odpowiedźNie zaskakująco pobita przez Galaretkę. Szablon napisów w Staxie jest naprawdę schludny i zapewnia funkcje podobne do printf. Programy generowane przez kompilator są prawie zawsze tak krótkie, jak najlepsze, jakie można osiągnąć, ręcznie kodując kodowanie bez użycia pakowania.Sam kompilator ma 23 bajty .
Odpowiednikiem ASCII jest:
Podane dane wejściowe
[]
generują ten (5 bajtów)Uruchom i debuguj
Podane dane wejściowe
[[1,"Golf"]]
generują ten (17 bajtów)Uruchom i debuguj
Podane dane wejściowe
[[3,"Fizz"],[5,"Buzz"]]
generują ten (29 bajtów)Uruchom i debuguj
źródło
Common Lisp,
636577Wziąłem inną odpowiedź i zawinąłem ją w quasi-cytaty, dodając parametry wejściowe. Powstały formularz drukuję jako jednowierszowy i usuwam niepotrzebne białe znaki. Kompilator jest nieco dłuższy niż poprzednia wersja, ale wynik jest mniejszy.
Wynik
Zwrócone wartości:
Ładny
Format wejściowy to lista
(number string)
par. Na przykład:... drukuje na standardowe wyjście:
... która, ładnie wydrukowana, jest:
Testowanie wynikowej funkcji:
źródło
Perl 5 , 77 + 93,170 bajtów
Wypróbuj kompilator online!
Spróbuj policzyć online!
Spróbuj po prostu golfa online!
Wypróbuj fizz buzz online!
źródło
Galaretka ,
88848373 bajtówNajkrótsza jak dotąd odpowiedź (uderzenia poprzednią „najkrótszą odpowiedź” o 1 bajt)
Kompilator:
Wypróbuj online!(kompilator)
Wypróbuj online!(sprawdź bytecount)
Statystyka:
źródło
C, łącznie 1080 bajtów
Kompilator [369 bajtów]
Fizz Buzz [241]
Golf [237]
Policz [233 bajty]
źródło
dc , 434 bajty
Wypróbuj online!
Dane wejściowe kompilatora (168 bajtów) należy umieścić na stosie jako liczbę całkowitą, ciąg, liczbę całkowitą, ciąg itd. (
3 [Fizz] 5 [Buzz]
). Powinien być podany w takiej kolejności, w jakiej chce się wydrukować jego szumy i szumy, co może być trochę oszustwem (po wdrożeniu sortowania bąbelkowegodc
wcześniej, sądzę, że kosztowałoby mnie to około 100 bajtów), ale pozwala również użytkownikowi , powiedzmy, nadal „Fizz” działa na 3 i „Buzz” na 5, ale mają 15 wydajności „BuzzFizz”.Jestem pewien, że można to trochę pograć w golfa; główne makro w programie końcowym (
M
) opiera się na dwóch makrach (F
iP
), które są raczej niepotrzebne, jeśli nie zostaną wprowadzone. W tej chwili kompilator sprawdza wejścia i wyjścia różnych (znacznie mniejszych) wersji tych makr, jeśli ich nie ma, ale nie jestem pewien, czy cała konfiguracja jest optymalna.Sam kompilator jest dość prosty, po prostu sprawdza, czy na stosie znajdują się „reguły”, a jeśli tak, to drukuje kod, który przechowuje głębokość stosu
z
, przechowuje stos w tablicy o indeksie 0a
, a następnie drukuje uogólniony Kod FizzBuzz. Jeśli na stosie nie było nic, to po prostu drukuje zmodyfikowaną wersję kodu FizzBuzz. Przypadki testowe:Brak danych wejściowych (46 bajtów):
3 [Fizz] 5 [Buzz] (117 bajtów):
1 [Golf] (103 bajty):
Wszyscy oczekują wartości n na stosie, która zostaje zapisana
n
. Te, które mają „reguły”, umieszczają je w tablicya
, przy czym ciągi znaków mają nieparzyste wskaźniki, a liczby całkowite są równe. Główne makro,M
inkrementuje wszystko, co znajduje się na stosie, uruchamia makro,F
które sprawdza wartość względem tablicya
, sprawdza, czyF
ustawiono rejestrb
na wartość true, czy nie, i drukuje górę stosu, jeśli tak, lub znak nowej linii, jeśli nie, resetuje sięb
do fałszowania, a następnie zachowuje działa, jeślin
jeszcze nie został osiągnięty. MakroF
, podane reguły, przechodzi przez całą tablicę w poszukiwaniu dopasowań. Zwiększa się o dwa, ponieważ nasze liczby całkowite i łańcuchy są wplecione przez tablicę, a po dopasowaniu wywołuje makroB
. MakroB
po prostu pobiera ciąg (bieżąca pozycja w tablicy mniej niż jeden) i drukuje go. Ustawia się równieżb
na prawdę. Nasz kompilator nie zadaje sobie trudu drukowaniaB
bez żadnych danych wejściowych i zasadniczo robiF
nop.źródło
vim, 122 (kompilator) + 73 (pusty) + 90 (golf) + 123 (fizzbuzz) = 392 bajtów
Kompilator
Format wejściowy
Wygenerowany kod dla sprawy FizzBuzz
Wygenerowany kod, opatrzony adnotacjami
<C-V>
to 0x16.<ESC>
to 0x1b.<C-A>
to 0x01.Przykładowa sesja
źródło
SlooSarksi .Lang, 179
źródło