feat(sterni/aoc/2022): day10 BQN solution
I cheated a bit to skip implementing multi cycle instructions. The VM is pretty much a normal tail recursive function, but working with scalars in BQN is on brand-ish. Array programming helps again when drawing the picture on screen. Change-Id: I2562c862e228f633c5fad09e503529c6e0785112 Reviewed-on: https://cl.tvl.fyi/c/depot/+/7556 Tested-by: BuildkiteCI Reviewed-by: sterni <sternenseemann@systemli.org> Autosubmit: sterni <sternenseemann@systemli.org>
This commit is contained in:
parent
42a4f14878
commit
c381fa64cf
2 changed files with 30 additions and 1 deletions
25
users/sterni/exercises/aoc/2022/10/10.bqn
Normal file
25
users/sterni/exercises/aoc/2022/10/10.bqn
Normal file
|
@ -0,0 +1,25 @@
|
|||
⟨SplitOn,ReadDec⟩ ← •Import "../../lib.bqn"
|
||||
# Instead of implementing the VM described in the problem, translate the
|
||||
# program to instructions with equivalent timing for a similar VM that
|
||||
# only needs 1 cycle for every instruction.
|
||||
is ← ∾{"noop": <"noop"; 𝕩: (<"noop")∾<ReadDec⌾(1⊸⊑) (<' ') SplitOn 𝕩}¨ •FLines "input"
|
||||
|
||||
Op ← {x 𝕊 "noop": x;x 𝕊 "addx"‿i: x+i}
|
||||
Draw ← {𝕊 c‿x‿pic: pic∨(↕240)((c-1)⊸=∘⊣∧∊)(⌊⌾(÷⟜40)c)+¯1+x+↕3}
|
||||
_vm ← {
|
||||
is _self s: (⊑s)≥≠is? s;
|
||||
is _self prev‿sum‿x‿pic:
|
||||
cycle ← prev+1
|
||||
is _self ⟨
|
||||
cycle,
|
||||
sum+x×cycle×⊑cycle∊20‿60‿100‿140‿180‿220,
|
||||
x Op (¯1+cycle)⊑is,
|
||||
Draw cycle‿x‿pic
|
||||
⟩
|
||||
}
|
||||
|
||||
·‿sum‿·‿pic ← is _vm 1‿0‿1‿(240⥊0)
|
||||
|
||||
•Out "day10.1: "∾•Fmt sum
|
||||
•Out "day10.2:"
|
||||
•Show (⊑⟜".#")¨ ∘‿40⥊pic
|
|
@ -1,6 +1,10 @@
|
|||
IsAsciiNum ⇐ ('0'⊸≤∧≤⟜'9')
|
||||
|
||||
ReadInt ⇐ {(𝕨⊸×+⊣)´∘⌽-⟜'0'𝕩} # stolen from leah2
|
||||
# based on leah2's function
|
||||
ReadInt ⇐ {
|
||||
𝕨 𝕊 𝕩: '-'=⊑𝕩? -𝕨 𝕊 1↓𝕩;
|
||||
𝕨 𝕊 𝕩: (𝕨⊸×+⊣)´∘⌽-⟜'0'𝕩
|
||||
}
|
||||
ReadDec ⇐ 10⊸ReadInt
|
||||
|
||||
SplitOn ⇐ ((⊢ (-1˙)⍟⊣¨ +`∘(1⊸»<⊢))∘(≡¨)⊔⊢)
|
||||
|
|
Loading…
Reference in a new issue