Fişierul intrare/ieşire:monede3.in, monede3.outSursăad-hoc
AutorCiprian OprisaAdăugată decypryCiprian Oprisa cypry
Timp execuţie pe test0.5 secLimită de memorie131072 kbytes
Scorul tăuN/ADificultateN/A

Vezi solutiile trimise | Statistici

Inversarea interactivă a monedelor

Gigel a ieşit cu bine din supermarket dar a uitat să scaneze la ieşire o ciocolată. Paznicul îl observă, dar îl va lăsa să plece dacă trece de provocarea de mai jos.

Gigel va fi legat la ochi, iar paznicul pune 4 monede pe colţurile unui pătrat din carton, fiecare având o poziţie aleatoare (cap - 0 sau pajură - 1). Scopul lui Gigel este ca toate cele patru monede să ajungă cu aceeaşi faţă în sus (toate cap sau toate pajură). Provocarea are cel mult 9 runde, în fiecare rundă se efectuează paşii de mai jos, în această ordine:

  • paznicul roteşte pătratul de carton (împreună cu monedele de pe colţuri) cu un unghi ales aleator dintre 0°, 90°, 180° şi 270°
  • Gigel îi cere paznicului să inverseze între una şi patru monede, specificând colţurile mesei corespunzătoare monedelor pe care doreşte să le inverseze (notate cu A, B, C şi D)
  • paznicul îi spune lui Gigel dacă după inversarea monedelor, scopul a fost atins (toate monedele au aceeaşi faţă); dacă da, provocarea se termină şi Gigel a câştigat; dacă nu, se trece la runda următoare

Dacă la finalul a 9 runde Gigel încă nu a câştigat, provocarea se termină, iar Gigel pierde.

În partea stângă a figurii de mai jos este reprezentată masa paznicului la începutul unei runde. Paznicul decide aleator să rotească pătratul de carton cu 90°, rezultatul fiind reprezentat în partea dreaptă a figurii. Observaţi că doar monedele îşi schimbă poziţia (moneda cu faţa 1 mutându-se de pe poziţia B pe poziţia C), în timp ce colţurile mesei rămân fixe. Dacă în această rundă Gigel spune C, toate monedele vor avea faţa 0 şi Gigel câştigă. La fel, dacă Gigel spune ABD, toate monedele vor avea faţa 1 şi câştigă deasemenea.

Interacţiune

Aceasta este o problemă interactivă. În loc să citiţi datele dintr-un fişier de intrare şi să afişaţi rezultatul într-un fişier de ieşire, veţi interacţiona cu evaluatorul citind de la standard input (de exemplu folosind scanf sau cin în C/C++) şi afişând în standard output (de exemplu folosind printf sau cout în C/C++).

Programul vostru va începe citind numărul de provocări la care participă Gigel. Pentru a ne asigura că metoda aleasă de voi rezolvă orice provocare în cel mult 9 runde, vor avea loc un număr de cel mult 100 de provocări. Imediat ce numărul de provocări a fost citit, va începe prima rundă a primei provocări.

La fiecare rundă, programul vostru trebuie să afişeze un o linie (terminată cu '\n'), corespunzând poziţiilor monedelor pe care vrea să le inverseze. Caracterele afişate trebuie să fie distincte şi pot avea doar valorile 'A', 'B', 'C' sau 'D'. După ce se afişează această linie, va trebui să citiţi rezultatul acţiunii voastre, exprimat printr-un număr întreg, ce poate avea valorile următoare:

  • -1: linia dată de voi este greşită
  • 1: aţi câştigat provocarea (toate monedele au aceeaşi faţă)
  • 0: încă nu aţi câştigat provocarea

În cazul în care aţi câştigat provocarea, va începe imediat următoarea provocare. După ce aţi câştigat şi ultima provocare, programul vostru trebuie să îşi încheie execuţia. Dacă aţi primit răspunsul 0 în toate cele 9 runde ale unei provocări sau aţi primit vreun răspuns -1, programul vostru trebuie să îşi încheie deasemenea execuţia.

Pentru a vă asigura că linia afişată de voi ajunge la standard output în momentul dorit, asiguraţi-vă că aţi pus '\n' la finalul liniei, iar după afişare faceţi flush la standard output.

  • În C sau C++, dacă aţi afişat folosind printf, apelaţi ulterior fflush(stdout).
  • În C++, dacă aţi afişat folosind cout, apelaţi ulterior cout.flush().
  • În Pascal, după afişare apelaţi flush(output).
  • În Java, după afişare apelaţi System.out.flush().
  • În Python, după afişare apelaţi sys.stdout.flush().

Exemplu

stdinstdoutExplicaţie
2 Numărul de provocări este 2.
  Pentru prima provocare s-a generat aleator configuraţia [0 1 0 0], care în prima rundă s-a rotit aleator cu 90°, deci avem [0 0 1 0].
 ACSe inversează monedele de la poziţiile A şi C, deci [0 0 1 0] -> [1 0 0 0]
 Încă nu am câştigat, provocarea continuă.
  Pătratul se roteşte aleator cu 270°, [1 0 0 0] -> [0 0 0 1].
 ABCSe inversează monedele de la poziţiile A, B şi C, deci [0 0 0 1] -> [1 1 1 1]
1 Am câştigat prima provocare după două runde.
  Începe provocarea a doua. Se generează aleator configuraţia [0 1 0 1], care se roteşte aleator cu 0°.
 ABCDSe inversează toate monedele, deci [0 1 0 1] -> [1 0 1 0]
 Încă nu am câştigat, provocarea continuă.
  Pătratul se roteşte aleator cu 90°, [1 0 1 0] -> [0 1 0 1].
 CSe inversează moneda C, deci [0 1 0 1] -> [0 1 1 1]
 Încă nu am câştigat, provocarea continuă.
  Pătratul se roteşte aleator cu 90°, [0 1 1 1] -> [1 0 1 1].
 BSe inversează moneda B, deci [1 0 1 1] -> [1 1 1 1]
1 Am câştigat a doua (ultima) provocare după trei runde.
  Programul ar trebui să îşi încheie execuţia.

Observaţie: Există posibilitatea ca în configuraţia iniţială toate monedele să aibă aceeaşi faţă.

Trebuie sa te autentifici pentru a trimite solutii. Click aici

Cum se trimit solutii?