Có N lần xuất hiện liên tiếp của một số trong một hàng / cột trong ma trận không?


20

Lấy một ma trận A bao gồm các số nguyên dương và một số nguyên dương N duy nhất làm đầu vào và xác định xem có ít nhất N lần xuất hiện liên tiếp của cùng một số trong bất kỳ hàng hoặc cột nào trong ma trận hay không.

Bạn chỉ cần kiểm tra theo chiều ngang và chiều dọc.

Các trường hợp thử nghiệm

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

Giải thích luôn luôn là một điều tốt :)


5
Bạn có vẻ thích ma trận.
Okx

4
Chà, tôi là một chàng trai MATLAB ... Nhà hát Mat rix Lab =)
Stewie Griffin

Là đủ để trả về một giá trị trung thực / giả?
Dennis

@Dennis tất nhiên :)
Stewie Griffin

5
Khó chịu, vì bạn là một chàng trai Matlab, bạn thực hiện những thử thách có vẻ dễ dàng trong MATLAB nhưng có một chút thay đổi để loại bỏ giải pháp rõ ràng ...
Sanchise

Câu trả lời:


7

Husk , 9 byte

≤▲mLṁgS+T

Lấy một mảng 2D và một số, trả về 0cho các trường hợp giả và một số dương cho các trường hợp trung thực. Hãy thử trực tuyến!

Giải trình

Husk là một ngôn ngữ chức năng, vì vậy chương trình chỉ là một thành phần của một số chức năng.

≤▲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 Dyalog, 27 25 23 byte

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

Dùng thử trực tuyến!

Cảm ơn @MartinEnder và @Zgarb cho mỗi byte 2 byte (thành phần loại bỏ nhu cầu sử dụng wvà các parens vô nghĩa)

Thông báo cho tôi nếu có bất kỳ vấn đề và / hoặc byte cho golf. Lập luận trái là N , lập luận đúng là Một .

Giải trình:

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

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

Hãy thử trực tuyến!

  • @^mlà ma trận đầu vào (đối số thứ nhất) và $^nlà số lần xuất hiện liên tiếp để kiểm tra (đối số thứ hai).
  • [Z,] @^m là chuyển vị của ma trận đầu vào.
  • (@^m | [Z,] @^m)là một điểm nối của ma trận đầu vào và chuyển vị của nó. Sau đây mapđánh giá một giá trị trung thực nếu $^ncác giá trị bằng nhau liên tiếp xảy ra trong bất kỳ hàng nào của người yêu cầu. Áp dụng cho ma trận đầu vào HOẶC chuyển vị của nó, nó ước tính thành một giá trị trung thực nếu ma trận đầu vào hoặc chuyển vị của nó chứa $^ncác giá trị bằng nhau liên tiếp trong bất kỳ hàng nào; nếu chuyển vị đáp ứng điều kiện đó, điều đó có nghĩa là ma trận đầu vào có $^ncác giá trị bằng nhau liên tiếp trong một trong các cột của nó.
  • *.rotor($^n => $^n - 1)biến mỗi hàng thành một chuỗi các $^nlát cắt. Ví dụ: nếu $^nlà 3 và một hàng là <1 2 2 2 3>, điều này ước tính (<1 2 2>, <2 2 2>, <2 2 3>).
  • .map({ [==] $_ })biến mỗi lát cắt thành một boolean cho biết liệu tất cả các phần tử của lát cắt có bằng nhau hay không. Tiếp tục ví dụ trước, điều này trở thành (False, True, False).
  • .any biến chuỗi booleans đó thành một ngã ba hoặc đó là sự thật nếu bất kỳ booleans nào là đúng.

Đầu ra là một giá trị trung thực hoặc tiếp giáp, điều này đúng nếu ma trận đầu vào HOẶC chuyển vị của nó có hàng BẤT K where trong đó $^ncác giá trị liên tiếp bằng nhau.


4

MATL , 12 byte

t!YdY'wg)>~a

Hãy thử trực tuyến! Hoặc xác minh tất cả các trường hợp thử nghiệm .

Giải trình

Một ma trận không vuông không thể được nối chính xác với chuyển vị của nó, theo chiều dọc hoặc chiều ngang. Vì vậy, mã nối chúng theo đường chéo , bằng cách tạo một ma trận khối chéo.

Ma trận kết quả được tuyến tính hóa theo thứ tự chính cột và mã hóa chiều dài chạy. Các số không do kết hợp khối chéo chéo phục vụ để cô lập các hoạt động của các giá trị thực tế.

Các kết quả từ mã hóa độ dài chạy là một mảng các giá trị và một mảng các độ dài chạy. Độ dài chạy tương ứng với các giá trị khác không được giữ nguyên. Đầu ra là 1nếu một số độ dài đó lớn hơn hoặc bằng số đầu vào, và 0nếu không.

Chúng ta hãy xem kết quả trung gian để làm cho nó rõ ràng hơn. Xem xét đầu vào

