Вдохновленный этим
В связанном задании нас просят применить дополнение к элементам оригинала и обратное к входному массиву. В этом задании мы немного усложним его, введя другие основные математические операции.
Получив массив целых чисел, переберите +, *, -, //, %, ^
, где //
есть целочисленное деление и ^
экспонента, применяя его к обратной части массива. Или, другими словами, примените одну из вышеперечисленных функций к каждому элементу массива, причем второй аргумент является обратным к массиву, а функция применяется для циклического перемещения по приведенному выше списку. Это все еще может сбивать с толку, поэтому давайте рассмотрим пример.
Input: [1, 2, 3, 4, 5, 6, 7, 8, 9]
Reverse: [9, 8, 7, 6, 5, 4, 3, 2, 1]
[ 1, 2, 3, 4, 5, 6, 7, 8, 9]
Operand: + * - / % ^ + * -
[ 9, 8, 7, 6, 5, 4, 3, 2, 1]
Result: [10, 16, -4, 0, 0, 1296, 10, 16, 8]
поэтому вывод для [1, 2, 3, 4, 5, 6, 7, 8, 9]
будет[10, 16, -4, 0, 0, 1296, 10, 16, 8]
Чтобы охватить угловые случаи, ввод никогда не будет содержать 0, но может содержать любое другое целое число в диапазоне от отрицательной бесконечности до положительной бесконечности. Вы можете принять ввод как список строк, представляющих цифры, если хотите.
Контрольные примеры
input => output
[1, 2, 3, 4, 5, 6, 7, 8, 9] => [10, 16, -4, 0, 0, 1296, 10, 16, 8]
[5, 3, 6, 1, 1] => [6, 3, 0, 0, 1]
[2, 1, 8] => [10, 1, 6]
[11, 4, -17, 15, 2, 361, 5, 28] => [39, 20, -378, 7, 2, 3.32948887119979e-44, 9, 308]
Это код-гольф, поэтому выигрывает самый короткий код (в байтах)!
источник
Ответы:
Желе, 10 байт ( вилка )
Я только что работал над внедрением быстрого для этого на днях, так что довольно удивительно увидеть его применение так скоро. Он по-прежнему существует только как форк, поэтому вы не можете попробовать его онлайн.
Образец вывода
объяснение
источник
ƭ
поддержку nilads (заменить значение) и monad (применить к левому аргументу)2 1”q3ƭ€
на[7,4,9,0]
возвраты[2, 1, 'q', 2]
Шелуха , 16 байт
Эта задача благоприятствует языкам, которые могут создавать бесконечные списки функций.Возможно нет,eval
FTWПопробуйте онлайн!
Как?
Альтернативное 17-байтовое решение:
источник
ë+*-÷%^
? Зачем делатьe
необходимое?ë
принимает 4 аргумента,e
принимает 2. 2 аргумента не существует05AB1E , 18 байт
Попробуйте онлайн!
объяснение
источник
Ig∍
если вы хотите использовать команду "newish" (здесь не очень много∍
).Утилиты Bash + GNU, 53
Этот скрипт принимает имя файла в качестве параметра командной строки.
Попробуйте онлайн .
Приятно то, что здесь можно
paste -d
указать список разделителей, которые используются циклически. Остальное это просто получение ввода в правильном формате, чтобы сделать это.источник
Желе , 15 байт
Попробуйте онлайн! или посмотрите набор тестов .
Как?
источник
ż“+×_:%*”;"ṚV
ż“+×_:%*”ṁ$;"ṚV
что также составляет 15 байтов.Python 2 , 67 байт
-3 байта благодаря овс.
Попробуйте онлайн!
Python 2 , 95 байт
Попробуйте онлайн!
eval
это зло ... но, возможно, больше в гольфе. :Писточник
JavaScript (ES7),
6867 байтПоказать фрагмент кода
источник
o
внутри скобок,.pop()
чтобы сэкономить несколько байтов.o
также используется как условие троичного оператора. Это сломало бы эту схему.Perl 6 ,
6766 байтСохранено 1 байт благодаря @nwellnhof.
Попробуйте онлайн!
Очень невообразимое (и, вероятно, плохое) решение. Zips аргумент с собой поменялся местами. Полученный список затем сопоставляется с блоком, в котором
EVAL
находится строкаa (operator) b
. Оператор выбирается из списка строк,<+ * - div % **>
используя переменную freestate
(например,static
C - значение сохраняется в вызовах блока)$
. Он создается для каждого блока в отдельности и устанавливается на 0. Вы можете делать с ним все, что вам нравится, но вы можете ссылаться на него только один раз ($
фактически, каждый случай обращения к другой переменной). Так$++%6
что на самом деле это 0 во время первого звонка, 1 во время второго, ... 5 во время 6-го, 0 во время 7-го и так далее.Я сначала пытался обойтись без
EVAL
. Операторы на самом деле просто подпрограммы (= функции), но их имена настолько ужасны (&infix:<+>
и так далее), что мне пришлось отказаться от такого подхода.источник
map {EVAL ".[0] ... .[1]"},zip $_,.reverse
на 1 байт короче.Haskell ,
74117105 байтПопробуйте онлайн!
Сохранено 12 байт благодаря @nimi
Конечно, есть лучший способ добиться этого.
РЕДАКТИРОВАТЬ 1. Исправлена экспонента для целых чисел; 2. Определенно есть лучший способ, см. Комментарий ниже:
9591 байтПопробуйте онлайн!
источник
zipWith3($)(cycle[(+),(*),(-),div,mod,(^)])<*>reverse
Короче, сейчас удалена твоя версия.h
в вызовеo
:o a b
и без этого вы можете встроитьh
( TIO ).Python 2 , 71 байт
Попробуйте онлайн!
Сохранено 2 байта благодаря ovs!
источник
J,
4442 байтаВычеркнул 44, Яда Яда ...
-2 байта благодаря @ ConorO'Brien
Попробуйте онлайн!
Так много паренов и вставок ... Конечно, есть лучший способ сделать это (возможно, используя вставку, а не инфикс?)
объяснение
Некоторые заметки:
У J нет целочисленного деления, поэтому мы составляем-
%
деление с>.
-floor. J's mod (|
) выполняет порядок, обратный тому, что мы ожидали, поэтому мы должны инвертировать его порядок с помощью~
-reflexive.Несмотря на то, что мы перемещаемся с интервалами в 2, мы должны использовать
/
-insert, чтобы вставить глаголы, чтобы их можно было использовать двоично, поскольку именно\
так работает -infix.источник
()
и повторить/
- я не смог понять это .../
обращенного массива (так как он работает в обратном направлении ...) с глаголами вроде,(,+)`(,*)
но это не очень помогает ... (также это не работает)+/`(*/)`...
Рубин ,
6357 байтНичего особенного, правда. Просто выполните итерацию по массиву, используйте индекс в качестве обратного итератора, объедините строку, используя правильный оператор, оцените, промойте и повторите.
Попробуйте онлайн!
источник
к , 40 байт
Попробуйте онлайн!
источник
MATL ,
2723 байта-4 байта благодаря @LuisMendo
Попробуйте онлайн!
Объяснение:
источник
Perl 5 , 68 + 1 (-p) = 69 байт
Попробуйте онлайн!
Вводит как разделенный пробелами список чисел.
источник
R , 74 байта
Попробуйте онлайн!
Это последний ответ, который я придумал. Возвращает список длины,
length(l)
где каждый элемент является списком, содержащим соответствующий элемент. Вроде дерьмо, но они все там. Если это неприемлемо, любой из нихMap
может быть замененmapply
на +3 байта.Поскольку все операторы R являются функциями (инфиксная нотация просто синтаксический сахар), я попытался выбрать один из списка; например, решение 94 байтов ниже.
Чтобы попытаться избавиться от цикла, я пытался
sapply
, но это работает только с одной функцией и списком ввода. Затем я вспомнил многомерную форму,mapply
которая принимаетn-ary
функциюFUN
иn
последующие аргументы, применяяFUN
к первому, второму, ..., элементам каждого из аргументов, перерабатывая при необходимости . Существует также функция-обёрткаmapply
,Map
которая «не пытается упростить результат» . Поскольку он на три байта короче, это хорошая возможность для игры в гольф.Итак, я определил тройную функцию (как в 80-байтовом решении ниже), которая принимает функцию в качестве первого аргумента и применяет ее ко второму и третьему. Однако я понял, что
Map
это функция, которая берет функцию в качестве первого аргумента и применяет ее к последующим. Ухоженная!Наконец, в конце мы устанавливаем подмножество, чтобы гарантировать, что мы возвращаем только первые
length(l)
значения.R , 80 байт
Попробуйте онлайн!
Этот не работает, так как он возвращает 6 значений для списков, содержащих менее 6 элементов.
R , 94 байта
Попробуйте онлайн!
Объяснение (мягко не одураченное):
Поскольку каждая из функций векторизована, мы можем индексировать в конце (
res[i]
). Это лучше, чемeval
подход ниже.R , 100 байт
Попробуйте онлайн!
Это самый короткий
eval
подход, который я мог найти; потому что мы должны собрать результаты в один вектор, нам нужноpaste
черезc( )
вокруг всех выражений, который добавляет массу ненужных байтовисточник
Casio-Basic, 108 байт
Это было больно. Особенно потому, что
mod(x,y)
возвращается,x
когда это действительно не должно, что означало, что я должен был сделать свою собственную функцию мода: следовательноx-int(x/y)y
.Циклы
i
от 0 доlength(l)-1
, принимая последовательные элементы вo
списке и применяяl[i]
дляx
иl[-i]
дляy
. (отрицательные индексы не работают, поэтому вместо этого я вычитаюi
длину списка и беру этот индекс.)107 байт для функции, +1 байт для добавления
l
в поле параметров.источник
Java 8, 336 байт
Попробуй это здесь.
Вздох ..
Вход как
int[]
, вывод какjava.math.BigInteger[]
.Без правила « Чтобы охватить угловые случаи, ввод никогда не будет содержать 0, но может содержать любое другое целое число в диапазоне от отрицательной бесконечности до положительной бесконечности. », Используя целые числа в диапазоне
-2147483648
до2147483647
, это будет 186 байт (вход asint[]
, и нет выходных данных, потому что он изменяет этот массив ввода вместо сохранения байтов):Попробуй это здесь.
Объяснение:
источник