Представлено в честь APL как интерактивного инструмента, которому в этом году исполняется 50 лет
Задний план
Кен [Айверсон] представил свою работу « Формализм в языках программирования» в августе 1963 года на рабочей конференции по механическим языковым структурам, Принстон, штат Нью-Джерси. Список участников конференции полон известных и скоро известных имен, а также нескольких будущих лауреатов премии Тьюринга. (Бэкус, Карри, Дейкстра, Флойд, Айверсон, Ньюэлл, Перлис, Уилкс). В документе также записано обсуждение, которое состоялось после презентации, завершившейся обменом между Кеном и [Эдсгером] Дейкстрой , в котором ответ Кена на вопрос Дейкстры был однорядным.
Вызов
Как бы вы представили более сложную операцию, например, сумму всех элементов матрицы M , равных сумме соответствующих индексов строк и столбцов?
Напишите фрагмент или выражение (нет необходимости в полной программе или функции), чтобы вычислить сумму каждого элемента в данной целочисленной матрице, которая равна сумме его индексов. Или, как говорит FryAmTheEggman: для данной матрицы M с элементами a ij возвращают сумму каждого a ij, где a ij = i + j.
Вы можете предположить, что матрица уже находится в переменной или ячейке памяти, или вы можете принять ее в качестве аргумента или ввода. Вы можете использовать 0 или 1 на основе индексов.
Контрольные примеры
0
для пустой матрицы
2
0
для 0 на основе индексов или 2
для 1 на основе
1 5 2
9 4 2
5 9 6
2
для 0 на основе или 10
для 1 на основе
0 3 0 4
0 4 1 4
4 3 1 2
-2 4 -2 -1
11
3 -1 3 3
3 -1 3 1
6
для 0 на основе или 3
для 1 на основе
Анекдот
Ответ Айверсона был ++ / ( M = ⍳ ¹ ⨢ ⍳ ¹) // M , что недопустимо ни в обозначении Айверсона, как определено в языке программирования , ни в том, что в итоге стало APL. В обозначениях Айверсон, было бы + / ( М = ⍳ ¹ ( μ ( М )) ⨢ ⍳ ¹ ( ν ( М ))) / М . В самых первых версиях APL это было +/(,M=(⍳1↑⍴M)∘.+⍳1↓⍴M)/,M
.
Ответы:
APL,
1312 байт1 байт благодаря @ jimmy23013.
1-индексироваться.
Массив хранится в переменной
m
.Попробуйте онлайн!
На основании ответа в J , который является языком на основе APL.
В TryAPL введите:
+/m`em`c`1+/`1`i`rm
С массивом:
+/m`em`c`1+/`1`i`rm `[ 2 4 `r 3 `21 3 3 3 `21 3 1
объяснение
источник
`
означает «ключ APL».+/∊m∩¨+/¨⍳⍴m
,MATL ,
151410 байтУ входа есть строки, разделенные
;
. Например:[1 5 2; 9 4 2; 5 9 6]
. Используется индексирование на основе 1.Попробуйте онлайн! Или проверьте все тестовые случаи .
объяснение
Я буду использовать пример с вводом
[3 -1 3 3; 3 -1 3 1]
в объяснении.источник
JavaScript,
4946 байтРедактировать: 3 байта сохранены благодаря @MartinEnder, указывающему, что фрагменты разрешены.
источник
Сетчатка , 46 байт
Число байтов предполагает кодировку ISO 8859-1.
Ввод использует разделители пробела и перевода строки для представления матрицы. Индексы начинаются с 0.
Попробуйте онлайн!
объяснение
Не совсем то испытание, для которого была создана Retina, но на удивление хорошо ... :)
Этап 1: Замена
Это просто расширяет все целые числа в строке как унарные числа, используя
1
в качестве унарной цифры. Отрицательные числа как-3
просто станут вещами как-111
.Этап 2: Матч
Из-за
!
опции, это печатает все совпадения данного регулярного выражения. Упомянутое регулярное выражение использует балансирующие группы, чтобы проверить, совпадает ли текущее число с суммой его индексов.Чтобы сделать это, мы сначала определяем сумму индексов с обратной стороны
(?<=(\S* |.*¶)*)
. Это добавляет один захват для каждого номера перед текущим на той же строке (через\S*
), а также один захват для каждой строки перед текущей (через.*¶
) для группировки1
. Следовательно, в результате мы получаем сумму индексов, начинающуюся с нуля.Затем мы пытаемся сопоставить все следующее число, удаляя захваты из этого стека с
(?<-1>1)+\b
. И тогда мы делаем матч потерпеть неудачу , если какие - либо захваты оставлены на группы1
с(?(1)1)
целью обеспечения равенства.Обратите внимание, что отрицательные числа никогда не совпадают, потому что lookbehind не может пройти
-
перед списком1
s и(?<-1>1)+
не может соответствовать ему.Это дает нам список всех унарных чисел, которые равны сумме их индексов.
Этап 3: Матч
Мы заканчиваем другим этапом совпадения, но без
!
опции, это просто подсчитывает количество совпадений, которое одновременно суммирует все унарные числа из предыдущего результата, а также преобразует эту сумму обратно в десятичную.источник
Желе,
151410 байт4 байта благодаря Аднану.
1-индексироваться.
Попробуйте онлайн!
Проверьте все тестовые случаи одновременно. (Слегка изменено.)
источник
J€
вместоL€R€
?Python 2 -
6057 байтЭто фрагмент кода, так что, я думаю, было бы еще несколько байтов, если бы я на самом деле вернул значение.
e=enumerate;sum(i*(x+y==i)for x,r in e(a)for y,i in e(r))
Спасибо за помощь Leaky Num :-)
Быстрое объяснение.
a
массив, содержащий числа Просто перебирайте индексы и суммируйте все значения, где значение равно сумме индекса.источник
e=enumerate;sum(i*(x+y==i)for x,r in e(a)for y,i in e(r))
R, 24 байта
1 на основе.
Тестовые случаи:
источник
J 15 байт
Использование нуля на основе индексации и принимает матрицу уже хранящиеся в переменной M .
объяснение
источник
CJam,
232120 байтСпасибо Питеру Тейлору за сохранение 3 байта.
Ожидает, что матрица будет в стеке, и вместо этого оставляет сумму. Индексы начинаются с нуля в любом случае.
Проверьте это здесь.
источник
_,,
вместо внутреннегоee
и.
для внутреннего цикла:ee{~_,,@f+1$.=.*~}%1b
ee{~_@f-_,,.=.*~}%1b
k4, 24 байта
Предполагается, что матрица хранится в
m
.Это одна из тех загадок, где упрощения, связанные с конструированием k из APL (и J), действительно вредят - k
!
- это эквивалент APL,⍳
но работает только над векторами, поэтому я должен собрать матрицу индексов самостоятельно; внутренний продукт - один символ в APL, но пять в k; и я теряю три символа для правильной обработки пустой матрицы, потому что k не имеет строго типизированных матриц.источник
Pyth, 14 байт
0 индексированные.
Тестирование.
источник
PowerShell v2 +, 43 байта
Как фрагмент Использование состоит в том, чтобы явно направить матрицу к этому (см. Примеры ниже). Подразумевается , что
$i
, и$o
являются либо нулевой или нуль в начале (я явно установить их в качестве таковых в примерах ниже), и использует 0-индекс.Делает цикл по каждому элементу в каждой строке матрицы. Мы установили ,
$j
чтобы0
, а затем пройти через каждый элемент строки в другом цикле$_|%{...}
. Каждый внутренний цикл мы увеличиваем$o
на текущий элемент, умноженный на логическое($_-eq$i+$j++)
значение, что означает, что если логическое значение есть$TRUE
, оно будет1
иначе0
. Затем мы выходим из внутреннего цикла, увеличиваем$i
и начинаем следующий ряд. Наконец, мы выходим$o
на конвейер в конце.Примеры
источник
Рубин, 63 байта
С z в качестве двумерного массива чисел:
Не очень интересно вообще.
Если z - плоский массив с x и y, имеющими размеры массивов, такие как:
Тогда у нас есть это чудовище - возможно, более рубиновое с его модными продуктами и почтовыми индексами, но на самом деле больше:
источник
На самом деле, 21 байт
Попробуйте онлайн!
Спасибо Leaky Nun за то, что заставил меня перестать лениться и наконец написал это.
Это использует 0-индексированные матрицы и принимает входные данные как вложенный список.
Объяснение:
источник
Matlab / Octave, 48 байтов
1-индексироваться.
Не будет обрабатывать первый контрольный пример, потому
[1:0]
что по какой-то причине имеет размер 1x0Проверено в Октаве 3.
Полная программа:
источник
sum((M.*(M-[1:size(M,1)]'-[1:size(M,2)]==0))(:))
. Кроме того, я думаю, что вы можете изменить==0
начальное значение~
для дальнейшего уменьшения количества байтов. Наконец, обратите внимание, что вам нужно обработать все контрольные примеры, иначе вопрос должен быть удаленЛуа, 70 байт
1-индексироваться.
Бонус: это работает для рваных массивов!
Вход хранится в
a
, выход хранится вs
.Полная программа:
источник
PHP, 59 байт
ожидает массив $ a; должен быть пустым или двумерным, с 0 индексами.
вычисляет сумму до $ s (ранее 0 или неопределенно - 0 равно NULL),
вставляет
+2
перед финалом)
для 1-индексированного поведенияС Днем Рождения APL!
функции и набор тестов
источник
Брахилог , 15 байт
Попробуйте онлайн!
источник
Wolfram Language (Mathematica) , 42 байта
Попробуйте онлайн!
1-индексироваться.
источник