Problem C

MEME


Källkod: meme.c, meme.cc, meme.cpp, meme.p eller meme.pas

I digitala konstruktioner förekommer det ofta olika typer av logiska uttryck, t ex
     /MEME = /AS + A5 + /A6 + /A7
vilket betyder att signalen MEME blir aktiv då signalerna AS,A6 och A7 är logiskt låga (noll) och A5 är logiskt hög (ett). Att det står '/' framför betyder alltså att aktiv är noll och inaktiv är ett.

Ovanstående formel är ganska lätt för oss människor att förstå, men om man skall implementera den i ett chip är det inte helt självklart hur man skall gå till väga. Ett sätt är att använda programmerbar logik, t ex sk FPGA:er. För att de skall vara så flexibla som möjligt så brukar man konstruera dem med hjälp av sk lookup-tabeller. Det betyder att man tar antalet insignaler och konstruerar en tabell som har 2(antalet signaler) celler. Sedan placerar man en 0:a eller 1:a i cellerna och på så sätt kan man bestämma utsignalen för varje insignalkombination. Det finns många sätt att beskriva en sådan tabell. Ett sätt är att skriva upp den som sk mintermer. Då skriver man upp alla insignaler som ger 1 på formen: aBCdE etc. Att bokstaven är stor betyder att signalen måste vara hög (1) och att bokstaven är liten betyder att signalen måste vara låg (0). I detta exempel betyder det alltså att om signalerna a och d är 0 medan b, c och e är 1 så blir utsignalen 1. Om det finns flera kombinationer som ger en 1:a ut så skriver man upp dem efter varandra, t ex: aB|Ab betyder att både a=0,b=1 och a=1,b=0 ger utsignalen 1 medan resten av kombinationerna (a=0,b=0 och a=1,b=1) ger utsignalen 0.

Er uppgift blir ett skriva ett program som läser in ett logiskt uttryck och skriver ut det min-termuttryck som beskriver det inlästa uttrycket. De logiska uttrycken består av bokstäverna a-e samt tecknen & | ( ) ! där & betyder logiskt och, | betyder logiskt eller och ! betyder logiskt icke. En begränsning finns vad gäller de logiska uttrycken ­p; ! får endast vara unär operator till en bokstav, dvs !(a&b) är ett otillåtet logiskt uttryck. Mintermuttrycket skall endast bestå av samma bokstäver som fanns i det inlästa logiska uttrycket. Bokstäverna i ett deluttryck (av ett mintermuttryck) skrivs i bokstavsordning (där både A och a anses vara mindre än B osv). Om uttrycket skulle visa sig reduceras till ett konstant värde så skall dock bara resultatet skrivas ut (dvs 0 eller 1).

Indata:
Första raden anger antalet testfall programmet skall behandla (N). Därefter följer de N testfallen med ett testfall (logiskt uttryck) per rad. Det finns inget logiskt uttryck som består av mer än 80 tecken, samt så förekommer det inga blanktecken i de logiska uttrycken.

Utdata:
Skall bestå av N rader, en för varje testfall i form av ett mintermuttryck. Det får inte förekomma några blanktecken i mintermuttrycken, och de ingående deluttrycken i ett mintermuttryck skall sinsemellan vara sorterade i växande (ASCII-)ordning.

Exempel:

Indata:
5
a|b|c
a&b&c
a&(b|c)
(a|!a)&(b|!b)
a&(b|!b)

Utdata:
ABC|ABc|AbC|Abc|aBC|aBc|abC
ABC
ABC|ABc|AbC
1
AB|Ab