Недавно я создал новый язык ;#
(произносится как «Точка с запятой»), который имеет только две команды:
;
добавить один в аккумулятор
#
по модулю аккумулятора на 127, преобразовать в символ ASCII и вывести без перевода строки. После этого сбросьте аккумулятор на 0. Да, 127 правильно.
Любой другой персонаж игнорируется. Это не влияет на аккумулятор и ничего не должно делать.
Ваша задача - создать переводчика для этого мощного языка!
Это должна быть либо полная программа, либо функция, которая примет ;#
программу в качестве входных данных и выдаст правильные выходные данные.
Примеры
Output: Hello, World!
Program: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#
Output: ;#
Program: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#
Output: 2d{ (unprintable characters here; should have 4 `\000` bytes between the `d` and the `{` and 3 after the `{`)
Program: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;hafh;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;f;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;###ffh#h#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ffea;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#au###h;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;h;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;o
Output: Fizz Buzz output
Program: link below
Output: !
Program: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#
code-golf
interpreter
Caird Coneheringaahing
источник
источник
Ответы:
Python 3 ,
6968 байт-1 байт благодаря @WheatWizard
Попробуйте онлайн!
источник
if
. Попробуйте онлайн!JavaScript (ES6),
768280 байтдемонстрация
Показать фрагмент кода
Рекурсивная версия,
8277 байтСохранено 5 байтов благодаря Нейлу
Это может привести к сбою при больших входах, таких как пример Fizz Buzz.
источник
f(s,a+(c==';'))
может выбить три байта из вашей рекурсивной версии.Retina ,
336636765666259 байтПопробуйте онлайн!
Читаемая версия с использованием гипотетического escape-синтаксиса:
Не печатает байты NUL, потому что TIO не допускает их в исходном коде.
Также печатает дополнительный символ новой строки в конце, но я думаю, что это не может сделать иначе.Трейлинг новой строки подавлен благодаря @Leo .-273 (!) Байта благодаря @ETHproductions .
-2 байта благодаря @ovs .
-3 байта благодаря @Neil . Проверьте их замечательное 34-байтовое решение .
источник
+T`\x01-~`_\x03-\x7f`[^\x01¯]\x01
? (конечно, включая непечатные символы в виде одинарных символов)#
на входе нет трейлинга . Вы можете это исправить, изменив свой второй этап на(;{127}|;+$)
T`;#\x01-ÿ`\x80\x7F_
\x80+$
(пустая строка)\+T`\x7Fo`\x01-\x80_`\x80[^\x80]
(используя шестнадцатеричные экранированные символы для представления непечатных). Выводит \ x7F вместо нулей.Java 8, 100 байт
Попробуйте онлайн!
источник
Consumer<char[]>
:s->{char i=0;for(int b:s){if(b==59)i++;if(b==35){System.out.print(i%=127);i=0;}}}
Japt , 18 байт
После этого есть непечатаемый символ \ x7f
%#
. Проверьте это онлайн!Как это устроено
источник
q'# ®è'; u# dì¯J
также работает на тот же счет.Python , 65 байт
Это гольф этого раннего ответа.
Попробуйте онлайн! python2
Попробуйте онлайн! python3
объяснение
Это довольно простой ответ, мы определяем, сколько
;
s между каждым#
и печатаемchr
мод 127. Единственное, что может быть немного странным, это[:-1]
. Нам нужно отбросить последнюю группу, потому что#
после нее не будет.Например
Будет разделен на
Но мы не хотим последнего,
;;;
потому что#
после него нет значения для печати.источник
t
иx
.> <> 35 байт
Попробуйте онлайн! Заменить
␡
на 0x7F^?
или «удалить».Основной цикл
Он принимает символ input (
i
), проверяет, является ли он меньше нуля, т.е. EOF (:0(
), и завершает программу, если он равен (?;
). В противном случае, проверьте, равен ли вход#
(:'#'=
). Если это так, разветвите и перезапустите цикл (?v
...^ ... <
).Счетная логика
Проверьте, равен ли вход
;
(';'=
). Если это так, нажмите0
. В противном случае ничего не делать. Это перезапускает основной цикл.Печатная логика
Когда входной символ равен
#
, вытолкните ввод из стека (~
), получите количество членов в стеке (l
), нажмите 127 ('␡'
) и возьмите модуль (%
). Затем выведите его как символ (o
) и запустите новый стек ([0
). Это «обнуляет» счетчик. Затем цикл возобновляется.источник
:0(
:(Python 3, 69 байт
Улучшено, благодаря @Wheat Wizard, @Uriel
источник
:
s.';'==c
экономит место, но без использованияif
операторов вообще будет еще короче.Рёда ,
443938 байт5 байтов сохранено благодаря @fergusq
Попробуйте онлайн!
Анонимная функция, которая принимает данные из потока.
Если другие символы не должны быть проигнорированы, я получаю это:
Рёда , 20 байт
источник
Рубин,
413534 персонажа(
403433 символов кода + 1 символ опции командной строки)Благодаря:
putc
не нужно явное преобразование с.chr
(6 символов)Образец прогона:
Попробуйте онлайн!
источник
putc()
. Спасибо, @Jordan05AB1E ,
161514 байтовКод:
Объяснение:
Использует кодирование 05AB1E. Попробуйте онлайн!
источник
Желе , 13 байт
Попробуйте онлайн!
Как это устроено
источник
semicola
не существует, этоsemicolons
.машинный код x86 в MS-DOS - 29 байт
Комментируемая сборка:
источник
05AB1E ,
252119 байт-2 байта благодаря Аднану
Объяснение:
Попробуйте онлайн!
источник
i>}
на+
.Сетчатка , 34 байта
Попробуйте онлайн! Включает контрольный пример. Редактировать: Сохранено 2 байта с некоторой помощью @MartinEnder. Примечание. Код содержит непечатаемые шрифты, а использование
&#x;
кодов приводит к неверным результатам, поскольку браузер использует Windows-1252 вместо ISO-8859-1. Объяснение: Первая строка очищает входные данные:;
изменяется на\x80
,#
на\x7F
(из-за ограничений TIO), а все остальное удаляется. Затем всякий раз, когда мы видим,\x80
что нет перед другим\x80
, мы удаляем его и циклически увеличиваем код любого следующего символа. Это повторяется до тех пор, пока не останется больше\x80
символов. Исходный код, который поддерживает нулевые байты, в основном вычитает 1 из непечатаемых байтов, за исключением первой строки, где\xFF
неизменен и\x7F
становится\x00
, С побегами для удобства чтения:источник
\x80([^\x80]|$)
последним этапом.\s+T`\x7Fo`\x01-\x80_`\x80(?!\x80).?
также сохраняет только один байт.[^\x80]|\x80$
я думаю, что сохраняет два байта.s
это раздражает.R,
97908684 байтаФункция:
Когда R начинается,
F
определяется какFALSE
(числовой0
).Ungolfed:
источник
pryr
как пакет R, он все еще R код.import
то время как в R вы можете использовать::
для прямого доступа к функции в пакетах. Здесь часто можно увидеть использование дополнительных пакетов (например, для Python и Java). Однако я изменил свой прежний пост, потому что я не хочу участвовать в обсуждении.Python, 82 байта
источник
Простой TeX, 156 байт
Удобочитаемый
источник
C (gcc) , 58 байт
Попробуйте онлайн! (Подсказка: нажмите ▼ Нижний колонтитул, чтобы свернуть его.)
источник
Perl, 25 байт
Выполнить с
perl -043pe
(считается как 4 байта, так какperl -e
является стандартным).Объяснение:
-043
устанавливает терминатор строки в#
(ASCII 043).-p
перебирает входные «строки» (теперь на самом деле # -ограниченные строки).y%;%%
подсчитывает количество;
в каждой «строке».x/#/
гарантирует, что мы не печатаем дополнительный символ для программ, которые не заканчиваются на # (например, третий тестовый пример).%127
должно быть довольно очевидно.$_=
это обычный шаблонисточник
;;#;;;
него выводится № 5 вместо № 2.echo -n ';;#;;;' | perl -043pe '$_=chr(y%;%%%127)x/#/' | xxd
правильно выводит00000000: 02
на мою машину. Если вы остановились043
или используете кодовую страницу, где#
нет ASCII 043, это объяснит ваш результат.CJam, 27 байт
Объяснение:
Альтернативное решение, 18 байт
Объяснение:
источник
;
удалять аккумулятор?F #,
799193 байтаUngolfed
Попробуйте онлайн!
Изменить: Обрабатывал любой другой символ, кроме ';' как '#'. Изменено так, что он игнорирует недопустимые символы.
альтернатива
F #,
107104 байтаИспользование эталонной ячейки экономит 3 байта
Ungolfed
Попробуйте онлайн
источник
Processing.js (версия для ханакадемии), 118 байт
Попробуйте онлайн!
Поскольку используемая версия обработки не имеет методов ввода, ввод помещается в n.
источник
keyTyped=function(){ ... }
: PЛабиринт ,
6147 байтПопробуйте онлайн!
объяснение
Выполнение кода начинается в верхнем левом углу, а первая точка с запятой отбрасывает неявный ноль со стека и продолжается вправо.
оранжевый
_36
толкает 36 на стек. Это для сравнения ввода с#
}
перемещает вершину стека во вторичный стек,
помещает целое значение символа в стек)
увеличивает стек (если это конец ввода, это сделает стек 0 и поток программы перейдет к@
и завершится ){
перемещает вершину вторичного стека к вершине первичного стека-
pop y, pop x, нажмите x - y. Это для сравнения ввода с#
(35 в ascii). Если ввод был#
кодом, то он перейдет к фиолетовой части (так как вершина стека равна 0, IP будет продолжать в том же направлении, в котором он двигался ранее), в противном случае он перейдет к зеленой части.Фиолетовый
127
нажмите 127 в стек%
pop x, pop y, нажмите x% y.
вытолкнуть вершину стека (аккумулятор) и вывести в виде символаОтсюда серый код переносит нас в верхний левый угол программы без стека.
зеленый
_24
толкнуть 24 в стек-
pop x, pop y, нажмите xy. 24 - это разница между,#
и;
поэтому он проверяет, был ли ввод;
. Если это было так,;
код продолжается прямо к)
. В противном случае он превратится в значение,#
которое увеличивает высоту стека (всегда положительное число, заставляя программу повернуть направо на следующем перекрестке и пропустить код, который увеличивает значение аккумулятора);
сбросить вершину стека)
инкремент вершины стека, который либо является неявным нулем, либо является ранее увеличенным нулем, действующим в качестве аккумулятора для выводаОтсюда серый код переносит нас в верхний левый угол программы со стеком, в котором находится только аккумулятор.
Серый
Кавычки не имеют значения, помещают
_
0 в стек и;
сбрасывают верхнюю часть стека. Все это всего лишь код для правильного направления потока управления и удаления всего лишнего с вершины стека.источник
MATL , 29 байт
Ввод - это строка, заключенная в одинарные кавычки.
Попробуйте онлайн!
Программа FizzBuzz слишком длинная для онлайн-переводчиков; увидеть это работает в автономном режиме в этом GIF:
объяснение
Значение аккумулятора реализовано в виде количества элементов в стеке. Это делает программу медленнее, чем если бы значением аккумулятора было одно число в стеке, но сохраняет несколько байтов.
источник
Алиса , 22 байта
Попробуйте онлайн!
объяснение
Мы держим в стеке только один счетчик того, сколько
;
мы встретили. Когда стек пуст (например, в начале программы), это неявно 0.Более короткая, но не прекращающаяся версия этой программы может быть найдена здесь .
источник
~h
.JS (ES6),
9792 байтаПытался принять иной подход, чем ответ Шэгги . Ну что ж.
источник
; # + , 59 байт, неконкурентный
Язык был сделан после этого вызова.
Попробуйте онлайн! Ввод завершается нулевым байтом.
объяснение
Поколение такое же, как и из моего ответа Generate; # code . Единственная разница здесь - итерация.
итерация
источник
Bash + coreutils,
4639 байтПопробуйте онлайн!
объяснение
(Спасибо Корове Кряк за -7 байт!)
tr
Часть удаляет все посторонние символы (я мог бы поставить это вsed
течение точно так же ByteCount, но тогда он не обрабатывает символ перевода строки правильно, так какsed
оставляет их иdc
получает только до первого перевода строки с?
)sed
берет остальное и строитdc
программу:Струны
;
становятся нитями1
(длинный буквальный)#
становится.ZC7%P
(если это следует за строкой1
, то.
это десятичная точка для неоперации. Но если это в начале программы или после другой#
, это литерал0
. Затем он принимает длину числа, модифицирует его, и печатает соответствующий ASCII.)источник
;
изнутри,'...'
и вы можете просто изменитьсяdc -ez?
наdc
. Кроме того, вместо;
добавления 1 в стек, вы можете сгруппировать их и получить их длину, используяZ
для этого tio.run/##S0oszvj/… .dc -ez?
было следствием необходимости дополнительного нуля для запуска программы) Но ваша программа добавляет дополнительный выводstderr
либо в случае последовательного#
ввода, либо в случае ввода, который не заканчивается#
(в обоих случаях я имею в виду после удаления посторонних символов) , Я не знаю, есть ли консенсус, но я чувствую, что дополнительный вывод делает решение недействительным. Однако я адаптировал вашу идею и оказался на один байт больше, чем ваше предложение, безdc
ошибок!#
s из-Z
за0
is1
, поэтому оно выводит 0x01 вместо 0x00 (я тоже попал в ту же ловушку, но мой браузер отображает непечатаемые в виде их шестнадцатеричных кодов, поэтому я понял это).C,
65 6460 байт(-2 благодаря потолочной кошке)
источник
c
в ноль, чтобы сделать функцию многократно используемой .c=0
, и я не хотел бы обманывать, копируя ответ Денниса.