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 . …
4y ago
[Python 3], 75 bytes …
3y ago
[shortC], 78 bytes i,j; …
3y ago
10 answers
You are accessing this answer with a direct link, so it's being shown above all other answers regardless of its score. You can return to the normal view.
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
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
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 (V8), 44 bytes
a=>a.map((a,x)=>a.map((n,y)=>n&&print(x,y)))
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