Добро пожаловать в мир компилятора гольфа. Ваша задача - написать программу, которая генерирует другую программу для воспроизведения варианта FizzBuzz по спецификации.
Ваш компилятор
Напишите компилятор, который генерирует варианты программы FizzBuzz для спецификации. Спецификация этого варианта выражается в виде массива пар целое число / строка.
- Ввод может быть в любой форме, удобной для вашего языка. (Мои примеры используют n: xxxx, но это только для иллюстративных целей.)
- Каждый целочисленный ввод может использоваться только один раз за вызов вашего компилятора.
- Целое число каждой пары будет иметь значение не менее одного.
- Строка каждой пары будет состоять только из четырех букв ASCII.
- Выходные данные должны быть единой законченной программой, которая соответствует приведенным ниже правилам.
- Вывод может быть в любой удобной форме, если это текстовая программа. (Так что нет возврата лямбда-выражений.)
Поведение не определено для входных данных, не соответствующих вышеуказанным правилам.
Ваша сгенерированная программа FizzBuzz
Программа, сгенерированная вашим компилятором, примет одно целое число n в качестве входных данных. Он выведет последовательность чисел, начиная с одного до n включительно , заменяя числа строками FizzBuzz при необходимости.
- Сгенерированная программа должна быть на том же языке, что и компилятор.
- Ввод n может быть в любой форме, удобной для вашего языка.
- n будет иметь значение по крайней мере один.
- Число, кратное хотя бы одному из целых чисел, введенных в компилятор, должно быть заменено всеми строками в паре с этими целыми числами, соединенными вместе.
- Число, которое не должно заменяться строкой FizzBuzz, должно быть выведено в десятичном формате ASCII.
Например;
> GenFizzBuzz 3:Fizz 5:Buzz
> a.out 5
1
2
Fizz
4
Buzz
счет
Ваша запись будет оцениваться по длине программ, которые генерирует ваш компилятор, добавленных к длине вашего компилятора. Запустите ваш компилятор много раз с каждым из следующих параметров и добавьте длины сгенерированных программ вместе с длиной компилятора, чтобы найти ваш счет.
- Просто посчитай. (Нет входных данных - сгенерированная программа будет считать от 1 до n без замен.)
- Просто Гольф. (1: Golf - сгенерированная программа выдаст «Golf» n раз.)
- Классический FizzBuzz. (3: Fizz, 5: Buzz)
(Обратите внимание, что ваш компилятор должен генерировать код для любого допустимого ввода, а не только перечисленных.)
Ответы:
Python 3 -
168162 + 230 = 392О, Питон, ты так стараешься, но умножение
import sys;sys.argv
материала на 4 действительно больно!Выходные программы:
Ожидаемый ввод для основной программы представляет собой доступную для последовательности последовательность кортежей Python или
'()'
не требует ввода. (Вы действительно сказать , «удобно».) Пример ввода:'()'
,'("Golf",1),'
,'("Fizz",3),("Buzz",5)'
примечание со ссылкой на оболочке и задней запятой на один вход.Исправлена ошибка с 1:00, когда переход от dict (неопределенный порядок!) К кортежам.
Ожидаемый вклад для других программ - это просто число
источник
perl6
37634084 + 115 = 199ОБНОВЛЕНИЕ: переключено с perl5 на perl6, чтобы получить
say
безuse feature
.ОБНОВЛЕНИЕ: три теста вместо пяти
Для FizzBuzz существуют сотни уже готовых решений, и многие конкурсы заканчиваются тем же результатом, поэтому я и начал. Мой компилятор только производит настроенную версию этого решения. Несколько дополнительных символов были вставлены, чтобы учесть вариант «просто считать».
компилятор, ожидает аргументы вроде так: "Fizz 3" "Buzz 5"
скомпилированные программы, ожидайте аргумент так: 100
скомпилированные программы для старых тестовых случаев:
источник
Pyth - 51 + (38 + 43 + 50) = 182 байта
Вероятно, может сыграть в компиляторе несколько байт. Ссылки на все из них являются постоянными ссылками на онлайн-переводчика.
Компилятор - 51 байт
Просто выполняет форматирование строки с входным кортежем. Принимает входные данные, как:
Ничего - 38 байт
Просто Гольф - 43 байта
Классический Fizz Buzz - 50 байтов
источник
С ++ 11 ~ 486 + (234 + 244 + 255) = 1219
Первое участие здесь, это испытание не является одним из самых сложных, поэтому я решил попробовать. Используя C ++, хотя и с дополнениями C ++ 11, это все еще довольно многословный язык, но я уверен, что есть возможности для улучшения.
Компилятор (486):
Предполагает аргументы в виде
3Fizz 5Buzz
и т. Д.Количество (234):
Гольф (244):
FizzBuzz (255):
Дополнительная информация
Протестировано с GCC 4.8.1, никаких читов компилятора.
Вот небольшой make-файл для автоматизации генерации тестовых случаев и их запуска (use
make run
):источник
map<int,string> f
может бытьmap<int,string>f
. Вы можете инициализироватьj=1
одновременно сz
.Рубин 99 + (86 + 94 + 103) = 382
Использование:
источник
Stax , 23 + 5 + 17 + 29 = 74
Запустите и отладьте его
Самый короткий ответ до сих порНе удивительно побежден Желе. Шаблон строки, представленный в Stax, действительно аккуратный и предоставляет функции, похожие на printf. Программы, сгенерированные компилятором, почти всегда настолько коротки, насколько лучше всего можно достичь, вручную набирая код без использования упаковки.Сам компилятор составляет 23 байта длину .
Эквивалент ASCII:
При условии ввода
[]
, генерирует этот (5 байтов)Запустите и отладьте его
При условии ввода
[[1,"Golf"]]
, генерирует этот (17 байт)Запустите и отладьте его
При условии ввода
[[3,"Fizz"],[5,"Buzz"]]
, генерирует этот (29 байт)Запустите и отладьте его
источник
Обыкновенный Лисп,
636577Я взял другой ответ и обернул его в кавычки при добавлении входных параметров. Я печатаю полученную форму в виде одной строки и удаляю ненужные пробельные символы. Компилятор немного длиннее предыдущей версии, но итоговая оценка снижается.
Гол
Возвращаемые значения:
милая
Формат ввода представляет собой список
(number string)
пар. Например:... печатает на стандартный вывод:
... который, довольно напечатанный, является:
Тестирование полученной функции:
источник
Perl 5 , 77 + 93, 170 байт
Попробуйте компилятор онлайн!
Попробуйте просто посчитать онлайн!
Попробуйте просто гольф онлайн!
Попробуйте шипеть онлайн!
источник
Желе ,
88848373 байтаСамый короткий ответ на данный момент (превосходит предыдущий «самый короткий ответ» на 1 байт)
Составитель:
Попробуйте онлайн! (компилятор)
Попробуйте онлайн! (подтвердите счет bytecount)
Статистика:
источник
C, всего 1080 байт
Компилятор [369 байт]
Fizz Buzz [241]
Гольф [237]
Количество [233 байта]
источник
постоянный ток , 434 байта
Попробуйте онлайн!
Входные данные для компилятора (168 байт) должны быть помещены в стек как целое число, строка, целое число, строка и т. Д. (
3 [Fizz] 5 [Buzz]
). Это должно быть дано в том порядке, в котором нужно печатать их шипение и жужжание, что может быть чем-то вроде мошенничества (еслиdc
раньше я использовал пузырьковую сортировку , я думаю, это будет стоить мне около 100 байт), но это также позволяет пользователю Скажем, у «Fizz» еще 3, а «Buzz» - 5, но у «BuzzFizz» 15.Я уверен, что это может быть игра в гольф немного больше; Основной макрос в конечной программе (
M
) опирается на два макроса (F
иP
), которые довольно ненужны, если не вводить данные. Прямо сейчас компилятор проверяет на вход и выводит разные (гораздо меньшие) версии этих макросов, если их нет, но я не уверен, что вся установка оптимальна.Сам компилятор довольно прост, он просто проверяет, есть ли в стеке «правила», и если это так, он печатает код, в котором хранится глубина стека
z
, сохраняет стек в массиве с 0 индексамиa
, а затем печатает обобщенный Код FizzBuzz. Если в стеке ничего не было, он просто печатает измененную версию кода FizzBuzz. Тестовые случаи:Нет ввода (46 байт):
3 [Fizz] 5 [Buzz] (117 байт):
1 [Golf] (103 байта):
Все они ожидают значение n в стеке, в котором оно хранится
n
. Те, у которых есть «правила», помещают их в массивa
со строками с нечетными индексами и целыми числами с четными. Основной макрос,M
увеличивает все, что находится в стеке, запускает макрос,F
который проверяет значение по отношению к массивуa
, проверяет,F
установлено ли в регистреb
значение true или нет, и печатает верхнюю часть стека, если это так, илиb
перевод строки, если нет, сбрасывает в false и затем сохраняет работает сам, еслиn
еще не был достигнут. МакросF
, учитывая правила, проходит через весь массив в поисках совпадений. Он увеличивается на два, поскольку наши целые числа и строки переплетаются через массив, а при совпадении вызывает макросB
. макросB
просто получает строку (текущая позиция в массиве меньше единицы) и печатает ее. Это также устанавливаетb
правду. Наш компилятор не печатаетB
без ввода и, по сути, делаетF
nop.источник
vim, 122 (компилятор) + 73 (пусто) + 90 (гольф) + 123 (fizzbuzz) = 392 байта
составитель
Формат ввода
Сгенерированный код для случая FizzBuzz
Сгенерированный код, аннотированный
<C-V>
0x16.<ESC>
0x1b.<C-A>
0x01.Пример сеанса
источник
SlooSarksi .Lang, 179
источник