Polish version    English version  
  Historia OI -> V OI 1997/1998 -> Zadania


 Aktualności
 O olimpiadzie
 Komitety
 XVIII OI 2010/2011
 Historia OI
XVII OI 2009/2010
XVI OI 2008/2009
XV OI 2007/2008
XIV OI 2006/2007
XIII OI 2005/2006
XII OI 2004/2005
XI OI 2003/2004
X OI 2002/2003
IX OI 2001/2002
VIII OI 2000/2001
VII OI 1999/2000
VI OI 1998/1999
V OI 1997/1998
Wyniki III etapu
Wyniki II etapu
Wyniki I etapu
Zadania
Regulamin
Terminarz
Statystyki
IV OI 1996/1997
III OI 1995/1996
II OI 1994/1995
I OI 1993/1994
 Książeczki OI
 Reprezentacja
 Obozy Olimpiady
 Galeria zdjęć
 Ciekawe odsyłacze
 OIG LiveCD
 IV OIG 2009/2010
 Historia OIG
 SIO
 MAIN
V Olimpiada Informatyczna 1997/98

Zadanie: UKL
Autor: Marcin Kubica
Układy assemblerowe

III Etap, SESJA PRÓBNA - PONIEDZIAŁEK 6 KWIETNIA 1998 r.  
Plik źródłowy: UKL.??? (np. pas, c, cpp)
Plik wykonywalny: UKL.exe
Plik wejściowy: UKL.in
Plik wyjściowy: UKL.out

Firma Bajtel postanowiła usprawnić produkowane przez nią komputery, przez zastąpienie zaszytych w komputerach programów assemblerowych specjalnymi układami elektronicznymi, zwanymi układami assemblerowymi. Programy assemblerowe składają się wyłącznie z przypisań. Każde przypisanie jest określone przez cztery elementy:

  • dwa rejestry, z których pobierane są dane,
  • operację elementarną, wykonywaną na tych danych,
  • rejestr, w którym umieszczany jest wynik.

Zakładamy, że jest co najwyżej 26 rejestrów oznaczonych małymi literami alfabetu angielskiego od a do z oraz co najwyżej 4 różne operacje elementarne oznaczone wielkimi literami angielskiego alfabetu od A do D.
Układ assemblerowy ma:

  • wejścia oznaczone nazwami rejestrów, na każde wejście podawana jest wartość początkowa odpowiedniego rejestru, oraz
  • wyjścia oznaczone również nazwami rejestrów, których wartości końcowe są kierowane do tych rejestrów.

Wewnątrz układu znajdują się bramki. Każda bramka ma dwa wejścia i jedno wyjście. Wykonuje ona jedną operację elementarną na danych, które pojawiają się na jej wejściach i udostępnia wynik na swoim wyjściu. Wejścia bramek oraz wyjścia całego układu są połączone z wyjściami innych bramek lub wejściami układu. Wyjścia bramek oraz wejścia układu mogą być połączone z wieloma wejściami innych bramek lub wyjściami układu. Połączenia między bramkami nie tworzą cykli.

Układ assemblerowy jest równoważny programowi assemblerowemu, gdy dla dowolnego stanu początkowego rejestrów daje taki sam - jak program -stan końcowy rejestrów.

Zadanie

Napisz program, który:

  • wczytuje z pliku tekstowego UKL.IN opis programu assemblerowego;
  • oblicza najmniejszą liczbę bramek, które musi zawierać układ assemblerowy równoważny z danym programem;
  • zapisuje wynik w pliku tekstowym UKL.OUT.

Wejście

W pierwszym wierszu pliku wejściowego UKL.IN znajduje się jedna liczba całkowita n (1 <= n < 1000). Jest to liczba instrukcji programu.

W n kolejnych wierszach opisane są kolejne instrukcje programu. Każdy opis ma postać czteroliterowego słowa, zaczynającego się od symbolu operacji elementarnej: A, B, C albo D. Pozostałe trzy litery są małe. Druga i trzecia - to nazwy rejestrów, z których należy pobrać dane; czwarta - to nazwa rejestru, w którym należy umieścić wynik.

Wyjście

Twój program powinien zapisać w pierwszym i jedynym wierszu pliku wyjściowego UKL.OUT jedną liczbę całkowitą - minimalną liczbę bramek układu assemblerowego, równoważnego danemu programowi.

Przykład

Dla pliku tekstowego UKL.IN:

8
Afbc
Bfbd
Cddd
Bcbc
Afcc
Afbf
Cfbb
Dfdb

poprawnym rozwiązaniem jest plik wyjściowy UKL.OUT:

6

Układ równoważny danemu programowi przedstawiono na rysunku.

Rysunek do przykładu





Wersja do druku