La Susi colpisce ancora (per C64 per principianti)

RetroMagazine nr. 41 – Anno: 2023 – Autore: Eugenio Rapella

Sull’ultima “Settimana Enigmistica” compare un nuovo “Quesito con la Susi”, il 988°. Un amico di Susi, chiamiamolo Francesco, ha dovuto affrontare un test formato da 100 quesiti, del tipo “Vero” o “Falso”, numerati da 1 a 100. A test concluso, si viene a sapere che la soluzione corretta è: “Vero” per le domande con un numero multiplo di 4, “Falso” per le rimanenti. Francesco ha segnato “Falso” per tutte le domanda con un numero multiplo di 3, “Vero” per tutte le altre.
Quante risposte esatte ha totalizzato Francesco?

Se “x” è il numero di una domanda, la risposta risulta esatta per Francesco se
(a) x è multiplo di 4 (dunque la risposta corretta è V) e x non è multiplo di 3 (dunque Francesco ha segnato V)
oppure
(b) x non è multiplo di 4 (dunque la soluzione corretta è F) e x è multiplo di 3 (nel qual caso Francesco ha segnato F).

A questo punto, il nostro fidato C64 è in grado di risolvere il quesito con una manciata di istruzioni in Basic. Ecco qui:

10 for x=1 to 100
20 m4=0:m3=0
30 if(int(x/4)*4=x)then m4=1
40 if(int(x/3)*3=x)then m3=1
50 if((m4=1)and(m3=0))then e=e+1
60 if((m4=0)and(m3=1))then e=e+1
70 next
80 print" il numero di risposte esatte e' ";e

Nel ciclo “for-next”, “x” rappresenta il numero della domanda; la variabile m4 vale 0 se x non è multiplo di 4, vale 1 in caso contrario; in modo analogo m3 vale 0 se x non è multiplo di 3, vale 1 se invece lo è.
Come può il nostro C64 riconoscere se x è o non è multiplo di 4 senza ricorrere alla funzione “modulo” (che, ahimè, non rientra nel suo bagaglio culturale)? Il nostro Commodore non si lascia spaventare: se x è multiplo di 4, dividendo x per 4 si ottiene un numero intero. La parte intera ( int(..)) di questo valore è il valore stesso che, moltiplicato per 4, torna a dare l’x di partenza (ad esempio, se x=20, si ha 20/4 = 5; int(5) è 5 e 54 fornisce di nuovo 20). In definitiva, se x è multiplo di 4 la condizione nell’istr. 30 è vera è m4 è portata a 1. Se invece x non è multiplo di 4, x/4 non è intero e in int(x/4) vengono “eliminate” le cifre decimali del quoziente cosicché int(x/4)4 non restituisce la x iniziale (ad esempio, se x=19, si ha 19/4=4,75; int(4,75)=4 e 4*4=16 diverso da 19). In questo caso m4 rimane 0 come era stata inizializzata all’istruzione 20.
Il tutto si ripete per il valore 3 all’istr. 40: m3 varrà uno se x è multiplo di 3, zero in vaso contrario.
Alla 50 il C64 controlla se si è verificata la situazione (a), alla 60 se si è verificata la situazione (b); in questi i casi, il totale delle risposte (variabile “e”, inizialmente nulla) viene incrementato. A ciclo concluso, “e” conterrà il punteggio totalizzato da Francesco che viene stampato alla 80. E bravo il nostro Commodore 64!

I lettori della “Settimana Enigmistica” che non possono contare sul C64 (peggio per loro!) saranno riusciti a risolvere il Quesito?
Ecco una possibile soluzione:
il minimo comune multiplo tra 3 e 4 è 12. Ecco la situazione delle prime dodici domande:

Nella prima dozzina la soluzione corretta coincide con la risposta di Francesco in 5 casi (domande 3,4,6,8,9). A partire dalla domanda n. 13 questo schema si ripete identico per le dozzine successive; poiché 100/12 = 8,33.. vi sono 5 risposte esatte per ciascuna delle otto dozzine per un totale di 58 punti. Si arriva così alle prime 128=96 domande; per le ultime quattro vale lo schema qui sopra in relazione alle domande 1, 2, 3, 4.

Il punteggio totalizzato da Francesco è dunque 5*8+2= 42 in accordo con quanto calcolato dal Commodore.

“Quarantadue su cento”: ho i miei dubbi che Francesco abbia superato il test.

Share

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.