Wprowadzenie

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

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

Pobierz opracowania zadań z rozmów kwalifikacyjnych

Przygotowałem rozwiązania kilku zadań algorytmicznych z rozmów kwalifikacyjnych. Rozkładam je na czynniki pierwsze i pokazuję różne sposoby ich rozwiązania. Dołącz do grupy ponad 6147 Samouków, którzy jako pierwsi dowiadują się o nowych treściach na blogu, a prześlę je na Twój e-mail.

Dzień 12 zadanie 1

W końcu udało Ci się dotrzeć na ostatnie piętro budynku. Piękny ogród ze skośnym szklanym sufitem. Siedząc na ławce pomiędzy liliami odszyfrowałeś kilka plików, które udało Ci się wykraść z serwera piętro niżej.

Według tych dokumentów Kwatera Główna Królicza Wielkanocnego nie jest jednym budynkiem. Jest kompleksem budynków w okolicy. Wszystkie z nich połączone są kolejką i jeden z nich znajduje się całkiem niedaleko! Niestety, w nocy kolejka nie jeździ.

Udało Ci się zdalnie połączyć do systemu sterującego kolejką i odkryłeś, że sekwencja początkowa wymaga hasła. Logika sprawdzająca hasło (wejście dla Twojego programu) jest łatwa do pozyskania, jednak kod jest dość dziwny. Używa on specjalnego języka assembunny zaprojektowanego dla komputera, który złożyłeś wczoraj. Musisz wywołać kod, żeby uzyskać hasło.

Kod assembunny, który udało Ci się zdobyć operuje na czterech rejestrach (a, b, c i d), które przechowują wartość początkową 0 i mogą trzymać dowolną liczbę całkowitą. Wygląda na to, że wykorzystywany jest dość ubogi zestaw instrukcji:

  • cpy x y kopiuje x (zawartość rejestru albo liczbę) do rejestru y,
  • inc x zwiększa wartość rejestru x o jeden,
  • dec x zmniejsza wartość rejestru x o jeden,
  • jnz x y skacze do instrukcji oddalonej o y (dodatnie wartości oznaczają skok do przodu, ujemne do tyłu) jeśli x (liczba lub zawartość rejestru) nie jest zerem.

Instrukcja jnz przesuwa się relatywnie względem siebie, skok o -1 oznacza skok do poprzedniej instrukcji, skok o 2 przeskoczy następną instrukcję.

Mając na przykład następujący zestaw instrukcji:

cpy 41 a
inc a
inc a
dec a
jnz a 2
dec a

Powyższy kod ustawi rejestr a na wartość 41, zwiększy wartość rejestru o 1 dwukrotnie, zmniejszy wartość rejestru o 1 i następnie przeskoczy ostatnią instrukcję (ponieważ wartość rejestru a != 0). Ostateczna wartość rejestru a to 42. Program kończy się kiedy przejdzie za ostatnią instrukcję.

Zakładając, że kod assembunny znajduje się w tym pliku, jaka będzie wartość rejestru a na koniec programu?

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!

Pobierz opracowania zadań z rozmów kwalifikacyjnych

Przygotowałem rozwiązania kilku zadań algorytmicznych z rozmów kwalifikacyjnych. Rozkładam je na czynniki pierwsze i pokazuję różne sposoby ich rozwiązania. Dołącz do grupy ponad 6147 Samouków, którzy jako pierwsi dowiadują się o nowych treściach na blogu, a prześlę je na Twój e-mail.

Kategorie:

Ostatnia aktualizacja:

Autor: Marcin Pietraszek


Nie popełnia błędów tylko ten, kto nic nie robi ;). Bardzo możliwe, że znajdziesz błąd, literówkę, coś co wymaga poprawy. Jeśli chcesz możesz samodzielnie poprawić tę stronę. Jeśli nie chcesz poprawiać błędu, który udało Ci się znaleźć będę wdzięczny jeśli go zgłosisz. Z góry dziękuję!

Zostaw komentarz