Advent of Code 2023

Day 1, Part 1

Solution in 192 bytes

I wrote a simple solution to the first day's first part of the Advent of Code in x86 assembly.

The compiled binary takes up 192 bytes.

I couldn't test it against the full set but it does support 32bit numbers, even tho it's a 16bit .com file, so it won't overflow.

Unfortunately DOSBox crashes, and DOSBox-X doesn't support clipboard over 2048 bytes and pipes. Test it for me if you have the time. I don't see why it should not work.\

Download aoc1.com (192 bytes)

Here's a short proof it works:

And here's the source code:

%macro print 1 push ax push dx mov ah,02h mov dl,%1 int 21h pop dx pop ax %endmacro %macro num 1 ; print out num mov eax,%1 cmp eax,0 jne %%notzero print '0' jmp %%endend %%notzero: mov cx,0 %%loop: xor edx,edx cmp eax,0 je %%end mov ebx,10 div ebx push dx inc cx jmp %%loop %%end: cmp cx,0 je %%endend %%typeloop: pop dx add dx,30h mov ah,02h int 21h dec cx cmp cx,0 jne %%typeloop %%endend: %endmacro org 100h start: mov [cs:total],ax next_line: xor ax,ax mov dx,ax next_char: ; get char mov ah,01h int 21h ; if return, next line cmp al,13 je add_number ; check if digit cmp al,30h jl next_char cmp al,39h jg next_char ; if digit, checkl if first is set sub al,30h cmp dl,0 jne first_already_set ; if fisrt not set we set first and the flag inc dl mov [cs:first_num],al first_already_set: mov [cs:last_num],al ; repeat until enter jmp next_char add_number: ; if first not set, we finish cmp dl,0 je print_total xor ah,ah ; combine digits into number xor eax,eax mov al,[cs:first_num] mov ah,10 mul ah add al,[cs:last_num] mov [cs:combined],ax ; add number to total mov eax,[cs:combined] mov ebx,[cs:total] add eax,ebx mov [cs:total],eax jmp next_line print_total: num [cs:total] the_end: ; newline print 10 print 13 ret first_num_set: resb 1 first_num: resw 1 last_num: resw 1 combined: resd 1 total: resd 1


© Sos Sosowski 2023