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()