Дано (любыми средствами):
- Функция черного ящика с двумя аргументами (или один аргумент, состоящий из двухэлементного списка) , (вход и выход 1, 2, 3,…)
f: ℤ+ × ℤ+ → ℤ+
- Строго положительная целочисленная матрица с минимум двумя строками и двумя столбцами
вернуть трассировку функции матрицы .
Что такое функция трассировки ?
Трасса нормальной матрицы - это сумма большой диагонали (сверху-слева-внизу-справа) матрицы:
[[1,2,3],[4,5,6],[7,8,9]]
→ [1,5,9]
→ 1+5+9
→15
Но вместо суммирования мы хотим применить f
по диагонали:
[[1,2,3],[4,5,6],[7,8,9]]
→ [1,5,9]
→ f(f(1,5),9)
илиf(1,f(5,9))
Пожалуйста, укажите, используете ли вы слева направо или справа налево.
Данная матрица и все промежуточные значения будут строго положительными целыми числами в целочисленной области вашего языка. Матрица может быть не квадратной.
Примеры
f(x,y) = xy
, [[1,2,3],[4,5,6],[7,8,9]]
→ 1×5×9
→45
f(x,y) = xy
, [[1,2,3],[4,5,6],[7,8,9]]
→ →159
1
f(x,y) = x-y
, [[4,5,6],[1,2,3]]
→ 4-2
→2
f(x,y) = (x+y)⁄2
, [[2,3,4],[5,6,7],[8,9,10]]
→ 5
или7
f(x,y) = x+2y
, [[1,2,3],[4,5,6],[7,8,9]]
→ 47
или29
f(x,y) = max(x,y)
, [[1,2,3],[4,5,6],[7,8,9]]
→ max(1,5,9)
→9
f(x,y) = 2x
, [[1,2,3],[4,5,6],[7,8,9]]
→ 2
или4
f(x,y) = lcm(x,y)
, [[2,2,2],[2,2,3],[2,3,3],[4,4,4]]
→ lcm(2,2,3)
→6
[[2,2,2],[2,2,3],[2,3,3],[4,4,4]]
?[2,2,3]
Ответы:
R ,
4030 байтПопробуйте онлайн!
Проверьте контрольные примеры.
Пересекает по диагонали, так что слева направо в этом случае. Для арифметических операторов вы можете использовать
"+"
или обратные пометки вокруг операторов (+,*,-,%/%,^,%%
)Довольно просто:
Reduce
R эквивалентно afold
, адиагональ матрицы - это те элементы,a_ij
гдеi==j
, т. Е. Где индексыrow
иcol
umn совпадают.diag
имеет соответствующее поведение для неквадратных матриц.источник
Haskell , 39 байт
Спасибо @Laikoni за помощь в исправлении ранее недействительного решения!
Партнеры слева, попробуйте онлайн! (заменить
foldl1
наfoldr1
для правоассоциативной)источник
foldl1 f$zipWith(!!)m[0..]
?Mathematica , 16 байтов
-1 байт благодаря Мартину Эндеру.
Попробуйте онлайн!
Альтернативное решение, 17 байтов
Попробуйте онлайн!
источник
@*{}
синтаксис не имеет большого смысла (вы, вероятно, имели в виду@*List
), но тот факт, что он работает в любом случае, довольно крутой. На самом деле, это означает , что вы можете заменить{}
с0
и сохранить байты.List
первое, но я попробовал{}
просто так, и был очень удивлен, что это сработало. Имеет смысл, но как0
работает? o0{}
. В настоящее время вы используете{}
как функцию (или фактически как «голову», используя терминологию Mathematica). Если бы вы использовали общийf
там, вы бы получилиf[1,2,3]
(если это диагональ). Но с{}
тобой получится{}[1,2,3]
. Это совершенно бессмысленное выражение, но сами головы могут быть произвольными выражениями, и если Mathematica не знает, что с ними делать, она просто оставляет их такими, какие они есть. Большинство функций манипулирования списками в Mathematica фактически работают с выражениями с произвольным заголовком, а в случаеFold
заголовок просто игнорируется. [tbc]0
вместо головы, которая дает,0[1,2,3]
который все еще не имеет смысла, но работает все равно.Октава ,
615753 байтаПопробуйте онлайн!
Определяет функцию,
g
которая принимает дескриптор функцииf
и матрицуm
. На первой итерацииm(1)
возвращает верхний левый матричный элемент; после этого он просто возвращаетсяm
.источник
Чистый , 56 байт
Попробуйте онлайн! Складывается справа налево.
[t\\[_:t]<-r]
так же, какmap tl r
, но не нужноimport StdEnv
.источник
StdEnv
Haskell ,
474542 байтаПопробуйте онлайн! Определяет функцию,
(%)
которая принимает функцию и матрицу в качестве списка списков в качестве входных данных.Функция складывается справа налево:
Изменить: -2 байта благодаря BMO и -3 байта благодаря Zgarb !
источник
$
условного упрощения и с*>
.*>
!APL (Dyalog Unicode) , 7 байт ( SBCS Адама )
Попробуйте онлайн!
-3 благодаря предложению преобразовать это в полную программу от Адама .
Справа налево.
источник
Haskell , 44 байта
Попробуйте онлайн!
источник
Стандартный ML (MLton) , 59 байт
Попробуйте онлайн! Складывается справа налево.
Ungolfed:
Попробуйте онлайн!
источник
Python 2 , 61 байт
Попробуйте онлайн!
Это работает слева направо.
источник
(x+y)⁄2
иx+2y
примерыJavaScript (ES6),
5856 байтСкладывается слева направо. Редактировать: Сохранено 2 байта, используя тот факт, что массив является строго положительным. Альтернативное решение, также 56 байтов:
источник
1/
и вы можете сэкономить еще 2 байта, перемещая некоторые вещи вокруг:f=>a=>(h=r=>(e=a[++i]&&a[i][i])?h(f(r,e)):r)(a[i=0][0])
. TIOf,
) от первой версии?f,
приg
повторном звонке .JavaScript, 46 байт
Благодаря @Shaggy, используйте побитовый или сохранить один байт. Это волшебство.
Показать фрагмент кода
источник
Java 8,
888170 байтСкладывается
[[1,2,3],[4,5,6],[7,8,9]]
вf(f(1,5),9)
.-7 байтов косвенно благодаря @KamilDrakari , используя тот же прием, который он делал в своем ответе на C # : вместо того, чтобы иметь максимальную границу для цикла, основанного на строках / столбцах, просто попробуйте поймать
ArrayIndexOutOfBoundsException
.-11 байт
catch(Exception e)
с заменой наfinally
.Попробуйте онлайн.
Старый 88 байт ответа:
Попробуйте онлайн.
Объяснение:
Формат ввода черного ящика:
Предполагается, что именованная функция
int f(int x,int y)
присутствует, что разрешено в соответствии с этим мета-ответом .У меня есть абстрактный класс,
Test
содержащий функцию по умолчаниюf(x,y)
, а также лямбду выше:Для тестовых случаев я перезаписываю эту функцию
f
. Например, первый тестовый пример называется так:источник
Атташе , 14 байт
Попробуйте онлайн! Установите
f
и позвоните какf[function, array]
.объяснение
Это форк двух функций:
Fold
и/Diagonal
. Это для аргументовf
иa
эквивалентно:/
при монадическом применении к функции возвращает функцию, примененную к последнему аргументу. Итак, это эквивалентно:Это сгибает функцию
f
по главной диагоналиa
.источник
AWK , 77 байт
Попробуйте онлайн!
Мне было любопытно,
AWK
можно ли вообще заниматься функциональным программированием. Я думаю, что это имеет значение.«Матрица» определяется как стандартный ассоциативный массив с дополнительными полями
M[1]=#rows
иM[2]=#columns
. Имя функции передается в виде строки, которая оценивается через@F(...)
синтаксис. Оценка выполняется слева направо.r
Параметр является заполнителем для предотвращения перезаписи существующегоr
переменного и избежать необходимости повторной инициализации для каждого вызова. Обычно для обозначения таких заполнителей добавляется дополнительное пространствоAWK
, но это кодовый гольф, поэтому каждый байт считается. :)Ссылка TIO реализует все контрольные примеры.
источник
05AB1E ,
1510 байтСкладывается справа налево.
Сохранено 5 байтов с использованием новой встроенной функции, предложенной Кевином Круйссеном.
объяснение
Работает так же, как и в старой версии, за исключением того, что
Å\
это новая встроенная функция нажатия на основную диагональ.Попробуйте онлайн! или как тестовый набор
Старая версия
Попробуйте онлайн! или как тестовый набор
объяснение
источник
¬g£vyNè}[
можноÅ\`[
сейчас, сэкономив 5 байт.Шелуха , 7 байт
Спасибо @Zgarb за исправление моего представления!
Партнеры слева, попробуйте онлайн! (для правоассоциативной версии просто замените
Ḟ
наF
)объяснение
К сожалению, нет простого способа получить диагональ матрицы, поэтому большинство байтов предназначены для этого:
источник
SNOBOL4 (CSNOBOL4) , 86 байт
Попробуйте онлайн!
Определяет функцию
T
(дляTRACE
), которая принимаетARRAY
и строку,F
которая является именем функции. Складывается слева направо.Использование косвенной ссылки (
$
) не работает с функциями. Таким образом, использованиеEVAL
и передача строки имени является единственным способом получить функцию черного ящика в SNOBOL.Кроме того, довольно больно определять массивы; однако, поскольку причиной являются недопустимые ссылки на массивы
FAILURE
, это работает для неквадратных массивов - если значениеI
выходит за пределы любого из измерений,F(RETURN)
вынуждает функцию возвращаться.Редактировать:
Возможно, основываясь на этом мета-посте , я могу предположить, что функция «черный ящик»
F
определена под именемF
, что уменьшило бы ее до 75 байт (исключите использованиеEVAL
и,F
в определении функции). Однако я предпочитаю эту версию, поскольку она ближе к передаче ссылки на функцию.источник
C, 76 байтов
Слева направо.
Попробуйте онлайн!
источник
tinylisp , 79 байт
Последняя строка - это безымянная лямбда-функция, которая принимает функцию и матрицу и возвращает матричную трассировку. След является левоассоциативным (т.е.
f(f(1,5),9)
). Попробуйте онлайн!Ungolfed
Мы определяем вспомогательную функцию для вычисления диагонали; тогда
generalized-trace
это просто небольшая оболочка для библиотечной функцииfoldl
.При рекурсивном вычислении диагонали мы проверяем,
(head matrix)
верно ли это. Если в матрице нет строк, это будет пустой список (nil), аhead
nil - nil - falsey. Или, если в матрице нет столбцов, ее первая строка (заголовок) будет пустым списком (ноль) - фальси. Иначе будет непустой первый ряд, что является правдой.Итак, если первая строка не существует или пуста, мы возвращаем ноль. В противном случае, если есть непустая первая строка, мы берем
(head (head matrix))
- первый элемент первой строки - иcons
(добавляем) его к результату рекурсивного вызова. Аргументом для рекурсивного вызова является -(map tail (tail matrix))
то есть взять все строки, кроме первой, и взять все элементы, кроме первого, в каждой строке.источник
Пари / ГП , 42 байта
Попробуйте онлайн!
источник
C # (компилятор Visual C #) ,
726960 байтПопробуйте онлайн!
try/catch
позволяет правильно достичь диагонали, просто пройдя по ней и заканчивая вне границ.Сохранено 3 байта, поскольку, как указал Кевин Круйссен, можно предположить, что функции черного ящика существуют под определенным именем .
9 байтов сохранены путем возврата через изменение аргумента .
Таким образом, функция вызывается путем сохранения нужной функции под именем
f
, вызоваtrace(matrix)
и сохранения результата вmatrix[0][0]
.В качестве альтернативы, если вам действительно нравится многословие,
C # (компилятор Visual C #) ,
97 + 13 = 1107869 байтПопробуйте онлайн!
32 байта были сохранены с использованием предопределенной функции, поскольку отсутствие функции в качестве параметра позволило удалить
System
импорт и длинныйFunc
универсальный тип.источник
catch(Exception e)
вместоcatch
:) EDIT:. О, был в состоянии заменитьcatch(Exception e)
с ,finally
чтобы сохранить больше байтов. Еще раз спасибо. +1 от меня.finally
наcatch(Exception e)
, потому что я больше не возвращаюсь в наконец. Так чтоm->{try{for(int i=1;;m[0][0]=f(m[0][0],m[i][i++]));}catch(Exception e){}}
(73 байта), к сожалению, для меня больше по сравнению с моим текущим ответомm->{int r=m[0][0],i=1;try{for(;;)r=f(r,m[i][i++]);}finally{return r;}}
(70 байтов), но действительно хороший способ сохранить байты в вашем ответе! :) Жаль, что я могу только +1 ваш ответ один раз.JavaScript,
61575652504442 байтаУменьшает слева направо. Предполагается, что функция назначена переменной
f
, в соответствии с этим мета-постом, представленным моему вниманию Mr. Xcoder & totallyhuman. Не могу сказать, поскольку я согласен с этим, так как это прямо противоречит нашему существующему консенсусу, что мы можем не предполагать, что входные данные назначены предварительно определенной переменной, но я пока возьму несколько сохраняющихся байтов.Тестовые случаи
источник
APL NARS, 20 байтов, 10 символов
тест:
источник
Желе , 5 байт
Слева направо.
Попробуйте онлайн!
Отказ от ответственности: я не знаю, если это приемлемый метод ввода для функций черного ящика. Это предполагает, что функция реализована в приведенной выше ссылке и, таким образом, имеет «имя» (то есть, она вызывается)
ç
, но в противном случае у меня нет способа назначить ееç
. Если у кого-то есть больше опыта с функциями желе + черный ящик, я был бы признателен за мысли. Потратив некоторое время в чате, мы решили, что использованиеç
действительно может быть допустимым.источник
Clojure, 30 байтов
Уменьшает «слева».
источник
Рубин ,
5553 байтаПопробуйте онлайн!
источник