Реализовать простой целочисленный оператор сценариев калькулятора.
концепция
Аккумулятор начинается с 0 и на нем выполняются операции. В конце программы выведите значение аккумулятора.
Операции:
+
добавляет1
к аккумулятору-
вычитает1
из аккумулятора*
умножает аккумулятор на2
/
делит аккумулятор на2
Пример сценария
Вход ++**--/
должен дать выход 3
.
Пример реализации
def calc(s)
i = 0
s.chars.each do |o|
case o
when '+'
i += 1
when '-'
i -= 1
when '*'
i *= 2
when '/'
i /= 2
end
end
return i
end
правила
- Это код-гольф , поэтому младший ответ в байтах выигрывает, но не выбирается.
- Творческие реализации приветствуются.
- Стандартные лазейки запрещены.
- Вы получаете программу через стандартный ввод или аргументы и можете вывести ответ через возвращаемое значение или стандартный вывод.
- Повеселись.
- Деление сокращается, потому что это целочисленное деление.
- Программа
-/
возвращается-1
.
Контрольные примеры
*///*-*+-+
-1
/*+/*+++/*///*/+-+//*+-+-/----*-*-+++*+**+/*--///+*-/+//*//-+++--++/-**--/+--/*-/+*//*+-*-*/*+*+/+*-
-17
+++-+--/-*/---++/-+*-//+/++-*--+*+/*/*/++--++-+//++--*/***-*+++--+-*//-*/+*/+-*++**+--*/*//-*--**-/-*+**-/*-**/*+*-*/--+/+/+//-+*/---///+**////-*//+-+-/+--/**///*+//+++/+*++**++//**+**+-*/+/*/*++-/+**+--+*++++/-*-/*+--/++*/-++/-**++++/-/+/--*/-/+---**//*///-//*+-*----+//--/-/+*/-+++-+*-*+*+-/-//*-//+/*-+//+/+/*-/-/+//+**/-****/-**-//+/+-+/*-+*++*/-/++*/-//*--+*--/-+-+/+/**/-***+/-/++-++*+*-+*+*-+-//+/-++*+/*//*-+/+*/-+/-/*/-/-+*+**/*//*+/+---+*+++*+/+-**/-+-/+*---/-*+/-++*//*/-+-*+--**/-////*/--/*--//-**/*++*+/*+/-+/--**/*-+*+/+-*+*+--*///+-++/+//+*/-+/**--//*/+++/*+*////+-*-//--*+/*/-+**/*//+*+-//+--+*-+/-**-*/+//*+---*+//*/+**/*--/--+/*-*+*++--*+//+*+-++--+-*-*-+--**+/+*-/+*+-/---+-*+-+-/++/+*///*/*-+-*//-+-++/++/*/-++/**--+-////-//+/*//+**/*+-+/+/+///*+*///*-/+/*/-//-*-**//-/-+--+/-*--+-++**++//*--/*++--*-/-///-+/+//--+*//-**-/*-*/+*/-*-*//--++*//-*/++//+/-++-+-*/*-+++**-/-*++++**+-+++-+-***-+//+-/**-+/*+****-*+++*/-*-/***/-/*+/*****++*+/-/-**-+-*-*-++**/*+-/*-+*++-/+/-++*-/*-****-*
18773342
code-golf
math
number
arithmetic
dkudriavtsev
источник
источник
/
может давать нецелые числа.-/
вернуться?Ответы:
Python 2, 48 байт
Имеет ли
+2
,-2
,*2
или/2
. Делая+2
и-2
вместо+1
и-1
, мы работаем в двойных единицах, поэтому конечный результат нужно уменьшить вдвое. За исключением того, что разделение по этажам/
теперь должно округляться до кратного 2, что делается с помощью&-2
.источник
0q{2\~-2&}/2/
(2\~
обнуляет оператор со вторым операндом2
,-2&
является побитовым AND,2/
является окончательным делением на два.q{...}/
Является foreach над входом и0
является только начальным значение.)Haskell, 51 байт
Пример использования:
foldl(#)0 $ "++**--/"
->3
.источник
Желе ,
1817 байтПопробуйте онлайн!
Как это работает
Первые шесть строк определяют вспомогательные ссылки с индексами в диапазоне от 1 до 6 ; они увеличивают, ничего не делают, уменьшают, ничего не делают, делят пополам (настил) и удваивают.
Основная ссылка -
O0;ṛĿ/
преобразует входные символы в их кодовые точки (O
), добавляет 0 (начальное значение) к массиву кодовых точек0;
, а затем уменьшает сгенерированный массив следующим образом.Начальным значением является первый элемент массива, т. Е. Предваряемый 0 . Быстрая ссылка
ṛĿ
вызывается для каждого следующего элемента в массиве с последним возвращаемым значением в качестве левого аргумента и текущим элементом в качестве правого. Он проверяет свой правильный аргумент (ṛ
) и монадически оценивает связь с этим индексом (Ŀ
), применяя, таким образом, требуемую операцию.источник
Python 2, 54 байта
Ввод принимается как строковый литерал.
~ord(c)%5%3
сопоставляет операторы с соответствующими правыми операндами.Ранее я использовал,
hash(c)%55%3
который не дал согласованных результатов между различными версиями Python. Это побудило меня изучить другие формулы.источник
hash
зависит от версии Python - Ideone использует 2.7.10, который дает[1, 1, 2, 2]
в качестве четырех отображений, тогда как локально на 2.7.12 я получаю[2, 0, 1, 0]
SILOS ,
133211 байтПринимает ASCII коды операторов.
Попробуйте онлайн с тестовыми примерами:
-/
++**--/
*///*-*+-+
источник
-/
должен вернуть -1 , а не 0 .Машина Тьюринга - 23 состояния (684 байта)
Попробуйте здесь - постоянная ссылка
Входные данные не должны содержать никаких «*», так как это специальный символ в машинном коде Тьюринга. Вместо этого используйте «х». Выводит ответ в двоичном виде.
Необъяснимый код
Объяснение состояний:
Инициализация:
эти состояния посещаются один раз в начале каждого запуска, начиная с init2
Чтение инструкций:
эти состояния будут посещаться несколько раз по всей программе
readop: полностью перемещается вправо, пока не будет прочитан оператор или символ «.». Если он попадает в оператор, перейдите в соответствующее состояние (+, -, x, /). Если он попадает в «.», Измените на «fin».
return: возвращает голову в пустое пространство между промежуточной суммой и операторами. Затем меняется на «readop».
Шеф:
эти операции делают грязную работу
+: Двигаться влево до тех пор, пока голова не прочитает любой непробельный символ. Если этот символ - «-», переместитесь влево и измените на «dec». В противном случае измените на «inc».
-: Аналогично «+», за исключением того, что изменяется на «inc», если есть «-» и «dec» в противном случае.
inc: Если цифра под заголовком - 0 (или пробел), измените ее на 1 и измените на «ноль». Если цифра равна 1, измените ее на 0, затем повторите следующую цифру.
dec: аналогично inc, за исключением того, что 1 переходит в 0, 0 переходит в 1, а если заголовок считывает пробел, изменится на 'neg'.
x, x0, x1: сдвиг влево на номер один. Изменить на «возврат».
/, //, div, div0, div1: переместиться полностью вправо от числа, затем сдвинуть бит на единицу вправо. Если есть «-», измените на «inc». Это моделирует округление отрицательных чисел. В противном случае, изменить на «ноль»
neg: поместите «-» после числа, затем измените на «readop»
ноль, ноль1, ноль2: удалить ведущие нули и изменить на «readop»
Очистка: делает вывод презентабельным
источник
Perl 6 ,
5352 байтаОбъяснение:
Использование:
источник
C
636257 байтWandbox
источник
05AB1E , 20 байтов
Спасибо Enigma за исправление
-/
ошибки!Для 16 байт , если это не было целое деление:
Î"+-*/""><·;"‡.V
.Объяснение:
Использует кодировку CP-1252 . Попробуйте онлайн!
источник
-/
должен вернуть -1 , а не 0 .Î…+-*"><·"‡'/"2÷":.V
тем же количеством байтов.JavaScript ES6,
8068 байтБлагодаря Нилу удалось сэкономить 12 байтов!
источник
"c"+
и написали"c+1 c-1 c*2 c/2|0".split
и т. Д.o=>c=[c+1,c-1,c*2,c/2|0]["+-*/".indexOf(o)]
, или я думаю, что вы можете затем продолжить, используя еще один байтo=>c={"+":c+1,"-":c-1,"*":c*2,"/":c/2|0}[o]
.k=>[...k].reduce((c,o)=>+{"+":c+1,"-":c-1,"*":c*2,"/":c/2|0}[o],0)
может получиться еще короче, но я потерял счет ...}
и[o]
, так что на самом деле это всего лишь 66 байтов. Также ОП уточнил;-/
должен вернуть -1 , а не 0 .Рубин,
484442 + 1 = 43 байта+1 байт за
-n
флаг. Принимает участие в STDIN.Посмотрите его на ideone (использует,
$_
так как ideone не принимает флаги командной строки): http://ideone.com/3udQ3Hисточник
PHP 76 байт
источник
Python 2,
5856 байт-2 байта благодаря @Lynn
Ординалы персонажей
+-*/
являются по43,45,42,47
модулю 11 это по10,1,9,3
модулю 3 те1,1,0,0
, 2 меньше тех , которые1,1,2,2
дают суммы нам нужно для каждой операции:r=r+1
,r=r-1
,r=r*2
, иr=r/2
Предыдущая:
источник
2-ord(c)%11%3
?Mathematica,
837370 байт10 байтов сохранено благодаря @MartinEnder .
Анонимная функция. Принимает список символов в качестве ввода и возвращает число в качестве вывода. Предложения по игре в гольф приветствуются.
источник
SILOS ,
175164 байтаПопробуйте онлайн!
Вменяемый метод ввода. Правильное целочисленное деление (округление к бесконечности).
источник
C #,
8781 байтUngolfed:
Предполагается, что ввод действителен. Деление на два выполняется путем сдвига вправо на один бит, потому что обычное деление всегда округляется до нуля, а сдвиг битов всегда округляется вниз. Для увеличения и уменьшения удобно использовать расстояние 1 между кодами ASCII для
+
и-
.источник
int f(string s)=>s.Aggregate(0,(i,c)=>c<43?i*2:c<46?i+44-c:i>>1);
(65 байт)Javascript (ES6), 57 байт (массив) / 60 байт (целое число)
Возвращает массив всех промежуточных результатов:
Например, вывод для
"++**--/"
будет[1, 2, 4, 8, 7, 6, 3]
.Возвращает только окончательный результат:
Как это работает
Оба решения основаны на ту же идею: с помощью совершенной хэш - функции
eval(2+c+3)&3
для отображения различных символов оператораc
в[0, 3]
.источник
JavaScript (ES6), 57
Примечание: начальным значением для аккумулятора является строка программы, с помощью битовых операций (~, >>, <<, |) она преобразуется в 0 при первом использовании.
Как примечание, умный ответ @xnor оценил бы 40, портированных на javascript:
(если вам это нравится, проголосуйте за него)
Тест
источник
Java, 77 байт
Использует Java 8 потоков.
источник
r >> 1
наr>>1
и сохранить 2 байта?s->s.chars().reduce(0,(r,c)->c<43?r*2:c<46?r+44-c:r>>1);
которая даст вам 56 байтGNU sed,
655957 байтИзменить: 2 байта короче благодаря комментариям Тоби Спейт
Бег:
Выход:
sed
Сценарий подготавливает вход дляdc
вызова оболочки в конце концов, последний прием вход в обратной польской записи . При делении, если число отрицательное (d0>
), вызывается команда[1-]
уменьшения, сохраненная в регистре@
. Пример конвертации:+ - * /
->1+ 1- 2* d0>@2/
.источник
[1-]
шаблону ...s
сS
. Я забыл, что он не заменяет стек реестра, он выдвигает на него, оказывая противоположный эффект от того, что я хотел (так как я использовал его для каждого/
). Кавычки все еще нужны, потому что у вас есть/
символы, которые делают строку интерпретированной как путь к файлу :) Я побрил еще 1 байт, удалив пробел после-e
.-e
как имя файла, поэтому вам не нужны кавычки для/
- попробуйте! Я думаю, что для кода-гольфа разумно требовать, чтобы текущий рабочий каталог не содержал никаких файлов, начинающихся с01s@
или0-s@
.-e
отношении/
, однако цитаты все еще необходимы, как я только что видел.>
Интерпретируется непосредственно оболочки в качестве оператора перенаправления Я думаю , что , так как я получил эту ошибку:cannot create @2/d0: Directory nonexistent
>
. Вам нужны цитаты, в конце концов. Извинения за (попытку) ввести в заблуждение! И хотя добавление обратной косой черты выглядит как один символ, его необходимо удвоить вs///
замене, так что никакой пользы нет ...PHP, 75 байт
Здесь используется модифицированная версия ответа Йорг Хюльсерманн .
Он сильно зависит от подстановки строк, используя простое регулярное выражение (
~.~
).Переменной
$s
присваивается новое значение для каждого символа. В конце он выводит результат.Примечание : это должно быть выполнено с использованием
-r
флага.Попробуйте это здесь:
Показать фрагмент кода
Или попробуйте: http://sandbox.onlinephpfunctions.com/code/7d2adc2a500268c011222d8d953d9b837f2312aa
Отличия:
echo$s
я используюsprintf($s)
. Оба выполняют одно и то же действие с числами. Так как это только для тестирования, это нормально.++*+
в качестве первого аргумента, который должен отображаться5
.источник
e
Модификатор возвращается! : De
, который был заменен наpreg_replace_callback
и мог быть использован для злоупотребления ... но это не совсем так.Пакет, 61 байт
Перевод @ xnor's xcellent Python ответа.
источник
Пайк,
2422 байтаПопробуй это здесь!
Или 12 байт (неконкурентоспособных)
Попробуй это здесь!
Добавить
translate
узел - в основном несколько найти и заменить.источник
PHP,
10410282 байтаПервая версия с eval:
Вторая версия с троичными операторами:
Принимает входную строку в качестве первого аргумента из командной строки.
Это «только» работает для строк ввода короче 10 000 символов - и этого должно быть достаточно. Протестировано со всеми тестами, к сожалению, не может сэкономить на инициализации в начале.Вторая версия работает со строками любой длины и без инициализации. :-)Основным элементом является функция eval, которая управляет
$i
на основе карты арифметических операций, которые довольно просты, за исключением деления. PHP возвращает число с плавающей запятой при использовании/
иintdiv
слишком много байтов, поэтому мы делаем сдвиг вправо .Обновления
$i=$i>>1
до$i>>=1
целочисленного деления.источник
Python 3,
986660 байтСпасибо Tukkax!
Не так хорошо, как в другом ответе, но я не могу соревноваться с ними без плагиата.
Кроме того, у меня есть рекурсивное лямбда-решение, а также
7367 байт (улучшено!)источник
i=0 for c in input():i+=[1,-i//2,-1,i][ord(c)%23%4] print(i)
. (не правильно отформатирован, конечно). Также я думаю, что вы должны упомянуть, что вы используете Python3. В Python2input()
оценил быint(raw_input())
.+-
делает 1)R, 201 байт
Golfed
комментарии
Стратегия заключается в уточнении
+, -, %
операторов. Разделите строку, а затем проанализируйте строку в длинный список функций, которые будут поданы вReduce()'s
аккумулятор.Больше не мог играть в гольф. Если кто-то может приступить
b=body<-
к работе, можно сэкономить несколько байтов (уточните каждую функцию с помощьюb
after"-"="+"="/"="*"
). Первоначально пытался заменить и разобрать eval, но порядок операций и скобки были ужасающими.источник
f, ...
в определенииReduce
функции и избавиться отstdin()
в ,scan
но я просто попытался наивным подход, который отбросил еще два байта, определяя функции немного по-другому. tio.run/##XcvLCsMgEAXQrwnO6Gge29B/…Lex + C,
78,74, 73 байтаПервый символ - это пробел.
Читает из
stdin
, возвращает результат.Скомпилировать с
lex golfed.l && cc lex.yy.c main.c -lm -lfl
, проверить основной:источник
Javascript (ES5), 127 байт
Ungolfed:
источник
Pyth, 23 байта
Полная программа, которая принимает входные данные в виде строки и печатает результат.
Это порт ответа @ xnor на Python .
Попробуйте онлайн
Как это работает
источник
u@[yGhG0tG0/G2)CHQ0
19 байтовPHP, 79 байт
источник
1
; вам нужно разделить и умножить на2