В этом задании вы собираетесь написать переводчика для простого языка, который я составил. Язык основан на одном аккумуляторе A, длина которого составляет ровно один байт. В начале программы A = 0. Это языковые инструкции:
!
: Инверсия
Эта инструкция просто инвертирует каждый бит аккумулятора. Каждый ноль становится единым целым и каждый становится нулем. Просто!
>
: Сдвиг вправо
Эта инструкция сдвигает каждый бит в A на одно место вправо. Самый левый бит становится нулем, а самый правый бит сбрасывается.
<
: Сдвиг влево
Эта инструкция сдвигает каждый бит в A на одно место влево. Самый правый бит становится нулем, а самый левый бит отбрасывается.
@
: Поменять местами
Эта инструкция меняет старшие четыре бита А на нижние четыре бита. Например, если A есть 01101010
и вы выполняете @
, A будет 10100110
:
____________________
| |
0110 1010 1010 0110
|_______|
Вот и все инструкции! Просто, правда?
правила
- Ваша программа должна принять ввод один раз в начале. Это будет строка кода. Это не интерактивный переводчик! Вы можете принять ввод только один раз и не нужно возвращаться к началу, как только эта строка была выполнена.
- Ваша программа должна оценить указанный вклад. Каждый персонаж, который не упомянут выше, игнорируется.
- Ваша программа должна затем распечатать окончательное значение аккумулятора в десятичном виде.
- Применяются обычные правила для действительных языков программирования.
- Стандартные лазейки запрещены.
- Это код-гольф , выигрывает наименьшее количество байтов.
Вот несколько небольших программ для проверки ваших работ. Перед стрелкой - код, после - ожидаемый результат:
!
->255
!>>
->63
!<@
->239
!nop!&6*!
->255
Наслаждайтесь!
источник
! -> 255
что мы будем использовать 8 бит на байт здесь? Вопрос не явный.Ответы:
Pyth,
3635 байтИспытательный жгут
Внутреннее представление аккумулятора является целым числом. Это целое число изменяется на 256 на каждой итерации, по желанию. Выполненные операции
-G-1
,G/2
,G*2
иG
преобразуются в базу 16, обращенные, и преобразуются обратно к основанию 10, гдеG
находится аккумулятор.Я пропустил линию о игнорировании всего остального. Это было исправлено. Спасибо, @ Денис.
источник
-G-1
короче чем~G
в пите? Я несколько сомневаюсь в этом.t_G
, где_
есть отрицание иt
есть-1
. В Pyth~
означает что-то совершенно другое.~
(побитовое НЕ)С, 96
Предполагая ASCII (или совместимый) ввод:
опрятнее:
По сути это просто набор вложенных троичных выражений. Я увеличиваю полученное значение
getchar()
так, что EOF (-1) приводит к нулевому значению, и программа завершается.(ссылка идеально)
источник
!<>
должен приводить к,127
а не к255
). Либо определите свойa
какchar
, либо используйте строкуa&=255
(и используйте%u
), чтобы получить правильный эффект. Также вы можете сократить свое отрицаниеa^255
до~a
.a>>4&15
тоже короче твоего(a&240)/16
.%u
вместо%hhu
a/16|a*16
вместоa/16|(a&15)*16
. Несколько битов сверху удаляются&255
.a*257/16
на один байт меньше, чемa/16|a*16
.Python 3, 133 байта
Использует словарь, чтобы восполнить отсутствие синтаксиса переключателя в Python. Подробнее здесь .
Аккумулятор представляет собой строку, которая в конце преобразуется в число 10.
Пример ввода / вывода:
источник
for i in sys.stdin:
:)Javascript (ES6),
809190 байтДовольно коротко, как только можно. Определяет анонимную функцию, которая принимает программу в качестве входных данных.
!
, беретx XOR 255
, поскольку JS's~
рассмотрел быx
32-битное число.<
, умножаетсяx
на 2 и принимает результат мод 256.>
действительно сдвигает битыx
1 бит вправо.@
этажейx/16
и добавляет егоx%16*16
.Спасибо @vihan за предложение использовать
reduce
для сохранения байта.источник
<
чтобы сохранить около 4 байтов. Использование<
в виду вместо==
? Если это так, это не сработает, так как неактивные символы будут неправильно выполнять операцию. Я использовал это в своем предыдущем 80-байтовом решении.CJam, 37 байт
Попробуйте онлайн в интерпретаторе CJam .
Как это работает
источник
Java (8),
514483411366359239224229198194187186184182181180177 символовВау, это было в гольфе много! Спасибо всем, кто дал мне предложения! Я очень ценю это!
Гольф 31 (!) Байт, оптимизируя обмен бит с битовыми операциями, в отличие от длинных
Integer.???
методов.Поместите в гольф 72 (!!!!) персонажа, удалив ненужную строку, созданную для обмена кусочками. Гораздо лучше, чем раньше !?
Гольф 45 (!!) символов, удалив использование
java.util.Scanner
и чтениеSystem.in
непосредственно. Обратите внимание, что теперь, когда лямбда-выражение исчезло, Java 8 больше не требуется! Просто Java 1 подойдет!Гольф 7 символов, сделав класс
(default)
(удаленноеpublic
ключевое слово), благодаря @bmarksГольф 120 (!!!!!!!) символов, превратив все эти длинные
Integer
операции класса в бит, переключаясь на255 - a
. Теперь это намного короче!Гольф 15 (!) Символов путем преобразования сдвигов в умножение и деление, удаление скобок из оператора while и создание
a
локальных внутриmain
метода.Ungolfed 9 = (chars из-за проблемы с левым сдвигом, не отбрасывающим самый левый байт. Поэтому я теперь делаю
mod (256)
. Правое смещение сделает результирующее число на один бит короче, чем раньше, поэтому нет необходимости использоватьmod
правый сдвиг. Моя вещь обменивает nibble-swap, поменяет последние 4 бита и второй-последний клев, иand (&)
обрежет все остальные биты. Моя программа инверсии не вызывает никаких проблем, если исходное число меньше 256.Игра в гольф
3135 символов благодаря @Geobits, преобразующемуswitch
операторы во множество троичных операторов, а также конвертирующим символы в целые, сокращая литералы.Golfed 7 символов, удалив ненужные
&240
в полубайтового свопа ((a&240)>>4
доa>>4
и преобразования(a&15)<<4
вa<<4&240
. Последнее изменение только golfed один символ , хотя.Гольф 1 символ, удалив ненужные
=
вa /= 2
, потому чтоa = a /= 2
эквивалентноa = a / 2
.Играли в гольф 2 символа, поворачиваясь
println
кprint
.Гольф 2 символа, удалив случайный
a=
вa=255-a
(a=a=255-a
эквивалентноa=255-a
)Гольф 1 символ, превращаясь
a<<4&240
вa%16<<4
.Гольф 1 символ, добавив скобки за пределами троичного заявления и делать
%256
. Таким образом, нет%16
необходимости в левой части смены мест. В скобках добавлено 2 символа, а в%16
сохранении - 3 символа.Golfed 3 символов путем изменения
class
кinterface
и удалению сpublic
помощью функции методы статического интерфейса Java 8 в. Спасибо @TheNumberOne (без комментариев, но найти его ответ на "Советы по игре в гольф на Яве"источник
Integer
методы класса, хотя.switch
то время как игра в гольф.case
/break
Просто слишком долго. Вы должны быть в состоянии сохранить кучу, сделав все это троичным; что-то вродеa=i=='!'?255-a:i==62?a/2:i=='<'?a*2%256:i=='@'?(a&240)>>4|(a&15)<<4:a;
Rust,
121115 bytesОбразец прогона:
Ungolfed:
Удивительно коротко для Rust. Ничто иное, действительно интересное, кроме того факта, что сегодня я узнал больше правил приоритета - кто знал,
(a>>b)|c
- это то же самое, что иa>>b|c
?Сбрил байт, изменив
n>>=1
наn/=2
; однако, то же самое не может быть сделано с умножением, потому что арифметическое переполнение - паника (то есть крах) в Rust.источник
>>
это своего рода походит деления и|
является своего рода походит дополнение.HP 41C / CV / CX (? Байт, 42 шага)
Чисто для хихиканья, вот он для калькулятора HP 41C / CV / CX. (Требуется либо модуль расширенных функций, либо 41CX для функции ATOX.) К сожалению, калькулятор не сообщает размеры программы в байтах.
Поместите вашу программу в регистр Alpha, что немного сложно, так как нет возможности войти! или @ прямо с клавиатуры (используйте XTOA с кодами ASCII 33 и 64 соответственно, чтобы добавить их).
Шаги 08 и 10 позволяют игнорировать недействительные коды операций; удалите их, чтобы сохранить 2 шага, но программа потерпит крах при неверном вводе.
источник
Python 2, 79 байт
Я понял, что я сделал что-то очень похожее на это в Python ранее. Это просто порт моего ответа на Ruby , но это, кстати, самый короткий ответ Python на данный момент: D
Отличие от версии для Ruby состоит в том, что она не игнорирует неверные инструкции при переборе ввода. Вместо этого я использую тот факт, что Python имеет тенденцию возвращаться,
-1
а неnil
при отсутствии совпадений - текущее значениеa
добавляется в конец массива результатов, так что все недопустимые инструкции отображаются на одно и то же неизменное значение.источник
Python 3,
1249493 байта"!" то же самое, что вычитание из 255.
"<" такое же, как умножение на 2. Но 8-битный регистр означает mod 256.
">" такое же, как целочисленное деление на 2.
"@" означает сдвиг последних 4 битов (
a%16
) на 4 бита (*16
) и добавление первых четырех битов (a/16
).РЕДАКТИРОВАТЬ (читать бесстыдное копирование)
Увидел другой ответ в Python (путем бета-распада). Он использует действительно эффективный способ имитации переключений, используя словарь. Используя это, мы можем написать
Спасибо, бета распад.
источник
256
правильно? Так почему бы не сделать это в концеa={"!":255-a,"<":a*2,">":a//2,"@":(a%16)<<4+a>>4}.get(i,a)%256
. Это сразу же экономит вам байт (потому что вы будете делатьa*2
вместоa<<1
) ... но ответ @ daniero также показывает, что если вы сделаете это таким образом, то(a%16)<<4
его можно сократить до простогоa<<4
, потому что любой бит 16 или больше будет исключен после умножения это на 16 и уменьшить его мод 256. Ницца! Кроме того, теперь вы можете заменить255-a
на-1-a
... или лучше, просто~a
. В целом, эти предложения должны сэкономить вам 9 байтов.Haskell, 89 байт
Пример использования:
f "!>>"
->63
источник
Ржавчина, 111 байт
Больше комментариев к ответу @ Doorknob, но у меня нет ни одного представителя для комментариев, так как я только что создал аккаунт.
Его решение Rust можно сбрить на 10 байт следующим образом:
источник
Python 3, 127 байт
Редактировать: коротко, спасибо @Jakube
Edit2: исправить, спасибо @Anachor
источник
!<
дает,510
пока это должно быть254
Цейлон,
297290отформатирован:
#f
и#f0
шестнадцатеричные числа для клевов,.byte
преобразует целое число в байт. Мне повезло, что.string
атрибут Byte уже использует беззнаковое представление байта. В Цейлоне также есть оператор переключения без провала, а строка представляет собой список символов, который можно повторять.Я также попытался сократить эти имена методов с длинным сдвигом, используя импорт псевдонимов, но на самом деле это становится на 7 байт длиннее:
отформатирован:
Это может быть полезно, если нам нужны эти методы немного чаще.
источник
Рубин,
8173 байтаГораздо проще - нет оценки! Для каждого действительного символа на входе он оценивает каждую инструкцию и находит соответствующую инструкцию по индексу
$&
(текущий символ на входе).источник
STATA, 197 байт
Ungolfed
Не работает с онлайн-переводчиком и требует несвободного переводчика по умолчанию. Это было бы несколько проще с реальными побитовыми операциями, но я не думаю, что они слишком полезны для большинства распространенных применений STATA.
источник
JavaScript, 104
Вложенные троичные операторы отображаются в инструкции.
BITWISE AND используется для ограничения нашего типа Number одним байтом.
источник
Юлия,
117948673 байтаЭто анонимная функция, которая принимает строку и возвращает целое число. Чтобы вызвать его, присвойте его переменной.
Ungolfed:
Сохранено 8 байтов благодаря Sp3000 и 13 благодаря Деннису!
источник
JavaScript (ES6), 76
81В качестве неназванной функции, возвращающей значение аккумулятора
Это портирование супер-умных ответов @daniero (у которых слишком мало голосов)
Бонус: вы можете передать начальное значение аккумулятора. Если не передано, начальное значение равно 0, как определено.
Попробуйте запустить приведенный ниже фрагмент в любом браузере EcmaScript 6 (я тестировал в Firefox)
источник
Crystal, 139 байтов
источник
C # 193
источник
using System;
или что-то подобное для доступаConsole.ReadLine
иConsole.Write
безSystem.
префикса?byte
приводить для каждой операции, но я могу ошибаться.Луа, 344 чар
Вдохновленный @Beta Decay использованием строкового аккумулятора, поскольку lua не имеет байтового типа. Вероятно, можно больше играть в гольф, используя меньше функций.
источник
R 194 байта
ungolfed
источник
<-
можно заменить все=
, уменьшив код на 7 байт. Кроме того, вы можете заменить сериюif
утверждений одним вызовомswitch
(как вA=switch(r,"!"=(A+1)%%2, ...)
)b=readline();A=rep(0,8);s=strsplit(b,"")[[1]];for(r in s)A=switch(r,"!"=(A+1)%%2,">"=c(0,A)[1:length(A)],"<"=c(A,0)[-1],"@"=c(A[5:8],A[1:4]),A);print(sum(A*(2^(7:0))))
получается 167 байтов.RPL, 170,5 байта
Ввод должен быть введен в виде строки на уровне 1.
источник
К, 57 байт
Это начало:
протестировано с использованием Kona:
Я мог бы добиться большего успеха в k5, но это сложная серия компромиссов - например, преобразование двоичного в десятичное так же просто, как и то
2/
, но поведение?
усложняет обработку случая по умолчанию для поиска команд.источник
PHP, 189 байт
Дело не в том, что он побьет много ответов, это только для практики
источник
HPPPL ,
302294 байтаUngolfed:
Этот ответ гарантирует, что HP Prime использует 8-разрядные целые числа без знака, даже если пользователь установил режим, например, 64-разрядный. Если калькулятор настроен вручную на использование 8-разрядных целых чисел без знака, то эту
pragma
команду можно опустить. Если вывод не должен строго следовать формату, тоa*1
в конце может быть простоa
. Умножение результата на 1 просто гарантирует, что вывод не будет следовать за внутренним выводом для целочисленных значений. Командаprint
в строке 4 также может быть опущена, если нет необходимости очищать терминал перед распечаткой результата. Если передача программы в качестве строкового аргумента разрешена, тоINPUT
команда также может быть опущена.Это самая короткая версия с вводом и правильным выводом без аргумента прагмы (если калькулятор по умолчанию установлен в Uint8:
243 байта:
источник
Perl 6,
9689 байтСтарое решение:
источник
C #, 119 байт
Другие версии, которые я пробовал, но нужно больше байтов:
источник
Python 2.7.3, 104 байта
Наличие кода в строках для оценки выглядит довольно грязно, но работает: D
Вот вывод (и ввод на самом деле ..)
И да, он действительно работает на RaspberryPi :)
источник