Advent of Code

Posted on Mon 25 April 2016 in Brain game, Shitz • 2 min read

Emsi przeczytał mi w myślach, że gram w TIS-100 i podesłał link do artykułu, w którym znalazłem następną gierkę tego typu: Advent Of Code. Pierwsze zadanie polega na znalezieniu na którym piętrze budynku wyląduje Święty Mikołaj biorąc pod uwagę, że znak otwarcia nawiasu ( to wspięcie się o 1 piętro, a znak ) zejście o 1 piętro. Dostajemy plik z długą na 7400 znaków sekwencją nawiasów.

Właściwie do rozwiązania tego zadania nie potrzeba kodować, ktoś za nas już to zrobił. Można np. w VIM-ie, albo sed-em lub awkiem policzyć poszczególne nawiasy, odjąć od siebie obie liczby i wyjdzie odpowiedź. Postanowiłem jednak, że jest to świetna okazja do podciągnięcia się z Pythona i Lispa i każde zadanie spróbuję zrobić w obu językach.

W Pythonie poszło łatwo, day1 to nazwa pliku w którym jest zadanie:

myfloor = 0;
with open('day1', 'r') as myfile:
    data=myfile.read().replace('\n', '')
for i in range(0, len(data)):
        if  data[i] == '(':
                myfloor += 1
        else:
                myfloor -= 1
print myfloor

Lispa jeszcze robię, bo nie umiem czytać z pliku, nie umiem sprawdzać długości ciągu, choć pewnie mogę napisać rekursywną funkcję, która używa CAR i CDR i liczy wywołania. CAR odcina pierwszy znak i po nim powinienem zwiększyć licznik o 1, a potem CDR zwraca mi resztę ciągu (bez pierwszego znaku) i tę część muszę wysłać z powrotem do funkcji, a ona znowu odetnie CAR-em, zwiększy licznik i wywoła CDR, i tak w kółko aż string się skończy. Ciągi zdaje się kończą się w Lispie NIL-em więc jeszcze muszę sprawdzać wystąpienie końca. No, nic dziś wieczorem zacznę się temu przyglądać.

Jak znam tego typu gierki, warto tworzyć gotowe funkcje, jak powyższa, bo przydają się w następnych zadaniach.

Drugie zadanie jest banalnie proste, wersja w Pytongu:

myfloor = 0
licznik = 0
with open('day1', 'r') as myfile:
    data=myfile.read().replace('\n', '')
for i in range(0, len(data)):
        licznik += 1
        if  data[i] == '(':
                myfloor += 1
        else:
                myfloor -= 1
        if myfloor == -1:
                print licznik
                quit()