Есть ли N последовательных вхождений числа в строке / столбце в матрице?


20

Возьмите матрицу A, состоящую из положительных целых чисел и одного положительного целого числа N, в качестве входных данных и определите, есть ли хотя бы N последовательных вхождений одного и того же числа в какой-либо строке или столбце матрицы.

Вам нужно только проверить горизонтально и вертикально.

Контрольные примеры

N = 1
A = 
1
Result: True
----------------
N = 3
A = 
1 1 1
2 2 3
Result: True
----------------
N = 4
A = 
1 1 1
2 2 3
Result: False
----------------
N = 3
A = 
3 2 3 4 2 1
4 1 4 2 4 2
4 2 3 3 4 1
1 1 2 2 3 4
3 2 3 1 3 1
1 1 2 2 3 4
Result: True
----------------
N = 1
A = 
5 2 3 8
Result: True
----------------
N = 3
111   23  12    6
111   53   2    5
112  555   5  222
Result: False
----------------
N = 2
 4  2  6  2  1  5
 2  3  3  3  3  3
11 34  4  2  9  7
Result: True

Пояснения это всегда хорошо :)


5
Вы, кажется, любите матрицы.
— Okx

4
Ну, я парень из MATLAB ... Оратор из Mat rix Lab =)
— Стьюи Гриффин,

Достаточно ли вернуть истинное / ложное значение?
— Деннис

@ Денис, конечно :)
— Стьюи Гриффин

5
Раздражает, потому что вы парень из Matlab, вы делаете задачи, которые кажутся простыми в MATLAB, но имеют небольшой поворот, который исключает очевидное решение ...
— Sanchises

Ответы:


7

Шелуха , 9 байт

≤▲mLṁgS+T

Принимает 2D массив и число, возвращает 0 ложные экземпляры и положительное число для истинных. Попробуйте онлайн!

объяснение

Husk - это функциональный язык, поэтому программа представляет собой просто набор из нескольких функций.

≤▲mLṁgS+T
        T  Transpose the array
      S+   and concatenate with original.
           We get a list of the rows and columns of the input array.
    ṁ      Map and concatenate
     g     grouping of equal consecutive elements.
           This gives all consecutive runs on rows and columns.
  mL       Map length over the runs,
 ▲         take the maximum of the results
≤          and see if it's at least the second input.

5

Dyalog APL, 27 25 23 байта

{1∊∊⍷∘⍵¨(⊢,⍪¨)⍺/¨⍳⌈/∊⍵}

Попробуйте онлайн!

Благодаря @MartinEnder и @Zgarb за -2 байта каждый (композиция устраняет необходимость использования w бессмысленные парены)

Оповестите меня, если есть какие-либо проблемы и / или байты в гольфе. Левый аргумент N , правый аргумент .

Объяснение:

{1∊∊⍷∘⍵¨(⊢,⍪¨)⍺/¨⍳⌈/∊⍵}
                     ⍵    - Right argument
                    ∊     - Flatten the array
                 ⍳⌈/      - 1 ... the maximum (inclusive)
              ⍺/¨         - Repeat each item ⍺ (left argument) times.
        (⊢,⍪¨)            - Argument concatenated with their transposes.
    ⍷∘⍵¨                  - Do the patterns occur in ⍵?
   ∊                      - Flatten (since we have a vector of arrays)
 1∊                       - Is 1 a member?
{                     }   - Function brackets

4

Perl 6 , 60 байт

{(@^m|[Z,] @^m).map(*.rotor($^n=>$^n-1).map({[==] $_}).any)}

Попробуйте онлайн!

  • @^mявляется входной матрицей (первый аргумент) и $^nявляется количеством последовательных вхождений для проверки (второй аргумент).
  • [Z,] @^m транспонирование входной матрицы
  • (@^m | [Z,] @^m)является или соединением входной матрицы и ее транспонирования. Следующее mapоценивает истинное значение, если $^nпоследовательные равные значения встречаются в любой строке инвоканта. Применительно к входной матрице ИЛИ ее транспонированию, он оценивает истинное значение, если либо входная матрица, либо ее транспонирование содержат $^nпоследовательные равные значения в любой строке; если транспонирование удовлетворяет этому условию, это означает, что входная матрица имеет$^n последовательные равные значения в одном из своих столбцов.
  • *.rotor($^n => $^n - 1)превращает каждую строку в последовательность $^nсрезов -элементов. Например, если $^n3 и строка есть <1 2 2 2 3>, это оценивается как (<1 2 2>, <2 2 2>, <2 2 3>).
  • .map({ [==] $_ })превращает каждый срез в логическое значение, которое указывает, равны ли все элементы среза. Продолжая предыдущий пример, это становится (False, True, False).
  • .any превращает эту последовательность логических значений в ор-соединение, что является правдой, если любое из логических значений истинно.

