Laudian
Moderator
Moin Moin,
Nachdem die Idee letztes Jahr recht erfolgreich war, gibt es auf adventofcode.com/ auch dieses Jahr jeden Tag wieder 2 kleine Programmieraufgaben.
Letztes Jahr wurde ich durch diesen Post hier im Forum leider erst relativ spät auf die Aktion aufmerksam.
Da ich die Sache insbesondere für Hobbyprogrammierer sehr interessant finde, wollte ich hier noch einmal darauf aufmerksam machen. Die Aufgaben fangen in den ersten Tagen relativ einfach an und werden zum Ende hin dann immer kniffliger.
Außerdem würde es mich freuen, wenn sich hier noch ein paar andere Leute finden, welche die Aufgaben auch lösen und daran interessiert sind, ihren Code hier mit anderen zu vergleichen. Mich würde es einfach interessieren, wie andere Leute an die Aufgaben herangehen und wie die Lösungen in anderen Sprachen aussehen (ich schreibe in Python).
Fragen zu Problemen oder Verbesserungsvorschläge zu gepostetem Code sind natürlich auch gern gesehen.
Lösungen:
Nachdem die Idee letztes Jahr recht erfolgreich war, gibt es auf adventofcode.com/ auch dieses Jahr jeden Tag wieder 2 kleine Programmieraufgaben.
Letztes Jahr wurde ich durch diesen Post hier im Forum leider erst relativ spät auf die Aktion aufmerksam.
Da ich die Sache insbesondere für Hobbyprogrammierer sehr interessant finde, wollte ich hier noch einmal darauf aufmerksam machen. Die Aufgaben fangen in den ersten Tagen relativ einfach an und werden zum Ende hin dann immer kniffliger.
Außerdem würde es mich freuen, wenn sich hier noch ein paar andere Leute finden, welche die Aufgaben auch lösen und daran interessiert sind, ihren Code hier mit anderen zu vergleichen. Mich würde es einfach interessieren, wie andere Leute an die Aufgaben herangehen und wie die Lösungen in anderen Sprachen aussehen (ich schreibe in Python).
Fragen zu Problemen oder Verbesserungsvorschläge zu gepostetem Code sind natürlich auch gern gesehen.
Lösungen:
Tag 1:
Tag 2:
Tag 3:
Tag 4:
Tag 5:
Tag 6:
Aufgabe 1:
Aufgabe 2:
Code:
eingabe = """R4, R4, L1, R3, L5, R2, R5, R1, L4, R3, L5, R2, L3, L4, L3, R1, R5, R1, L3, L1, R3, L1, R2, R2, L2, R5, L3, L4, R4, R4, R2, L4, L1, R5, L1, L4, R4, L1, R1, L2, R5, L2, L3, R2, R1, L194, R2, L4, R49, R1, R3, L5, L4, L1, R4, R2, R1, L5, R3, L5, L4, R4, R4, L2, L3, R78, L5, R4, R191, R4, R3, R1, L2, R1, R3, L1, R3, R4, R2, L2, R1, R4, L5, R2, L2, L4, L2, R1, R2, L3, R5, R2, L3, L3, R3, L1, L1, R5, L4, L4, L2, R5, R1, R4, L3, L5, L4, R5, L4, R5, R4, L3, L2, L5, R4, R3, L3, R1, L5, R5, R1, L3, R2, L5, R5, L3, R1, R4, L5, R4, R2, R3, L4, L5, R3, R4, L5, L5, R4, L4, L4, R1, R5, R3, L1, L4, L3, L4, R1, L5, L1, R2, R2, R4, R4, L5, R4, R1, L1, L1, L3, L5, L2, R4, L3, L5, L4, L1, R3"""
eingabe = eingabe.split(", ")
instructions = []
for instruction in eingabe:
instructions.append((instruction[0:1], int(instruction[1:])))
NORTH = (0, 1)
SOUTH = (0, -1)
WEST = (-1, 0)
EAST = (1, 0)
Directions = (NORTH, EAST, SOUTH, WEST)
cDir = 0
cCoords = [0,0]
def changeDir(turn):
global cDir
if turn == "R":
cDir = (cDir+1)%4
elif turn == "L":
cDir = (cDir % 4 - 1) % 4
return
def addSteps(steps):
global cCoords
for i in (0,1):
cCoords[i] += Directions[cDir][i]*steps
return
for instruction in instructions:
changeDir(instruction[0])
addSteps(instruction[1])
print(abs(cCoords[0])+abs(cCoords[1]))
Code:
eingabe = """R4, R4, L1, R3, L5, R2, R5, R1, L4, R3, L5, R2, L3, L4, L3, R1, R5, R1, L3, L1, R3, L1, R2, R2, L2, R5, L3, L4, R4, R4, R2, L4, L1, R5, L1, L4, R4, L1, R1, L2, R5, L2, L3, R2, R1, L194, R2, L4, R49, R1, R3, L5, L4, L1, R4, R2, R1, L5, R3, L5, L4, R4, R4, L2, L3, R78, L5, R4, R191, R4, R3, R1, L2, R1, R3, L1, R3, R4, R2, L2, R1, R4, L5, R2, L2, L4, L2, R1, R2, L3, R5, R2, L3, L3, R3, L1, L1, R5, L4, L4, L2, R5, R1, R4, L3, L5, L4, R5, L4, R5, R4, L3, L2, L5, R4, R3, L3, R1, L5, R5, R1, L3, R2, L5, R5, L3, R1, R4, L5, R4, R2, R3, L4, L5, R3, R4, L5, L5, R4, L4, L4, R1, R5, R3, L1, L4, L3, L4, R1, L5, L1, R2, R2, R4, R4, L5, R4, R1, L1, L1, L3, L5, L2, R4, L3, L5, L4, L1, R3"""
eingabe = eingabe.split(", ")
instructions = []
for instruction in eingabe:
instructions.append((instruction[0:1], int(instruction[1:])))
NORTH = (0, 1)
SOUTH = (0, -1)
WEST = (-1, 0)
EAST = (1, 0)
Directions = (NORTH, EAST, SOUTH, WEST)
cDir = 0
cCoords = [0,0]
def changeDir(turn):
global cDir
if turn == "R":
cDir = (cDir+1)%4
elif turn == "L":
cDir = (cDir % 4 - 1) % 4
return
def addSteps(steps):
global cCoords
for i in (0,1):
cCoords[i] += Directions[cDir][i]*steps
return
visitedLocations = [(0,0)]
def execute():
for instruction in instructions:
changeDir(instruction[0])
for n in range(instruction[1]):
addSteps(1)
coords = tuple(cCoords)
if coords in visitedLocations:
return coords
else:
visitedLocations.append(coords)
execute()
print(abs(cCoords[0])+abs(cCoords[1]))
Aufgabe 1:
Aufgabe 2:
Code:
eingabe = """DULUDRDDDRLUDURUUULRRRURDRDULRUDDUDRULUDDUDRLDULRRLRDRUDUUULUUDLRURDUDDDDRDLLLLULRDLDRDLRLULRUURDDUULUDLRURRDDRDDRDDLDRDLLUURDRUULRRURURRDLRLLLUDULULULULUDRLLRUDUURLDRLRLRDRRDRLLLDURRDULDURDDRLURRDURLRRRLDLLLDRUUURLRDLDLLLLRDURRLDLULRLDDLDLURLRRDDRUDDUULRURRUDLRDLDUURDDDDRLRURUDULUDLRRLLLLLRDRURLLDLDULUUDLUDDDRLLDRRUDLLURRUUDDRRLLRRLDDDURLDRDRLURRRRDRRRDDUDULULDURRUUURRRDULUUUDDRULDRLLRDLDURLURRLLRUUUULRDURLLDDRLLDLRLRULUUDRURUDLLURUDDRDURLRDRRRDURLDDRDRLRLLURULUUULUDDDULDLRDDDRDLLRRLDRDULLUUUDLDDLDDDLLLLLLLDUDURURDURDRUURRRDDRDUDLULDURDUDURDDDRULDURURURRLURLURLUURLULDLLRUULURDDRLRDDLRDLRRR
LUURLRUDRRUDLLDLUDDURULURLUUDUUDDRLUULRDUDDUULDUUDRURDDRRDRLULLRDRDLRLLUURRUULRLDRULUDLDUUDDDRDDLRDLULDRLDUULDLRDLLLDLDLRDUULUDURRULLRLDUDRLLLULUUUULUUDUUURRRDULLUURUDRRLDURRUULDRDULDUDRDUUULUUDDRLUDRLDLDRUUURDLDUDRUDUURLLRRLRLLRRLDULDDULUDUUURULDDUDUDRURRDLULRUDDURDLDLLRRRLDRLULLLRUULDUDLUUDURRLLLRLUDURRDDLDRDDDLURDLDRRUDUDLUDULULRUUUDLUURLLRLDDLURULDURDLRRDDDDURLDDLLDDULLLRLDLDULDUUDDRLDUURDDLDLUUDULRRLRLUURURUURLRLURUURLDRUURLLRDDUUUDULUDDDRDRLDRDRRLRLDULLRRUDLURULULRDRURURLULDUDLRURLRDDRULDDLRD
LUDRULUULRRDDDDRRDUURUDDRLDDLDRDURRURULRDLDLDUUDRRDUUDUDLLLRRLDUDDRLDDLRRLRDRLUDLULUDDUUDULDUUULUDLDDURLDURUDLDRUUDRLRRLDLDDULDUUDDLDDLLURDRLRUURDDRUDDUDLDRRLRUDRUULRRRLRULULURDLRRURDRLRULDDDRDUULLURUUUURUDDLRRRRRDURLULDLUULUDRRUDUDRRDDRURDURLRLUDDLDLRRULUDLDDRLDDLDDDLLLLRDLLUULDDLULDLDRDDUDLURUDLDLDDRRUUDDDLRLLLDRRDDDUURDUDURUURRDRLLDUDLDUULLDLDLLUULLRRULDLDRURLDULDRUURDURRURDLRDLLLDRRUDRUUDRURLUDDRURLDURRDLUUDLUUDULLLDDDDRRDLLLDLURULDDRDLUUURRDRRUUDDUL
DUUULDUDDDURLLULDDLLUDURLLLURULULURUURDRURLRULLLLDRDDULRRDRRLLLRDDDUULLRRURRULLDDURRRLRDDLULDULLDUDLURRDLDDLURDLRLLDRURLLRLLRRRDRRRURURUUDDLLDDLDDDLRLURUUUULRDLUDDDURLLDDRLDRRLLUDUUULRLLDRRRLRUUDLDUULRLUDRULLLLDUDLLUUDDRUURLURUDRDDDLRURUDRLULLULUUDLDURDULRRDRLDURUULRDRRRDRDRRLRLRDDUULLRDLDURDDDULURRLULDDURDURDDUDURDLLUUULUDULRDDLDRDRUDLLUURDLRDURURULURULLDRLLRRULDLULULDLULRURLRRLUDLLLRLUDLURLULDULDRLLLDLDDDDRDRLRRLRDULUUDULDDLDURDLLLDDDDLLUURRDURLDLUDDLULRUUUDDRRLDLLLRDLLDRRRDDLULLURDDRRRRLDLRLLLRL
LULLRRDURRLDUUDRRURLURURRRLRDRUULUULURLLURRDRULRDURDDDDUULLLLDUULDLULURDRLDLULULDRLLDLLRLRULURUDRUUDULRULLLUDRULUDRLLUDLDRRDRUUURURLRDURDRLRDDDURLURRDLRUUUDUURULULDLUULRDLRRRDRDRLLLDLRRDRLLDDULDRUDRRLULLRDLDUDDULRDDLULRURULRLLLULDLLLLRDLDRURUDUURURLDRLUULLDUDULUDDDULUDLRUDDUDLULLUULUUURULURRULRDDURDDLURLRRDRDLDULRLRDRRRULRDDDRLLDDDDRRRRDRDLULUURDURULDLRDULDUDLDURUDLUDLUDDDUDURDURDDURLLRUDUURRRUDRRRRULLLLDDDLUULLUULRRRULDLURDLULRULDRLR"""
eingabe = eingabe.split("\n")
class Coord(tuple):
def __add__(self, b):
result = (self[0]+b[0], self[1]+b[1])
return result
def __sub__(a, b):
result = (a[0]-b[0], a[1]-b[1])
return result
keypad = {(0,2):1, (1,2):2, (2,2):3,
(0,1):4, (1,1):5, (2,1):6,
(0,0):7, (1,0):8, (2,0):9}
move = {"U":(0,1), "D":(0,-1), "L":(-1, 0), "R":(1, 0)}
pos = Coord((1,1))
def execute():
global pos
string = ""
for instruction in eingabe:
for letter in instruction:
newPos = pos + move[letter]
if newPos in keypad.keys():
pos = Coord(newPos)
string += str(keypad[pos])
print(string)
return
execute()
Code:
eingabe = """DULUDRDDDRLUDURUUULRRRURDRDULRUDDUDRULUDDUDRLDULRRLRDRUDUUULUUDLRURDUDDDDRDLLLLULRDLDRDLRLULRUURDDUULUDLRURRDDRDDRDDLDRDLLUURDRUULRRURURRDLRLLLUDULULULULUDRLLRUDUURLDRLRLRDRRDRLLLDURRDULDURDDRLURRDURLRRRLDLLLDRUUURLRDLDLLLLRDURRLDLULRLDDLDLURLRRDDRUDDUULRURRUDLRDLDUURDDDDRLRURUDULUDLRRLLLLLRDRURLLDLDULUUDLUDDDRLLDRRUDLLURRUUDDRRLLRRLDDDURLDRDRLURRRRDRRRDDUDULULDURRUUURRRDULUUUDDRULDRLLRDLDURLURRLLRUUUULRDURLLDDRLLDLRLRULUUDRURUDLLURUDDRDURLRDRRRDURLDDRDRLRLLURULUUULUDDDULDLRDDDRDLLRRLDRDULLUUUDLDDLDDDLLLLLLLDUDURURDURDRUURRRDDRDUDLULDURDUDURDDDRULDURURURRLURLURLUURLULDLLRUULURDDRLRDDLRDLRRR
LUURLRUDRRUDLLDLUDDURULURLUUDUUDDRLUULRDUDDUULDUUDRURDDRRDRLULLRDRDLRLLUURRUULRLDRULUDLDUUDDDRDDLRDLULDRLDUULDLRDLLLDLDLRDUULUDURRULLRLDUDRLLLULUUUULUUDUUURRRDULLUURUDRRLDURRUULDRDULDUDRDUUULUUDDRLUDRLDLDRUUURDLDUDRUDUURLLRRLRLLRRLDULDDULUDUUURULDDUDUDRURRDLULRUDDURDLDLLRRRLDRLULLLRUULDUDLUUDURRLLLRLUDURRDDLDRDDDLURDLDRRUDUDLUDULULRUUUDLUURLLRLDDLURULDURDLRRDDDDURLDDLLDDULLLRLDLDULDUUDDRLDUURDDLDLUUDULRRLRLUURURUURLRLURUURLDRUURLLRDDUUUDULUDDDRDRLDRDRRLRLDULLRRUDLURULULRDRURURLULDUDLRURLRDDRULDDLRD
LUDRULUULRRDDDDRRDUURUDDRLDDLDRDURRURULRDLDLDUUDRRDUUDUDLLLRRLDUDDRLDDLRRLRDRLUDLULUDDUUDULDUUULUDLDDURLDURUDLDRUUDRLRRLDLDDULDUUDDLDDLLURDRLRUURDDRUDDUDLDRRLRUDRUULRRRLRULULURDLRRURDRLRULDDDRDUULLURUUUURUDDLRRRRRDURLULDLUULUDRRUDUDRRDDRURDURLRLUDDLDLRRULUDLDDRLDDLDDDLLLLRDLLUULDDLULDLDRDDUDLURUDLDLDDRRUUDDDLRLLLDRRDDDUURDUDURUURRDRLLDUDLDUULLDLDLLUULLRRULDLDRURLDULDRUURDURRURDLRDLLLDRRUDRUUDRURLUDDRURLDURRDLUUDLUUDULLLDDDDRRDLLLDLURULDDRDLUUURRDRRUUDDUL
DUUULDUDDDURLLULDDLLUDURLLLURULULURUURDRURLRULLLLDRDDULRRDRRLLLRDDDUULLRRURRULLDDURRRLRDDLULDULLDUDLURRDLDDLURDLRLLDRURLLRLLRRRDRRRURURUUDDLLDDLDDDLRLURUUUULRDLUDDDURLLDDRLDRRLLUDUUULRLLDRRRLRUUDLDUULRLUDRULLLLDUDLLUUDDRUURLURUDRDDDLRURUDRLULLULUUDLDURDULRRDRLDURUULRDRRRDRDRRLRLRDDUULLRDLDURDDDULURRLULDDURDURDDUDURDLLUUULUDULRDDLDRDRUDLLUURDLRDURURULURULLDRLLRRULDLULULDLULRURLRRLUDLLLRLUDLURLULDULDRLLLDLDDDDRDRLRRLRDULUUDULDDLDURDLLLDDDDLLUURRDURLDLUDDLULRUUUDDRRLDLLLRDLLDRRRDDLULLURDDRRRRLDLRLLLRL
LULLRRDURRLDUUDRRURLURURRRLRDRUULUULURLLURRDRULRDURDDDDUULLLLDUULDLULURDRLDLULULDRLLDLLRLRULURUDRUUDULRULLLUDRULUDRLLUDLDRRDRUUURURLRDURDRLRDDDURLURRDLRUUUDUURULULDLUULRDLRRRDRDRLLLDLRRDRLLDDULDRUDRRLULLRDLDUDDULRDDLULRURULRLLLULDLLLLRDLDRURUDUURURLDRLUULLDUDULUDDDULUDLRUDDUDLULLUULUUURULURRULRDDURDDLURLRRDRDLDULRLRDRRRULRDDDRLLDDDDRRRRDRDLULUURDURULDLRDULDUDLDURUDLUDLUDDDUDURDURDDURLLRUDUURRRUDRRRRULLLLDDDLUULLUULRRRULDLURDLULRULDRLR"""
eingabe = eingabe.split("\n")
class Coord(tuple):
def __add__(self, b):
result = (self[0]+b[0], self[1]+b[1])
return result
def __sub__(a, b):
result = (a[0]-b[0], a[1]-b[1])
return result
keypad = {(2,4):1, (1,3):2, (2,3):3,
(3,3):4, (0,2):5, (1,2):6,
(2,2):7, (3,2):8, (4,2):9,
(1,1):"A", (2,1):"B", (3,1):"C", (2,0):"D"}
move = {"U":(0,1), "D":(0,-1), "L":(-1, 0), "R":(1, 0)}
pos = Coord((0,2))
def execute():
string = ""
global pos
for instruction in eingabe:
for letter in instruction:
newPos = pos + move[letter]
if newPos in keypad.keys():
pos = Coord(newPos)
string += str(keypad[pos])
print(string)
return
execute()
Aufgabe 1:
Aufgabe 2:
Code:
file = open("day03_1.txt", "r")
eingabe = file.read()
eingabe = eingabe.split("\n")
instructions = []
for line in eingabe:
while " " in line:
line = line.replace(" ", " ")
line = line.strip().split(" ")
instructions.append([int(x) for x in line])
def isPossibleTriangle(instruction):
a, b, c = instruction
if (a+b) > c and (a+c) > b and (c+b) > a:
return True
else:
return False
counter = 0
for instruction in instructions:
counter += isPossibleTriangle(instruction)
print(counter)
Code:
file = open("day03_1.txt", "r")
eingabe = file.read()
eingabe = eingabe.replace("\n", " ").strip()
while " " in eingabe:
eingabe = eingabe.replace(" ", " ")
eingabe = eingabe.split(" ")
instructions = []
for x in eingabe:
instructions.append(int(x))
triangles = []
while len(instructions) > 0:
a = instructions.pop(-9)
b = instructions.pop(-8)
c = instructions.pop(-7)
d = instructions.pop(-6)
e = instructions.pop(-5)
f = instructions.pop(-4)
g = instructions.pop(-3)
h = instructions.pop(-2)
i = instructions.pop(-1)
triangles.append((i, f, c))
triangles.append((h, e, b))
triangles.append((g, d, a))
def isPossibleTriangle(instruction):
a, b, c = instruction
if (a+b) > c and (a+c) > b and (c+b) > a:
return True
else:
return False
counter = 0
for instruction in triangles:
counter += isPossibleTriangle(instruction)
print(counter)
Aufgabe 1&2:
Code:
from operator import itemgetter
file = open("day04_1.txt", "r")
eingabe = file.read().split("\n")
instructions = []
for line in eingabe:
line = line.strip("]")
a, b = line.split("[")
checksum = b
c = a.split("-")
sectorID = int(c.pop())
string = "".join(c)
instructions.append((string, sectorID, checksum, c))
realrooms = []
def isRealRoom(room):
string, sectorID, checksum, oldstring = room
string = "".join(sorted(string))
copy = string
counter = []
while len(copy) > 0:
letter = copy[0]
x = copy.count(letter)
counter.append((letter, x))
copy = copy.replace(letter, "")
counter = sorted(counter,key=itemgetter(1), reverse=True)
check = []
for n in reversed(range(1, counter[0][1]+1)):
sublist = []
for element in counter:
if element[1] == n:
sublist.append(element)
sublist = sorted(sublist,key=itemgetter(0))
for item in sublist:
check.append(item[0])
if "".join(check).startswith(checksum):
return True
else:
return False
abc = list("abcdefghijklmnopqrstuvwxyz")
abc_dict = {}
for x in range(26):
abc_dict[x] = abc[x]
abc_dict[abc[x]] = x
x = 0
realrooms = []
for room in instructions:
if isRealRoom(room):
x += room[1]
rotate = room[1] % 26
decrypted = ""
for string in room[3]:
newstring = ""
for letter in string:
newstring += abc_dict[(abc_dict[letter] + rotate) % 26]
decrypted += newstring+" "
realrooms.append((decrypted.strip(), room[1]))
print(x)
for room in realrooms:
if "north" in room[0]:
print(room)
Aufgabe 1:
Aufgabe 2:
Code:
import hashlib
eingabe = "reyedfim"
password = ""
index = 0
while len(password) < 8:
string = eingabe + str(index)
md5hash = hashlib.md5(string.encode()).hexdigest()
if md5hash.startswith("00000"):
password += md5hash[5]
print(password)
index += 1
Code:
import hashlib
eingabe = "reyedfim"
password = [False, False, False, False, False, False, False, False]
index = 0
while False in password:
string = eingabe + str(index)
md5hash = hashlib.md5(string.encode()).hexdigest()
if md5hash.startswith("00000"):
try:
if password[int(md5hash[5])] == False:
password[int(md5hash[5])] = md5hash[6]
print(password)
except:
pass
index += 1
print("".join(password))
Code:
import collections
file = open("day06_1.txt", "r")
eingabe = file.read().split("\n")
strings = []
for i in range(len(eingabe[0])):
string = ""
for element in eingabe:
string += element[i]
strings.append(string)
result = ""
result2 = ""
for string in strings:
result += str(collections.Counter(string).most_common()[0][0])
result2 += str(collections.Counter(string).most_common()[-1][0])
print(result)
print(result2)
Zuletzt bearbeitet: