20
\$\begingroup\$

This challenge is from a game called Keep Talking And Nobody Explodes.

Memory is a fragile thing but so is everything else when a bomb goes off, so pay attention! – from the manual

The Objective

A number from 1–4 is given as the "display", along with scrambled numbers 1–4 as the "buttons."

The output must be the label of the correct "button." Repeat this process 5 times.

The Format

The input format must be:

<display #> <buttons #>

Repeated 5 times. As long as the numbers are distinguishable and the <display #> is dedicated separately, the input format and type don't matter. For any input that doesn't fit this format, the entire challenge falls in don't care situation.

The output format and type don't matter as long as the numbers are distinguishable.

Which button to press

Pressing a button means to output the label of the button.

The buttons are indexed from left to right, and are 1-indexed.

For the 1st line:

If the display is 1, press the button in the second position.
If the display is 2, press the button in the second position.
If the display is 3, press the button in the third position.
If the display is 4, press the button in the fourth position.

For the 2nd line:

If the display is 1, press the button labeled "4".
If the display is 2, press the button in the same position as you pressed in line #1.
If the display is 3, press the button in the first position.
If the display is 4, press the button in the same position as you pressed in line #1.

For the 3rd line:

If the display is 1, press the button with the same label you pressed in line #2.
If the display is 2, press the button with the same label you pressed in line #1.
If the display is 3, press the button in the third position.
If the display is 4, press the button labeled "4".

For the 4th line:

If the display is 1, press the button in the same position as you pressed in line #1.
If the display is 2, press the button in the first position.
If the display is 3, press the button in the same position as you pressed in line #2.
If the display is 4, press the button in the same position as you pressed in line #2.

For the last line:

If the display is 1, press the button with the same label you pressed in line #1.
If the display is 2, press the button with the same label you pressed in line #2.
If the display is 3, press the button with the same label you pressed in line #4.
If the display is 4, press the button with the same label you pressed in line #3.

An Example

Given the following input:

2 1432
4 3214
2 4213
1 4231
1 3214

For the 1st line, press the button in the second position, so output 4.
For the 2nd line, press the button in the same position as you pressed in line #1, so output 2.
For the 3rd line, press the button with the same label you pressed in line #1, so output 4.
For the 4th line, press the button in the same position as you pressed in line #1, so output 2.
For the last line, press the button with the same label you pressed in line #1, so output 4.

So the entire output is 42424, in any format and type.

asked Dec 14, 2019 at 0:21
\$\endgroup\$
4
  • 1
    \$\begingroup\$ May the input be taken in more convenient formats such as [[2, [1,4,3,2]], [4, [3,2,1,4]], ... ]? May the buttons be 0-indexed? \$\endgroup\$ Commented Dec 14, 2019 at 0:39
  • \$\begingroup\$ @Arnauld Sorry, the input is meant to be a string. ("string" tag is added.) By "1-indexed" I mean it is 1-indexed in the description. If you are going to store them in an array, it doesn't matter whether it's 0-indexed or 1-indexed. \$\endgroup\$ Commented Dec 14, 2019 at 0:45
  • 9
    \$\begingroup\$ Just as a friendly reminder: unless the very purpose of the challenge is to parse something or to deliver an exact output, cumbersome I/O formats are just an annoyance. \$\endgroup\$ Commented Dec 14, 2019 at 1:04
  • \$\begingroup\$ @Arnauld Fine.. \$\endgroup\$ Commented Dec 14, 2019 at 1:12

3 Answers 3

8
\$\begingroup\$

JavaScript (ES6), (削除) 109 106 105 (削除ここまで) 104 bytes

Takes input as a list of pairs [display, "buttons"]. Returns a list of pressed buttons.

a=>a.map(([d,b],i)=>a[i]=b[a[~i]=(n='_5567.848106.80990132'[i*4+d])>3?n>7?a[7-n]:n-4:b.search(a[n]||4)])

Try it online!

How?

The action for each line and each displayed value is encoded as a single character as follows (with 0-indexed lines and positions):

  • \$n=0\$ to \3ドル\$: press the button with the same label that we pressed in line \$n\$
  • \$n=4\$ to \7ドル\$: press the button in position \$n-4\$
  • \$n=8\$ or \9ドル\$: press the button in the same position as we pressed in line \$n-8\$
  • ".": press the button labeled "\4ドル\$"

Translating the rules described in the challenge into these codes leads to the groups 5567, .848, 106., 8099 and 0132, which are concatenated into a single lookup string. The purpose of the leading "_" is just to deal with the 1-indexed input.

The input array \$a[\:]\$ is re-used to store both the labels that are pressed and their positions. For each line \$i\$, we store the label in \$a[i]\$ and its position in \$a[-i-1]\$.

