Вызов:
Ваша задача - создать простого переводчика для простого языка игры в гольф.
Входные данные:
Ввод будет в виде строки, разделенной пробелами.
Вы можете заменить пробел на то, что вы хотите
Выход:
Выведите результат (число или строку), полученный после выполнения всех операций. Если имеется более одного выхода, объедините их, чтобы получить один результат (без разделителей). Начальное значение переменной всегда равно нулю. то есть: это начинается в0
Синтаксис языка:
Язык имеет следующие операторы:
inc ---> add one to variable
dec ---> remove one from variable
mult ---> multiply variable by 2
half ---> divide the variable by 2
Pri ---> print the variable to console (or whatever your language has)
exit ---> end the program (anything after this is ignored)
Примеры:
inc inc inc dec Pri exit ---> 2
dec inc mult inc inc Pri ---> 2
inc inc inc mult half Pri exit inc ---> 3
inc Pri inc Pri inc Pri exit half mult ---> 123
Pri exit ---> 0
inc half Pri exit ---> 0.5
Ограничение:
Это код-гольф, поэтому победит самый короткий код в байтах для каждого языка.
Замечания:
- Ввод всегда будет действительным. (строка операторов, разделенных пробелом)
- Вы можете округлить до ближайшего целого числа, если не хотите десятичных знаков.
code-golf
math
interpreter
Мухаммед Салман
источник
источник
Ответы:
Баш , 61 байт
Попробуйте онлайн!
Преобразует программу в программу постоянного тока, а затем оценивает ее как код постоянного тока. Это берет ввод, разделенный новыми строками. Обратите внимание, что dc основан на стеке и использует обратную польскую запись.
Вход сначала передается в sed
1i0
в первой строке ввода вставьте (prepend) a 0, это будет аккумуляторs/.//2g
удалить все, кроме первого символа в каждой строкеy"idmhe"+-*/q"
транслитерируйтеidmhe
в+-*/q
соответственно, + - * / - арифметические команды и q выходит из программы/+\|-/
в каждой строке, содержащей + или -,i1
вставьте 1/*\|\//
в каждой строке, содержащей * или /,i2
вставьте 2/P/
в каждой строке, содержащей P,cdn
измените его наdn
эквивалентный дубликат и выведите без перевода строки в dcТеперь это оценивается как выражение постоянного тока.
источник
sed
исключено, что синтаксис станет еще более чуждым, чем считалось ранее, когда в игру вступит гольф.Желе , 21 байт
Попробуйте онлайн!
Обратите внимание, что значения ASCII первых символов (
idmhPe
) по модулю 11 являются уникальными по модулю 6.Использование по модулю 16:
Желе , 21 байт
Попробуйте онлайн!
В
ḤH‘’IȮ
этом случае используется строка для индексации . Они‘’
больше не на границах.источник
“”
занимает 2 байта,¤
занимает 1 байт, сами данные занимают 6 байтов, осталось 2 байта, чтобы что-то сделать. В настоящее время это⁾
иj
, ноịØJ
илиṃØJ
намного хуже, иỌ
не работает (потому что Unicode).R ,
128125 байтПопробуйте онлайн!
Должен вызываться с,
source(echo=FALSE)
чтобы предотвратить автоматическое распечатывание возвращаемого значения. Альтернативой может быть завернуть все,invisible
но это гораздо меньше, чем игра в гольф (и разрушает мой [все еще] хороший счетчик байтов).источник
05AB1E , 25 байтов
Попробуйте онлайн!
Сопоставляет каждую языковую функцию с соответствующей функцией 05AB1E (используя первый символ каждой функции), а затем выполняет результирующую строку как код 05AB1E.
источник
Красный , 121 байт
Попробуйте онлайн!
Удобочитаемый:
источник
Python 2 ,
131125122121118117115 байтовПопробуйте онлайн!
-6 и -3 благодаря @Rod
-3 и -2 благодаря @etene
-1 путем замены
"Pri"==x
на"P"in x
источник
split
включить"exit"
и получить 1-й блок, вместоbreak
этого сохранив 4 байта'idmh'
и использоватьfind
вместо нихindex
, что сэкономит несколько байтовex
чтобы сохранить еще 2v=(v+1,v-1,v*2,v/2.)
наv+=(1,-1,v,-v/2.)
него, должно работать, не проверял, хотяhalf
. Так просто! Благодарю.Python 3 ,
1109182 байтаexit
приведет к выходу программы с ошибкой.Попробуйте онлайн!
источник
i='x+=1';d='x-=1';...
и затем в вашемexec
вызове измените его наexec(eval(c[0]))
print
утверждение!JavaScript (ES6),
8379 байтСохранено 4 байта благодаря @ l4m2
Итеративно заменяет инструкции либо выходными, либо пустыми строками.
Попробуйте онлайн!
комментарии
источник
s=>s.replace(/\S+./g,w=>k<s?'':w<{}?k:(k+={d:-1,e:w,i:1,m:k}[w[0]]||-k/2,''),k=0)
w<{}
чистое зло: рs=>s.replace(/\S+./g,e=>m<s?'':e<{}?m:(m+={d:-1,e,i:1,m}[e[0]]||-m/2,''),m=0)
также работаДревесный уголь ,
3735 байтПопробуйте онлайн! Ссылка на подробную версию кода. Вдохновленный ответом @ RickHitchcock. Объяснение:
Очистить переменную.
Обрежьте вход в
x
случае, если он есть, затем зациклите и включите каждый символ (остаток) от ввода.n
я п инкрементов переменную.d
d экранирует переменную.m
m умножает переменную на два (т.е. удваивает).h
h alves переменная.r
p r вставляет переменную, приведенную к строке.источник
JavaScript (ES6),
7775 байт(Заимствовано ( украдено ) @ Уловка Арно, использующая в
m
качестве имени переменной, экономя 2 байта.)Рекурсивно обходит строку, ища различные буквы в каждой инструкции и игнорируя остальные:
Принимает преимущество в том , что не
undefined
является ни больше , ни меньше , чем'x'
, в результате чего рекурсии до остановки в конце строки или когда он встречает'x'
в выходе .Показать фрагмент кода
источник
JavaScript (Node.js) , 107 байт
Попробуйте онлайн!
источник
f=
JavaScript (Node.js) , 91 байт
Попробуйте онлайн!
JavaScript (Node.js) , 96 байт
Попробуйте онлайн!
JavaScript (Node.js) , 99 байт
Попробуйте онлайн!
источник
JavaScript, 107 байт
источник
Haskell , 93 байта
Попробуйте онлайн!
По сути это перевод ответа Python от mbomb007 .
источник
Lua, 207 байт
источник
Python 3 ,
114110109116 байтНа самом деле в Python 2 потребовалось бы на два байта меньше, потому что
exec
это оператор и не нуждается в скобках ...Сохранено 4 дополнительных байта благодаря @ElPedro
Сохраненный дополнительный байт, используя тот факт, что
find
при ошибке возвращается -1, который затем можно использовать в качестве индекса+7 байт, потому что я не заметил правила отсутствия перевода строки :(
Попробуйте онлайн!
Отображает первый символ каждого входного слова на фрагмент кода Python. Затем они объединяются и
exec
редактируются.Довольно простой подход, который, вероятно, может быть немного больше в гольфе. Сложность в основном заключается в поиске самой короткой формы из множества возможных ...
источник
print(i,end='')
. Смотрите 4-й контрольный пример.Рубин +
-na
,817365 байтПопробуйте онлайн!
Довольно просто. Для первой буквы каждого слова найдите соответствующую командную строку и
eval
ее. Использует целочисленное деление иexits
бросаяZeroDivisionError
.-5 байт: использовать
.ord%11%6
вместо поиска строки. Кредит идет в пользователю202729-3 байта:
.ord
учитывает только первый символ строки, поэтому я могу пропустить[0]
.-8 байт: используйте
-a
флаг для автоматического разделения ввода, благодаря Кириллу Л.источник
-a
опцию, чтобы сделать автоматическое разделение для вас, как этоЭмоджикод , 270 байт
Попробуйте онлайн!
источник
SNOBOL4 (CSNOBOL4) , 165 байт
Попробуйте онлайн!
Валовой.
источник
C # (.NET Core), 186 байт
источник
i
сv
помощью таблицы ASCII, чтобы вы могли использовать небольшие числа, перегруппироватьif
s, а затем использовать троичный:class Z{static void Main(string[]a){int v=0,i;foreach(var s in a){i=s[0]%'d';if(i==1)break;if(i>9)System.Console.Write(v);else v=i<1?v-1:i<5?v/2:i<6?v+1:v*2;}}}
(PS объяснение того, как это работает и как использовать это (например, ожидает аргументы командной строки) всегда приветствуется!)%50
вместо%'d'
)Perl 5
-a
, 61 байтПопробуйте онлайн!
Украл
ord%11%6
трюк пользователя user202729Как?
источник
Pyth, 44 байта
Тестирование
объяснение
источник
TI-BASIC, 112 байт
Это использует некоторые предположения, которые AFAIK совершенно приемлемы. Во-первых, все переменные инициализируются нулями до выполнения; номер два в том, что вход берется через
Ans
.источник
Java (OpenJDK 8) , 164 байта
Попробуйте онлайн!
Выше мое решение, которое округляется до целых чисел, но ниже мое решение, которое обрабатывает десятичные дроби. Ненавистный способ, которым двойные отпечатки java добавляют еще 55 байтов к счету. Я оставил новые строки, чтобы сделать код более читабельным во втором представлении только потому, что это по сути то же самое решение с одной дополнительной командой и оператором импорта.
Java (OpenJDK 8) , 219 байт
Попробуйте онлайн!
источник
C (gcc) ,
120114111 байтов-6 байт благодаря потолку.
Попробуйте онлайн!
124 байта
Версия с плавающей точкой:
Попробуйте онлайн!
Я не беспокоился о версии, которая округляется, но делает исключение для 0, что будет разрешено, если я правильно понимаю цепочку комментариев.
источник
33 , 62 байта
Попробуйте онлайн!
Эта программа принимает инструкции, разделенные символами новой строки
Объяснение:
Код перед этим сегментом определяет все функции.
источник