Вывод является истинным значением или значением j-junction, которое истинно, если либо входная матрица, либо ее транспонирование имеют ЛЮБУЮ строку, в которой $^nпоследовательные значения равны.


4

MATL , 12 байт

t!YdY'wg)>~a

Попробуйте онлайн! Или проверьте все тестовые случаи .

объяснение

Неквадратная матрица не может быть надлежащим образом соединена с ее транспонированием, ни вертикально, ни горизонтально. Таким образом, код объединяет их по диагонали , создавая блок-диагональную матрицу.

Результирующая матрица линеаризуется в главном порядке столбцов и кодируется по длине серии. Нули, полученные в результате конкатенации блок-диагональ, служат для выделения серий фактических значений.

Результаты кодирования длин серий представляют собой массив значений и массив длин серий. Длина пробега, соответствующая ненулевым значениям, сохраняется. Выходные данные - 1если некоторые из этих длин больше или равны входному номеру, и 0иначе.

Давайте посмотрим на промежуточные результаты, чтобы прояснить ситуацию. Рассмотрим вход

[10 10 10;
 20 20 30]

и

3

Диагональная матрица блока, содержащая входную матрицу и ее транспонирование (код t!Yd):

10 10 10  0  0
20 20 30  0  0
 0  0  0 10 20
 0  0  0 10 20
 0  0  0 10 30

Эта матрица неявно линеаризована в главном порядке столбцов (вниз, затем поперек):

10 20  0  0  0 10 20  0  0  0 10 30  0  0  0  0  0 10 10 10  0  0 20 20 30

Кодирование длин серий (код Y') дает следующие два вектора (показаны здесь как векторы строк; на самом деле это векторы столбцов): вектор со значениями

10 20  0 10 20  0 10 30  0 10  0 20 30

и вектор с длинами пробега

1 1 3 1 1 3 1 1 5 3 2 2 1

Сохранение только длин, соответствующих ненулевым значениям (код wg)), дает

1 1 1 1 1 1 3 2 1

Сравнение, чтобы увидеть, какая длина больше или равна входному числу (коду >~), дает вектор

0 0 0 0 0 0 1 0 0

Наконец, вывод должен быть true(показан как 1), если указанный выше вектор содержит хотя бы trueзапись (код a). В этом случае результат

1

4

Октава, 77 70 байт

