add bf day 4
This commit is contained in:
parent
a94eca12bf
commit
f987c01b73
1 changed files with 256 additions and 0 deletions
256
bf/day_04.bf
Normal file
256
bf/day_04.bf
Normal file
|
@ -0,0 +1,256 @@
|
|||
adventofcode 2023 day 4
|
||||
input example:
|
||||
Card 1: 41 48 83 86 17 | 83 86 6 31 17 9 48 53
|
||||
Card 2: 13 32 20 16 61 | 61 30 68 82 17 32 24 19
|
||||
Card 3: 1 21 53 59 44 | 69 82 63 72 16 21 14 1
|
||||
Card 4: 41 92 73 84 69 | 59 84 76 51 58 5 54 83
|
||||
Card 5: 87 83 26 28 32 | 88 30 70 12 93 22 82 36
|
||||
Card 6: 31 18 13 56 72 | 74 77 10 23 35 67 36 11
|
||||
|
||||
|
||||
#### 297693052
|
||||
|
||||
out0 out1 score0 score1
|
||||
255 t0 t1 t2 t3 t4
|
||||
255 win_0 win_1 etc
|
||||
|
||||
>>>>- set marker before t0
|
||||
>>>> >>- set marker before cmp
|
||||
<<<< < t0
|
||||
, read "C"
|
||||
[ for each line
|
||||
,,, ,, read "ard x"
|
||||
[read until ":" (58)
|
||||
,
|
||||
>++++ ++++
|
||||
[-<---- --->] subtract 8*7=56
|
||||
<-- subtract 2
|
||||
]
|
||||
: reached
|
||||
, read " "
|
||||
[ read winning numbers until "|" (124)
|
||||
+[-<+]-> goto t0
|
||||
, digit or " " or "|"
|
||||
>[-]++++ ++++
|
||||
[-<---->] subtract " " (32)
|
||||
< t0
|
||||
[digit or "|"
|
||||
>++++
|
||||
[-<---->] subtract 16 from t0 to get digit value
|
||||
t1
|
||||
] now at t0 or t1
|
||||
+[-<+]-> goto t0
|
||||
t0 now has digit value or "|" minus 48 (76)
|
||||
space interpreted as zero
|
||||
[->+>+<<] move t0 to t1 and t2
|
||||
++++ ++++ +
|
||||
[->---- ----<] subtract 72 from t1
|
||||
>---- subtract 4
|
||||
t1
|
||||
[ t2 is a digit
|
||||
>t2
|
||||
[->>+++++ +++++<<] t2*10 in t4
|
||||
, read second digit to t2
|
||||
>++++ ++++ t3
|
||||
[-<--- --->] reduce t2 to digit value
|
||||
< t2
|
||||
[->>+<<] add t2(ones place) into t4
|
||||
>>t4
|
||||
> marker 1
|
||||
[>] find empty win slot
|
||||
+mark slot
|
||||
[<]> return to marker t4 (t3 is empty and everything between is not)
|
||||
[-> marker 1
|
||||
[>]< find last populated win slot
|
||||
+
|
||||
+[-<+]-return to marker 1
|
||||
< t4
|
||||
]
|
||||
> marker 1
|
||||
[>]< find last populated win slot
|
||||
- unmark
|
||||
<[<] return to t4 (everything between will be nonzero)
|
||||
<< t2
|
||||
,[-] read the trailing space
|
||||
]
|
||||
+[-<+]->> return to t1
|
||||
loop on t1 since its the input="|" marker
|
||||
]
|
||||
all winner numbers parsed for this line
|
||||
>[-] reset t2
|
||||
<< t0
|
||||
, read " "
|
||||
[read candidate numbers until \n=LF(10) is reached
|
||||
there is another number
|
||||
, digit or " "
|
||||
>++++ ++++
|
||||
[-<---->] subtract " " (32)
|
||||
<
|
||||
[not space so subtract 16 to get digit value
|
||||
>++++
|
||||
[-<---->]
|
||||
now at t1
|
||||
] t0 or t1
|
||||
+[-<+]-> goto t0
|
||||
[->>+++++ +++++<<] digit*10 in t2
|
||||
, guaranteed digit in t0
|
||||
>++++ ++++
|
||||
[-<------>] subtract 48 from t0
|
||||
< t0
|
||||
[->>+<<] add t0 to t2
|
||||
|
||||
>>>>> goto marker
|
||||
[>]- mark end of array
|
||||
[<] goto t4
|
||||
|
||||
check numbers while t3 is set
|
||||
<+ set t3
|
||||
[ COMPARISON for all winning numbers
|
||||
(copy t2 to t0):
|
||||
<<<[-] clear t0
|
||||
>>[-<+<+>>] move t2 to t0 and t1
|
||||
<[->+<] move t1 back to t2
|
||||
|
||||
>>>> goto marker
|
||||
>+[->+]-< go to last element
|
||||
[ (subtract next number in win list to compare):
|
||||
- dec element
|
||||
<+[-<+]-< return to t4
|
||||
<<<< goto t0
|
||||
- subtract for comparison
|
||||
>>>>> goto marker
|
||||
>+[->+]- goto end marker
|
||||
>+ place copy of number after the marker
|
||||
<< return to last element
|
||||
]
|
||||
(at old pos of last element)
|
||||
t0 is now 0 if this was a winning number
|
||||
->+ move end marker to the left
|
||||
<<+[-<+]-< return to t4
|
||||
<<<<<<+ mark score1
|
||||
>>>>>
|
||||
- unmark t3 (exit loop)
|
||||
<<< t0
|
||||
[ numbers are not equal
|
||||
not a winning number (yet)
|
||||
<< - unmark score1
|
||||
>>> t1 is empty; use to exit
|
||||
]
|
||||
now t0 or t1
|
||||
t0 might be 255
|
||||
> t1 or t2
|
||||
+[->+]-> first array element
|
||||
+[-
|
||||
array has remaining values
|
||||
looping will continue
|
||||
<<<+mark t3
|
||||
> exit on t4
|
||||
] t4 or first array element
|
||||
<+[->+]- goto marker
|
||||
<<t3
|
||||
loop on t3
|
||||
]
|
||||
array is empty and/or winning number confirmed
|
||||
> t4
|
||||
[
|
||||
-
|
||||
add to temp score
|
||||
<<<<t0
|
||||
<<+>>>t1 should be empty
|
||||
] t4 or t1
|
||||
+[->+]- goto marker (t0 might be 255 from subtraction
|
||||
|
||||
(reorder winner array)
|
||||
|
||||
>[+] remove end marker (its still there if there was a winning number)
|
||||
>> first in the shifted array
|
||||
[>]- mark end of array
|
||||
< last element
|
||||
[
|
||||
-
|
||||
<+[-<+]- goto start marker
|
||||
>>+ move value to beginning of array
|
||||
+[->+]-< return to last element
|
||||
]
|
||||
< new last element
|
||||
[
|
||||
-
|
||||
<+[-<+]- goto start marker
|
||||
>+ move value to beginning of array
|
||||
+[->+]-<< return to last element
|
||||
]
|
||||
|
||||
>>+ remove marker
|
||||
<<< last element
|
||||
[<] return to t4
|
||||
<<[-] clear t2
|
||||
<< t0
|
||||
, ---- ---- -- subtract LF(10)
|
||||
NOTE: gets stuck if there is no trailing newline
|
||||
exit loop if newline reached
|
||||
] t0
|
||||
(clear win array)
|
||||
>>>>> marker
|
||||
> first array element
|
||||
[[-]>] clear array
|
||||
+[-<+]- return to marker
|
||||
<<<<< t0
|
||||
TODO add score to total
|
||||
|
||||
(score calculations)
|
||||
<<[->>+>+<<<] move score to t0 and t1
|
||||
check if 9 or 10 (256 or 512)
|
||||
<<<++ mark high byte as if score was 512
|
||||
>>>>> t0
|
||||
----- -----
|
||||
[
|
||||
not equal to 10
|
||||
<<<<<- unmark high byte for 512
|
||||
>>>>>+
|
||||
[
|
||||
not equal to 9
|
||||
<<<<<- unmark high byte for 256
|
||||
>>>>> [+]reset t0
|
||||
>t1
|
||||
[-
|
||||
for each match
|
||||
<<< score1 low byte
|
||||
[->>+<<] move score to t0
|
||||
>>t0
|
||||
[double the score; it was not zero
|
||||
[-<<+<+>>>]move t0 to score0 and score1
|
||||
<<<[->+<] add score0 to score1
|
||||
>>>t0 is empty now
|
||||
]
|
||||
<<<+ add init to score0
|
||||
> score1
|
||||
[ if score is already set; remove init score
|
||||
<-
|
||||
]score0 or score1
|
||||
+[->+]- goto marker
|
||||
<<[->+<] move init score if any to score1
|
||||
>>>> t1
|
||||
]
|
||||
add to total
|
||||
<<<score1
|
||||
[-
|
||||
<+ mark score0 that wrapping happened
|
||||
<+ add to total1
|
||||
[total1 did not wrap
|
||||
>- unmark wrap (score0)
|
||||
>>> t0 is empty
|
||||
]total1 or t0
|
||||
total1 might be 255
|
||||
>>>score0 or t3
|
||||
+[-<+]- goto marker
|
||||
<score1
|
||||
]
|
||||
< score0; wrap marker
|
||||
[ apply wrap
|
||||
<<+>>-
|
||||
]
|
||||
>>>return to t0
|
||||
]
|
||||
]
|
||||
,loop on first character of the line (exits if all input is consumed)
|
||||
]
|
Loading…
Reference in a new issue