"tl;dr" fans beware: upon reading this post, a 1.5 grams loss in saliva fluids is guaranteed!
Sume defecte [Să-nvățăm când concurăm]
Prolog:
VeveritaCuPedale, un utilizator stimat de altfel de la noi din comunitate, s-a gândit el într-o zi că ar fi tare dacă ar înțelege cum funcționează adunarea într-un procesor. Destinul sau poate chiar bookmark-ul pus pe bitcell i-a adus parte din răspuns chiar aici pe forum.
Parcurgând explicațiile, Veve este supărat : tabelul nu este complet! "Cum este influențată suma unui bit în funcție de restul operației de adunare din rangurile precedente ?" Se întrebă el.
Fiind o fire conștiincioasă și perseverentă, Veve reușește să-și completeze singur tabelul :

Coloanele colorate în albastru reprezintă intrări pentru celula de adunare, iar coloanele colorate în verde - ieșiri.
Pentru a înțelege mai bine celula, Veve s-a apucat să îi dea și o formă care să îmbrace logica și a ajuns la această desen frumos :

Partea frumoasă, așa cum a considerat-o și activistul nostru mic, a fost reușita lui de a sintetiza, pe cât l-a dus căpușorul, cele 2 funcții care modelează comportamentul celulei de adunare :
- Rezultatul operațiunii de adunare:
- Restul adunării :
Pe baza acestor funcții și folosind o serie de porți logice, Veve a reușit să creeze circuistica unei astfel de celule sumator :
Pentru calculul bitului de sumă

Pentru calculul bitului de rest

Încapsulând cele 2 circuite în diagrama condensată prezentată sub tabel și multiplicând celula, Veve a reușit într-un final să creeze un sumator pe 16 biți. Modul în care a interconectat cele 16 celule a fost, după cum se observă, în serie :

La testarea sumatorului însă, buba! : stimatul nostru colocatar a observat că ceva nu funcționează așa cum ar trebui. Îi dăm o mână de ajutor să descopere ce anume ?
Descrierea problemei:
Tot ce speculează Veve este că, datorită porților logice vechi recuperate dintr-un calculator ponosit, sigur o poartă este defectă și, în consecință, scoate aceeași valoare logică indiferent de valorile prezente la intrările sale, stricând astfel rezultatul final. Problema este că Veve nu știe nici în care celulă se află poarta buclucașă și nici ce afectează ea (suma sau restul). El are doar niște date de analiză rezultate în urma testării unor valori prin sumator și observând rezultatul.
Ajutați-l pe Veve să descopere poarta buclucașă și demonstrați că ați găsit-o printr-o aplicație care preia 2 numere de maxim 16 biți dintr-un fișier și, în urma procesării, scrie rezultatul obținut de Veve în alt fișier.
Date de analiză:
X = 5; Y = 13 => suma_veve(X, Y) = 50
X = 47; Y = 67 => suma_veve(X, Y) = 114 (fiind mereu setat, uneori suma este corectă)
X = 925; Y = 379 => suma_veve(X, Y) = 1336
X = 30439; Y = 17583 => suma_veve(X, Y) = 48054
X = 49151; Y = 55159 => suma_veve(X, Y) = 38774 (trunchere de rezultat la primii 16 biți)
Date de intrare:
Fișierul "bitcell10.in" conține, separate printr-un spațiu, cele 2 numere naturale X și Y de maxim 16 biți cu semnificația de mai sus.
Date de ieșire:
În "bitcell10.out" : Un singur număr, rezultatul sumatorului lui Veve aplicat pe X și Y-ul citit mai sus. Datorită limitărilor fizice, în caz de situație de overflow ( suma_veve(X, Y) nu încap pe 16 biți), rezultatul se va trunchea la cei mai puțini semnificativi 16 biți!
Exemplu:
"bitcell10.in" : 17 4
"bitcell10.out" : 53
Bonus:
Numerele din fișierul de intrare sunt scrise în baza 10, dar frecvent ... în circuistică, se lucrează pentru claritate, direct cu baza 2. Pentru a interpreta corect baza-non-zecimală a unui număr se folosesc, de regulă, prefixe. Astfel, binar-ul are prefixul "0b". În această idee, ca și bonus, construiți aplicația să poată citi numerele din fișierul de intrare atât în baza implicit 10 cât și în baza 2 (condiționat de prezența prefixului, desigur).
Exemplu bonus:
"bitcell10.in" : 0b1101 12
este totuna cu
"bitcell10.in" : 13 12
deoarece 13 = 1101 (în baza 2)
sau
"bitcell10.in" : 0b0001010 0b100001
este totuna cu
"bitcell10.in" : 10 33
Vă mulțumesc pentru atenție,
Game on!
P.S: Pentru alte date de analiză/nedumeriri, vă rog folosiți forumul.
Perioada de desfășurare:
22-30 Iunie - înscrierea în concurs
1 Iulie - desemnarea câștigătorului
Welcome to BitCell. Click here to register !

.