This commit is contained in:
dobiadi
2022-12-25 10:26:59 +01:00
parent 4db23f212c
commit b80bd0674c
3 changed files with 213 additions and 0 deletions

111
day25/input.txt Normal file
View File

@@ -0,0 +1,111 @@
1=021=20---11-1=1
222==-=1-2=-11-11
1010==0=0=1--=1
2
1122=
2222==2222-2--10
100=-2-002=
12221-2-10-=1=
1-=211000=221-1
2=--12==11221-2-002
1101==-01===01=
220=0=-2-1-0===10=2
2-0-
1=-12=2==
1-=-02==-1
100-0-11--02--0=-
1==0-1220011=-
21
1102-22==
222
1==0=22-0--011-0
1020
2==2-102
1010-02==02=
1=1
2=010==12022=
1=-22001-2=
101=2-201122111
1=-0021211-1-1-1202
2-22-2
1212002==1
2=-0-
1-1==1122110100
1--020-2-=-0-21--
2=22-21220022==1=
1=-00-121-20-2122
1-==-00
20=21=0
20-02-0-=-==-=22
1120==-2
2=--0-0-000201=101
1---=02=21
1-011
211-2112=20--2
1=-
1=--=021
1-1-122200==1-1111
11001-
200=200
1===21=1-2
1===10
2=22
10-110210=01112-
2121=1=2=-201-
1---2=-0=-
211-120---000=-0-
1-
1-101-2=01020=-0=
112-12--0=12=12--
1-0-=2--=--12=20
1=0=-121
1000122-210--011200
120==-1-=01
1=2=1--
101-1=--2-
2=
2--10
2201020-=2-
1===2001-1=0=
222=-2---2=112
2010=-22=012=202=
111
1-2112=0200=1
2=02211=2
2-121
1----12=-2011
2==0
112
22=0==1-1=
1-20=0-
1=110211-022201222
20
1-111
1=-=022011=2=2=1
1-02122
2-1
1-2-=2-0=0---
1-20
1=1=102
1=1=0--1
11222-==0101-
2122100=0
2011==12-10
210--121-0=
22121=01=0=-=-=-==
10-0-=1-12
2-2=21
1=1-0-0-
10020
10-0-0120=211-2-
1-==10-0-==001201-
1-0
21=00202002-0
1-1=2021
11=1==1=0
1=102-1=-20-0
2=100-12-0=
1=0
1--=
12=212110200-
222002100

BIN
day25/snafu Executable file
View File

Binary file not shown.

102
day25/snafu.c Normal file
View File

@@ -0,0 +1,102 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BUFFER_SIZE 64
#define MAGIC_NUMBER 5
long powNum(long, long);
long snafu_to_human(char*, int);
void human_to_snafu(char*, long);
int main() {
char buf[BUFFER_SIZE], *p, c;
memset(buf, 0, BUFFER_SIZE);
p = buf;
long sum = 0;
while ((c = getchar()) != EOF) {
*p++ = c;
if (c == '\n') {
sum += snafu_to_human(p-2, p-buf);
memset(buf, 0, BUFFER_SIZE);
p = buf;
}
}
printf("Sum in decimal: %li\n", sum);
char snafu[64];
memset(snafu, 0, 64);
human_to_snafu(snafu, sum);
printf("Sum in SNAFU: %s\n", snafu);
}
long powNum(long b, long e) {
long result = 1;
for (int i = 0; i < e; i++) {
result *= b;
}
return result;
}
long snafu_to_human(char* p, int len) {
long result = 0;
for (int i = 0; i < len; i++) {
switch(*(p-i)) {
case '0':
break;
case '1':
result += powNum(MAGIC_NUMBER, i);
break;
case '2':
result += 2*powNum(MAGIC_NUMBER, i);
break;
case '-':
result += -powNum(MAGIC_NUMBER, i);
break;
case '=':
result += -2*powNum(MAGIC_NUMBER, i);
break;
}
}
return result;
}
void human_to_snafu(char* p, long decimal) {
char buf[64], *q;
memset(buf, 0, 64);
long num = decimal;
int len = 0;
int remainder = 0;
while (num != 0) {
int numeric = num % MAGIC_NUMBER;
num /= MAGIC_NUMBER;
numeric += remainder;
remainder = 0;
if (numeric > 2) {
remainder = 1;
numeric = numeric - MAGIC_NUMBER;
}
if (numeric == -1) {
buf[len] = '-';
} else if (numeric == -2) {
buf[len] = '=';
} else {
buf[len] = '0' + numeric;
}
len++;
}
if (remainder) {
buf[len] = '1';
len++;
}
for (int i = 0; i <= len; i++) {
*(p+len-i-1) = buf[i];
}
}