Вам будет дан двумерный массив и число, и вас попросят определить, является ли данная матрица теплицевой или нет.
Формат ввода:
Вам будет предоставлена функция, которая будет принимать two-dimensional
матрицу в качестве аргумента.
Выходной формат:
Возврат 1
из функции, если матрица Тёплица , иначе возврат -1
.
Ограничения:
3 < n,m < 10,000,000
где n
число строк, а m
количество столбцов.
Образец теста:
Sample Input :
4
5
6 7 8 9 2
4 6 7 8 9
1 4 6 7 8
0 1 4 6 7
Sample Output :
1
счет
Это код-гольф , поэтому выигрывает самый короткий ответ в байтах.
code-golf
grid
decision-problem
matrix
Мартин Эндер
источник
источник
Ответы:
Mathematica, 42 байта
Mathematica не имеет встроенной проверки того, является ли матрица Теплица, но она имеет встроенную функцию для ее генерации. Таким образом, мы генерируем один из первого столбца (
#&@@@#
) и первого ряда (#&@@#
) ввода и проверяем, равен ли он входу. Чтобы преобразоватьTrue
/False
result в1
/-1
мы используемBoole
(чтобы дать1
или0
), а затем просто преобразовать результат с помощью2x-1
.источник
Октава , 30 байт
Я предполагаю, что мне не нужно обрабатывать матрицы 1 000 000 x 1 000 000, как сказано в задаче. Это работает для матриц, которые не превышают доступную память (в моем случае менее 1 ТБ).
Попробуйте онлайн!
Он принимает матрицу в
x
качестве входных данных и создает матрицу Теплица на основе значений в первом столбце и первой строке. Затем он проверит каждый элемент матриц на равенство. Если все элементы равны, то вход является матрицей Теплица.На выходе будет матрица с теми же размерами, что и на входе. Если на выходе есть какие-либо нули, то это считается ошибкой Octave.
Редактировать:
Просто заметил строгий формат вывода:
Это работает для 41 байта. Возможно, удастся отыграть один или два байта в этой версии, но я надеюсь, что правила вывода будут немного смягчены.
источник
Желе , 5 байт
Попробуйте онлайн!
После определения здесь .
источник
05AB1E , 11 байт
Попробуйте онлайн!
объяснение
источник
Haskell , 43 байта
Попробуйте онлайн!
источник
False
был разрешен, я мог бы побить его одним байтом.Mathematica, 94 байта
вход
еще один, основанный на алгоритме Стьюи Гриффина
Mathematica, 44 байта
источник
s
? Вы не можете просто использовать#
вместо этого?Java 7,
239233220113 байтов-107 байт после подсказки об использовании более эффективного алгоритма благодаря @Neil .
Объяснение:
Попробуй это здесь.
источник
r
=n
иc
=,m
если вы сравните это с задачей).-->
оператор!Haskell , 51 байт
t
берет список списков целых чисел и возвращает целое число.Попробуйте онлайн!
Это могло быть 39 или 38 байт с выводом «истина / ложь».
Идея использования
init
была вдохновлена ответом Эминьи 05AB1E, в котором используется очень похожий метод; до этого я использовал вложенную молнию.Как это работает
zipWith((.init).(/=).tail)=<<tail
это бессмысленная форма\m->zipWith(\x y->tail x/=init y)(tail m)m
.m
, проверяя, отличается ли первое с удаленным первым элементом от второго с удаленным вторым элементом.or
Затем комбинирует проверки для всех пар строк.1-sum[2|...]
преобразует выходной формат.источник
JavaScript (ES6),
6554 байтаисточник
a=>a.some(b=>b.some((v,i)=>d[i]-(d[i]=v),d=[,...d]),d=[])?-1:1
(62 байта)Рубин , 54 байта
Точно так же, как указано, может быть больше, если гибкий ввод / вывод принят.
Объяснение:
Выполните итерацию по матрице и сравните каждую строку со строкой выше, смещенной на единицу вправо. Если они разные, используйте пустой массив для следующей итерации. В конце верните -1, если окончательный массив пуст, или 1, если это хотя бы 2 элемента (так как наименьшая возможная матрица - 3x3, это верно, если все сравнения возвращают true)
Попробуйте онлайн!
источник
<=>
для вычисления результата!|(*x,_),y|
чтобы вам не нужно нарезать ломтикиx
?PHP, 70 байт
источник
Питон, 108
Совсем не эффективен, поскольку затрагивает каждый элемент
n+m
раз при фильтрации по диагонали. Затем проверяет, есть ли более одного уникального элемента на диагонали.источник
Аксиома, 121 байт
m должна быть матрицей некоторого элемента, который позволяет ~ =; раскрутить это
источник
Сетчатка , 148 байт
Попробуйте онлайн!
Матрица ввода N × M
сначала преобразуется в матрицу N × (N + M-1) путем выравнивания диагоналей следующим образом:
а затем первый столбец повторно проверяется на наличие единственного уникального номера и удаляется, если это так. Матрица Тёплица, если на выходе ничего нет.
источник
MATL , 11 байт
Попробуйте онлайн!
Простой метод «построить матрицу Теплица и проверить его», который используют первые несколько ответов, почему-то мне показался скучным (и, похоже , в любом случае это было бы на 1 байт длиннее). Поэтому я выбрал метод «проверить, что каждая диагональ содержит только одно уникальное значение».
T&Xd
- Извлечь диагонали входных данных и создать новую матрицу с ними в виде столбцов (заполнение нулями по мере необходимости)"
- перебрать столбцы этого@Xz
- нажать переменную итерации (текущий столбец) и удалить из нее (заполнение) нули&=
- проверка равенства вещания - это создает матрицу со всеми единицами (правда), если все оставшиеся значения равны друг другу, в противном случае матрица содержит несколько нулей, что неверноv
- объединить значения результатов вместе, чтобы создать один конечный вектор результата, который будет либо истинным (все 1 с), либо ложным (некоторые 0)источник
R , 48 байтов
Попробуйте онлайн!
источник
Clojure, 94 байта
источник