parent
38d1976227
commit
7f190fbc74
@ -0,0 +1,250 @@ |
|||||||
|
#!/usr/bin/env python |
||||||
|
|
||||||
|
from aoc import get_input # AoC |
||||||
|
import re # regex |
||||||
|
|
||||||
|
seats = get_input(11).strip().splitlines() |
||||||
|
seats = [ [seat for seat in seatrow] for seatrow in seats ] |
||||||
|
|
||||||
|
maxy = len(seats) |
||||||
|
maxx = len(seats[0]) |
||||||
|
|
||||||
|
def getseat(x, y, seats): |
||||||
|
if( not x in range(0, maxx) or not y in range(0, maxy) ): |
||||||
|
return "." |
||||||
|
return seats[y][x] |
||||||
|
|
||||||
|
def genMapString(seatmap, line="\n"): |
||||||
|
out = "" |
||||||
|
for seat in seatmap: |
||||||
|
for char in seat: |
||||||
|
out += char |
||||||
|
out += line |
||||||
|
|
||||||
|
return out |
||||||
|
|
||||||
|
def printMap(seatmap): |
||||||
|
string = genMapString(seatmap) |
||||||
|
print(string) |
||||||
|
print("") |
||||||
|
|
||||||
|
|
||||||
|
def getaround(x, y, curseats): |
||||||
|
out = dict() |
||||||
|
|
||||||
|
out[(x+1, y)] = getseat(x+1, y, curseats) # Right |
||||||
|
out[(x-1, y)] = getseat(x-1, y, curseats) # Left |
||||||
|
|
||||||
|
out[(x, y-1)] = getseat(x, y-1, curseats) # Up |
||||||
|
out[(x, y+1)] = getseat(x, y+1, curseats) # Down |
||||||
|
|
||||||
|
out[(x+1, y-1)] = getseat(x+1, y-1, curseats) # Right top |
||||||
|
out[(x+1, y+1)] = getseat(x+1, y+1, curseats) # Right bottom |
||||||
|
out[(x-1, y-1)] = getseat(x-1, y-1, curseats) # Left top |
||||||
|
out[(x-1, y+1)] = getseat(x-1, y+1, curseats) # Left bottom |
||||||
|
|
||||||
|
return out |
||||||
|
|
||||||
|
def copySeatmap(curseats): |
||||||
|
return [ [seat for seat in seatrow] for seatrow in curseats ] |
||||||
|
|
||||||
|
def countThing(prop, taken, free, pr=False): |
||||||
|
staken, sfree = 0, 0 |
||||||
|
for i in range(len(prop)): |
||||||
|
s = prop[i] |
||||||
|
if(s == "#" or s == "L"): |
||||||
|
if(s == "#"): |
||||||
|
staken = 1 |
||||||
|
if( s == "L" ): |
||||||
|
sfree = 1 |
||||||
|
#print(prop, i) |
||||||
|
break |
||||||
|
|
||||||
|
return taken+staken, free+sfree |
||||||
|
|
||||||
|
def listToString(s): |
||||||
|
|
||||||
|
str1 = "" |
||||||
|
|
||||||
|
for ele in s: |
||||||
|
str1 += ele |
||||||
|
|
||||||
|
return str1 |
||||||
|
|
||||||
|
def getseen(x, y, seats): |
||||||
|
curseats = copySeatmap(seats) |
||||||
|
seen = dict() |
||||||
|
|
||||||
|
seenx = curseats[y] |
||||||
|
seenx[x] = "2" |
||||||
|
|
||||||
|
seenx = listToString(seenx) |
||||||
|
|
||||||
|
seenx = seenx.replace(".", "") |
||||||
|
seenx_left = seenx.split("2")[0][::-1] |
||||||
|
seenx_right = seenx.split("2")[1] |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
seeny = [] |
||||||
|
for iy in range(0, maxy): # NOTE: REVERSED ORDER max = DOWN, min = UP |
||||||
|
s = getseat(x, iy, seats) |
||||||
|
if( iy == y ): |
||||||
|
s = "2" |
||||||
|
if( s != "." ): |
||||||
|
seeny.append( s ) |
||||||
|
|
||||||
|
seeny = listToString(seeny) |
||||||
|
seeny_up = seeny.split("2")[0][::-1] |
||||||
|
seeny_down = seeny.split("2")[1] |
||||||
|
|
||||||
|
diagRU = [ getseat( x+i, y-i, curseats ) for i in range(0, maxx) if getseat( x+i, y-i, curseats ) != "." and i > 0 ] # Right up |
||||||
|
diagRD = [ getseat( x+i, y+i, curseats ) for i in range(0, maxx) if getseat( x+i, y+i, curseats ) != "." and i > 0 ] # Right down |
||||||
|
|
||||||
|
diagLU = [ getseat( x-i, y-i, curseats ) for i in range(0, maxx) if getseat( x-i, y-i, curseats ) != "." and i > 0 ] # Left up |
||||||
|
diagLD = [ getseat( x-i, y+i, curseats ) for i in range(0, maxx) if getseat( x-i, y+i, curseats ) != "." and i > 0 ] # Left down |
||||||
|
|
||||||
|
|
||||||
|
# if(x == 9 and y == 1): |
||||||
|
# print("||", seenx) |
||||||
|
# print("######||", "l:", seenx_left, "|", "r:", seenx_right) |
||||||
|
|
||||||
|
# print("||", seeny) |
||||||
|
# print("######||", "u:", seeny_up, "|", "d:", seeny_down) |
||||||
|
|
||||||
|
# print(seenx, "x") |
||||||
|
# print(seeny, "y") |
||||||
|
|
||||||
|
# print(diagRU, "RU") |
||||||
|
# print(diagRD, "RD") |
||||||
|
# print(diagLU, "LU") |
||||||
|
# print(diagLD, "LD") |
||||||
|
|
||||||
|
taken, free = 0, 0 |
||||||
|
|
||||||
|
taken, free = countThing( seenx_right, taken, free ) |
||||||
|
taken, free = countThing( seenx_left, taken, free ) |
||||||
|
|
||||||
|
taken, free = countThing( seeny_up, taken, free ) |
||||||
|
taken, free = countThing( seeny_down, taken, free ) |
||||||
|
|
||||||
|
taken, free = countThing( diagRU, taken, free ) |
||||||
|
taken, free = countThing( diagRD, taken, free ) |
||||||
|
taken, free = countThing( diagLU, taken, free ) |
||||||
|
taken, free = countThing( diagLD, taken, free ) |
||||||
|
|
||||||
|
return taken, free |
||||||
|
|
||||||
|
#print( "#", getseen(1, 0, seats) ) |
||||||
|
|
||||||
|
|
||||||
|
def calculateSeatmap2(curseats, i=0): |
||||||
|
newseats = copySeatmap(curseats) |
||||||
|
for y in range(0, maxy): |
||||||
|
for x in range(0, maxx): |
||||||
|
seat = getseat(x, y, curseats) |
||||||
|
if(seat == "."): |
||||||
|
continue |
||||||
|
taken, free = getseen(x, y, curseats) |
||||||
|
#print(taken, free, (x, y)) |
||||||
|
|
||||||
|
if(taken == 0 and seat == "L"): |
||||||
|
newseats[y][x] = "#" |
||||||
|
elif( taken >= 5 and seat == "#" ): |
||||||
|
newseats[y][x] = "L" |
||||||
|
|
||||||
|
return newseats |
||||||
|
|
||||||
|
|
||||||
|
seen = [] |
||||||
|
def calculateSeatmap(curseats, i=0): |
||||||
|
newseats = copySeatmap(curseats) |
||||||
|
for y in range(0, maxy): |
||||||
|
for x in range(0, maxx): |
||||||
|
seat = getseat(x, y, curseats) |
||||||
|
if(seat == "."): |
||||||
|
continue |
||||||
|
around = getaround(x, y, curseats) |
||||||
|
|
||||||
|
taken, free = 0, 0 |
||||||
|
|
||||||
|
for coord, s in around.items(): |
||||||
|
if( s == "#" ): |
||||||
|
taken += 1 |
||||||
|
elif( s == "L" ): |
||||||
|
free += 1 |
||||||
|
|
||||||
|
if(taken == 0 and seat == "L"): |
||||||
|
newseats[y][x] = "#" |
||||||
|
elif( taken >= 4 and seat == "#" ): |
||||||
|
newseats[y][x] = "L" |
||||||
|
|
||||||
|
return newseats |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def countSeats(seatmap): |
||||||
|
mapstr = genMapString(seatmap, "") |
||||||
|
count = mapstr.count("#") |
||||||
|
return count |
||||||
|
|
||||||
|
def convertSeatmap(seatmap): |
||||||
|
out = [] |
||||||
|
for seat in seatmap: |
||||||
|
seatstr = "" |
||||||
|
for char in seat: |
||||||
|
seatstr += char |
||||||
|
out.append(seatstr) |
||||||
|
|
||||||
|
return out |
||||||
|
|
||||||
|
def checkEqual(seats1, seats2): |
||||||
|
|
||||||
|
return seats1 == seats2 |
||||||
|
|
||||||
|
|
||||||
|
def numSeats(): |
||||||
|
lastSeatmap = copySeatmap(seats) |
||||||
|
i = 0 |
||||||
|
while True: |
||||||
|
nextSeatmap = calculateSeatmap(lastSeatmap) |
||||||
|
|
||||||
|
check = checkEqual(nextSeatmap, lastSeatmap) |
||||||
|
|
||||||
|
if( check ): |
||||||
|
printMap(lastSeatmap) |
||||||
|
taken = countSeats(lastSeatmap) |
||||||
|
|
||||||
|
print("FOUND taken:", taken) |
||||||
|
break |
||||||
|
|
||||||
|
lastSeatmap = copySeatmap(nextSeatmap) |
||||||
|
|
||||||
|
|
||||||
|
def numSeats2(): |
||||||
|
lastSeatmap = copySeatmap(seats) |
||||||
|
i = 0 |
||||||
|
while True: |
||||||
|
nextSeatmap = calculateSeatmap2(lastSeatmap) |
||||||
|
|
||||||
|
check = checkEqual(nextSeatmap, lastSeatmap) |
||||||
|
|
||||||
|
if( check ): |
||||||
|
printMap(lastSeatmap) |
||||||
|
taken = countSeats(lastSeatmap) |
||||||
|
|
||||||
|
print("2: FOUND taken:", taken) |
||||||
|
break |
||||||
|
|
||||||
|
lastSeatmap = copySeatmap(nextSeatmap) |
||||||
|
|
||||||
|
numSeats2() |
||||||
|
|
||||||
|
# printMap(seats) |
||||||
|
|
||||||
|
# nextSeatmap = calculateSeatmap2(seats) |
||||||
|
# printMap(nextSeatmap) |
||||||
|
|
||||||
|
# nextSeatmap = calculateSeatmap2(nextSeatmap) |
||||||
|
# printMap(nextSeatmap) |
Loading…
Reference in new issue