Commented

a => // a[] = input
 a.map(([d, b], // for each pair of displayed value d and buttons b
 i) => // at position i in a[]:
 a[i] = b[ // save the label in a[i]
 a[~i] = // save its position in a[-i-1]
 ( n = // n = action code taken from ...
 '_5567.848106.80990132' // ... our lookup string ...
 [i * 4 + d] // ... at position i * 4 + d
 ) > 3 ? // if n is greater than 3:
 n > 7 ? // if n is greater than 7:
 a[7 - n] // re-use the position used at line n - 8,
 // stored in a[-(n-8)-1], i.e. a[7-n]
 : // else:
 n - 4 // use the position n - 4
 : // else:
 b.search(a[n] // look for the label used at line n
 || 4) // or look for '4' if a[n] is undefined,
 // which happens only when n is '.'
 ] // end of button lookup
 ) // end of map()
answered Dec 14, 2019 at 1:40
\$\endgroup\$
5
\$\begingroup\$

Python 2, (削除) 415 375 351 317 299 273 (削除ここまで) 265 bytes

a=[0]*5;x=input()
for i,z in enumerate(x):j,q=z;exec'a[i]'+['=[q[j-1],j]',';k=a[0][1];a[i]=[4,q.index(4)+1]if j<2else[q[k-1],k]if j-3else[q[0],1]','=[4if j>3else a[j<2][0]if j<3else q[0]]','=[q[a[j>1][1]-1]]if j-2else[q[0]]','=a[6>>4-j&3];print[l[0]for l in a]'][i]

Try it online!

-40 bytes by making everything ternary
-24, -18, -10 by removing unnecessary code
-16 by using (label,position) rather than (position,label)
-4, -4 thanks to @Arnauld
-26, -8 thanks to @Chas Brown

Not quite as competitive as @Arnauld's solution... probably a bit naive as its basically just logic.

Very happy with how this progressed, thanks everyone for the suggestions!

answered Dec 14, 2019 at 2:06
\$\endgroup\$
8
  • \$\begingroup\$ j/2+2*(j==3) can be replaced with 6>>4-j&3. \$\endgroup\$ Commented Dec 14, 2019 at 14:21
  • \$\begingroup\$ I think you can save another byte with a[i]=[4]if j>3else[a[j<2][0]]if j<3else[q[0]]. \$\endgroup\$ Commented Dec 14, 2019 at 14:25
  • \$\begingroup\$ @Arnauld good catches - Im not too familiar with bitwise operations, so I though my solution for the last line could be improved somewhat \$\endgroup\$ Commented Dec 15, 2019 at 1:18
  • 1
    \$\begingroup\$ 299 bytes? \$\endgroup\$ Commented Dec 15, 2019 at 14:48
  • \$\begingroup\$ @Arnauld nice, added it \$\endgroup\$ Commented Dec 16, 2019 at 1:08
3
\$\begingroup\$

Charcoal, 74 bytes

Sθ≔∨⊖S1η⊞υ§θηSθ≔§⟦⌕θ4η0η⟧⊖Sζ⊞υ§θζ⊞υ§+⮌υ⟦§S24⟧⊖S⊞υ§S§⟦η0ζζ⟧⊖SSθ⊞υ§υ⌕1243S↑υ

Try it online! Link is to verbose version of code. Takes input as buttons#1 display#1 buttons#2 ... display#5. Explanation:

Input the first buttons.

≔∨⊖S1η

Decrement the first display to make it 0-indexed, but if that results in zero, increment it again. Save the result for steps 2 and 4.

⊞υ§θη

Save the appropriately indexed button in the predefined empty list.

Input the second buttons.

≔§⟦⌕θ4η0η⟧⊖Sζ

Make a list of four elements: the index of "4" in the buttons; the index of the first button; 0 (representing the button in first position); the index of the first button. Get the element corresponding to the (decremented) second display. Save the result for step 4.

⊞υ§θζ

Add the appropriately indexed button to the list.

⊞υ§+⮌υ⟦§S24⟧⊖S

Input the third buttons and make a list of four elements: the two buttons so far in reverse order, the button at index 2 (i.e. third position), and 4. Index this using the (decremented) third display. Add the result to the list.

⊞υ§S§⟦η0ζζ⟧⊖S

Input the fourth buttons, and index them from a list of four elements: the position used for the first button, 0 (representing the first button), and the position used for the second button (twice), first indexed using the (decremented) fourth display. Add the result to the list.

Input the fifth buttons.

⊞υ§υ⌕1243S

Input the fifth display, find its index into the string 1243, and index that into the list so far, adding the result to the list.

↑υ

Output the result.

answered Dec 15, 2019 at 20:11
\$\endgroup\$

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.