Bir matristeki bir satır / sütundaki sayının ardışık N sayısı var mı?


20

Pozitif tamsayılardan ve giriş olarak tek bir pozitif tamsayı N'den oluşan bir A matrisini alın ve matristeki herhangi bir satırda veya sütunda aynı sayının en az N ardışık tekrarlama olup olmadığını belirleyin .

Sadece yatay ve dikey olarak test yapmanız gerekir.

Test senaryoları

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

Açıklamalar her zaman iyi bir şeydir :)


5
Matrisleri seviyor gibisin.
Okx

4
Ben MATLAB'lı bir adamım ... Mat rix Lab oratory =)
Stewie Griffin

Doğru / yanlış bir değer döndürmek yeterli mi?
Dennis

@Dennis tabii ki :)
Stewie Griffin

5
Rahatsız edici bir şekilde, bir Matlab adamı olduğunuz için, MATLAB'da kolay görünen ancak bariz çözümü
dışlayan

Yanıtlar:


7

Kabuk , 9 bayt

≤▲mLṁgS+T

Bir 2D dizi ve bir sayı alır, 0yanlış örnekler için döner ve gerçek örnekler için pozitif bir sayı döndürür . Çevrimiçi deneyin!

açıklama

Kabuğu fonksiyonel bir dildir, bu nedenle program sadece birkaç fonksiyonun bir bileşimidir.

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

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

Çevrimiçi Deneyin!

Her biri -2 baytlık @MartinEnder ve @Zgarb sayesinde (kompozisyon kullanım ihtiyacını wve anlamsız ebeveynleri ortadan kaldırır )

Golf için herhangi bir sorun ve / veya bayt varsa beni uyar. Sol argümanı N , sağ argümanı bir .

Açıklama:

{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 bayt

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

Çevrimiçi deneyin!

  • @^mgirdi matrisidir (birinci bağımsız değişken) ve $^nkontrol edilecek ardışık tekrarların sayısıdır (ikinci bağımsız değişken).
  • [Z,] @^m girdi matrisinin devrikidir.
  • (@^m | [Z,] @^m)"Giriş matrisi" ve "devri" nin bir ya da kesişim noktasıdır. Aşağıda , invokantın herhangi bir satırında art arda eşit değerler meydana gelirse mapdoğruluk değeri değerlendirilir $^n. Girdi matrisine VEYA onun devriye uygulandığında, ya girdi matrisi ya da devriyesi $^nherhangi bir satırda ardışık eşit değerler içeriyorsa doğru bir değer olarak değerlendirilir ; devrik bu koşulu karşılıyorsa, giriş matrisinin $^nsütunlarından birinde ardışık eşit değerlere sahip olduğu anlamına gelir .
  • *.rotor($^n => $^n - 1)her satırı $^n-element dilimleri dizisine dönüştürür . Örneğin $^n, 3 ve bir satır ise <1 2 2 2 3>, bu olarak değerlendirilir (<1 2 2>, <2 2 2>, <2 2 3>).
  • .map({ [==] $_ })her dilimi, dilimin tüm öğelerinin eşit olup olmadığını gösteren bir boole değerine dönüştürür. Önceki örneğe devam edersek bu olur (False, True, False).
  • .any boolean dizisini, booleanlardan herhangi biri doğru olduğunda doğrudur.

Çıktı, giriş matrisi VEYA onun transpozisyonunun $^nardışık değerlerin eşit olduğu HERHANGİ BİR satırı varsa doğrudur .


4

MATL , 12 bayt

t!YdY'wg)>~a

Çevrimiçi deneyin! Veya tüm test senaryolarını doğrulayın .

açıklama

Kare olmayan bir matris, dikey veya yatay olarak transpozisyonuna uygun şekilde birleştirilemez. Böylece kod , blok-diyagonal bir matris oluşturarak bunları çapraz olarak birleştirir .

Sonuçta elde edilen matris, kolon-major düzeninde doğrusallaştırılır ve çalışma uzunluğu kodlanır. Blok-diyagonal birleşimden kaynaklanan sıfırlar, gerçek değerlerin çalışmalarını izole etmeye yarar.

Çalışma uzunluğu kodlamasından elde edilen sonuçlar bir değerler dizisi ve çalışma uzunlukları dizisidir. Sıfır olmayan değerlere karşılık gelen çalışma uzunlukları tutulur. Çıktı, 1bu uzunluklardan bazıları giriş numarasından büyük veya ona eşitse veya 0başka bir şekilde yapılır.

Daha net hale getirmek için ara sonuçları görelim. Girdileri düşünün

[10 10 10;
 20 20 30]

ve

3

Giriş matrisini ve onun geçişini (kodunu t!Yd) içeren blok köşegen matrisi :

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

Bu matris, sütun ana düzeninde (aşağı, sonra karşıya) örtük doğrusallaştırılmıştır:

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

Çalışma uzunluğu kodlaması (kod Y') aşağıdaki iki vektörü verir (burada satır vektörleri olarak gösterilir; aslında sütun vektörleridir): değerlere sahip vektör

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

ve çalışma uzunlukları ile vektör

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

Sadece sıfır olmayan değerlere (kod wg)) karşılık gelen uzunlukları korumak

1 1 1 1 1 1 3 2 1

Hangi uzunlukların giriş numarasından (kod >~) büyük veya ona eşit olduğunu görmek için karşılaştırma vektör

0 0 0 0 0 0 1 0 0

Son olarak, yukarıdaki vektör en azından bir giriş (kod ) içeriyorsa , çıkış true(olarak gösterilmelidir ) olmalıdır. Bu durumda sonuç1truea

1

4

Oktav, 77 70 bayt

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

Çevrimiçi deneyin!

Açıklama: Bu matris yalnızca sıfır olmayan tamsayılar içerdiğinden, matrisin etrafına 0'lık bir kenarlık ekleyebilir ve matrisin çalışma uzunluğu kodlamasını hesaplayabiliriz (bir vektörle yeniden şekillendirilir)

@(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
Çözümlerinizi gerçekten seviyorum (sadece bu değil), ama bazı açıklamalardan kesinlikle faydalanabilirler! :) Octave'nin bilmediğini bilmiyordum runlength... Her gün yeni bir şeyler öğren ...
Stewie Griffin

Bana hatırlattığın için teşekkürler runlength! Matlab'a daha fazla odaklanmak, Octave'de var olduğunu hatırlamıyordum
Luis Mendo

@StewieGriffin Teşekkürler, cevap uyandıktan sonra güncellendi!
rahnema1

@LuisMendo Gönderilerinizden sonra adlı bir işlevin farkına vardım runlength.
rahnema1

4

Jöle , 9 8 bayt

;ZjṡƓE€S

Matrisi argüman olarak alır ve STDIN'den tamsayıyı okur.

Çevrimiçi deneyin!

Nasıl çalışır

;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.

Örnek çalışma

;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

;ZJelly ile değil Japt de olsa aynı fikri vardı ...
ETHproductions 27:17

Şimdi neden doğruluk / sahtelik değerleri sorduğunuzu görüyorum . Jelly'deki bu tanım MATLAB (veya MATL) 'den esinlenerek değil mi?
Stewie Griffin

Hayır, Jelly dahili olarak Python'un koşullarını kullanır. Yine de Ȧatom MATL'den ilham aldı.
Dennis

Ah benimki çok uzundu> <Doğru, Eyerleşik olan bunu yapmanın yoluydu. Güzel :)
HyperNeutrino

3

Python 2 , 60 92 91 bayt

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,[]))

Çevrimiçi deneyin!

Sayım yerine, boyutta bir liste n(matristeki her öğe için) oluşturulur ve matriste olup olmadığını kontrol eder

Dizgisiz, 94 bayt

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,()))

Çevrimiçi deneyin!


Bunun çok basamaklı sayılarla yanlış pozitifler verebileceğini düşünüyorum.
xnor

@xnor orada, sabit
Çubuk


3

Japt , 18 15 14 bayt

cUy)d_ò¦ d_ʨV

Dene

  • ETHproductions'ın yardımı ile 3 bayt kaydedildi.

açıklama

    :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
Oh vay be, benimkini göndermeden önce bunu görmedim. İle 2 bayt cUy)®ò¦ d_l ¨V\ndve başka bir ile kaydedebilirsiniz cUy)d_ò¦ d_l ¨Vve sonra pratikte (silinmiş) çözümüm var.
ETHproductions

Ha-Ha; büyük beyinler ..., @ETHproductions :) Obarakon bugün bütün gün beni dövdükten sonra en hızlı parmağım şok oldu! Bu ipuçları için teşekkürler, bir tanesini daha önce fark ettim ama henüz değil.
Shaggy

2

CJam , 16 bayt

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

Çevrimiçi deneyin!

açıklama

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.

Her zaman CJam'ın RLE'nin neden çalışma uzunluğu, sonra değer verdiğini merak ettim. Burada yararlı olduğu ortaya çıkıyor :-)
Luis Mendo