[10 10 10;
 20 20 30]

3

Ma trận đường chéo khối chứa ma trận đầu vào và chuyển vị (mã t!Yd) của nó là:

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

Ma trận này được ngầm định tuyến tính theo thứ tự chính cột (xuống, sau đó qua):

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

Mã hóa độ dài chạy (mã Y') cho hai vectơ sau (được hiển thị ở đây dưới dạng vectơ hàng; thực ra chúng là vectơ cột): vectơ có giá trị

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

và vector với độ dài chạy

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

Chỉ giữ độ dài tương ứng với các giá trị khác không (mã wg)) mang lại

1 1 1 1 1 1 3 2 1

So sánh để xem độ dài nào lớn hơn hoặc bằng số đầu vào (mã >~) tạo ra vectơ

0 0 0 0 0 0 1 0 0

Cuối cùng, đầu ra phải là true(hiển thị dưới dạng 1) nếu vectơ trên chứa ít nhất một truemục (mã a). Trong trường hợp này kết quả là

1

4

Octave, 77 70 byte

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

Hãy thử trực tuyến!

Giải thích: Vì ma trận tha chỉ chứa các số nguyên khác không, chúng ta có thể thêm đường viền 0 xung quanh ma trận và tính toán mã hóa runlength của ma trận (được định hình lại thành một vectơ)

@(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
Tôi thực sự thích các giải pháp của bạn (không chỉ giải pháp này), nhưng chúng chắc chắn có thể được hưởng lợi từ một số giải thích! :) Tôi không biết Octave đã runlength... Học một cái gì đó mới mỗi ngày ...
Stewie Griffin

Cảm ơn đã nhắc nhở tôi về runlength! Tập trung hơn vào Matlab, tôi không nhớ rằng nó đã tồn tại trong Octave
Luis Mendo

@StewieGriffin Cảm ơn, câu trả lời được cập nhật sau khi thức dậy!
rahnema1

@LuisMendo Sau một trong những bài đăng của bạn, tôi biết đến một chức năng có tên runlength.
rahnema1

4

Thạch , 9 8 byte

;ZjṡƓE€S

Lấy ma trận làm đối số và đọc số nguyên từ STDIN.

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

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

Chạy ví dụ

;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

Tôi đã có cùng một ý tưởng với ;Z, mặc dù trong Japt chứ không phải Jelly ...
ETHproductions

Bây giờ tôi thấy lý do tại sao bạn hỏi về giá trị trung thực / giả . Định nghĩa đó trong Jelly được lấy cảm hứng từ MATLAB (hay MATL) phải không?
Stewie Griffin

Không, Jelly sử dụng các điều kiện của Python trong nội bộ. Các Ȧnguyên tử được lấy cảm hứng từ MATL mặc dù.
Dennis

Ôi, cái của tôi đã quá dài>. <Phải, Edựng sẵn là cách để làm điều đó. Đẹp :)
HyperNeutrino

3

Python 2 , 60 92 91 byte

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

Hãy thử trực tuyến!

Thay vì đếm, một danh sách có kích thước n(cho mỗi phần tử trong ma trận) được tạo và kiểm tra nếu nó nằm trên ma trận

Không có chuỗi, 94 byte

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

Hãy thử trực tuyến!


Tôi nghĩ rằng điều này có thể cung cấp cho dương tính giả với số nhiều chữ số.
xnor

@xnor đó, đã sửa
Rod


3

Japt , 18 15 14 byte

cUy)d_ò¦ d_ʨV

Kiểm tra nó

  • 3 byte được lưu với một số trợ giúp từ ETHproductions.

Giải trình

    :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
Ồ wow, tôi đã không nhìn thấy điều này trước khi đăng bài của tôi. Bạn có thể lưu 2 byte với cUy)®ò¦ d_l ¨V\ndvà một byte khác cUy)d_ò¦ d_l ¨V, và sau đó bạn thực sự có giải pháp (đã xóa) của tôi.
Sản phẩm ETH

Hà Hà; những bộ óc tuyệt vời ..., @ETHproductions :) Tôi bị sốc Tôi là ngón tay nhanh nhất sau khi obarakon đánh tôi cả ngày hôm nay! Cảm ơn vì những lời khuyên đó, đã phát hiện ra một cái nhưng chưa phải cái khác.
Xù xì

2

CJam , 16 byte

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

Hãy thử trực tuyến!

Giải trình

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.

Tôi luôn tự hỏi tại sao RLE của CJam cho chiều dài, sau đó là giá trị. Chà, hóa ra nó có ích ở đây :-)
Luis Mendo

@LuisMendo Tôi đoán bởi vì đó là cách bạn nói "3 a, 5 b, 2 c". Tôi thực sự thấy thứ tự này hữu ích khá thường xuyên.
Martin Ender

