Truthify an array
Jelly has an atom called untruth, which when given indices, creates an array with 1s at those places: [2,4] → [0,1,0,1]
.
You are required to perform the inverse of this. Given a 2D boolean array, find the indices of the true values in it.
Challenge
You will be given a single 2D boolean array $M$. You may take its dimensions as a separate argument if needed.
The output must consist of all the indices of the true values in $M$.
Output may be 0-indexed or 1-indexed.
It is guaranteed that the input will only consist of two different values.
Test Cases
All test cases are 0-indexed.
I: [[1,0,1,1,1,0]]
O: [[0,0],[0,2],[0,3],[0,4]]
I: [[1,0,1],[1,0,1],[0,1,0]]
O: [[0,0],[0,2],[1,0],[1,2],[2,1]]
[JavaScript (Node.js)], 74 70 …
4y ago
[APL (Dyalog Extended)], 1 byt …
4y ago
[Jelly], 2 bytes ŒṪ …
4y ago
JavaScript (V8), 44 bytes …
3y ago
[C (gcc)], 100 bytes …
4y ago
Japt `-m`, 8 7 bytes ð …
3y ago
JavaScript (Node.js), 68 bytes …
3y ago
Scala 3, 68 bytes ```scala . …
3y ago
[Python 3], 75 bytes …
3y ago
[shortC], 78 bytes i,j; …
3y ago
10 answers
Jelly, 2 bytes
ŒṪ
1-indexed, but the footer converts to 0-indexed.
Less built-in:
Jelly, 3 bytes
œẹ1
œẹ All multidimensional indices of
1 one.
Less built-in:
Jelly, 7 bytes
J,Ɱ"T€Ẏ
,Ɱ Pair each
T truthy index
€ from all rows
J " with the indices of the rows.
Ẏ Flatten rows.
The absolute least built-in:
Jelly, 8 bytes
Jx),€"JẎ
Outputs each index backwards.
Jx Repeat each index by the corresponding element
) for each row.
,€"J Pair each remaining index with its row index.
Ẏ Flatten rows.
0 comment threads
JavaScript (Node.js), 74 70 bytes
Works for any number of dimensions.
f=(a,z=[])=>a.map?.((b,c)=>z.push(...f(b).map(a=>[c,...a])))?z:a?[z]:z
Try it online! (TIO uses an old version of Node.js that does not support the ?.
operator, but you can try the 74 bytes solution)
0 comment threads
JavaScript (V8), 44 bytes
a=>a.map((a,x)=>a.map((n,y)=>n&&print(x,y)))
0 comment threads
C (gcc), 100 bytes
i,j;f(x,y,p)int*p;{puts("[");for(;i<x;i++)for(j=0;j<y;j++)*p++&&printf("[%d,%d],",i,j);puts("\b]");}
Note that TIO console doesn't handle backspace properly.
0 comment threads
JavaScript (Node.js), 68 bytes
f=(a)=>a.map((x)=>[...x.entries()].filter((e)=>e[1]).map((e)=>e[0]))
Run the function f on your input, e.g. f([[1,0,1],[1,0,1],[0,1,0]])
.
The output looks like this:
[[0, 2], [0, 2], [1]]
with one subarray for each input subarray.
Explanation:
f=(a)=> // creates a function to run the input on
a.map((x)=> // for each outer array:
[...x.entries()] // creates things like this: [index, value]
.filter((e)=>e[1]) // keep ones where the value acts like true
.map((e)=>e[0]) // return the indices for each one
)
Scala 3, 68 bytes
_.zipWithIndex.flatMap(_.zipWithIndex.filter(_._1)map(_._2)map _.->)
Takes a List[List[Boolean]]
, returns a List[(Int, Int)]
. This abuses underscores a bit (which is why Scala 3 is needed), but I'm proud of it.
Explanation:
_.zipWithIndex //Zip each row with its index
.flatMap( //Map every (row, index) tuple to a list of truthy indices,
//then flatten
_.zipWithIndex //Zip each element with its column
.filter(_._1) //Keep the tuples where the element (_1) is true
map(_._2) //Keep the second part of the tuple (the column)
map _.->) //Make a 2-tuple with the row's index
0 comment threads
Python 3, 75 bytes
lambda a:[[i,k]for i in r(l(a))for k in r(l(a[0]))if a[i][k]]
r=range;l=len
1 comment thread