@LuisMendo Sanırım çünkü bunu "3 a's, 5 bs, 2 c's" şeklinde söylerdiniz. Aslında bu siparişi oldukça sık buluyorum.
Martin Ender

Aslında Octave runlengthişlevi çıktıları da bu sırayla verir. Ama bir şekilde düzeni value, lengthdaha doğal hissediyorum
Luis Mendo

2

Python 3 , 129 128 125 120 104 101 bayt

@Zachary T, @Stewie Griffin, @Mr. Xcoder, @Rod, @totallyhuman bunu çok geliştirdiği için.

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

Çevrimiçi deneyin!


Sen arasına boşluk gerekmez 1ve if.
Zacharý

Değiştirerek dört bayt kaydet a=b;b=0;c=0ilea=b=c=0
Sn Xcoder

(Emin değilim) ama m+zip(*m)bunun yerine m4. hatta kullanabileceğinizi ve tamamen 1. çizgiyi bırakabileceğinizi n<=max()ve son çizgiyen<=c
Rod


Yerine b=b+1kullanımı b+=1... Ahh, @StewieGriffin tarafından Ninja'd
Sn Xcoder

2

05AB1E , 16 14 12 bayt

Døìvyγ€gM²‹_

Çevrimiçi deneyin!

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 Ne demek istediğinden emin değilim. Bu örnek, 0ikinci sırada 3 ardışık s içerir, bu yüzden doğru olmalıdır.
Riley

@MagicOctopusUrn Bu çalıştırmayı (TIO) ayırırsanız false değerini döndürür.
Riley

Üçüncü komut, aktarılan satırları orijinal satırlarla birleştirmez mi?
Sihirli Ahtapot Urn

Ayrıca, sadece 3 olduğunda doğru dönmesi gerektiğini düşündüm [3,3,3] . Bu durumda meydan okumayı yanlış okudum, bu yüzden burada yanıldığımı düşünüyorum.
Sihirli Ahtapot Urn

@MagicOctopusUrn İlk 3 komut, her satırı ve her sütunu ayrı ayrı öğeler olarak içeren bir dizi oluşturur.
Riley

1

Jöle , 18 bayt

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

Çevrimiçi deneyin!

Œ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?

İade 0 yanlış ve truthy için sıfır olmayan bir tamsayı için.

Ew, bu kötü. Ve çok uzun. Golf ipuçları mutluluk duyacağız :)


1

JavaScript (ES6), 99 bayt

Matris mve nköri sözdiziminde beklenen olay sayısını alır(m)(n) . Bir boole döndürür.

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

Nasıl?

Bu kod özellikle kısa değil, ama sadece düzenli ifadelere dayanan bir yaklaşım denemek istedim.

Matrisin bir dizeye dönüştürülmesi

Kullanırız m.join('|')2D diziyi bir dizeye dönüştürmek için . Bu, ilk olarak matris satırlarının virgülle ayrılmış dizelere örtük bir zorlamasına neden olur.

Örneğin, bu girdi:

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

dönüştürülecek:

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

Satır eşleme

Birbirini takip eden olayları ardarda arıyoruz:

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

Bu eşleşiyor:

  • \b bir kelime sınırı
  • \d+ ardından bir sayı
  • (){n-1}takip edilen n-1 kez :
    • , bir virgül
    • \1 ardından referansımız: bir kelime sınırı + ilk sayı
  • \b ardından bir kelime sınırı

Sütun eşleme

Bir sütunda art arda tekrarlar ararız:

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

burada Lbir satır uzunluğudur.

Bu eşleşiyor:

  • \b bir kelime sınırı
  • \d+ ardından bir sayı
  • (){n-1}n-1 kez takip etti :
    • (){L-1} L-1 kez:
      • . herhangi bir karakter (aslında: virgül ya da kanal)
      • \d+? ardından bir sayı (bu, açgözlü olmamalıdır)
    • . ardından herhangi bir karakter (yine: virgül veya dikey çizgi)
    • \1 ardından referansımız: bir kelime sınırı + ilk sayı
  • \b ardından bir kelime sınırı

Test senaryoları



0

Clojure, 77 bayt

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

Art arda tüm puzunluk bölümlerini N(sembol %2) oluşturur ve kaç farklı değere sahip olduğunu sayar. Daha sonra bu uzunlukların 1setini oluşturur ve setten ve nilbaşka bir şekilde bulunursa geri döner . foryapı bunun için mükemmel uyum, benim orijinal girişimi kullanıldı flatten, concatya bu kısa bir şey.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.