Trên thực tế, runlengthchức năng của Octave cũng cung cấp đầu ra theo thứ tự đó. Nhưng bằng cách nào đó tôi cảm thấy trật value, lengthtự tự nhiên hơn
Luis Mendo

2

Python 3 , 129 128 125 120 104 101 byte

Rất cảm ơn @Zachary T, @Stewie Griffin, @Mr. Xcoder, @Rod, @totallyhuman để cải thiện điều này rất nhiều.

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

Hãy thử trực tuyến!


Bạn không cần một không gian giữa 1if.
Zacharý

Lưu bốn byte bằng cách thay thế a=b;b=0;c=0bằnga=b=c=0
Ông Xcoder

(Tôi không chắc chắn) nhưng tôi nghĩ rằng bạn có thể sử dụng m+zip(*m)thay thế mtrên dòng thứ 4 và thả hoàn toàn dòng thứ 1, di chuyển n<=max()đến dòng cuối cùng nhưn<=c
Rod


Thay vì b=b+1sử dụng b+=1... Ahh, Ninja'd của @StewieGriffin
Ông

2

05AB1E , 16 14 12 byte

Døìvyγ€gM²‹_

Hãy thử trực tuyến!

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 Tôi không chắc ý của bạn là gì. Ví dụ đó có 3 0s liên tiếp ở hàng thứ hai, vì vậy nó phải đúng.
Riley

@MagicOctopusUrn Nếu bạn chia tay lần chạy đó (TIO), nó sẽ trả về false.
Riley

Không phải lệnh thứ ba nối các hàng được chuyển sang các hàng ban đầu sao?
Bạch tuộc ma thuật Urn

Ngoài ra, tôi nghĩ rằng nó được cho là chỉ trả lại đúng cho 3 khi có [3,3,3]. Tôi đã đọc sai thử thách trong trường hợp đó, vì vậy tôi nghĩ rằng tôi đã sai ở đây.
Bạch tuộc ma thuật Urn

@MagicOctopusUrn 3 lệnh đầu tiên sẽ tạo một mảng chứa mỗi hàng và mỗi cột dưới dạng các phần tử riêng lẻ.
Riley

1

Thạch , 18 byte

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

Hãy thử trực tuyến!

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

Trả về 0sai và số nguyên khác không cho sự thật.

Ew, điều này là xấu. Và rất dài. Lời khuyên chơi golf sẽ được đánh giá cao :)


1

JavaScript (ES6), 99 byte

Lấy ma trận mvà số lần xuất hiện dự kiến ntrong cú pháp currying (m)(n). Trả về một boolean.

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

Làm sao?

Mã này không đặc biệt ngắn, nhưng tôi muốn thử một cách tiếp cận hoàn toàn dựa trên các biểu thức thông thường.

Chuyển đổi ma trận thành một chuỗi

Chúng tôi sử dụng m.join('|')để chuyển đổi mảng 2D thành một chuỗi. Điều này đầu tiên gây ra một sự ép buộc ngầm định của các hàng ma trận đối với các chuỗi được phân tách bằng dấu phẩy.

Ví dụ, đầu vào này:

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

sẽ được chuyển thành:

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

Kết hợp hàng

Chúng tôi tìm kiếm sự xuất hiện liên tiếp trong một hàng với:

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

Điều này phù hợp:

  • \b một ranh giới từ
  • \d+ theo sau là một con số
  • (){n-1}theo dõi n-1 lần bởi:
    • , dấu phẩy
    • \1 theo sau là tham chiếu của chúng tôi: một ranh giới từ + số đầu tiên
  • \b theo sau là một ranh giới từ

Kết hợp cột

Chúng tôi tìm kiếm sự xuất hiện liên tiếp trong một cột với:

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

trong đó Lchiều dài của một hàng.

Điều này phù hợp:

  • \b một ranh giới từ
  • \d+ theo sau là một con số
  • (){n-1}theo dõi n-1 lần bởi:
    • (){L-1} L-1 lần:
      • . bất kỳ ký tự nào (có hiệu lực: dấu phẩy hoặc đường ống)
      • \d+? theo sau là một con số (cái này phải không tham lam)
    • . theo sau bởi bất kỳ ký tự nào (một lần nữa: dấu phẩy hoặc đường ống)
    • \1 theo sau là tham chiếu của chúng tôi: một ranh giới từ + số đầu tiên
  • \b theo sau là một ranh giới từ

Các trường hợp thử nghiệm



0

Clojure, 77 byte

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

Tạo tất cả các phân vùng liên tiếp pvề chiều dài N(ký hiệu %2) và đếm xem nó có bao nhiêu giá trị riêng biệt. Sau đó, nó tạo thành tập hợp các độ dài này và trả về 1nếu nó được tìm thấy từ tập hợp này và nilnếu không. forcấu trúc là sự phù hợp hoàn hảo cho điều này, nỗ lực ban đầu của tôi được sử dụng flatten, concathoặc một cái gì đó ngắn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.