On the Subject of Memory
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()
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!
Charcoal, 74 bytes
Sθ≔∨⊖S¹η⊞υ§θηSθ≔§⟦⌕θ4η⁰η⟧⊖Sζ⊞υ§θζ⊞υ§⁺⮌υ⟦§S²4⟧⊖S⊞υ§S§⟦η⁰ζζ⟧⊖SSθ⊞υ§υ⌕1243S↑υ
Try it online! Link is to verbose version of code. Takes input as buttons#1 display#1 buttons#2 ... display#5
. Explanation:
Sθ
Input the first buttons.
≔∨⊖S¹η
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.
Sθ
Input the second buttons.
≔§⟦⌕θ4η⁰η⟧⊖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.
⊞υ§⁺⮌υ⟦§S²4⟧⊖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§⟦η⁰ζζ⟧⊖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.
Sθ
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.