Чи є в матриці 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 oratori = =)
Стюі Гріффін

Чи достатньо повернути значення фальшивої / хибної?
Денніс

@ Денніс звичайно :)
Стюі Гріффін

5
Дратівливо, тому що ви хлопець Matlab, ви робите проблеми, які здаються легкими в MATLAB, але мають невеликий поворот, що виключає очевидне рішення ...
Sanchises

Відповіді:


7

Лушпиння , 9 байт

≤▲mLṁgS+T

Бере 2D масив і число, повертає 0для фальшивих екземплярів і додатне число для правдивих екземплярів. Спробуйте в Інтернеті!

Пояснення

Лушпиння - це функціональна мова, тому програма - це лише композиція з кількох функцій.

≤▲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

Діялог 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-елементних фрагментів. Наприклад, якщо $^nє 3, а рядок є <1 2 2 2 3>, це оцінюється до (<1 2 2>, <2 2 2>, <2 2 3>).
  • .map({ [==] $_ })перетворює кожен фрагмент в булевий, який вказує, чи рівні елементи фрагмента рівні. Продовжуючи попередній приклад, це стає (False, True, False).
  • .any перетворює цю послідовність булевих в перехід або перехід, який є триатюрним, якщо будь-який із булевих істин.

Вихід - це значення "truthy" або "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)

Спробуйте в Інтернеті!

Пояснення: Оскільки матриця містить лише ненульові цілі числа, ми можемо додати межу 0s навколо матриці та обчислити кодування довжини пробігу матриці (перероблено на вектор)

@(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! Будучи більш зосередженим на Матлабі, я не пам'ятав, що існувало в Октаві
Луїс Мендо

@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, хоча в Japt, а не в Jelly ...
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 там, виправлено
Rod


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 :) Я шокований, що я був найшвидшим пальцем після того, як сьогодні цілий день бив мене Обаракон! Дякуємо за ці поради, один уже помітив, а іншого ще не.
Кудлатий

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's, 5 b's, 2 c's". Я фактично вважаю це замовлення корисним досить часто.
Мартін Ендер

Власне, 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.
Zacharý

Збережіть чотири байти, замінивши a=b;b=0;c=0зa=b=c=0
г Xcoder

(Я не впевнений), але я думаю, що ви можете використовувати m+zip(*m)натомість m4-й рядок і повністю скинути перший рядок, перемістивши n<=max()до останнього рядка якn<=c
Rod


Замість b=b+1використання b+=1... Ааа, Ninja'd від @StewieGriffin
Містер 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), він поверне помилковий.
Райлі

Чи не третя команда поєднує перенесені рядки з початковими рядками?
Чарівна урна восьминога

Крім того, я подумав, що він повинен повернути істину лише за 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.