Есть ли 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.