day 15 part1&2

This commit is contained in:
Lucia Ceionia committed 2023-12-15 01:58:12 -06:00
1 parent 5b6a60a62a
commit 9ecb520b5c
6 files changed
+467

No files matched your search

+3
View File
@@ -0,0 +1,3 @@
all:
nasm -g -felf32 main.s && ld -melf_i386 -g main.o
+1
View File
@@ -0,0 +1 @@
kff-,skp-,ff=5,rgr-,kgt-,mmv=2,lmr=2,xrq=3,jrs-,jccx=6,qprx=1,bsr=6,dnb=3,mgft-,cdj-,hf=7,fdrgdv-,hm-,kc=6,cvc-,mm-,pm=9,kstfh=8,rlqh-,jq=1,ljk=3,cx-,bbp-,dkpnb=4,mg=4,dpq-,ts=8,vgsn-,pvs=5,gbpzd-,xr=6,vj-,vtphg=5,fvz-,cpz-,cgm-,lvr=1,sfq-,ksd-,mj=9,kldxjm=9,qmj-,fqrh-,jn=3,czlss-,cpl=7,fh-,bsm-,nt-,bbp-,hj=6,ks-,tf-,hpbbfq-,fgrb-,rsz-,fjh-,zxm-,dczd=9,zsp-,qg=6,qfnxg=3,hf-,dn=5,gvm-,jxhht-,lxj=8,lt-,rch=4,pdb=9,xqm=4,drg=4,vrm=7,flkj=4,mm=5,fkkc=7,vc=6,jmd-,qbss-,trlmql=8,zg=4,rch-,msdnpt-,xctl-,ksbtkp=3,ptrq=5,tgl=8,rgr-,np=4,hqkr-,hgcvx=5,shdr-,rqlzm=5,ts-,hkrg=1,fl-,rsz=5,xrsj=6,lt=2,zcv=6,kldxjm-,bjhnm=7,tg=9,cn=4,xnx=1,zg=7,rrl=6,kqkm-,jmn-,fc-,mltqq-,rct-,cnsq=6,nrbv-,zn=9,gp=7,zsp-,zr-,pbpsp=3,dj-,cgdmm-,fl=9,xnx-,dkg=2,lm=6,fgrb=5,cznv-,sn-,rrf-,tld=8,rvmf=8,vq=7,msf=1,ncrtf=5,jhb-,mpb=3,phf-,bhl=9,mj-,nz=3,tr-,lj=5,zcv=6,vmd-,slb=6,clzljg-,mpzq-,tk-,tld-,vkm-,hqf-,jmd=1,chk=9,zr-,zdf=3,bm-,rfn-,qck=4,bqv=4,xjhbf-,zjxnb-,gn=1,fh-,klt-,jm-,qsr-,ft-,jrs-,xtr-,mgnh=7,jf=3,csr=7,cf=2,kbxm-,jmn-,fqrh-,qq-,jhnlt-,vk=9,jz-,vkm-,fzj=7,bqvq=8,lmr-,vhljvf-,zcm=7,jnn=3,ncrtf=4,jhnlt=7,vzvr-,rhtt-,gm=3,lk-,cpz=1,pq-,bb-,ct=4,qd=7,zcm=5,rh-,lvr-,sc=2,pf-,gtz-,mgft-,fjh-,gl=6,zxrrl=5,jq-,spq=7,xnjlqp-,xnjlqp=1,lhzng=6,dhdx=7,sj-,dhdx=6,jbjjms=4,ggnd-,qkz-,hqf=9,ts=8,qhtp-,zg-,rj-,dm=1,cvc-,dqs=9,hqkr=5,qfvt-,fknrgk=7,dfv-,zlm=6,kksttq-,rj-,bhl-,psgr=4,dkpnb-,vtvr-,qmms=7,vhljvf=6,rh=7,fvz-,fp=1,qfvt-,vmr-,ksd-,xrsj-,rhtt-,lvr-,qq-,knc-,kbxm-,xpvg-,zjxnb-,zgk=9,rsz=1,qprx-,gjs=5,lmr-,pjp-,rdkhx-,jtnf=6,zcx=4,fjtbp-,cxgtt=9,xqm-,cm=8,crhp-,xvp=9,skp=8,trm-,zrj-,ks=8,csgd-,nqg-,fxxtp=5,zn-,xqm=1,hmt-,mrn-,brpr-,gcth-,hj-,cr=6,vp-,srjg-,vq=3,hvt-,trlmql=5,dsqj=8,dj=5,msf-,gtp-,rch=4,fd-,rpkx=2,cx=7,mxvrm=1,mh-,tk-,fss=4,sgkj-,xtd=5,zl=8,vp-,qfnxg-,lhp=2,srjg=9,svl-,tvd=6,shdr-,rt-,dhdx-,pfp-,rct=2,zz-,nj-,xfr=7,cx=1,bqlxm=3,pf-,qh=8,lsm=7,xqpqd-,prg-,pnntc-,fxxtp-,gvm=5,xh-,mrn-,lsm=9,fc=4,kbb=8,fxxtp-,rrl=6,dqzfx-,ms-,fkkc=9,ncrtf-,tbpmh=8,pdd=7,rgr-,djgb=5,kldxjm=5,kbb=6,rns=7,gbpzd=1,ztvk=9,nggs=2,hkrg-,lqcv-,qbss-,vp=3,srvd-,sdvrn-,vxp=9,hpbbfq-,zrj-,tzs=3,rbn=3,kbb=8,gtz-,gsc-,nffffr=7,qqv-,jbjjms-,hh=4,np=5,rfn-,fzj-,jccx-,kstfh-,xqpqd-,qck-,np-,ph-,zxrrl=1,sxxxr=4,phf-,jccx-,nhxp=8,srjg-,cj-,rqb=5,lq-,zr-,cq-,vq-,zv-,fv-,lf-,qqv=7,dsdsqj-,tkt=7,md-,cxgtt-,kstfh-,cvc=3,ct=2,qqv=1,zrj-,sdkz-,spl=7,hqkr=9,kc-,sbq-,dvf-,jxhht-,hq-,rlr-,pvs-,bb-,kvxx=6,kcb-,qsb=3,hq-,lk-,fg=1,vmf-,rh-,hxr-,kzd=8,bm-,zg-,vhljvf=5,gfhkm-,tcxq=7,zkbh=4,mxfc-,pm-,zv-,sr-,jxd-,qhtp=2,vtclbc=9,cpl-,hvb=8,qxpk-,xctl-,knm-,vp=6,zxrrl=9,hmt=6,zv=5,sr=9,trm=7,dhdx-,cpl-,fd-,cn=6,hpbbfq=6,sdr-,pqqb-,crhp-,nqg=3,hmxm=6,pdd=8,xnjlqp=7,xr-,vpx=2,jq-,dvf=1,qprx=5,kc=4,prg-,xctl-,cxlx-,qx-,rlr-,zcx-,cnsq=9,kp=8,xtt-,xrsj-,fh-,pv-,ft-,ckt-,fvz-,ps-,sr=5,tkt-,fjk=2,tvz=7,kkb-,dhdx=9,psgr=4,zl-,pqqb=5,bqv=6,vmf=9,dvf-,bnr=4,fl=7,qg-,tlpts=7,dvf-,lhzng-,zz-,qkz-,pjp=1,hmxm-,stp=3,kksttq-,bc=6,sgkj=8,cjj-,jbjjms-,clzljg-,xcrs-,mj=4,dkg=3,vds=9,nfkn=5,hnr=9,rbn-,zjxnb-,ht=2,kxgc=5,nj-,kd-,kxn-,bn=9,lhp-,zgk=5,dz-,nrx-,nz-,ch=3,fgrb=5,cpl-,dqm-,dx-,xr=1,nqg=6,gn-,jxhht=5,fr=7,qck-,jrs-,fkkc=4,nnv=4,vpx-,kvxx-,sdvrn-,bnvgz=6,gxd-,cznv=9,vtphg=6,msf=3,vtv=3,zd=3,xrsj-,tf-,vj-,fh=2,prg-,rpkx-,pm=8,jnq=7,lj=1,vds-,np-,tld-,xctl=9,lq=1,qxxs=9,hmxm-,gh-,nffffr-,lm-,fjk-,ztp-,cdktcd-,llmrl-,cdktcd-,sn=1,lj-,mm-,dsxc=3,nhxp=8,tx-,zxm=4,tcxq=5,dczd-,tbpmh=9,fknrgk=5,kp=3,qxk-,cm=9,qs-,qfvt=4,rqb=4,rj-,nggs=1,ks=4,mk-,csr-,rt=2,cn-,qq=3,nfkn-,vj=1,pjp=6,pnntc-,vgtk=8,qjc-,cdls=1,fxxtp=6,vbn-,vk-,prg=9,dn=7,pvs=7,lmr-,hrm=9,sc-,rrsls=9,dsxc-,rrf=8,nz-,sxxxr=6,qmd=8,fp-,gl=4,tb-,zqv=1,dv=7,nrbv-,kc-,cgm=3,vkm=4,pbpsp-,ct-,zcx=1,pncctm=2,lvj-,qprx-,tzs=6,tjt=6,qmd=4,brpr-,rlqh-,dgcmk-,fgrb=5,zj=4,ptrq-,xr=6,zrfd-,dsqj=7,qt-,fj-,xrq=3,mmv-,fxxtp=8,zn=7,xh-,pfp-,zrj=7,dp=5,sn=1,ftb=9,rhtt=1,qt=4,lzs=7,xgjsm=8,fg-,zrj-,hh=7,lt=9,dm-,kkb=1,tgpg=5,ts=4,vp-,srjg=4,vtv=2,srvd=2,jf=8,qp=4,qb=5,np-,bjhnm=6,vk-,jb=7,rqb=7,lvj-,lk-,ph=9,dx=2,rh=8,vrm=5,ndf-,km-,ttp-,cpz=1,bjhnm-,rmdpjc=4,qp-,hrm-,ms-,tlvcnc-,vk=9,bf-,rrf=7,tlvcnc-,mxrp-,qmms-,rgr=8,vj-,ts-,bsm-,cr-,mh=4,trlmql=5,tjt-,gl=5,lr-,pgbg=9,tx=6,rj-,bsm=5,fpbz=9,cdls=2,nhxp-,zn-,qrc=3,lj=2,kxn-,ccn-,vbn=3,tgpg=6,dph=9,bgvt=6,bl=7,vq-,lxj=4,zdf-,rx-,xc=8,jmn-,lsqj-,sbq=3,dsqj=6,mk-,fl=4,clsd=4,vtphg-,qs=2,jxhht=2,tgpg=7,mp-,nffffr-,rs-,pnntc=6,jmb-,ph-,hvt-,xtd=9,srjg=5,tld=2,tvz=1,nhxp-,vgtk=9,xrq=3,dng=8,nnv=3,rns=9,qq-,rrsls=7,qp-,rgr-,kzd=3,ct=8,dfv-,rt-,sxxxr=4,xj-,qxxs-,klt-,df-,qcz=5,dczd=8,md-,qsr=1,rj-,sll-,dp-,ht-,zv-,tlpts-,clzljg=4,cjj=6,pdd=1,xtt=5,fvz=6,zcm=8,cdktcd-,kksttq-,xpvg=2,sdvrn-,knm=2,lmr-,qgfmp-,ng-,fvz=6,dqm-,kgt=6,lqcv-,xr=7,qmd=3,tn-,smffl=9,lzs-,llmrl=3,mtpc-,kgt=8,jl-,bsf=4,hrm=8,nt-,cgdmm-,mtpc-,bgvt-,lqcv=8,zqv=1,xctl-,hnr=7,jnq-,mp-,bm=4,qlm-,pv-,jbtf=6,pvs-,dmgc-,rgt-,kxn=7,zv=1,svl-,clsd=9,ljk=6,brpr-,nfkn=9,fg-,dl=3,sc-,skp-,dn=6,zrj-,gbpzd-,nrbv-,lxj-,rqlzm=7,pdb=6,lzs=9,cfc=7,qrk-,xj-,tcxq=3,gxbm=8,fqrh-,rgt=4,gr-,qd-,rlqh=8,sjjxn-,tf=2,qck=9,lhzng-,trm-,vmjq=9,ztp-,tk=5,bq-,pq-,kLine truncated
+1
View File
@@ -0,0 +1 @@
rn=1,cm-,qp=3,cm=2,qp-,pc=4,ot=9,ab=5,pc-,pc=6,ot=7
+160
View File
@@ -0,0 +1,160 @@
global _start
[bits 32]
[section .text]
%include "utils.s"
_start:
; HASH
mov esi, file
xor ebx, ebx ; current value
xor edi, edi ; current label high
xor ecx, ecx ; current label low
mov ebp, 17 ; mul value
hash:
movzx eax, byte [esi]
inc esi
cmp al, 10
je next_seq
cmp al, '-'
je minus
cmp al, '='
je equals
; save label
cmp ecx, 0x00ffffff
ja .needs_high
shl ecx, 8
mov cl, al
jmp .do_hash
.needs_high:
xchg eax, edi
shl eax, 8
mov al, cl
xchg eax, edi
mov cl, al
.do_hash:
; do HASH
; current += new
add eax, ebx
; current *= 17
mul ebp
; current %= 256
movzx ebx, al
jmp hash
; i'm not using a linked list whatever
minus:
; box *box = boxes+current*1024
shl ebx, 10
lea ebp, [ebx+boxes]
lea ebx, [ebx+boxes+4]
; box->max
mov eax, [ebp]
.find_eq:
test eax, eax
jz .done
dec eax
cmp [ebx], ecx
jne .cont
cmp [ebx+4], edi
jne .cont
xchg esi, edx
; remove match, move others down
mov edi, ebx
lea esi, [ebx+12]
; len = eax*8 + eax*4
mov ecx, eax
shl ecx, 3
shl eax, 2
add ecx, eax
rep movsd
xchg esi, edx
; decrease max
dec dword [ebp]
jmp .done
.cont:
add ebx, 12
jmp .find_eq
.done:
inc esi
jmp next_seq
equals:
; box *box = boxes+current*1024
shl ebx, 10
lea ebp, [ebx+boxes]
lea ebx, [ebx+boxes+4]
; box->max
mov eax, [ebp]
.find_eq:
test eax, eax
jz .no_match
dec eax
cmp [ebx], ecx
jne .cont
cmp [ebx+4], edi
jne .cont
; update match
mov al, [esi] ; ascii num
sub al, '0' ; to binary
mov [ebx+8], al
jmp .done
.cont:
add ebx, 12
jmp .find_eq
.no_match:
; new entry
mov [ebx], ecx
mov [ebx+4], edi
mov al, [esi]
sub al, '0'
mov [ebx+8], al
; inc max
inc dword [ebp]
.done:
add esi, 2
next_seq:
xor ebx, ebx ; current value
xor edi, edi ; current label high
xor ecx, ecx ; current label low
mov ebp, 17 ; mul value
cmp esi, file.over
jb hash
mov esi, boxes
calc_shit:
cmp dword [esi], 0
je .cont
mov edi, esi
sub edi, boxes
shr edi, 10 ; box idx
inc edi ; box num
mov ecx, 1 ; slot num
lea ebx, [esi+4] ; lenses
.inner:
mov eax, edi ; box num
mul ecx ; slot num
mul dword [ebx+8] ; focal length
add [final_value], eax
add ebx, 12
inc ecx
cmp ecx, [esi]
jbe .inner
.cont:
add esi, 1024
cmp esi, boxes.end
jb calc_shit
game_over:
mov eax, [final_value]
call print_dec
call newline
jmp exit
[section .data]
final_value: dd 0
file: incbin "input"
.over:
[section .bss]
boxes: resb 256*1024
.end:
+44
View File
@@ -0,0 +1,44 @@
global _start
[bits 32]
[section .text]
%include "utils.s"
_start:
; HASH
mov esi, file
xor ebx, ebx ; current value
mov ebp, 17 ; mul value
hash:
movzx eax, byte [esi]
inc esi
cmp al, ','
jle .next_seq
; do HASH
; current += new
add eax, ebx
; current *= 17
mul ebp
; current %= 256
movzx ebx, al
jmp hash
.next_seq:
add [final_value], ebx
xor ebx, ebx
cmp esi, file.over
jb hash
game_over:
mov eax, [final_value]
call print_dec
call newline
jmp exit
[section .data]
final_value: dd 0
file: incbin "input"
.over:
[section .bss]
+258
View File
@@ -0,0 +1,258 @@
; call # val val2
; int $0x80 eax eax edx -
;
; arg1 arg2 arg3 arg4 arg5 arg6 arg7
; ebx ecx edx esi edi ebp -
exit:
mov eax, 1 ; exit
int 0x80
; filename in EBX
; return handle in EBX
; read only
open_file:
push eax
push ecx
mov eax, 5 ; open
xor ecx, ecx ; read only
int 0x80
mov ebx, eax
pop ecx
pop eax
ret
; file handle in EBX
; buffer in ECX
; count of bytes to read in EDX
; return bytes actually read in EAX
; exits on error
read_file:
mov eax, 3 ; read
int 0x80
test eax, eax
js .err
ret
.err:
mov eax, 4 ; write
mov ebx, 1 ; stdout
mov ecx, .err_str
mov edx, 21
int 0x80
jmp exit
.err_str: db `Could not read file.\n`
; string input in ESI
; value in EAX
; CF set if none, clear if some
; ESI set past checked area
dec_parse:
push ebx
push edx
push edi
xor eax, eax
xor edi, edi
mov ebx, 10 ; base
lodsb
sub al, '0'
js .no_input
cmp al, 9
jle .got_char
.no_input:
stc ; set CF
jmp .done
.loop:
xor eax,eax
lodsb
sub al, '0'
js .dec_done
cmp al, 9
jg .dec_done
.got_char:
xchg edi,eax
mul ebx
add edi,eax
jmp .loop
.dec_done:
clc ; clear CF
.done:
mov eax,edi
pop edi
pop edx
pop ebx
ret
; string input in ESI
; value in EAX
; CF set if none, clear if some
; ESI set past checked area
sign_dec_parse:
push ebx
push ecx
push edx
push edi
xor eax, eax
xor edi, edi
xor ecx, ecx ; neg flag
mov ebx, 10 ; base
cmp byte [esi], '-'
jne .no_minus
inc esi
mov cl, 1
.no_minus:
lodsb
sub al, '0'
js .no_input
cmp al, 9
jle .got_char
.no_input:
stc ; set CF
jmp .done
.loop:
xor eax,eax
lodsb
sub al, '0'
js .dec_done
cmp al, 9
jg .dec_done
.got_char:
xchg edi,eax
mul ebx
add edi,eax
jmp .loop
.dec_done:
test ecx, ecx
jz .not_neg
neg edi
.not_neg:
clc ; clear CF
.done:
mov eax,edi
pop edi
pop edx
pop ecx
pop ebx
ret
; modifies no regs
newline:
pushad
push 10
mov eax, 4 ; write
mov ebx, 1 ; stdout
mov ecx, esp ; string
mov edx, 1 ; length
int 0x80
add esp, 4
popad
ret
; modifies no regs
space:
pushad
push 9
mov eax, 4 ; write
mov ebx, 1 ; stdout
mov ecx, esp ; string
mov edx, 1 ; length
int 0x80
add esp, 4
popad
ret
; input in EAX, all regs unmodified
print_dec:
pushad ; save regs
; max 4294967296 is 10 chars
; round to nearest 32-bit boundary
sub esp, 12
; string in ECX, length in EDX
lea ecx, [esp+11] ; last possible byte
; check for 0
test eax, eax
jz .zero
mov ebx, 10 ; base 10
xor esi, esi ; counter
.div_shit:
xor edx, edx
; divide
div ebx
dec ecx ; next char
inc esi
; store
add dl, '0'
mov byte [ecx], dl
; check if done
test eax, eax
jnz .div_shit ; continue
mov edx, esi ; counter in edx
jmp .write
.zero:
mov byte [ecx], '0'
mov edx, 1 ; length
.write:
mov eax, 4 ; write
mov ebx, 1 ; stdout
int 0x80
add esp, 12 ; restore stack
popad ; restore regs
ret
; input in EAX, all regs unmodified
print_sign_dec:
pushad ; save regs
; range -2147483648 to 2147483647 is 11 chars
; round to nearest 32-bit boundary
sub esp, 12
; string in ECX, length in EDX
lea ecx, [esp+11] ; last possible byte
; check for 0, negative
xor ebp, ebp
test eax, eax
jz .zero
jns .positive
neg eax
mov ebp, 1
.positive:
mov ebx, 10 ; base 10
xor esi, esi ; counter
.div_shit:
xor edx, edx
; divide
div ebx
dec ecx ; next char
inc esi
; store
add dl, '0'
mov byte [ecx], dl
; check if done
test eax, eax
jnz .div_shit ; continue
mov edx, esi ; counter in edx
jmp .write
.zero:
mov byte [ecx], '0'
mov edx, 1 ; length
.write:
test ebp, ebp
jz .no_minus
dec ecx
inc edx
mov byte [ecx], '-'
.no_minus:
mov eax, 4 ; write
mov ebx, 1 ; stdout
int 0x80
add esp, 12 ; restore stack
popad ; restore regs
ret
; input in ESI, len in ECX, all regs unmodified
print_string:
pushad ; save regs
mov eax, 4 ; write
mov ebx, 1 ; stdout
mov edx, ecx ; length
mov ecx, esi ; string
int 0x80
popad ; restore regs
ret