В прошлый раз, когда я пытался придумать что-то простое, что не было дубликатом, это оказалось слишком сложным ... Так что, надеюсь, на этот раз это действительно то, что новички могут попробовать.
Входные данные:
Массив / список с целыми числами / десятичными числами. (Или строка, представляющая массив с целыми числами / десятичными числами.)
Выход:
Переберите числа и примените следующие пять математических операндов в следующем порядке:
- Дополнение (
+
); - Вычитание (
−
); - Умножение (
*
или×
или·
); - Real / Calculator Division (
/
или÷
); - Возведение в степень (
^
или**
).
(ПРИМЕЧАНИЕ. Символы между круглыми скобками просто добавляются в качестве пояснения. Если ваш язык программирования использует для математической операции совершенно другой символ, чем примеры, то это, конечно, вполне приемлемо.)
Продолжайте, пока не дойдете до конца списка, а затем дайте результат суммы.
Правила соревнований:
- Возведение в степень 0 (
n ^ 0
) должно привести к 1 (это также относится к0 ^ 0 = 1
). - Для деления на 0 (
n / 0
) нет тестовых случаев , поэтому вам не нужно беспокоиться об этом пограничном случае. - Если массив содержит только одно число, мы возвращаем его как результат.
Основные правила:
- Это код-гольф , поэтому выигрывает самый короткий ответ в байтах.
Не позволяйте языкам кода-гольфа отговаривать вас от публикации ответов на языках, не относящихся к кодексу. Попробуйте придумать как можно более короткий ответ для «любого» языка программирования. - К вашему ответу применяются стандартные правила , поэтому вы можете использовать STDIN / STDOUT, функции / метод с правильными параметрами, полные программы. Ваш звонок.
- По умолчанию лазейки запрещены.
- Если возможно, добавьте ссылку с тестом для вашего кода.
Тестовые случаи:
[1,2,3,4,5] -> 0
-> 1 + 2 = 3
-> 3 - 3 = 0
-> 0 * 4 = 0
-> 0 / 5 = 0
[5,12,23,2,4,4,2,6,7] -> 539
-> 5 + 12 = 17
-> 17 - 23 = -6
-> -6 * 2 = -12
-> -12 / 4 = -3
-> -3 ^ 4 = 81
-> 81 + 2 = 83
-> 83 - 6 = 77
-> 77 * 7 -> 539
[-8,50,3,3,-123,4,17,99,13] -> -1055.356...
-> -8 + 50 = 42
-> 42 - 3 = 39
-> 39 * 3 = 117
-> 117 / -123 = -0.9512...
-> -0.9512... ^ 4 = 0.818...
-> 0.818... + 17 = 17.818...
-> 17.818... - 99 -> -81.181...
-> -81.181... * 13 = -1055.356...
[2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2] -> 256
-> 2 + 2 = 4
-> 4 - 2 = 2
-> 2 * 2 = 4
-> 4 / 2 = 2
-> 2 ^ 2 = 4
-> 4 + 2 = 6
-> 6 - 2 = 4
-> 4 * 2 = 8
-> 8 / 2 = 4
-> 4 ^ 2 = 16
-> 16 + 2 = 18
-> 18 - 2 = 16
-> 16 * 2 = 32
-> 32 / 2 = 16
-> 16 ^ 2 = 256
[1,0,1,0,1,0] -> 1
-> 1 + 0 = 1
-> 1 - 1 = 0
-> 0 * 0 = 0
-> 0 / 1 = 0
-> 0 ^ 0 = 1
[-9,-8,-1] -> -16
-> -9 + -8 = -17
-> -17 - -1 = -16
[0,-3] -> -3
-> 0 + -3 = -3
[-99] -> -99
источник
n ^ 0 = 1
но0 ^ n = 0
. Конфликт разрешается путем установкиn != 0
обоих правил, но затем он остается0 ^ 0
неопределенным. Однако в математике есть много вещей, которые хорошо подходят для математики, если0 ^ 0
она определена1
. Посмотрите Википедию для некоторых деталей.Ответы:
Желе , 13 байт
Попробуйте онлайн! или проверьте все контрольные примеры .
Как это работает
источник
Javascript ES7 49 байтов
Сохранено 9 байтов благодаря Dom Hastings, сохранено еще 6 благодаря Leaky Nun
Использует новый оператор возведения в степень.
источник
Infinity
, а не ошибка?Haskell,
76656462 байтаСпасибо @Damien за удаление еще двух байтов =)
Это использует,
>>
который здесь просто добавляет список[(+),...]
к себеlength v
раз. Остальное все еще работает так же, как старые версии.Старые версии:
Эти решения используют бесконечные списки, так как
cycle[...]
просто повторяют данный список бесконечно. Затем он в основном редактируетсяzip
со списком чисел, и мы простоfold
( сокращаем на других языках) сжатый список через лямбду, который применяет операторы к элементу аккумулятора / текущего списка.источник
foldl(&)u$zipWith(&)v(flip<$>v>>[…])
?import
for&
, так что это снова будет дольше, но все равно спасибо!uncurry
. Не сработало, но я заметил, что вы должны быть в состоянии сохранить другой байт, используя$
вместо скобок.Пайк,
2221 байтПопробуй это здесь!
источник
Haskell, 61 байт
Создает серию преобразований в списке, как в [сложить 1, сложить 2, вычесть 3, ...], начиная с 2 сложений, потому что мы начинаем с 0 в сгибе. Далее мы делаем то, что я называю сложением списка приложений, или foldl (flip id), который применяет список гомоморфизмов в серии. Это начинается с нуля, добавляет начальное значение, затем выполняет все вышеуказанные преобразования, чтобы получить окончательный результат.
Обратите внимание, что (flip id) такой же, как (\ x y-> yx), только короче.
Пример использования:
источник
flip id
вы можете просто использовать&
. Илиflip($)
. Вау, я так и не понял($) = id
&
определено вData.Function
, так что вамimport
тоже нужно . Может быть, какой-то онлайн-переводчик импортирует его по умолчанию, но тогда вам нужно указать, какой из них вы используете.TSQL
11611588 байтБлагодаря предложению Росса Прессера я смог сыграть в гольф до 88 символов
Попробуйте онлайн
источник
Pyth,
272625 байтТестирование.
Pyth использует префиксную нотацию:
1+2
записывается как+1 2
(пространство, необходимое для разделения чисел).Поэтому для первого тестового примера выражение будет таким
(((1+2)-3)*4)/5
, которое в префиксной записи будет записано как/*-+ 1 2 3 4 5
.В Pyth
c
вместо деления делится поплавок/
, поэтому он становитсяc*-+ 1 2 3 4 5
.Также в Pyth
-100
написано как_100
вместо.Таким образом, для третьего случая испытания, которое
((((((((-8+50)-3)*3)/-123)^4)+17)-99)*13)
, она становится:*-+^c*-+ _8 50 3 3 _123 4 17 99 13
.история
v:P+*lQ\(ssV+R\)Q*"+-*/p"lQ\p"**"
.vs+_XUtQUQ"+-*c^"m:+;d\-\_
.vs+_XUtQUQ"+-*c^":jdQ\-\_
источник
На самом деле, 23 байта
Попробуйте онлайн!
На самом деле используется постфиксная нотация для математики, и операторы, которые когда-либо принимают только два аргумента (например, операторы сложения, вычитания, умножения, деления и возведения в степень), ничего не делают, когда в стеке только один элемент. Таким образом, преобразование ввода в код на самом деле так же просто, как изменение ввода, форматирование его в виде чисел и добавление операций. Затем результирующий код может быть выполнен, давая желаемый результат.
Объяснение:
Пример переведенного кода для ввода
1,2,3,4,5
:источник
s/Actually uses postfix notation/Actually actually uses postfix notation/
Юлия,
5350 байтПопробуйте онлайн!
источник
J, 40 байт
Находит количество значений, необходимых для использования кратных 5 операторам, чем площадок со значениями идентичности этих операторов. По порядку
+
: 0,-
0,*
1, 1,%
1 и^
1, что может быть битовым значением00111
, или 7 в базе 10. Затем работает с этим списком при циклическом переключении между операторами.использование
объяснение
источник
Python 2,
816764 байтаВвод представляет собой массив с плавающей точкой. Проверьте это на Ideone .
Как это работает
'*+-*/*'[i::5]
выбирает каждый пятый символ строки, начиная с символа с индексом i , поэтому это дает,**
если i = 0 ,+
если i = 1 ,-
если i = 2 ,*
если i = 3 и/
если i = 4 . Поскольку строка имеет длину 6 , выражение даст пустую строку, если i> 5 .Мы инициализируем переменную i до 10 . Для каждого числа n во входном массиве мы строим строку
r<op>=n
, котораяexec
выполняется.Первоначально, i = 10 , поэтому
<op>
пустая строка, и он инициализирует r сr+=n
. После каждого шага мы увеличиваем i по модулю 5 сi=-~i%5
, так что следующий шаг будет извлечь правильный оператор.Когда все входные числа были обработаны, и мы печатаем r , который содержит желаемый результат.
источник
Матлаб -
95 9185 байт / октава - 81 байтВвод в такой форме:
a = ['1' '2' '3' '4' '5'];
я надеюсь, что это покрыто "строкой, представляющей массив с целыми числами / десятичными числами", иначе дополнительно требуется 2 num2str.Каждый промежуточный результат выводится на консоль, потому что это экономит мне несколько точек с запятой.
a(1)
выполняется, поэтому его значение затем сохраняется вans
. Также, конечно, использованиеans
в коде - плохая практика.В Octave
'+-*/^'(mod(i+2,5)+1)
также работает, что экономит еще 4 байта, спасибо Адаму и Луису Мендо:Changelog:
источник
b = '+-*/^'
быть golfed кb='+-*/^'
иfor i = 2:length(a)
кfor i=2:length(a)
(удаление пробелов)? Также, возможно, вам будут интересны Советы по игре в гольф в MATLAB . :)'+-*/^'(mod(i+2,5)+1)
действительным?Mathematica,
676665 байтПростой
Fold
с переменной,i
содержащей индекс.источник
+##
вместо#+#2
CJam, 18 байт
Ввод представляет собой массив с плавающей точкой. Попробуйте онлайн!
Как это работает
источник
R ,
87 7870 байтПопробуйте онлайн!
источник
do.call
... Я, вероятно, не должен считать себя программистом R, пока не пойду!Advanced R
от Hadley Wickam - отличный пляж для чтения :)do.call
- заставил меня понять, что я искалget
.Haskell - 74
Тестовые случаи:
Возможно, это может быть короче; Однако поддержка Хаскеллом бесконечных списков и функций более высокого порядка делает прямое решение довольно приятным. Версия
^ :: Double -> Double -> Double
была бы лучше для игры в гольф, но я не мог найти ее. К счастью, мне не нужна была полная лямбда, поэтому бессмысленный стиль сбрил несколько байтов.источник
(+)
к списку операторов и начатьfoldl
с0
идти полностью pointfree и сохранить имя функции и параметры:foldl(\x(o,y)->o x y)0.zip((+):cycle[(+),(-),(*),(/),(**)])
.PowerShell v2 +, 124 байта
Долго, потому что PowerShell не имеет оператора
^
или**
, поэтому мы должны учитывать отдельный случай и использовать вызов .NET.Принимает ввод
$n
в виде массива, устанавливает наш вывод$o
в качестве первой цифры. Затем мы проверяем.count
массив, и до тех пор, пока он больше единицы, мы входим вif
. В противном случае мы пропускаемif
.Внутри
if
мы перебираем массив1..$y|%{...}
и каждую итерацию мы сбрасываем$o
на новое значение, результат другогоif/else
оператора. Пока наш счетчик$i++
не равен по модулю 5 4 (т. Е. Мы не в^
операторе), мы просто берем$o
и объединяем его с соответствующим символом'+-*/'[$x]
и следующим числом во входном массиве$n[$_]
. Мы передаем это вiex
(псевдоним дляInvoke-Expression
и аналогичноeval
), и это снова сохраняется в$o
. Если мы находимся на^
операторе, мы находимся вelse
, поэтому мы выполняем[math]::Pow()
вызов, и этот результат снова сохраняется в$o
.В любом случае мы просто выводим данные
$o
в конвейер и выходим с неявным выводом.источник
Ржавчина,
123, 117 байтОригинальный ответ:
глупые длинные имена методов ^^ ааа, намного лучше
ungolfed
источник
Perl 6 ,
70 68 6562 байтаОбъяснение:
Технически
* + *
это лямбда-бы то ни было, но фактически она такая же, как&[+]
и сокращение для&infix:<+>
набора подпрограмм, которые обрабатывают добавление чисел в инфикс.Я не использовал это для умножения или возведения в степень, поскольку способы написать их таким образом, по крайней мере, столько, сколько у меня есть (
*×*
или* * *
и* ** *
)Тест:
Протестируйте его на ideone.com
(после того, как они обновятся до версии Rakudo, то есть за полтора года до официального выпуска спецификаций Perl 6 )
источник
Python 3,
8893 байтаСначала все было намного короче, но затем победил оператор, и мне пришлось добавить много скобок ...
источник
Oracle PL / SQL,
275254 байтаДанные должны быть вставлены в таблицу с именем
T
столбцаN
типаNUMBER
Использование:
Выход:
275 байт версия:
источник
Ява 8,
173172167138137118113 байтовОбъяснение:
Попробуй это здесь.
источник
double r=a[0];
чтобыdouble r=a[0],b;
сохранить некоторые байты.float
, но нетMath.pow
для поплавков, следовательно,double
вместо. Спасибо за,b
. И сi++<a.length
я получаю ArrayOutOfBoundsException вb=a[i];
(если я не делаюi++<a.length-1
вместо этого, который на один байт больше, чем короче).== 4
на> 3
и== 0
на< 1
. Я не уверен, но я думаю, что вы могли бы немного сэкономить, создав переменную дляi % 5
.<x
хитрость, сократив всю функцию до 137 символов.Несколько трюков могут уменьшить подход @ Willmore's на 23–174 байта (требуется php 5.6 или более поздняя версия). Самая экономящая часть - это удаление ненужных скобок (-10 байт).
Но использование
**
оператора вместоpow()
также позволяет использоватьeval
с массивом для операций; и еще с несколькими трюками ...PHP> = 5,6, 82 байта
берет список из параметров командной строки. Запустите
php -nr '<code>'
или попробуйте онлайн .старая версия,
161 157 151 145 144 140 137117 байтНаиболее эффективная игра в гольф пришла от записи промежуточного результата непосредственно к первому элементу - после смещения предыдущего результата из массива.
сломать
тестирование
источник
If the array contains just a single number, we return that as the result.
довольно ясно. Но спасибо, что позволили мне вернуться к этому.PHP ,
135130 байтСпасибо @titus, -5 байт, плюс 0 исправлений!
Попробуйте онлайн!
Меньше гольфа
Был действительно болтать за array_reduce (), чтобы работать для этого, но требует слишком много символов, чтобы побить текущий самый низкий счет PHP.
Размещение в любом случае, если у кого-то есть предложения!
источник
$c
попадет0
. Сохраните два байта с анонимной функцией вместоw
.eval('$c'.['/','**','+','-','*'][$i++?$i%5:5].'=$x');return$c;
на шесть байтов короче и должен решить нулевую проблему.Брахилог , 68 байт
Это долго ... но не использует предикат оценки.
объяснение
Главный предикат
Предикат 1
источник
IBM PC 8087 FPU,
6682 байтаДля вычислений используется только математический сопроцессор Intel 8087 IBM PC.
Попробуйте это в автономном режиме! (в DOSBox или что-то еще). Дайте что-нибудь делать скучающему чипу 8087 вашего старого компьютера, кроме всех тех таблиц Lotus 1-2-3, которые вы использовали в 80-х годах.
Ungolfed (в разобранном виде):
Выход:
Ввод осуществляется через PROC (x86, наиболее эквивалентный функции), причем BX - это указатель на массив WORD в памяти, а CX - количество элементов в нем и возвращает результат в ST.
* Примечание: фактический код функции
6682 байта. Конечно, код для записи числа с плавающей запятой на консоль (код поваренной книги) составляет 83 байта. Программа тестирования и данные183215 байт, что делает исполняемый файл .COM305Всего 380 байт.источник
APL (Dyalog Unicode) ,
2927 байтов SBCSФункция аномального молчаливого префикса. Обратите внимание, что
*
это возведение в степень в APL.Попробуйте онлайн!
Поскольку APL выполняется справа налево, мы можем просто изменить порядок аргументов вставленных операций и полностью изменить выражение. Postfix
⍨
меняет аргументы. После идеального перемешивания чисел и операций нам просто нужно повернуть вспять, сгладить и оценить:≢{
…}⊢
Вызвать следующую функцию с количеством и фактическими числами как⍺
и⍵
:'⍨'
этот персонаж'+-×÷*',¨
добавьте к этому каждый из этих символов;["+⍨","-⍨","×⍨","÷⍨","*⍨"]
⍺⍴
использовать левый аргумент (кол - во номеров) циклически г eshape , что⌽
обратный⍕
форматировать как плоскую строку3↓
опустить ведущие 3 символа (пробел и символ и⍨
)⍎
выполнить как код APLисточник
Japt , 16 байт
Попробуйте онлайн!
Объяснение:
источник
c #,
238, 202 байтаЯ не видел никакого решения C #, поэтому я дам его. Это мой первый Codegolf. Я начал писать на c # «два месяца назад» (хотя я знаю Java до некоторой степени).
Он использует стек
Ungolfed и тестовые случаи
Выход:
источник
a, Double.Parse
->a,Double.Parse
;while (s.Count
->while(s.Count
;Pow(l, r)
->Pow(l,r)
). Кроме того, вы можете удалитьint
передj=
и положить его заint i=0,j;
. Отличный первый ответ, и еще раз добро пожаловать. :)PHP,
206,198, 197 байтUngolfed
В PHP логика похожа на мою с # ответ ( 202 байта ) :).
источник