Advent of Code dzień 3

Posted on Mon 08 June 2020 in Brain game, Games • 2 min read

Wyjmuję z historii zaległości. Tym razem AoC zdaje się, że z 2018 roku ale pewności nie mam.

#!/usr/bin/python

import sys, getopt
from copy import deepcopy

def laziMikolaj(plik):
    # pierwotna tablica zbierajaca wszystkie adresy
    adresy = []
    # aktualny adres Mikolaja
    currAdr= [0,0]
    adresy.append(deepcopy(currAdr)) # pierwszy adres jest pierwszy
    # tablica zliczajaca ilosc odwiedzin
    wizyty = []
    # licze sobie ile razy robil skrecal
    up=0
    right=0
    down=0
    left=0
    # ile razy odwiedzil tylko raz
    ileRaz = 1
    # otwieram plik z danymi
    with open('day3', 'r') as myfile:
        data=myfile.read().replace('\n', '')
    # iteruje znak po znaku
    for i in range(0, len(data)):
        if data[i] == '^':
                currAdr[1]      += 1
                up += 1
        elif data[i] == '>':
                currAdr[0]      += 1
                right += 1
        elif data[i] == 'v':
                currAdr[1]      -= 1
                down += 1
        elif data[i] == '<':
                currAdr[0]      -= 1
                left += 1
    #   print "i = %d" % i
    #   print currAdr
    # zbieram aktualne adresy do glowej tablicy
        adresy.append(deepcopy(currAdr))
    # sortowanie po wspolrzednej X
    adx=sorted(adresy,key=lambda x: x[0])
    # sortowanie po wspolrzednej Y
    bdx=sorted(adx,key=lambda x: x[1])
    prevX = bdx[0][0] # poprzedniego nie ma wiec jest nim pierwszy
    prevY = bdx[0][1] # j.w.
    zmiana = 1
    for i in range(0, len(bdx)):
        x = bdx[i][0]
        y = bdx[i][1]
        if x == prevX and y == prevY:
            if zmiana == 1:
                ileRaz -= 1
                zmiana = 0
#                 print "zmiana z 1 na 0"
#             print "----------------------------------------------------------"
#             print "Obecnie:   %d:     %s" % (i, bdx[i])
#             print "Poprzednio:                %d, %d, ileRaz = %d" % (prevX, prevY, ileRaz)
        else:
            zmiana = 1
#             print "zmiana z 0 na 1"
            ileRaz += 1
#             print "----------------------------------------------------------"
#             print "Obecnie:   %d:     %s" % (i, bdx[i])
#             print "Poprzednio:        ***     %d, %d, ileRaz = %d" % (prevX, prevY, ileRaz)
            prevX = x
            prevY = y
    #print "Adresy: %s" % adresy
    print "Adresy ma %s elementow" % len(adresy)
    print "Up: %s" % up
    print "Right: %s" % right
    print "Down: %s" % down
    print "Left: %s" % left
    #print "bdx: %s" % bdx
    print "Pojedynczych prezentow bylo: %d" % ileRaz

def main(argv):
    inputfile = ''
    try:
        opts, args = getopt.getopt(argv,"hi:o:",["ifile="])
    except getopt.GetoptError:
        print 'test.py -i <inputfile>'
        sys.exit(2)
    for opt, arg in opts:
        if opt == '-h':
            print 'test.py -i <inputfile>'
            sys.exit()
        elif opt in ("-i", "--ifile"):
            inputfile = arg
            laziMikolaj(inputfile)

if __name__ == "__main__":
    main(sys.argv[1:])

I drugie zadanie z tego dnia:

#!/usr/bin/python
import sys, getopt
import itertools
from copy import deepcopy

def lazi(plik,start, step):
    # pierwotna tablica zbierajaca wszystkie adresy
    adresy = []
    # aktualny adres Mikolaja
    currAdr= [0,0]
    # pierwszy adres jest pierwszy ;)
    adresy.append(deepcopy(currAdr))
    # tablica zliczajaca ilosc odwiedzin
    wizyty = []
    # otwieram plik z danymi
    with open(plik, 'r') as myfile:
        data=myfile.read().replace('\n', '')
    # iteruje znak po znaku
    for i in range(start, len(data), step):
        if data[i] == '^':
                currAdr[1]      += 1
        elif data[i] == '>':
                currAdr[0]      += 1
        elif data[i] == 'v':
                currAdr[1]      -= 1
        elif data[i] == '<':
                currAdr[0]      -= 1
        # zbieram aktualne adresy do glowej tablicy
        adresy.append(deepcopy(currAdr))
    return adresy

def zlicz(lazik, adresy):
    unique = [k for k,g in itertools.groupby(sorted(adresy))]
    #print "Adresy: %s" % adresy
    print "Lazil: %s" % lazik
    print "Adresy ma %s elementow" % len(adresy)
    print "Pojedynczych prezentow bylo: %d" % len(unique)
    return len(unique)

def main(argv):
    inputfile = ''
    try:
        opts, args = getopt.getopt(argv,"hi:o:",["ifile="])
    except getopt.GetoptError:
        print 'test.py -i <inputfile>'
        sys.exit(2)
    for opt, arg in opts:
        if opt == '-h':
            print 'test.py -i <inputfile>'
            sys.exit()
        elif opt in ("-i", "--ifile"):
            inputfile = arg
            Miki    = lazi(inputfile, 0, 2)
            Robot   = lazi(inputfile, 1, 2)
            Razem   = Miki + Robot
            razem = zlicz("Razem", Razem)
            print "Razem: %d" % razem

if __name__ == "__main__":
    main(sys.argv[1:])