@(A,N)any(([x y]=runlength([(p=padarray(A,[1 1]))(:);p'(:)]))(!!y)>=N)

Попробуйте онлайн!

Объяснение: Поскольку матрица содержит только ненулевые целые числа, мы можем добавить границу 0 вокруг матрицы и вычислить кодировку по длине прогона матрицы (преобразованной в вектор).

@(A,N)any(([x y]=runlength([(p=padarray(A,[1 1]))(:);p'(:)]))(!!y)>=N)
                             p=padarray(A,[1 1])                        % add a border of 0s around the matrix 
                            (                   )(:)                    % reshape the matrix to a column vector
                                                     p'(:)              % transpose of the matrix reshaped to a column vector
                           [                        ;     ]             % concatenate two vectors vertically
           [x y]=runlength(                                )            % runlength encoding of the vector[x=count,y=value]
          (                                                 )           % take x,counts.
                                                             (!!y)      % extrect those counts that their valuse aren't 0
      any(                                                        >=N)  % if we have at least a count that is greater than or equal to N                                                              

3
Мне действительно нравятся ваши решения (не только это), но они могут определенно извлечь выгоду из некоторых объяснений! :) Я не знал, что у Октавы runlength... Учиться чему-то новому каждый день ...
— Стьюи Гриффин,

Спасибо, что напомнили мне о runlength! Будучи более сосредоточенным на Matlab, я не помню, что существовало в Octave
— Луис Мендо

@ StewieGriffin Спасибо, ответ обновился после пробуждения!
— rahnema1

@LuisMendo После одного из ваших сообщений мне стало известно о функции с именем runlength.
— rahnema1

4

Желе , 9 8 байт

;ZjṡƓE€S

Принимает матрицу в качестве аргументов и читает целое число из STDIN.

Попробуйте онлайн!

Как это устроено

;ZjṡƓE€S  Main link. Argument: M (matrix / row array)

 Z        Zip/transpose M.
;         Concatenate the row array with the column array.
  j       Join the rows and columns, separating by M.
    Ɠ     Read an integer n from STDIN.
   ṡ      Split the result to the left into overlapping slices of length 2.
     E€   Test the members of each resulting array for equality.
       S  Take the sum.

Пример запуска

;ZjṡƓE€S  Argument: [[1, 2], [3, 2]]. STDIN: 2

 Z        [[1, 3], [2, 2]]

;         [[1, 2], [3, 2], [1, 3], [2, 2]]

  j       [1, 2, [1, 2], [3, 2], 3, 2, [1, 2], [3, 2], 1, 3, [1, 2], [3, 2], 2, 2]

    Ɠ     2

   ṡ      [[1, 2],             [2, [1, 2]],        [[1, 2], [3, 2]],   [[3, 2], 3],
           [3, 2],             [2, [1, 2]],        [[1, 2], [3, 2]],   [[3, 2], 1],
           [1, 3],             [3, [1, 2]],        [[1, 2], [3, 2]],   [[3, 2], 2],
           [2, 2]                                                                 ]

     E€   [     0,                       0,                       0,             0,
                0,                       0,                       0,             0,
                0,                       0,                       0,             0,
                1                                                                 ]

       S  1

У меня была такая же идея ;Z, хотя в Джапте, а не в желе ...
— ETHproductions

Теперь я понимаю, почему вы спросили о истинных / ложных ценностях . Это определение в Jelly было вдохновлено MATLAB (или MATL), не так ли?
— Стьюи Гриффин

Нет, Jelly использует условные выражения Python для внутреннего использования. ȦАтом был вдохновлен MATL хотя.
— Деннис

О, хорошо, мое было слишком долго>. <Правильно, Eвстроенный был способ сделать это. Приятно :)
— HyperNeutrino

3

Python 2 , 60 92 91 байт

def f(n,x):x=[map(str,i)for i in x];print any(`[i]*n`[1:-1]in`x+zip(*x)`for i in sum(x,[]))

Попробуйте онлайн!

Вместо подсчета nгенерируется список с размером (для каждого элемента в матрице) и проверяется, находится ли он в матрице

Без строк, 94 байта

lambda n,x:any((e,)*n==l[i:i+n]for l in x+zip(*x)for i in range(len(l)-n+1)for e in sum(x,()))

Попробуйте онлайн!


Я думаю, что это может дать ложные срабатывания с многозначными числами.
— xnor

@xnor там, исправлено
— Род


3

Japt , 18 15 14 байтов

cUy)d_ò¦ d_ʨV

Проверь это

  • 3 байта сохранены с помощью ETHproductions.

объяснение

    :Implicit input of 2D array U and integer V
c   :Append to U...
Uy  :U transposed.
d   :Check if any of the elements (sub-arrays) in U return true when...
_   :Passed through a function that...
ò   :Partitions the current element by...
¦   :Checking for inequality.
d   :Check if any of the partitions return true when...
_   :Passed through a function that checks if...
Ê   :The length of the current element...
¨V  :Is greater than or equal to V.
    :Implicit output of resulting boolean.

1
Ого, я не видела этого до публикации моего. Вы можете сохранить 2 байта с cUy)®ò¦ d_l ¨V\nd, а другой с cUy)d_ò¦ d_l ¨V, и тогда у вас практически есть мое (удаленное) решение.
— ETHproductions

Ха-Ха; великие умы ..., @ETHproductions :) Я в шоке Я был самым быстрым пальцем после того, как obarakon бить меня весь день сегодня! Спасибо за эти советы, уже заметил один, но еще нет.
— Лохматый

2

CJam , 16 байтов

q~_z+N*e`:e>0=>!

Попробуйте онлайн!

объяснение

q~    e# Read and eval input.
_z+   e# Append the matrix's transpose to itself.
N*    e# Join with linefeeds to flatten without causing runs across rows.
e`    e# Run-length encode.
:e>   e# Get maximum run (primarily sorted by length).
0=    e# Get its length.
>!    e# Check that it's not greater than the required maximum.

Я всегда задавался вопросом, почему RLE CJam дает длину пробега, а затем значение. Ну, это оказывается полезным здесь :-)
— Луис Мендо

@ LuisMendo Я думаю, потому что вы бы так сказали «3 a, 5 b, 2 c». Я на самом деле считаю этот заказ полезным довольно часто.
— Мартин Эндер

На самом деле, runlengthфункция Octave также выводит данные в этом порядке. Но почему-то я чувствую порядок value, lengthболее естественным
— Луис Мендо

2

Python 3 , 129 128 125 120 104 101 байт

Огромное спасибо @Zachary T, @Stewie Griffin, @Mr. Xcoder, @Rod, @totallyhuman за много улучшений.

def f(n,m):
 a=b=c=0;m+=zip(*m)
 for r in m:
  for i in r:b,a=[1,b+1][a==i],i;c=max(c,b)
 return n<=c

Попробуйте онлайн!


Вам не нужно пространство между 1и if.
— Захари

Сохраните четыре байта, заменив a=b;b=0;c=0наa=b=c=0
— Mr. Xcoder

(Я не уверен), но я думаю, что вы могли бы использовать m+zip(*m)вместо этого mна 4-й строке и полностью отбросить 1-ю строку, переместив ее n<=max()на последнюю строку какn<=c
— Rod


Вместо b=b+1использования b+=1... Ах, Ninja'd @StewieGriffin
— Mr. Xcoder

2

05AB1E , 16 14 12 байт

Døìvyγ€gM²‹_

Попробуйте онлайн!

Dø           # Duplicate the input and transpose one copy
  ì          # Combine the rows of both matrixes into one array
   vy        #   For each row...
     γ       #     Break into chunks of the same element
      €g     #     get the length of each chunk
        M    #     Get the largest length so far
         ²‹_ #     Check if that is equal to or longer than required

1
@MagicOctopusUrn Я не уверен, что ты имеешь в виду. Этот пример имеет 3 последовательных 0s во втором ряду, так что это должно быть правдой.
— Райли

@MagicOctopusUrn Если вы прервете этот прогон (TIO), он вернет false.
— Райли

Разве третья команда не объединяет транспонированные строки с исходными?
— Волшебная Урна Осьминога

Кроме того, я думал, что он должен возвращать true только для 3, когда есть [3,3,3]. Я неправильно понял вызов в этом случае, поэтому я думаю, что я не прав здесь.
— Волшебная урна осьминога

@MagicOctopusUrn Первые 3 команды создадут массив, содержащий каждую строку и каждый столбец в виде отдельных элементов.
— Райли

1

Желе , 18 байт

ŒrFUm2<⁴$ÐḟL
ZÇo³Ç

Попробуйте онлайн!

ŒrFUm2<⁴$ÐḟL  Helper Link
Œr            Run-length encode
  F           Flatten the whole thing, giving the numbers in the odd indices and the lengths of the runs in the even indices
   U          Reverse
    m2        Take every other element (thus only keeping the run lengths)
         Ðḟ   Discard the elements that are
      <⁴$                                   less than the required run length
           L  And find the length
ZÇo³Ç         Main Link
Z             Zip the matrix
 Ç            Call the helper link on it
   ³Ç         Call the helper link on the original matrix
  o           Are either of these truthy?

Возвращает 0для ложного и ненулевого целого для правды.

Фу, это плохо. И очень долго. Гольф советы будут оценены :)


1

JavaScript (ES6), 99 байт

Принимает матрицу mи ожидаемое количество вхождений nв синтаксисе карри (m)(n). Возвращает логическое значение.

m=>n=>[',',`(.\\d+?){${m[0].length-1}}.`].some(s=>m.join`|`.match(`(\\b\\d+)(${s}\\1){${n-1}}\\b`))

Как?

Этот код не очень короткий, но я хотел попробовать подход, основанный исключительно на регулярных выражениях.

Преобразование матрицы в строку

Мы используем m.join('|') для преобразования 2D-массива в строку. Это сначала вызывает неявное приведение строк матрицы к разделенным запятыми строкам.

Например, этот вход:

[
  [ 1, 2, 3 ],
  [ 4, 5, 6 ]
]

будет преобразован в:

"1,2,3|4,5,6"

Соответствие строк

Мы ищем последовательные вхождения в строке с:

/(\b\d+)(,\1){n-1}\b/

Это соответствует:

  • \b граница слова
  • \d+ с последующим номером
  • (){n-1}следуют n-1 раз:
    • , запятая
    • \1 сопровождаемый нашей ссылкой: граница слова + первое число
  • \b сопровождается границей слова

Сопоставление столбцов

Мы ищем последовательные вхождения в столбце с:

/(\b\d+)((.\d+?){L-1}.\1){n-1}\b/

где L длина строки.

Это соответствует:

  • \b граница слова
  • \d+ с последующим номером
  • (){n-1}следуют n-1 раз:
    • (){L-1} L-1 раз:
      • . любой символ (в действительности: запятая или труба)
      • \d+? с последующим номером (этот должен быть не жадным)
    • . сопровождаемый любым символом (снова: или запятая или труба)
    • \1 сопровождаемый нашей ссылкой: граница слова + первое число
  • \b сопровождается границей слова

Контрольные примеры



0

Clojure, 77 байт

#((set(for[I[%(apply map vector %)]i I p(partition %2 1 i)](count(set p))))1)

Создает все последовательные разделы pдлины N(символа %2) и подсчитывает, сколько у него различных значений. Затем он формирует набор этих длин и возвращает, 1если он найден из набора, и в nilпротивном случае. forконструкция была идеально подходит для этого, использовали мой первоначальный попытка flatten, concatили что - то из этого короткого замыкания.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.