Advent of Code 2016 dzień 7 artykuł
Advent of Code dzień 7
9 grudnia 2016
Advent of Code 2016 dzień 9 artykuł
Advent of Code 2016 dzień 9
11 grudnia 2016
Advent of Code 2016 dzień 8 artykuł

Advent of Code 2016 dzień 8. Twoja pomoc jest potrzebna w symulacji pracy zniszczonego wyświetlacza. Dasz radę rozwiązać to zadanie?

Wprowadzenie

Oryginalna strona z zadaniami z Advent of Code 2016. Zadanie z artykułu dostępne jest pod adresem http://adventofcode.com/2016/day/8

Advent of Code to inicjatywa, w której codziennie publikowane są zadania algorytmiczne dla programistów. Ich rozwiązywanie pomaga rozwijać umiejętności nie tyko początkujących programistów. W tej serii artykułów pokazuję zadanie opublikowane w ramach Advent of Code 2016 wraz z przykładowym rozwiązaniem.

Jeśli masz ochotę na odrobinę rywalizacji możesz dołączyć do klasyfikacji, którą założyłem na oryginalnej stronie. Aby dołączyć do tej klasyfikacji zaloguj się na http://adventofcode.com/2016 i dołącz wpisując kod 124245-88569bd0.

Dzień 8 zadanie 1

Dzięki Twoje pomocy poprzednio udało się znaleźć wszystkie adresy w Kwaterze Głównej Króliczka Wielkanocnego wspierające TLS. Dzisiaj czeka na Ciebie inne zadanie.

Trafiłeś na drzwi. Wydaje się, że drzwi implementują coś w rodzaju uwierzytelniania dwuskładnikowego. Aby przez nie przejść na początku musisz użyć karty magnetycznej (z tym nie ma problemu, jedną znalazłeś na pobliskim biurku). Następnie, na malutkim ekranie pokazywany jest kod, który musisz wklepać na klawiaturze przy drzwiach. Później można tylko zakładać, że drzwi się otworzą.

Niestety, wyświetlacz, na którym pokazywany jest kod jest rozbity. Po kilku minutach i rozłożeniu wszystkiego na części dowiedziałeś się dokładnie jak on działa. Teraz nie zostało już nic innego jak tylko dojść do tego co pokazałby wyświetlacz.

Pasek magnetyczny na karcie, której możesz użyć do otworzenia drzwi zawiera sekwencje instrukcji dla wyświetlacza. Te instrukcje są także wejściem do zadania, które musisz rozwiązać. Ekran ma 50 pikseli szerokości i 6 pikseli wysokości. Wszystkie piksele na początku są wyłączone. Sam ekran jest w stanie wykonać trzy specyficzne polecenia:

  • rect AxB włącza wszystkie piksele w prostokącie w lewym górnym rogu ekranu. Prostokąt jest szeroki na A pikseli i wysoki na B pikseli,
  • rotate row y=A by B przesuwa wszystkie piksele w rzędzie A (gdzie 0 to pierwszy wiersz od góry) w prawo o B pikseli. Piksele, które „wypadłyby” za ekran pokazują się po lewej stronie ekranu,
  • rotate column x=A by B przesuwa wszystkie piksele w kolumnie A (gdzie 0 to pierwsza kolumna od lewej strony) w dół o B pikseli. Pikseke, które „wypadłyby za ekran pokazują się na górze kolumny.

Dla przykładu poniższa sekwencja pokazuje operacje dla mniejszego ekranu o wymiarach 7 na 3 pikseli:

  • rect 3x2 tworzy mały prostokąt w lewym górnym rogu,
  • rotate column x=1 by 1 przesuwa kolumnę 1 w dół o 1 piksel,
  • rotate row y=0 by 4 przesuwa wiersz 0 w prawo o 4 piksele,
  • rotate column x=1 by 1 ponownie przesuwa kolumnę 1 w dół o 1 piksel. Tym razem piksel z ostatniego rzędu pojawia się w pierwszym rzędzie,

Jak widzisz, ta technologia obsługi ekranów ma niesamowite możliwości i niedługo zdominuje rynek małych wyświetlaczy. Przynajmniej tak twierdzi naklejka reklamowa z tyłu wyświetlacza.

Twoim zadaniem jest policzenie pikseli, które będą świeciły się na ekranie po wprowadzeniu sekwencji komend z pliku wejściowego.

Podsumowanie

Zachęcam do dalszej zabawy z drugim zadaniem, jego treść pokaże się na stronie AoC2016 po rozwiązaniu pierwszego. Takie zadania pomagają w rozwijaniu umiejętności nie tylko początkujących programistów. Jeśli będziesz miał jakikolwiek problem z rozwiązaniem zadania możesz rzucić okiem do przykładowego rozwiązania, jednak zrób to raczej w ostateczności.

Na koniec mam do Ciebie prośbę – podziel się linkiem do artykułu ze znajomymi, może Oni także będą chcieli pomóc Świętemu Mikołajowi 😉 ? Jeśli nie chcesz ominąć kolejnych artykułów proszę zapisz się do mojego newslettera i polub stronę na facebooku. Do następnego razu!

Newsletter

  Jeśli chcesz otrzymywać informacje o nowych artykułach na blogu prosto na Twój email, zapisz się 🙂

Zdjęcie dzięki uprzejmości https://www.flickr.com/photos/derekl/sets/72157649148835567

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *