Count the contiguous submatrices
Migrated from chat
Given two non-empty non-negative integer matrices A and B, answer the number of times A occurs as a contiguous, possibly overlapping, submatrix in B.
Examples/Rules
0. There may not be any submatrices
A:[[3,1],
[1,4]]
B:[[1,4],
[3,1]]
Answer:0
1. Submatrices must be contiguous
A:[[1,4],
[3,1]]
B:[[3,1,4,0,5],
[6,3,1,0,4],
[5,6,3,0,1]]
Answer:1
(marked in bold)
2. Submatrices may overlap
A:[[1,4],
[3,1]]
B:[[3,1,4,5],
[6,3,1,4],
[5,6,3,1]]
Answer:2
(marked in bold and in italic respectively)
3. A (sub)matrix may be size 1-by-1 and up
A:[[3]]
B:[[3,1,4,5],
[6,3,1,4],
[5,6,3,1]]
Answer:3
(marked in bold)
4. Matrices may be any shape
A:[[3,1,3]]
[[3,1,3,1,3,1,3,1,3]]
Answer:4
(two bold, two italic)
code-golf array-manipulation matrix search
add a comment |
Migrated from chat
Given two non-empty non-negative integer matrices A and B, answer the number of times A occurs as a contiguous, possibly overlapping, submatrix in B.
Examples/Rules
0. There may not be any submatrices
A:[[3,1],
[1,4]]
B:[[1,4],
[3,1]]
Answer:0
1. Submatrices must be contiguous
A:[[1,4],
[3,1]]
B:[[3,1,4,0,5],
[6,3,1,0,4],
[5,6,3,0,1]]
Answer:1
(marked in bold)
2. Submatrices may overlap
A:[[1,4],
[3,1]]
B:[[3,1,4,5],
[6,3,1,4],
[5,6,3,1]]
Answer:2
(marked in bold and in italic respectively)
3. A (sub)matrix may be size 1-by-1 and up
A:[[3]]
B:[[3,1,4,5],
[6,3,1,4],
[5,6,3,1]]
Answer:3
(marked in bold)
4. Matrices may be any shape
A:[[3,1,3]]
[[3,1,3,1,3,1,3,1,3]]
Answer:4
(two bold, two italic)
code-golf array-manipulation matrix search
add a comment |
Migrated from chat
Given two non-empty non-negative integer matrices A and B, answer the number of times A occurs as a contiguous, possibly overlapping, submatrix in B.
Examples/Rules
0. There may not be any submatrices
A:[[3,1],
[1,4]]
B:[[1,4],
[3,1]]
Answer:0
1. Submatrices must be contiguous
A:[[1,4],
[3,1]]
B:[[3,1,4,0,5],
[6,3,1,0,4],
[5,6,3,0,1]]
Answer:1
(marked in bold)
2. Submatrices may overlap
A:[[1,4],
[3,1]]
B:[[3,1,4,5],
[6,3,1,4],
[5,6,3,1]]
Answer:2
(marked in bold and in italic respectively)
3. A (sub)matrix may be size 1-by-1 and up
A:[[3]]
B:[[3,1,4,5],
[6,3,1,4],
[5,6,3,1]]
Answer:3
(marked in bold)
4. Matrices may be any shape
A:[[3,1,3]]
[[3,1,3,1,3,1,3,1,3]]
Answer:4
(two bold, two italic)
code-golf array-manipulation matrix search
Migrated from chat
Given two non-empty non-negative integer matrices A and B, answer the number of times A occurs as a contiguous, possibly overlapping, submatrix in B.
Examples/Rules
0. There may not be any submatrices
A:[[3,1],
[1,4]]
B:[[1,4],
[3,1]]
Answer:0
1. Submatrices must be contiguous
A:[[1,4],
[3,1]]
B:[[3,1,4,0,5],
[6,3,1,0,4],
[5,6,3,0,1]]
Answer:1
(marked in bold)
2. Submatrices may overlap
A:[[1,4],
[3,1]]
B:[[3,1,4,5],
[6,3,1,4],
[5,6,3,1]]
Answer:2
(marked in bold and in italic respectively)
3. A (sub)matrix may be size 1-by-1 and up
A:[[3]]
B:[[3,1,4,5],
[6,3,1,4],
[5,6,3,1]]
Answer:3
(marked in bold)
4. Matrices may be any shape
A:[[3,1,3]]
[[3,1,3,1,3,1,3,1,3]]
Answer:4
(two bold, two italic)
code-golf array-manipulation matrix search
code-golf array-manipulation matrix search
edited Dec 31 '18 at 14:59
asked Dec 31 '18 at 11:50
Adám
28.8k269190
28.8k269190
add a comment |
add a comment |
13 Answers
13
active
oldest
votes
Jelly, 7 bytes
ZẆ$⁺€Ẏċ
Try it online!
How it works
ZẆ$⁺€Ẏċ Main link. Arguments: B, A
$ Combine the two links to the left into a monadic chain.
Z Zip; transpose the matrix.
Ẇ Window; yield all contiguous subarrays of rows.
⁺ Duplicate the previous link chain.
€ Map it over the result of applying it to B.
This generates all contiguous submatrices of B, grouped by the selected
columns of B.
Ẏ Tighten; dump all generated submatrices in a single array.
ċ Count the occurrences of A.
add a comment |
Brachylog (v2), 10 bytes
{{ss}ᵈ}ᶜ
Try it online!
I like how clear and straightforward this program is in Brachylog; unfortunately, it's not that short byte-wise because the metapredicate syntax takes up three bytes and has to be used twice in this program.
Explanation
{{ss}ᵈ}ᶜ
s Contiguous subset of rows
s Contiguous subset of columns (i.e. transpose, subset rows, transpose)
{ }ᵈ The operation above transforms the first input to the second input
{ }ᶜ Count the number of ways in which this is possible
add a comment |
MATL, 12 bytes
ZyYC2MX:=XAs
Inputs are A, then B.
Try it online! Or verify all test cases.
Explanation
Consider inputs [1,4; 3 1]
, [3,1,4,5; 6,3,1,4; 5,6,3,1]
. The stack is shown with the most recent element below.
Zy % Implicit input: A. Push size as a vector of two numbers
% STACK: [2 2]
YC % Implicit input: B. Arrange sliding blocks of specified size as columns,
% in column-major order
% STACK: [3 6 1 3 4 1;
6 5 3 6 1 3;
1 3 4 1 5 4;
3 6 1 3 4 1]
2M % Push input to second to last function again; that is, A
% STACK: [3 6 1 3 4 1;
6 5 3 6 1 3;
1 3 4 1 5 4;
3 6 1 3 4 1],
[1 4;
3 1]
X: % Linearize to a column vector, in column-major order
% STACK: [3 6 1 3 4 1;
6 5 3 6 1 3;
1 3 4 1 5 4;
3 6 1 3 4 1],
[1;
3;
4;
1]
= % Test for equality, element-wise with broadcast
% STACK: [0 0 1 0 0 1
0 0 1 0 0 1;
0 0 1 0 0 1;
0 0 1 0 0 1]
XA % True for columns containing all true values
% STACK: [0 0 1 0 0 1]
s % Sum. Implicit display
% STACK: 2
add a comment |
05AB1E, 10 bytes
øŒεøŒI.¢}O
Try it online!
øŒεøŒI.¢}O Full program. Takes 2 matrices as input. First B, then A.
øŒ For each column of B, take all its sublists.
ε } And map a function through all those lists of sublists.
øŒ Transpose the list and again generate all its sublists.
This essentially computes all sub-matrices of B.
I.¢ In the current collection of sub-matrices, count the occurrences of A.
O At the end of the loop sum the results.
add a comment |
Dyalog APL, 6 4 bytes
≢∘⍸⍷
This is nearly a builtin (thanks H.PWiz and ngn).
⍷ Binary matrix containing locations of left argument in right argument
≢∘⍸ Size of the array of indices of 1s
Alternative non-builtin:
{+/,((*⍺)≡⊢)⌺(⍴⍺)*⍵}
Dyadic function that takes the big array on right and subarray on left.
*⍵ exp(⍵), to make ⍵ positive.
((*⍺)≡⊢)⌺(⍴⍺) Stencil;
all subarrays of ⍵ (plus some partial subarrays
containing 0, which we can ignore)
⍴⍺ of same shape as ⍺
(*⍺)≡⊢ processed by checking whether they're equal to exp(⍺).
Result is a matrix of 0/1.
, Flatten
+/ Sum.
Try it here.
You should checkout⍷
– H.PWiz
2 days ago
you can use compose (∘
) to shorten the train:+/∘∊⍷
or even≢∘⍸⍷
– ngn
yesterday
add a comment |
Charcoal, 36 bytes
IΣ⭆⊕⁻LηLθ⭆⊕⁻L§η⁰L§θ⁰⌊⭆θ⭆ν⁼π§§θ⁺κξ⁺μρ
Try it online! Probably should be much shorter than this but Equals isn't working for arrays at the moment. Explanation:
⭆⊕⁻LηLθ
Calculate and loop over the range of allowed values for the top coordinate of submatrices of B that are the same size as A.
⭆⊕⁻L§η⁰L§θ⁰
Repeat for the left coordinate.
⌊⭆θ⭆ν⁼π§§θ⁺κξ⁺μρ
Compare each element of A with the appropriate element from the submatrix of B and take the minimum. (As the comparison results are either 0
or 1
it's safe to use StringMap
here to flatten the result and get the minimum in a single byte.) This will be 1
for a match and 0
for a mismatch.
IΣ
As I've used StringMap
to loop over the submatrices I can simply take the digital sum, thereby counting the matches, and cast that to string for output.
add a comment |
Clean, 118 97 95 bytes
import StdEnv,Data.List
?x=[transpose y\z<-tails x,y<-inits z]
$a b=sum[1\x<- ?b,y<- ?x|y==a]
Try it online!
add a comment |
Python 2, 101 bytes
lambda a,b:sum(a==[l[j:j+len(a[0])]for l in b[i:i+len(a)]]for i,L in e(b)for j,_ in e(L))
e=enumerate
Try it online!
add a comment |
JavaScript (ES6), 93 bytes
Takes input as (A)(B)
.
a=>b=>b.map((r,y)=>r.map((_,x)=>s+=!a.some((R,Y)=>R.some((v,X)=>v!=(b[y+Y]||0)[x+X]))),s=0)|s
Try it online!
add a comment |
R, 95 bytes
function(A,B,x=dim(A),D=dim(B)-x){for(i in 0:D)for(j in 0:D[2])F=F+all(B[1:x+i,1:x[2]+j]==A);F}
Try it online!
add a comment |
Python 2, 211 bytes
a,b=input()
l,w,L,W,c=len(a),len(a[0]),len(b),len(b[0]),0
for i in range(L):
for j in range(W):
if j<=W-w and i<=L-l:
if not sum([a[x][y]!=b[i+x][j+y]for x in range(l)for y in range(w)]):
c+=1
print c
Try it online!
Fairly straightforward. Step through the larger matrix, and check if the smaller matrix can fit.
The only even slightly tricky step is the list comprehension in the 6th line, which relies on Python's conventions for mixing Boolean and integer arithmetic.
add a comment |
Groovy, 109 bytes
{a,b->(0..<b.size()).sum{i->(0..<b[i].size()).count{j->k=i-1
a.every{l=j;k++
it.every{(b[k]?:b)[l++]==it}}}}}
Try it online!
add a comment |
Scala, 151 bytes
(a,b)=>{(0 to b.size-a.size).map(i=>(0 to b(0).size-a(0).size).count(j=>{var k=i-1
a.forall(c=>{var l=j-1;k+=1
c.forall(d=>{l+=1
b(k)(l)==d})})})).sum}
Try it online!
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
return StackExchange.using("mathjaxEditing", function () {
StackExchange.MarkdownEditor.creationCallbacks.add(function (editor, postfix) {
StackExchange.mathjaxEditing.prepareWmdForMathJax(editor, postfix, [["\$", "\$"]]);
});
});
}, "mathjax-editing");
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "200"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: false,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: null,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodegolf.stackexchange.com%2fquestions%2f178173%2fcount-the-contiguous-submatrices%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
13 Answers
13
active
oldest
votes
13 Answers
13
active
oldest
votes
active
oldest
votes
active
oldest
votes
Jelly, 7 bytes
ZẆ$⁺€Ẏċ
Try it online!
How it works
ZẆ$⁺€Ẏċ Main link. Arguments: B, A
$ Combine the two links to the left into a monadic chain.
Z Zip; transpose the matrix.
Ẇ Window; yield all contiguous subarrays of rows.
⁺ Duplicate the previous link chain.
€ Map it over the result of applying it to B.
This generates all contiguous submatrices of B, grouped by the selected
columns of B.
Ẏ Tighten; dump all generated submatrices in a single array.
ċ Count the occurrences of A.
add a comment |
Jelly, 7 bytes
ZẆ$⁺€Ẏċ
Try it online!
How it works
ZẆ$⁺€Ẏċ Main link. Arguments: B, A
$ Combine the two links to the left into a monadic chain.
Z Zip; transpose the matrix.
Ẇ Window; yield all contiguous subarrays of rows.
⁺ Duplicate the previous link chain.
€ Map it over the result of applying it to B.
This generates all contiguous submatrices of B, grouped by the selected
columns of B.
Ẏ Tighten; dump all generated submatrices in a single array.
ċ Count the occurrences of A.
add a comment |
Jelly, 7 bytes
ZẆ$⁺€Ẏċ
Try it online!
How it works
ZẆ$⁺€Ẏċ Main link. Arguments: B, A
$ Combine the two links to the left into a monadic chain.
Z Zip; transpose the matrix.
Ẇ Window; yield all contiguous subarrays of rows.
⁺ Duplicate the previous link chain.
€ Map it over the result of applying it to B.
This generates all contiguous submatrices of B, grouped by the selected
columns of B.
Ẏ Tighten; dump all generated submatrices in a single array.
ċ Count the occurrences of A.
Jelly, 7 bytes
ZẆ$⁺€Ẏċ
Try it online!
How it works
ZẆ$⁺€Ẏċ Main link. Arguments: B, A
$ Combine the two links to the left into a monadic chain.
Z Zip; transpose the matrix.
Ẇ Window; yield all contiguous subarrays of rows.
⁺ Duplicate the previous link chain.
€ Map it over the result of applying it to B.
This generates all contiguous submatrices of B, grouped by the selected
columns of B.
Ẏ Tighten; dump all generated submatrices in a single array.
ċ Count the occurrences of A.
edited Dec 31 '18 at 15:15
answered Dec 31 '18 at 13:10
Dennis♦
186k32297735
186k32297735
add a comment |
add a comment |
Brachylog (v2), 10 bytes
{{ss}ᵈ}ᶜ
Try it online!
I like how clear and straightforward this program is in Brachylog; unfortunately, it's not that short byte-wise because the metapredicate syntax takes up three bytes and has to be used twice in this program.
Explanation
{{ss}ᵈ}ᶜ
s Contiguous subset of rows
s Contiguous subset of columns (i.e. transpose, subset rows, transpose)
{ }ᵈ The operation above transforms the first input to the second input
{ }ᶜ Count the number of ways in which this is possible
add a comment |
Brachylog (v2), 10 bytes
{{ss}ᵈ}ᶜ
Try it online!
I like how clear and straightforward this program is in Brachylog; unfortunately, it's not that short byte-wise because the metapredicate syntax takes up three bytes and has to be used twice in this program.
Explanation
{{ss}ᵈ}ᶜ
s Contiguous subset of rows
s Contiguous subset of columns (i.e. transpose, subset rows, transpose)
{ }ᵈ The operation above transforms the first input to the second input
{ }ᶜ Count the number of ways in which this is possible
add a comment |
Brachylog (v2), 10 bytes
{{ss}ᵈ}ᶜ
Try it online!
I like how clear and straightforward this program is in Brachylog; unfortunately, it's not that short byte-wise because the metapredicate syntax takes up three bytes and has to be used twice in this program.
Explanation
{{ss}ᵈ}ᶜ
s Contiguous subset of rows
s Contiguous subset of columns (i.e. transpose, subset rows, transpose)
{ }ᵈ The operation above transforms the first input to the second input
{ }ᶜ Count the number of ways in which this is possible
Brachylog (v2), 10 bytes
{{ss}ᵈ}ᶜ
Try it online!
I like how clear and straightforward this program is in Brachylog; unfortunately, it's not that short byte-wise because the metapredicate syntax takes up three bytes and has to be used twice in this program.
Explanation
{{ss}ᵈ}ᶜ
s Contiguous subset of rows
s Contiguous subset of columns (i.e. transpose, subset rows, transpose)
{ }ᵈ The operation above transforms the first input to the second input
{ }ᶜ Count the number of ways in which this is possible
answered Dec 31 '18 at 16:27
community wiki
ais523
add a comment |
add a comment |
MATL, 12 bytes
ZyYC2MX:=XAs
Inputs are A, then B.
Try it online! Or verify all test cases.
Explanation
Consider inputs [1,4; 3 1]
, [3,1,4,5; 6,3,1,4; 5,6,3,1]
. The stack is shown with the most recent element below.
Zy % Implicit input: A. Push size as a vector of two numbers
% STACK: [2 2]
YC % Implicit input: B. Arrange sliding blocks of specified size as columns,
% in column-major order
% STACK: [3 6 1 3 4 1;
6 5 3 6 1 3;
1 3 4 1 5 4;
3 6 1 3 4 1]
2M % Push input to second to last function again; that is, A
% STACK: [3 6 1 3 4 1;
6 5 3 6 1 3;
1 3 4 1 5 4;
3 6 1 3 4 1],
[1 4;
3 1]
X: % Linearize to a column vector, in column-major order
% STACK: [3 6 1 3 4 1;
6 5 3 6 1 3;
1 3 4 1 5 4;
3 6 1 3 4 1],
[1;
3;
4;
1]
= % Test for equality, element-wise with broadcast
% STACK: [0 0 1 0 0 1
0 0 1 0 0 1;
0 0 1 0 0 1;
0 0 1 0 0 1]
XA % True for columns containing all true values
% STACK: [0 0 1 0 0 1]
s % Sum. Implicit display
% STACK: 2
add a comment |
MATL, 12 bytes
ZyYC2MX:=XAs
Inputs are A, then B.
Try it online! Or verify all test cases.
Explanation
Consider inputs [1,4; 3 1]
, [3,1,4,5; 6,3,1,4; 5,6,3,1]
. The stack is shown with the most recent element below.
Zy % Implicit input: A. Push size as a vector of two numbers
% STACK: [2 2]
YC % Implicit input: B. Arrange sliding blocks of specified size as columns,
% in column-major order
% STACK: [3 6 1 3 4 1;
6 5 3 6 1 3;
1 3 4 1 5 4;
3 6 1 3 4 1]
2M % Push input to second to last function again; that is, A
% STACK: [3 6 1 3 4 1;
6 5 3 6 1 3;
1 3 4 1 5 4;
3 6 1 3 4 1],
[1 4;
3 1]
X: % Linearize to a column vector, in column-major order
% STACK: [3 6 1 3 4 1;
6 5 3 6 1 3;
1 3 4 1 5 4;
3 6 1 3 4 1],
[1;
3;
4;
1]
= % Test for equality, element-wise with broadcast
% STACK: [0 0 1 0 0 1
0 0 1 0 0 1;
0 0 1 0 0 1;
0 0 1 0 0 1]
XA % True for columns containing all true values
% STACK: [0 0 1 0 0 1]
s % Sum. Implicit display
% STACK: 2
add a comment |
MATL, 12 bytes
ZyYC2MX:=XAs
Inputs are A, then B.
Try it online! Or verify all test cases.
Explanation
Consider inputs [1,4; 3 1]
, [3,1,4,5; 6,3,1,4; 5,6,3,1]
. The stack is shown with the most recent element below.
Zy % Implicit input: A. Push size as a vector of two numbers
% STACK: [2 2]
YC % Implicit input: B. Arrange sliding blocks of specified size as columns,
% in column-major order
% STACK: [3 6 1 3 4 1;
6 5 3 6 1 3;
1 3 4 1 5 4;
3 6 1 3 4 1]
2M % Push input to second to last function again; that is, A
% STACK: [3 6 1 3 4 1;
6 5 3 6 1 3;
1 3 4 1 5 4;
3 6 1 3 4 1],
[1 4;
3 1]
X: % Linearize to a column vector, in column-major order
% STACK: [3 6 1 3 4 1;
6 5 3 6 1 3;
1 3 4 1 5 4;
3 6 1 3 4 1],
[1;
3;
4;
1]
= % Test for equality, element-wise with broadcast
% STACK: [0 0 1 0 0 1
0 0 1 0 0 1;
0 0 1 0 0 1;
0 0 1 0 0 1]
XA % True for columns containing all true values
% STACK: [0 0 1 0 0 1]
s % Sum. Implicit display
% STACK: 2
MATL, 12 bytes
ZyYC2MX:=XAs
Inputs are A, then B.
Try it online! Or verify all test cases.
Explanation
Consider inputs [1,4; 3 1]
, [3,1,4,5; 6,3,1,4; 5,6,3,1]
. The stack is shown with the most recent element below.
Zy % Implicit input: A. Push size as a vector of two numbers
% STACK: [2 2]
YC % Implicit input: B. Arrange sliding blocks of specified size as columns,
% in column-major order
% STACK: [3 6 1 3 4 1;
6 5 3 6 1 3;
1 3 4 1 5 4;
3 6 1 3 4 1]
2M % Push input to second to last function again; that is, A
% STACK: [3 6 1 3 4 1;
6 5 3 6 1 3;
1 3 4 1 5 4;
3 6 1 3 4 1],
[1 4;
3 1]
X: % Linearize to a column vector, in column-major order
% STACK: [3 6 1 3 4 1;
6 5 3 6 1 3;
1 3 4 1 5 4;
3 6 1 3 4 1],
[1;
3;
4;
1]
= % Test for equality, element-wise with broadcast
% STACK: [0 0 1 0 0 1
0 0 1 0 0 1;
0 0 1 0 0 1;
0 0 1 0 0 1]
XA % True for columns containing all true values
% STACK: [0 0 1 0 0 1]
s % Sum. Implicit display
% STACK: 2
edited Dec 31 '18 at 12:45
answered Dec 31 '18 at 12:39
Luis Mendo
74k886291
74k886291
add a comment |
add a comment |
05AB1E, 10 bytes
øŒεøŒI.¢}O
Try it online!
øŒεøŒI.¢}O Full program. Takes 2 matrices as input. First B, then A.
øŒ For each column of B, take all its sublists.
ε } And map a function through all those lists of sublists.
øŒ Transpose the list and again generate all its sublists.
This essentially computes all sub-matrices of B.
I.¢ In the current collection of sub-matrices, count the occurrences of A.
O At the end of the loop sum the results.
add a comment |
05AB1E, 10 bytes
øŒεøŒI.¢}O
Try it online!
øŒεøŒI.¢}O Full program. Takes 2 matrices as input. First B, then A.
øŒ For each column of B, take all its sublists.
ε } And map a function through all those lists of sublists.
øŒ Transpose the list and again generate all its sublists.
This essentially computes all sub-matrices of B.
I.¢ In the current collection of sub-matrices, count the occurrences of A.
O At the end of the loop sum the results.
add a comment |
05AB1E, 10 bytes
øŒεøŒI.¢}O
Try it online!
øŒεøŒI.¢}O Full program. Takes 2 matrices as input. First B, then A.
øŒ For each column of B, take all its sublists.
ε } And map a function through all those lists of sublists.
øŒ Transpose the list and again generate all its sublists.
This essentially computes all sub-matrices of B.
I.¢ In the current collection of sub-matrices, count the occurrences of A.
O At the end of the loop sum the results.
05AB1E, 10 bytes
øŒεøŒI.¢}O
Try it online!
øŒεøŒI.¢}O Full program. Takes 2 matrices as input. First B, then A.
øŒ For each column of B, take all its sublists.
ε } And map a function through all those lists of sublists.
øŒ Transpose the list and again generate all its sublists.
This essentially computes all sub-matrices of B.
I.¢ In the current collection of sub-matrices, count the occurrences of A.
O At the end of the loop sum the results.
edited Dec 31 '18 at 14:22
answered Dec 31 '18 at 14:17
Mr. Xcoder
31.7k759198
31.7k759198
add a comment |
add a comment |
Dyalog APL, 6 4 bytes
≢∘⍸⍷
This is nearly a builtin (thanks H.PWiz and ngn).
⍷ Binary matrix containing locations of left argument in right argument
≢∘⍸ Size of the array of indices of 1s
Alternative non-builtin:
{+/,((*⍺)≡⊢)⌺(⍴⍺)*⍵}
Dyadic function that takes the big array on right and subarray on left.
*⍵ exp(⍵), to make ⍵ positive.
((*⍺)≡⊢)⌺(⍴⍺) Stencil;
all subarrays of ⍵ (plus some partial subarrays
containing 0, which we can ignore)
⍴⍺ of same shape as ⍺
(*⍺)≡⊢ processed by checking whether they're equal to exp(⍺).
Result is a matrix of 0/1.
, Flatten
+/ Sum.
Try it here.
You should checkout⍷
– H.PWiz
2 days ago
you can use compose (∘
) to shorten the train:+/∘∊⍷
or even≢∘⍸⍷
– ngn
yesterday
add a comment |
Dyalog APL, 6 4 bytes
≢∘⍸⍷
This is nearly a builtin (thanks H.PWiz and ngn).
⍷ Binary matrix containing locations of left argument in right argument
≢∘⍸ Size of the array of indices of 1s
Alternative non-builtin:
{+/,((*⍺)≡⊢)⌺(⍴⍺)*⍵}
Dyadic function that takes the big array on right and subarray on left.
*⍵ exp(⍵), to make ⍵ positive.
((*⍺)≡⊢)⌺(⍴⍺) Stencil;
all subarrays of ⍵ (plus some partial subarrays
containing 0, which we can ignore)
⍴⍺ of same shape as ⍺
(*⍺)≡⊢ processed by checking whether they're equal to exp(⍺).
Result is a matrix of 0/1.
, Flatten
+/ Sum.
Try it here.
You should checkout⍷
– H.PWiz
2 days ago
you can use compose (∘
) to shorten the train:+/∘∊⍷
or even≢∘⍸⍷
– ngn
yesterday
add a comment |
Dyalog APL, 6 4 bytes
≢∘⍸⍷
This is nearly a builtin (thanks H.PWiz and ngn).
⍷ Binary matrix containing locations of left argument in right argument
≢∘⍸ Size of the array of indices of 1s
Alternative non-builtin:
{+/,((*⍺)≡⊢)⌺(⍴⍺)*⍵}
Dyadic function that takes the big array on right and subarray on left.
*⍵ exp(⍵), to make ⍵ positive.
((*⍺)≡⊢)⌺(⍴⍺) Stencil;
all subarrays of ⍵ (plus some partial subarrays
containing 0, which we can ignore)
⍴⍺ of same shape as ⍺
(*⍺)≡⊢ processed by checking whether they're equal to exp(⍺).
Result is a matrix of 0/1.
, Flatten
+/ Sum.
Try it here.
Dyalog APL, 6 4 bytes
≢∘⍸⍷
This is nearly a builtin (thanks H.PWiz and ngn).
⍷ Binary matrix containing locations of left argument in right argument
≢∘⍸ Size of the array of indices of 1s
Alternative non-builtin:
{+/,((*⍺)≡⊢)⌺(⍴⍺)*⍵}
Dyadic function that takes the big array on right and subarray on left.
*⍵ exp(⍵), to make ⍵ positive.
((*⍺)≡⊢)⌺(⍴⍺) Stencil;
all subarrays of ⍵ (plus some partial subarrays
containing 0, which we can ignore)
⍴⍺ of same shape as ⍺
(*⍺)≡⊢ processed by checking whether they're equal to exp(⍺).
Result is a matrix of 0/1.
, Flatten
+/ Sum.
Try it here.
edited yesterday
answered 2 days ago
lirtosiast
15.7k436107
15.7k436107
You should checkout⍷
– H.PWiz
2 days ago
you can use compose (∘
) to shorten the train:+/∘∊⍷
or even≢∘⍸⍷
– ngn
yesterday
add a comment |
You should checkout⍷
– H.PWiz
2 days ago
you can use compose (∘
) to shorten the train:+/∘∊⍷
or even≢∘⍸⍷
– ngn
yesterday
You should checkout
⍷
– H.PWiz
2 days ago
You should checkout
⍷
– H.PWiz
2 days ago
you can use compose (
∘
) to shorten the train: +/∘∊⍷
or even ≢∘⍸⍷
– ngn
yesterday
you can use compose (
∘
) to shorten the train: +/∘∊⍷
or even ≢∘⍸⍷
– ngn
yesterday
add a comment |
Charcoal, 36 bytes
IΣ⭆⊕⁻LηLθ⭆⊕⁻L§η⁰L§θ⁰⌊⭆θ⭆ν⁼π§§θ⁺κξ⁺μρ
Try it online! Probably should be much shorter than this but Equals isn't working for arrays at the moment. Explanation:
⭆⊕⁻LηLθ
Calculate and loop over the range of allowed values for the top coordinate of submatrices of B that are the same size as A.
⭆⊕⁻L§η⁰L§θ⁰
Repeat for the left coordinate.
⌊⭆θ⭆ν⁼π§§θ⁺κξ⁺μρ
Compare each element of A with the appropriate element from the submatrix of B and take the minimum. (As the comparison results are either 0
or 1
it's safe to use StringMap
here to flatten the result and get the minimum in a single byte.) This will be 1
for a match and 0
for a mismatch.
IΣ
As I've used StringMap
to loop over the submatrices I can simply take the digital sum, thereby counting the matches, and cast that to string for output.
add a comment |
Charcoal, 36 bytes
IΣ⭆⊕⁻LηLθ⭆⊕⁻L§η⁰L§θ⁰⌊⭆θ⭆ν⁼π§§θ⁺κξ⁺μρ
Try it online! Probably should be much shorter than this but Equals isn't working for arrays at the moment. Explanation:
⭆⊕⁻LηLθ
Calculate and loop over the range of allowed values for the top coordinate of submatrices of B that are the same size as A.
⭆⊕⁻L§η⁰L§θ⁰
Repeat for the left coordinate.
⌊⭆θ⭆ν⁼π§§θ⁺κξ⁺μρ
Compare each element of A with the appropriate element from the submatrix of B and take the minimum. (As the comparison results are either 0
or 1
it's safe to use StringMap
here to flatten the result and get the minimum in a single byte.) This will be 1
for a match and 0
for a mismatch.
IΣ
As I've used StringMap
to loop over the submatrices I can simply take the digital sum, thereby counting the matches, and cast that to string for output.
add a comment |
Charcoal, 36 bytes
IΣ⭆⊕⁻LηLθ⭆⊕⁻L§η⁰L§θ⁰⌊⭆θ⭆ν⁼π§§θ⁺κξ⁺μρ
Try it online! Probably should be much shorter than this but Equals isn't working for arrays at the moment. Explanation:
⭆⊕⁻LηLθ
Calculate and loop over the range of allowed values for the top coordinate of submatrices of B that are the same size as A.
⭆⊕⁻L§η⁰L§θ⁰
Repeat for the left coordinate.
⌊⭆θ⭆ν⁼π§§θ⁺κξ⁺μρ
Compare each element of A with the appropriate element from the submatrix of B and take the minimum. (As the comparison results are either 0
or 1
it's safe to use StringMap
here to flatten the result and get the minimum in a single byte.) This will be 1
for a match and 0
for a mismatch.
IΣ
As I've used StringMap
to loop over the submatrices I can simply take the digital sum, thereby counting the matches, and cast that to string for output.
Charcoal, 36 bytes
IΣ⭆⊕⁻LηLθ⭆⊕⁻L§η⁰L§θ⁰⌊⭆θ⭆ν⁼π§§θ⁺κξ⁺μρ
Try it online! Probably should be much shorter than this but Equals isn't working for arrays at the moment. Explanation:
⭆⊕⁻LηLθ
Calculate and loop over the range of allowed values for the top coordinate of submatrices of B that are the same size as A.
⭆⊕⁻L§η⁰L§θ⁰
Repeat for the left coordinate.
⌊⭆θ⭆ν⁼π§§θ⁺κξ⁺μρ
Compare each element of A with the appropriate element from the submatrix of B and take the minimum. (As the comparison results are either 0
or 1
it's safe to use StringMap
here to flatten the result and get the minimum in a single byte.) This will be 1
for a match and 0
for a mismatch.
IΣ
As I've used StringMap
to loop over the submatrices I can simply take the digital sum, thereby counting the matches, and cast that to string for output.
answered Dec 31 '18 at 21:49
Neil
79.4k744177
79.4k744177
add a comment |
add a comment |
Clean, 118 97 95 bytes
import StdEnv,Data.List
?x=[transpose y\z<-tails x,y<-inits z]
$a b=sum[1\x<- ?b,y<- ?x|y==a]
Try it online!
add a comment |
Clean, 118 97 95 bytes
import StdEnv,Data.List
?x=[transpose y\z<-tails x,y<-inits z]
$a b=sum[1\x<- ?b,y<- ?x|y==a]
Try it online!
add a comment |
Clean, 118 97 95 bytes
import StdEnv,Data.List
?x=[transpose y\z<-tails x,y<-inits z]
$a b=sum[1\x<- ?b,y<- ?x|y==a]
Try it online!
Clean, 118 97 95 bytes
import StdEnv,Data.List
?x=[transpose y\z<-tails x,y<-inits z]
$a b=sum[1\x<- ?b,y<- ?x|y==a]
Try it online!
edited 2 days ago
answered Dec 31 '18 at 23:45
Οurous
6,48211033
6,48211033
add a comment |
add a comment |
Python 2, 101 bytes
lambda a,b:sum(a==[l[j:j+len(a[0])]for l in b[i:i+len(a)]]for i,L in e(b)for j,_ in e(L))
e=enumerate
Try it online!
add a comment |
Python 2, 101 bytes
lambda a,b:sum(a==[l[j:j+len(a[0])]for l in b[i:i+len(a)]]for i,L in e(b)for j,_ in e(L))
e=enumerate
Try it online!
add a comment |
Python 2, 101 bytes
lambda a,b:sum(a==[l[j:j+len(a[0])]for l in b[i:i+len(a)]]for i,L in e(b)for j,_ in e(L))
e=enumerate
Try it online!
Python 2, 101 bytes
lambda a,b:sum(a==[l[j:j+len(a[0])]for l in b[i:i+len(a)]]for i,L in e(b)for j,_ in e(L))
e=enumerate
Try it online!
answered yesterday
TFeld
14.3k21240
14.3k21240
add a comment |
add a comment |
JavaScript (ES6), 93 bytes
Takes input as (A)(B)
.
a=>b=>b.map((r,y)=>r.map((_,x)=>s+=!a.some((R,Y)=>R.some((v,X)=>v!=(b[y+Y]||0)[x+X]))),s=0)|s
Try it online!
add a comment |
JavaScript (ES6), 93 bytes
Takes input as (A)(B)
.
a=>b=>b.map((r,y)=>r.map((_,x)=>s+=!a.some((R,Y)=>R.some((v,X)=>v!=(b[y+Y]||0)[x+X]))),s=0)|s
Try it online!
add a comment |
JavaScript (ES6), 93 bytes
Takes input as (A)(B)
.
a=>b=>b.map((r,y)=>r.map((_,x)=>s+=!a.some((R,Y)=>R.some((v,X)=>v!=(b[y+Y]||0)[x+X]))),s=0)|s
Try it online!
JavaScript (ES6), 93 bytes
Takes input as (A)(B)
.
a=>b=>b.map((r,y)=>r.map((_,x)=>s+=!a.some((R,Y)=>R.some((v,X)=>v!=(b[y+Y]||0)[x+X]))),s=0)|s
Try it online!
answered 2 days ago
Arnauld
72.5k689305
72.5k689305
add a comment |
add a comment |
R, 95 bytes
function(A,B,x=dim(A),D=dim(B)-x){for(i in 0:D)for(j in 0:D[2])F=F+all(B[1:x+i,1:x[2]+j]==A);F}
Try it online!
add a comment |
R, 95 bytes
function(A,B,x=dim(A),D=dim(B)-x){for(i in 0:D)for(j in 0:D[2])F=F+all(B[1:x+i,1:x[2]+j]==A);F}
Try it online!
add a comment |
R, 95 bytes
function(A,B,x=dim(A),D=dim(B)-x){for(i in 0:D)for(j in 0:D[2])F=F+all(B[1:x+i,1:x[2]+j]==A);F}
Try it online!
R, 95 bytes
function(A,B,x=dim(A),D=dim(B)-x){for(i in 0:D)for(j in 0:D[2])F=F+all(B[1:x+i,1:x[2]+j]==A);F}
Try it online!
edited 2 days ago
answered 2 days ago
digEmAll
2,47149
2,47149
add a comment |
add a comment |
Python 2, 211 bytes
a,b=input()
l,w,L,W,c=len(a),len(a[0]),len(b),len(b[0]),0
for i in range(L):
for j in range(W):
if j<=W-w and i<=L-l:
if not sum([a[x][y]!=b[i+x][j+y]for x in range(l)for y in range(w)]):
c+=1
print c
Try it online!
Fairly straightforward. Step through the larger matrix, and check if the smaller matrix can fit.
The only even slightly tricky step is the list comprehension in the 6th line, which relies on Python's conventions for mixing Boolean and integer arithmetic.
add a comment |
Python 2, 211 bytes
a,b=input()
l,w,L,W,c=len(a),len(a[0]),len(b),len(b[0]),0
for i in range(L):
for j in range(W):
if j<=W-w and i<=L-l:
if not sum([a[x][y]!=b[i+x][j+y]for x in range(l)for y in range(w)]):
c+=1
print c
Try it online!
Fairly straightforward. Step through the larger matrix, and check if the smaller matrix can fit.
The only even slightly tricky step is the list comprehension in the 6th line, which relies on Python's conventions for mixing Boolean and integer arithmetic.
add a comment |
Python 2, 211 bytes
a,b=input()
l,w,L,W,c=len(a),len(a[0]),len(b),len(b[0]),0
for i in range(L):
for j in range(W):
if j<=W-w and i<=L-l:
if not sum([a[x][y]!=b[i+x][j+y]for x in range(l)for y in range(w)]):
c+=1
print c
Try it online!
Fairly straightforward. Step through the larger matrix, and check if the smaller matrix can fit.
The only even slightly tricky step is the list comprehension in the 6th line, which relies on Python's conventions for mixing Boolean and integer arithmetic.
Python 2, 211 bytes
a,b=input()
l,w,L,W,c=len(a),len(a[0]),len(b),len(b[0]),0
for i in range(L):
for j in range(W):
if j<=W-w and i<=L-l:
if not sum([a[x][y]!=b[i+x][j+y]for x in range(l)for y in range(w)]):
c+=1
print c
Try it online!
Fairly straightforward. Step through the larger matrix, and check if the smaller matrix can fit.
The only even slightly tricky step is the list comprehension in the 6th line, which relies on Python's conventions for mixing Boolean and integer arithmetic.
answered 2 days ago
CCB60
1595
1595
add a comment |
add a comment |
Groovy, 109 bytes
{a,b->(0..<b.size()).sum{i->(0..<b[i].size()).count{j->k=i-1
a.every{l=j;k++
it.every{(b[k]?:b)[l++]==it}}}}}
Try it online!
add a comment |
Groovy, 109 bytes
{a,b->(0..<b.size()).sum{i->(0..<b[i].size()).count{j->k=i-1
a.every{l=j;k++
it.every{(b[k]?:b)[l++]==it}}}}}
Try it online!
add a comment |
Groovy, 109 bytes
{a,b->(0..<b.size()).sum{i->(0..<b[i].size()).count{j->k=i-1
a.every{l=j;k++
it.every{(b[k]?:b)[l++]==it}}}}}
Try it online!
Groovy, 109 bytes
{a,b->(0..<b.size()).sum{i->(0..<b[i].size()).count{j->k=i-1
a.every{l=j;k++
it.every{(b[k]?:b)[l++]==it}}}}}
Try it online!
edited 2 days ago
answered 2 days ago
ASCII-only
3,2221136
3,2221136
add a comment |
add a comment |
Scala, 151 bytes
(a,b)=>{(0 to b.size-a.size).map(i=>(0 to b(0).size-a(0).size).count(j=>{var k=i-1
a.forall(c=>{var l=j-1;k+=1
c.forall(d=>{l+=1
b(k)(l)==d})})})).sum}
Try it online!
add a comment |
Scala, 151 bytes
(a,b)=>{(0 to b.size-a.size).map(i=>(0 to b(0).size-a(0).size).count(j=>{var k=i-1
a.forall(c=>{var l=j-1;k+=1
c.forall(d=>{l+=1
b(k)(l)==d})})})).sum}
Try it online!
add a comment |
Scala, 151 bytes
(a,b)=>{(0 to b.size-a.size).map(i=>(0 to b(0).size-a(0).size).count(j=>{var k=i-1
a.forall(c=>{var l=j-1;k+=1
c.forall(d=>{l+=1
b(k)(l)==d})})})).sum}
Try it online!
Scala, 151 bytes
(a,b)=>{(0 to b.size-a.size).map(i=>(0 to b(0).size-a(0).size).count(j=>{var k=i-1
a.forall(c=>{var l=j-1;k+=1
c.forall(d=>{l+=1
b(k)(l)==d})})})).sum}
Try it online!
edited yesterday
answered 2 days ago
ASCII-only
3,2221136
3,2221136
add a comment |
add a comment |
If this is an answer to a challenge…
…Be sure to follow the challenge specification. However, please refrain from exploiting obvious loopholes. Answers abusing any of the standard loopholes are considered invalid. If you think a specification is unclear or underspecified, comment on the question instead.
…Try to optimize your score. For instance, answers to code-golf challenges should attempt to be as short as possible. You can always include a readable version of the code in addition to the competitive one.
Explanations of your answer make it more interesting to read and are very much encouraged.…Include a short header which indicates the language(s) of your code and its score, as defined by the challenge.
More generally…
…Please make sure to answer the question and provide sufficient detail.
…Avoid asking for help, clarification or responding to other answers (use comments instead).
Some of your past answers have not been well-received, and you're in danger of being blocked from answering.
Please pay close attention to the following guidance:
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodegolf.stackexchange.com%2fquestions%2f178173%2fcount-the-contiguous-submatrices%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown