Определение
Матрица со стрелками - это матрица , в которой все записи равны 0 , кроме тех, которые расположены на главной диагонали, в верхней строке и в крайнем левом столбце. Другими словами, матрица должна выглядеть так:
* * * * * * * * 0 0 0 0 * 0 * 0 0 0 * 0 0 * 0 0 * 0 0 0 * 0 * 0 0 0 0 *
Где каждый * - любая ненулевая запись.
задача
Учитывая квадратную матрицу неотрицательных целых чисел, проверьте, является ли это стрелкой в соответствии с определением выше.
Вы не можете принимать размер матрицы в качестве входных данных, если ваш язык не эквивалентен массиву, как указатель и длина (например, C). Это всегда будет не менее 3 х 3.
Самый короткий код в байтах на каждом языке выигрывает.
Вход и выход
Вы можете выбрать один из следующих форматов для получения ввода:
- Матрица в нативном типе матрицы (если она есть у вашего языка)
- 2D-массив 1 (массив 1D-массивов, каждый из которых соответствует одной строке)
- 1D массив (так как матрица всегда квадратная)
- Строка (вы выбрали интервал, но не злоупотребляйте этим).
Когда дело доходит до предоставления вывода, вы можете либо сообщить истинное / ложное значение, следуя стандартному определению проблемы решения , либо выбрать любые два различных и непротиворечивых значения.
Более того, вы можете принимать и выводить данные любым стандартным методом на любом языке программирования , при этом отмечая, что эти лазейки по умолчанию запрещены. Если вы хотите выбрать любой другой формат или не уверены в чем-то, пожалуйста, спросите в комментариях.
1: или эквивалент вашего языка (список, вектор и т. Д.)
Примеры
Давайте посмотрим на следующие примеры:
1 2 2 2 2 1 0 0 3 0 1 0 4 0 0 1
Это матрица стрелок (ваши программы должны сообщать истинное значение), потому что элементы на главной диагонали - это 1 1 1 1
те, которые находятся в верхней строке, 1 2 2 2
и те, которые находятся в крайнем левом столбце 1 2 3 4
. Все остальные записи равны 0 , так что это удовлетворяет всем условиям.
3 5 6 7 1 0 8 0 0
Эта матрица не наконечник стрелы , потому что есть 0 на главной диагонали.
9 9 9 9 9 9 0 0 9 7 9 0 9 0 0 9
Это один не наконечник стрелы либо, потому что она содержит 7 вместо 0 .
Больше тестов
Truthy:
[[1, 1, 1], [1, 1, 0], [1, 0, 1]] [[1, 2, 3, 4], [1, 1, 0, 0], [1, 0, 1, 0], [1, 0, 0, 1]] [[1, 2, 2, 2], [2, 1, 0, 0], [3, 0, 1, 0], [4, 0, 0, 1]] [[34, 11, 35, 5], [56, 567, 0, 0], [58, 0, 679, 0], [40, 0, 0, 7]]
Falsy:
[[3, 5, 6], [7, 1, 0], [8, 0, 0]] [[9, 9, 9, 9], [9, 9, 0, 0], [9, 7, 9, 0], [9, 0, 0, 9]] [[1, 0, 3, 4], [1, 1, 0, 0], [1, 0, 1, 0], [1, 0, 0, 1]] [[1, 6, 3, 4], [13, 2, 0, 6], [29, 0, 1, 0], [2, 0, 0, 4]]
источник
Ответы:
Javascript (ES6),
4847 байтСохранено 1 байт благодаря edc65
Возвращает
false
для матриц стрелок и матриц,true
не являющихся стрелками (допускается, поскольку любые два различных значения могут использоваться для представления значений true и false)Тестовые случаи:
Показать фрагмент кода
источник
f=m=>m.some((r,y)=>r.some((c,x)=>(x*y&&x!=y)^!c))
f=
конечно;-)
J ,
2120191715 байт-4 байта благодаря @GalenIvanov.
Принимает входные данные в виде матрицы (массив ранга 2).
Попробуйте онлайн!
объяснение
Пусть история редактирования станет для вас уроком, чтобы не играть в гольф и одновременно писать объяснения.
Визуальное объяснение
Обратите внимание, что это делается в REPL (входные данные начинаются с трех пробелов, а выходные - без начальных пробелов). Из-за этого я иногда опускаю составные функции, такие как
@
и,&
поскольку вещи в REPL оцениваются справа налево (функции более сложные).Предположим, у вас есть следующий образец матрицы:
Во-первых, я хотел бы объяснить (и отдать должное) очень умному способу генерирования матрицы тождеств @ GalenIvanov, который заключается в следующем
=&/:@}.
.Сначала мы обезглавили входную матрицу (
}.
).Затем мы получаем индексы в каждой строке, если бы строки были отсортированы с помощью
/:
-grade up.Обратите внимание, что результирующие индексы уникальны : в списке нет повторяющихся элементов (и с чего бы это? Нет способа разместить два элемента в одной позиции в массиве).
Наконец, мы используем эту нишу, но
=
помогаем классифицировать себя. Эта монада сравнивает каждый уникальный элемент со всеми другими элементами в массиве. Помните, как я упоминал, было важно, чтобы полученные признаки были уникальными? Поскольку=
-self-classify выполняет сравнения в порядке появления уникальных элементов в списке, результирующий вывод будет единичной матрицей для уникального ввода (вот почему=@i.
вы можете создать единичную матрицу заданной длины).Когда у нас есть единичная матрица, нужно добавить строку единиц и столбец единиц, что делается очень просто (если дан атом - то есть один элемент -
,
семья будет повторять его для заполнения при добавлении) :Затем мы просто сравниваем сгенерированную матрицу стрелки со знаком входной матрицы.
источник
*
достаточно вместо0@<
(для 17 байт)? Попробуй=&/:
когда я скомбинировал ее}.
, я получил это*-:1,1,.=&/:@}.
за 15 байт. Попробуйте онлайн!/:
-grade и}.
-headhead), еще раз спасибо! Я отредактирую это.*-:1,1,.=@}.
работает просто отлично - не нужно причудливого способа найти матрицу тождеств. Вы можете сгенерировать единичную матрицу из самой квадратной матрицы просто=
. Поэтому оставьте одну строку с помощью}.
, сделайте единичную матрицу с помощью=
, добавьте строку и столбец с помощью1
и так далее.Wolfram Language (Mathematica) , 47 байтов
Попробуйте онлайн!
Пояснение:
Clip@#
заменяет все ненулевые числа в матрице на 1 с, затем мы сравниваем это с массивом с размерами{1,1}Tr[1^#]
={Length@#, Length@#}
с 0 в положенииi,j
когда1 < i != j > 1
и 1 в противном случае.(Примерно на основе ответа Уриэля .)
Вот еще одна идея, которая на 16 байт длиннее - не стесняйтесь красть ее, если вы можете сыграть в гольф:
Попробуйте онлайн!
источник
APL (Dyalog Classic) ,
19161513 байтов-1 байт благодаря @ErikTheOutgolfer
(
⎕IO←0
)Попробуйте онлайн!
-2 байта благодаря @ngn и @ H.PWiz
Как?
(2D матрица ввода S )
×≡
Проверьте, является ли S положительным только на ...(∧=⌊
... диагонали или верхний ряд и левый столбец ...)/¨∘⍳∘⍴
... из S .источник
⍳∘⍴
для декартового произведения.×≡(=/∨1∊⊢)¨∘⍳∘⍴
(=/∨1∊⊢)
->(~≠⌊⌊)/
(∧=⌊)/
конечно, оба требуют⎕IO←0
PowerShell ,
112108 байтПопробуйте онлайн!
Принимает ввод и манипулирует как массив массивов, поскольку PowerShell не поддерживает матрицы (за исключением поддержки матриц преобразования .NET Direct3D, что является чем-то совершенно другим).
Весь алгоритм основан на том факте, что ненулевые числа являются истинными, а нулевые - ошибочными в PowerShell и используют умножение для определения этих истинных / ошибочных значений.
Сначала мы берем первую строку
$a[0]
и проверяем,0
является ли-in
этот массив, сохраняя его в нашей$o
переменной utput. Если что-либо в этой строке равно нулю, то$o
также равно нулю, в противном случае это единица, сделанная быстрым приведением к int с+
.Далее мы делаем цикл от
1
до$a.count-1
, устанавливая$x
путь - мы собираемся перебирать каждый ряд по одному за раз.В каждой итерации мы устанавливаем вспомогательную переменную,
$i
чтобы отслеживать, в какой строке мы находимся, затем выполняем цикл от0
до$x
до, чтобы выполнить итерацию каждого элемента в этой строке. Во внутреннем цикле мы снова умножаем$o
, на этот раз, выбирая из набора кортежей в качестве псевдо-троичного оператора.Условное условие кортежа
!$_-or$_-eq$i
гласит: «когда мы находимся в 0-м столбце или столбец совпадает со строкой (т. Е. С главной диагональю)», чтобы выбрать вторую половину кортежа, если она истинна, или первую половину, когда она ложна. Кортеж состоит из!($y=$a[$i][$_]), $y
. Первая половина сетов$y
для игры в гольф во второй половине, но в любом случае мы выбираем текущий элемент. Первая половина выполняет логическое отрицание, а вторая половина просто принимает элемент как есть. Таким образом, если мы не на 0-м столбце и не на главной диагонали, мы гарантируем, что элемент равен нулю, взяв логическое значение, а не его. Аналогично, мы гарантируем, что 0-й столбец или главная диагональ отличны от нуля, просто взяв его.Итак, теперь, когда мы перебрали каждый элемент в матрице, это
$o
будет либо,0
если какой-то элемент был неправильным, либо некоторое ненулевое целое число, если это матрица со стрелкой. Мы дважды получаем Boolean-not, чтобы получить тоFalse
или другоеTrue
, чтобы сделать наш вывод согласованным, и это остается на конвейере, где неявная печать.источник
+
=[int]
? Это мило.Желе ,
1412 байт-2 байта из Pietu1998
Попробуйте онлайн!
объяснение
Используйте приведенную выше матрицу в качестве примера ввода.
источник
APL (Dyalog) ,
211817 байтовПопробуйте онлайн!
Как?
Этот идет другим путем -
=/¨∘⍳
- создает матрицу идентичности1-⍨⍴
- дляn - 1
1⍪1,
- добавляет столбец и строку 1 с≡
- сравнивается с×
- исходная матрица, после того как она прошла поэлементную подписьисточник
MATL , 15 байт
Ввод - это матрица (используется в
;
качестве разделителя строк). Выход1
для стрелки, в0
противном случае.Попробуйте онлайн! Или проверьте все тестовые случаи .
объяснение
источник
C (GCC) ,
8075 байтовПопробуйте онлайн!
Сохранено 5 байтов благодаря Scottinet!
Повторно использовал тестовый код из этого ответа .
Линейно сканирует массив на предмет любых неправильных значений, возвращая 0 для матрицы стрелок и 1 в противном случае. Мы проверяем путем вычисления исключений или того, равен ли элемент в данной позиции нулю и находится ли эта позиция на стрелке.
Кодирование информации двумерного массива в одно измерение приводит к довольно простому набору условий. Если мы позволим
i
быть нашим индексом на основе 0 вn
размерном массиве, тоi<n
описывает первую строку. Точно так жеi%n==0
описывает первый столбец иi/n==i%n
описывает диагональ.Лучший трюк, который я нашел для обработки возврата - установить нулевое измерение при возникновении ошибки. Это приводит к немедленному завершению цикла, а затем возврат логического отрицания измерения даст нам одно из двух различных значений. Скоттинет нашел способ заставить GCC вернуть его более красиво.
источник
Python 2 , 75 байт
Попробуйте онлайн!
Python 2 , 85 байт
Взяв массив в качестве 1D матрицы:
Попробуйте онлайн!
источник
R ,
787069685453 байтаПопробуйте онлайн!
Портирование ответа Луиса Мендо намного короче, чем мой прежний подход.
Спасибо rturnbull за указание на ошибку и игра в гольф на байте!
старый ответ, 68 байт:
Попробуйте онлайн!
Ответ Duckmayr проверяет, что все записи в главной диагонали и первой строке / столбце (
m[i]
) отличны от нуля, а остальные (m[-i]
) равны нулю, используя некоторую хорошую арифметику для получения диагонали и первой строки.Этот ответ, однако, проверяет, чтобы убедиться, что (1) нулевые записи не находятся на главной диагонали или первой строке / столбце, и (2) что есть, с учетом
n x n
матрицы,3*n-2
ненулевые записи.which
возвращает индексы, где находится его входTRUE
, и с необязательнымarr.ind=T
, возвращает массив индексов для каждого измерения массива, в данном случае два.Следовательно, когда
any(i[,1]==i[,2])
на диагонали существует ноль, а когдаany(i==1)
есть ноль в первой строке или первом столбце.И, наконец, немного арифметика показывает , что число ненулевых элементов должно быть
3*n-2
,n
из первой колонки,n-1
от диагонали, иn-1
с первого ряда.источник
all(!m==!d)
в последней строке?(!!m)==d
но!
имеет более низкий приоритет, чем==
. Я думаю,d==!!m
должен сделать трюк, хотя.d!=!m
делает то же самое, на один байт меньше. Вы можете сохранить другой байт, используяpryr::f
синтаксис, а неfunction
слишком.Python 2 ,
9290 байтПопробуйте онлайн!
кредиты
источник
Haskell , 62 байта
-3 байта благодаря мистеру Xcoder. -13 байт благодаря пользователю 28667. -5 байт благодаря Згарбу.
Попробуйте онлайн!
источник
<1
таких хитростях? : P(x==y||x==0||y==0)==(m!!y!!x/=0)
должно быть корочеx*y<1
.Желе , 10 байт
Попробуйте онлайн!
источник
Python 3 ,
7271 байтСпасибо @xnor за вывод 1 байта!
Попробуйте онлайн!
источник
0<i!=j>0
сохраняет байт,Pyth,
2221 байтЭто определенно не язык для матричных манипуляций.
Для каждой строки
b
и ее индексаk
в matrix (.e
) захватывает первую иk
третью записи (слева и по диагонали) с помощью,@bkh
и (+
) всех остальных записей с помощью.Db,0k
. Еслиk
не 0, чтобы соответствовать первой строке (Wk
), то!
неM
все из этих записей. После того, как все они были выбраны, убедитесь, что все они верны. (.As
) Если есть 0, где его не должно быть, то соответствующее местоположение будет захвачено как есть и испортит и, и, если есть ненулевое значение, где его не должно быть, оно будет!
записано в 0, что тоже ложь.Тестирование.
-1 байт для обмена ордерами.
источник
@VQUQ
или.DVQUQ
Для диагоналей / удаление диагоналей. Но это потребует совершенно другого подхода. Хотя не уверен ... (Кстати, забыл обновить ссылку?)VQUQ
идею:>.A++hCQhQ.(VQUQsstCt
. Это кажется крайне избыточным. Вы можете настроить его, чтобы сэкономить несколько байтов.Пип ,
312322 байтаЭта функция принимает двумерный вложенный список чисел. Попробуйте онлайн!
объяснение
Здесь происходит множество сравнений. Первое, что нужно знать, это то, что операторы сравнения в Pip могут быть соединены вместе, как в Python:
5>4>3
is5>4 and 4>3
(true), а не(5>4)>3
(false). Во-вторых, это не относится к==
оператору «точно равно». Еще одно отличие: регулярные сравнения имеют более высокий приоритет , чем операторы отображенияMC
иMM
и может использоваться в лямбда - выражений, а==
имеет более низкий приоритет и не может.Для генерации первой матрицы мы используем
MC
«map-координаты». Этот оператор берет число, генерирует квадратную координатную сетку такого размера и отображает функцию для каждой пары координат (x, y), возвращая список списков результатов. Например,{a+b} MC 3
дал бы результат[[0; 1; 2]; [1; 2; 3]; [2; 3; 4]]
.Здесь размер сетки равен
#a
размеру нашего исходного аргумента. Функция0<_!=B>0
, которая является более коротким способом записи{0 < a != b > 0}
:Это возвращает 0 для первой строки / столбца и главной диагонали и 1 в другом месте.
источник
Шелуха ,
1211 байтПопробуйте онлайн!
объяснение
Идея состоит в том, что Husk определяет 0 в степени 0 как 1, поэтому внешний продукт имеет 1 в первой строке и столбце. Кроме того, от 1 до степени любого числа равно 1, поэтому внешнее произведение имеет 1s по диагонали. Другие записи равны 0 в степени некоторого положительного числа, равного 0. Это дает двоичную матрицу стрелки, которую мы сравниваем с входом
≡
.источник
APL + WIN,
3633 байтаЗапрашивает ввод на экран матрицы APL 2d.
источник
Clojure,
128959285 байтВсегда интересно видеть две открывающие скобки подряд.
Оригинальная версия:
Первая часть работает путем
assoc
смещения диагональных элементов подматрицы в ноль и проверки того, что все строки равны :) Я использовал аналогичный прием в методе Якобиана .concat
Последняя часть вводит диагональ + первый ряд и столбец и проверяет, что они положительны.источник
Javascript (ES6), 58 байт
Мое решение для Javascript:
Не такой умный, как ответ Германа , но я просто чувствовал, что должен опубликовать его и здесь.
Показать фрагмент кода
источник
Clojure,
212206188 байт-6 байт, удалив пропущенные пробелы и ярлыки
range
. Возможно, мне придется оставить это, чтобы я мог придумать лучший способ.-18 байт благодаря @NikoNyrh и созданию ярлыков для
map
.Ужасно, просто ужасно. Я не знаю, почему я не могу обернуть голову вокруг разумного решения.
Принимает вложенный вектор в качестве входных данных.
Я попытался переписать это с нуля, используя другой метод, и это закончилось дольше. Вместо того, чтобы вручную вырезать «остальные» участки матрицы, я решил попробовать сгенерировать все координаты в матрице, сгенерировать координаты стрелки, а затем использовать
clojure.set/difference
для получения ячеек, не являющихся стрелками. К сожалению, вызов этого встроенного является дорогостоящим:223 байта
источник
#(drop 1 %)
, так же, какrest
и так#(not(zero? %))
же, какpos?
(поскольку у нас есть неотрицательные числа). Возможно, вы захотите взглянуть на мой 128-байтовый ответ, который имеет аналогичные подходы. После реализации этого я понял, что в цикле for очень сложно работать с индексным доступом.rest
. Я должен, вероятно, просто отказаться от этой попытки и попробовать еще раз.Stax , 11 байтов CP437
Попробуйте онлайн!
Распакованная версия с 13 байтами:
Наконец-то связал Хаска и побил Желе всего одним байтом ...
объяснение
источник
R ,
8179 байт-2 байта благодаря мистеру Xcoder
Попробуйте онлайн!
источник
C 117 байт
Попробуйте онлайн!
источник
PowerShell , 186 байт
Попробуйте онлайн!
источник
param($a)
для ввода,-contains
можно поменять местами-in
и все-eq0
поменять местами!
. Наконец, вы можете1
выполнить цикл до$a.length
и избавиться отif($_-ne0)
тела цикла.Perl 5 , 136 + 2 (
-ap
) = 138 байтПопробуйте онлайн!
источник
Чисто , 79 байт
Попробуйте онлайн!
источник
Japt , 16 байт
Проверьте это онлайн!
Чувак, это возвращает меня к старым добрым временам, когда Джапт регулярно был намного длиннее, чем другие игры в гольф ...
источник
К (ок) ,
2730 байтРешение:
Попробуйте онлайн!
Объяснение:
Я должен делать что-то глупое, поскольку решения APL меньше половины байта ...
24 байта ушло на создание стрелки.
or
вместе следующие три матрицы:Полная разбивка:
источник