Многие пользователи PPCG помогли с созданием этой задачи, как в чате, так и в песочнице, в частности Martin Ender , AdmBorkBork , Emigna и user202729.
Наше сообщество сочло необходимым создать набор языков, разработанных специально для игры в гольф, «языки игры в гольф», как мы их называем. Такие языки развивались от некогда блестящего, теперь неуклюжего GolfScript до гладких лаконичных языков, таких как Jelly и Husk . Как мы видим, эти языки становятся все короче и короче для ряда задач. Итак, как очевидные эксперты в области языков для игры в гольф, мы должны вместе разработать язык, чтобы превзойти любой другой язык, который осмелится конкурировать. Представляем Bugle!
Bugle: от аббревиатуры BuGoL: Bu ilt Go lfing L anguage.
Как этот вызов будет работать
Если вы не поняли того, на что я намекаю во введении, эта задача представляет собой сложную цепочку ответов, в которой каждый из нас вносит свой вклад в интерпретацию нового языка игры в гольф, улучшая его способность конкурировать на PPCG с каждым ответом.
Я опубликую первый ответ, состоящий из основы языковой спецификации / интерпретатора, и все остальные ответы будут продолжены с этого. Новые материалы предоставят следующие вещи:
- Изменение в спецификации языка
- Современный переводчик, встречающий именно то , что изложено в изменениях
- Обновленная оценка языка (подробности немного)
Вы можете изменить спецификацию одним из трех способов:
- Вы можете добавить одну команду
- Вы можете добавить две новые команды
- Вы можете редактировать поведение одной существующей команды
Что касается нового интерпретатора, вы должны использовать последнюю версию, написанную на Python. Это не должно быть в гольф. Каждая ранее добавленная команда должна быть тестируемой с самым последним интерпретатором, а также с самой новой командой (командами), которую вы добавили. Вы также не должны использовать оскорбительные выражения при обновлении интерпретатора, например, в комментариях или строковых литералах и т. Д.
Добавленные команды могут делать все, что вы пожелаете . Единственными требованиями являются:
- Это не производит оскорбительный вывод
- Это не то же самое, что другая команда
- Это не препятствует выполнению одного из примеров испытаний
Помимо этого, он может быть настолько конкретным или общим, насколько вы хотите. Это также может быть любой персонаж, которого вы хотите. Если вы не уверены, является ли ваше дополнение «новой командой», не стесняйтесь спрашивать в комментариях.
Оценка языка
Возможно, вы заметили, что вам нужно включить оценку языка во все новые предложения. Его оценка - то, что препятствует тому, чтобы этот вызов продолжался навсегда, и определяется следующим образом:
Текущий результат - это сумма количества байтов, необходимых для выполнения языком ниже 20 задач.
Для каждой из задач применяются стандартные правила ввода-вывода , а также стандартные лазейки .
20 заданий:
- "Привет, мир!" - Вывести строку
Hello, World!
- 1, 2, Fizz, 4, Buzz - Выведите каждое целое число от 1 до 100 (включительно) в отдельной строке, с кратными 3, заменяемыми
Fizz
, кратными 5, заменяемымиBuzz
наFizzBuzz
- Произведите число 2014 без каких-либо чисел в исходном коде. Выведите число 2014 без использования каких-либо символов
0123456789
в исходном коде, без доступа к внешним переменным или случайным начальным числам. - Обфусцированный Hello World - Вывод строка
Hello, World!
, без использования какого - либо из символов , по меньшей мере , два из следующих множеств:hlwd
,eor01
и27
(без учета регистра) Спойте С Днем Рождения свой любимый язык программирования. На любом языке выведите следующее:
Happy Birthday to You Happy Birthday to You Happy Birthday Dear [the name of your favourite programming language] Happy Birthday to You
Мы не новички в программировании гольфа, вы знаете правила, и я тоже - выложу полный текст "Never Gonna Give You Up"
- Выведите знак - Если дано число, выведите -1, если оно отрицательное, 0, если оно равно 0, или 1, если оно положительное.
- Гипотеза Коллатца (OEIS A006577) - Начиная с целого числа, разделите его на 2, если он четный, или умножьте на 3 и добавьте 1, если он нечетный, и повторяйте процесс до достижения 1. Выходные данные должны быть равны числу итераций берет вас, чтобы достичь 1.
- Массив вызовов № 1: Чередующиеся массивы - учитывая массив целых чисел, проверьте, равны ли все элементы с четным индексом, и равны ли все элементы с нечетным индексом, и выведите соответственно истинное или ложное значение
- Я незначительный массив? - Учитывая массив целых чисел, проверьте, все ли абсолютные различия между последовательными элементами меньше или равны 1, и выведите соответственно истинное или ложное значение
- Это число простое? - Если задано положительное целое число, напишите полную программу, чтобы проверить, является ли оно простым, и выведите соответственно значение true или false.
- Я палиндром. Ты? - Получив строку, проверьте, является ли она палиндромом, в то время как ваша программа / функция тоже палиндромом, и выведите соответственно два различных и согласованных значения
- Суммируйте числа на стандартном входе - возьмите ряд чисел из STDIN и выведите их сумму.
- Найти факториал - Учитывая целое число
n
, выведите произведение всех целых чисел между1
иn
включительно. - Кратчайший код для получения бесконечного вывода - без какого-либо ввода создайте бесконечный вывод, который, теоретически, никогда не прекратит выводить.
- Испечь кусочек Пи - Выведите точный текст:
()()()()()()
|\3.1415926|
|:\53589793|
\::\2384626|
\::\433832|
\::\79502|
\::\8841|
\::\971|
\::\69|
\::\3|
\__\|
- Найдите наименьшее число, которое не делит N - Учитывая положительное целое число N, выведите наименьшее положительное целое число, которое не делит N.
- Это четное или нечетное? - Если задано целое число N, выведите его четность в виде истинных / ложных значений.
- Вывод такой же длины, как и у кода. Запишите кратчайший код, длина которого равна длине кода, где результат не совпадает с кодом.
- Гольф, ты идешь на отлично! - Напишите кратчайший квин на вашем языке.
Для того, чтобы быть действительным, новое представление должно иметь гольф-представление как минимум для 2 проблем, по крайней мере, 1 байт для каждой. Вы можете увеличить продолжительность других представлений, но общая оценка должна уменьшиться как минимум на 2 за ответ. Также, пожалуйста, рассмотрите возможность включения ссылки на обновленные программы. Обновленные решения не должны работать при запуске с предыдущей версией интерпретатора.
Как получить печенье
У меня есть список из 5 испытаний, которые не являются обязательными для выполнения и не влияют на ваш счет, а представляют собой просто дополнительные испытания, чтобы проверить, достаточно ли Bugle способен. Не стесняйтесь включить решение для любого из них в ваш ответ:
- Создать Self переводчик
- Создать полезную нагрузку
- Совмещать строку
- Гиперпрограммирование: N + N, N × N, N ^ N все в одном
- "УЗЛ" или "НЕ"?
Описания не включены, так как не обязательно, чтобы каждый мог участвовать в соревновании.
Как победить
Как только минимальная оценка ( мы считаем, что 16, хотя любые попытки сыграть в эту игру очень приветствуются), очевидно, цепочка закончилась, поскольку решения не могут получить более высокую оценку. После того, как 16 будет достигнуто, задача остается в силе в течение 1 месяца после этого, чтобы дать кому-либо возможность отыскивать решения больше. После того, как этот месяц прошел, вызов окончен.
Как только задача будет решена, я перенесу переводчик в репозиторий GitHub и пройдусь по обычным махинациям по выпуску стабильного языка. Вы также можете начать публиковать решения проблем PPCG в настоящее время, используя указанный язык, но, пожалуйста, постарайтесь не заполнять первую страницу ответами. Вместо этого распределите их в течение определенного периода времени.
Форматирование
Чтобы облегчить поиск информации в вашем ответе, отформатируйте ее следующим образом:
# [N]. [Score]
[New command + description]
[Interpreter/link to interpreter]
[Link to programs]
Где [N]
ваш номер ответа (1 для первого, 2 для второго и т. Д.)
правила
- Вы должны подождать 3 часа между отправкой ответов
- Вы не можете публиковать сообщения два раза подряд, если ответ не был опубликован в течение 10 дней (ровно 240 часов).
- Вы не можете удалить предыдущие команды.
- Ваш переводчик не должен быть в гольфе, и его количество байтов здесь совершенно не имеет значения.
- Если кто-то предлагает игру в гольф, пока ваш ответ самый последний, вы должны отредактировать поле для гольфа и обновить свой счет.
- Вы также можете сделать это, когда ваш ответ находится в середине цепочки, если ваш счет не становится ниже, чем любые последующие ответы.
- Пожалуйста, воздержитесь от ответа на любые существующие вызовы PPCG, используя этот язык, по крайней мере, пока вызов не будет завершен
- Интерпретатор написан на Python 3 и должен продолжаться таким же образом по всей цепочке. Смена языка запрещена.
- Опять же, для того, чтобы быть действительным, новое представление должно включать в себя как минимум 2 проблемы, по крайней мере, 1 байт для каждой.
Давайте начнем!
источник
Hello, World!
, то это 19 байтов. Но если поведение пустой программы изменится, в зависимости от входных данных, ее можно будет уменьшитьfor
циклы) разрешены, и их рекомендуется добавлятьОтветы:
3. Оценка:
293825832532 (-51)Новый переводчик здесь .
В основном для игры в гольф и упрощения вывода я добавил возможность дублировать стек / деку, а также выводить всю модель в виде отрисованного текста вместо целых чисел.
Решения
1. «Привет, мир!» - 17 байт (-3)
5. Пой С Днем Рождения на свой любимый язык программирования - 95 байт (-3)
6. Мы не новички в коде гольфа, вы знаете правила, и я тоже - 1884 байта (-3)
16. Выпекать кусочек пи - 149 байт (-3)
20. Гольф, ты идешь на отлично! - 23 байта (-39)
Добавлены языковые функции
a
#"Hello, World!"a
распечаткиHello, World!
d
источник
2. Оценка:
29382583Модифицированный интерпретатор здесь на TIO .
Строковый литерал является наиболее очевидным дополнением к языку, в основном для борьбы с колмогоровскими сложностями .
Решения
1. «Привет, мир!» - 20 байт (-28)
Любое задание колмогоровской сложности может быть выполнено с использованием структуры,
#"<string>"[o>]
которая выводит заданную строку до тех пор, пока не будет достигнута строка 0.2. 1, 2, Fizz, 4, Buzz -
41964 байта (-1332)Спасибо @ user202729 за отличную игру в гольф.
3. Произведите число 2014 без каких-либо цифр в исходном коде - 9 байт (-4)
Использует два символа 20 и 14 в кодовых точках Bugle.
4. Запутанный Hello World - 19 байт (-153)
Соответствует правилам № 1 (нет
HLWDhlwd
) и № 3 (нет27
).5. Пой С Днем Рождения на свой любимый язык программирования - 98 байт (-230)
6. Мы не новички в коде гольфа, вы знаете правила, и я тоже - 1887 байт (-5006)
16. Выпекать кусочек пи - 149 байт (-290)
20. Гольф, ты идешь на отлично! - 62 байта (-12)
Добавлена функция языка
"..."
: Строковый литерал.\n
обрабатывается так же, как и другие символы."
(34) в память с помощью этой команды. Это не слишком большая проблема, по крайней мере, на данный момент, так как все перечисленные здесь проблемы колмогоровской сложности не имеют"
выхода.Любые дальнейшие игры в гольф всегда приветствуются, особенно для "Никогда не собираюсь сдаваться" и квина. В частности, приведенная выше мука является самой первой нетривиальной мукой, которую я когда-либо делал, поэтому я твердо верю, что кто-то может придумать более короткую.
источник
1. Оценка: 9638
Базовый переводчик можно найти здесь , а представленные здесь . Это довольно долго, поэтому я включил его в GitHub, а не занимал большую часть поста.
Решения
Все эти решения являются программами Unicode, запускаемыми с
-u
флагом командной строки, но результаты подсчитываются, как если бы они были закодированы с помощью кодовой страницы Bugle.1. «Привет, мир!» - 48 байт
Просто нажмите, затем выведите код символа каждого символа в строке.
2. 1, 2, Fizz, 4, Buzz - 1396 байт
Та же техника, что и в Hello, World! пример
3. Произведите число 2014 без каких-либо цифр в исходном коде - 13 байт
#
использует ленту,+
увеличивает ячейку,O
выводит как целое число и-
уменьшает4. Запутанный Hello World - 172 байта
Использует присущее ему сходство с мозгом. Соответствует правилам № 1 и № 3
5. Пой С Днем Рождения на свой любимый язык программирования - 328 байт
Все проблемы колмогоровской сложности на данный момент имеют такую структуру.
6. Мы не новички в коде гольфа, вы знаете правила, и я тоже - 6893 байта
7. Выведите знак - 18 байт
Проверяет, является ли входное значение больше нуля, меньше нуля (изменено ли на выход
-1
вместо1
) и равно ли нулю, прежде чем брать их сумму.8. Гипотеза Коллатца (OEIS A006577) - 36 байт.
Это выполняет зацикливание в стеке, но переключается на ленту, чтобы увеличить счетчик каждой итерации.
9. Массив вызовов № 1: Чередующиеся массивы - 35 байт
Это небольшая модификация ответа Митча Шварца на существующий вызов.
10. Я незначительный массив? - 46 байт
Все заслуга Emigna для создания этого
11. Является ли это число простым? - 31 байт
Использует теорему Вильсона и вычисляет
(n-1)!² % n
12. Я палиндром. Ты? - 13 байт
Первая половина программы, до
O
, устанавливает стек как[x, x]
гдеx
либо,True
либоFalse
.O
выскакивает верхнее значение и выводит его. Остальная часть программы просто следит за тем, чтобы никаких ошибок не возникало. К счастью, когда?
встречается конец файла, он просто нажимает''
(пустая строка).13. Суммируйте числа по стандарту в - 19 байтов
Это можно разделить на две части:
?:[?:];
иL0s[+L1s-]
. Первая часть собирает все входные данные в стек. Вторая часть сдвигает сумму двух верхних элементов, а длина больше 1.14. Найти факториал - 25 байт
Это имеет структуру, аналогичную программе суммирования, но вместо ввода нескольких входов,
[:1s-:];
толкает диапазон от1 .. n
стека и[×L1s-]
принимает продукт.15. Самый короткий код для получения бесконечного вывода - 5 байт
Используйте цикл while с
1
постоянно под указателем. Выходы1
навсегда.16. Испечь кусочек пи - 439 байт
17. Найдите наименьшее число, которое не делит N
При этом используется пробное деление, заканчивающееся, когда результат по модулю не равен
0
.18. Это четное или нечетное? - 5 байт
Простой по модулю 2
19. Вывод той же длины, что и код - 16 байтов
Выводит первые 16 печатных символов ASCII в обратном порядке:
0/.-,+*)('&%$#"!
20. Гольф, ты идешь на отлично!
Кредит переходит к пользователю 202729 за это
Спецификация языка
призвание
bugle.py
в настоящее время принимает ряд флагов, затем имя файла / код, который будет выполнен. На данный момент он имеет 4 флага командной строки:-f
/--file
указывает, что код должен быть прочитан из файла-c
/--cmd
/--cmdline
Указывает , что код поставляется с помощью командной строки.-c
и-f
не может использоваться в одном вызове-u
/--unicode
говорит интерпретатору прочитать код с кодировкой Unicode. По умолчанию используется кодировка Bugle ниже-l
/--length
выводит длину файла в байтах в STDERR после выполненияСледующий вызов был использован для проверки вышеуказанных представлений
Кодовая страница
Bugle использует 512 символов в своей кодовой странице. Символ
0xFF
не должен использоваться для команды , так как он используется для обозначения следующего шестнадцатеричного значения для индексации во второй половине кодовой страницы. Используемые символы:Или посмотрите в табличном формате . Обратите внимание, что
\t
и\n
представляют вкладку и перевод строки соответственно. Также обратите внимание, что 16-я строка заканчивается непечатаемым символом:и может отображаться не во всех браузерах.
объем памяти
В настоящее время в интерпретатор встроено 5 моделей памяти. Каждая модель памяти требует, чтобы персонаж сказал интерпретатору начать использовать эту модель:
$
): стандартный стек, который поддерживает отправку, извлечение значений и т. Д.#
): лента, как брейнфук, которая изначально только0
s.G
): двумерная сетка, бесконечная в обоих направлениях, содержащая только0
sD
): Deque , как реализованоcollections
модулем.S
): одно значение, которое можно использовать для хранения одного значения.Сетка также имеет единственное значение, сохраненное в своем указателе, которое может быть записано или записано в ячейки.
Кроме того, размеры ленты и сетки и режим обтекания можно изменить с помощью другой команды invoke. Эти различные команды принимают заданное количество значений из текущей модели памяти в качестве параметров настройки:
À
): принимает два значения - size (int
) и wrapping (bool
)Á
): принимает одно значение - размер (int
). Обертывания на конце лентыÂ
): принимает одно значение - размер (int
). Не оборачивается в концеǴ
): принимает 4 значения - x size (int
), y size (int
), x wrap (bool
) и y wrap (bool
)Используемый тип памяти может изменяться во время программы с помощью
₀₁₂₃₄₅₆₇₈₉
, который обращается к 0-индексируемомуn
типу используемой памяти (₀
является первым,₁
вторым и т. Д.), Но в настоящее время значения нельзя поменять местами между различными типами памяти.разветвление
Пока у Bugle есть две команды ветвления, каждая из которых заканчивается
]
символом:Хотя (
[
): циклы в стиле брейнфук. Они извлекают значение из стека / очереди, если оно используется, или получают доступ к ячейке под указателем в ленте / сетке.Пример:
#?[-O]
отсчет от ввода до0
Если / еще (
{
и}
). Одиночное исполнение пока циклы. Если значение popped равно false, то предложение if пропускается, переходя к предложению else, разделенному символом}
. Они ведут себя так же, как и циклы while в отношении доступа к памяти.Пример:
{0}1]
логические НЕ воротаВстроенные функции
Наборы цифр интерпретируются как целые числа и просто помещаются / записываются в текущую модель памяти как есть.
Очевидно, что я снабдил Bugle некоторыми базовыми встроенными функциями, как можно меньше, чтобы другие могли добавлять больше по мере развития цепочки. Основные команды следующие:
+
-
%
:
;
<
=
>
?
L
O
R
Z
^
h
o
r
n
, гдеn
верхнее значениеs
…
×
÷
источник