domenica 11 febbraio 2018

Quesito con la Susi n. 948

Nove minibus sono arrivati al capolinea e i generosi passeggeri decidono di lasciare una mancia agli autisti.

La mancia che ciascun passeggero lascia è di 10€. Deve essere stato un viaggio costoso e gli autisti devono aver guidato in modo davvero grazioso per meritarsi una mancia così generosa…

(L'immagine non si riferisce al problema ma ai primordi del linguaggio usato per calcolare la soluzione: il Fortran. Naturalmente il Fortran moderno è un linguaggio moderno, appunto; aggiungo che è anche molto bello e sottovalutato fuori dalla sua nicchia :-D)

Gianni chiede a Susi se sa dirgli quanti passeggeri sono arrivati a bordo dei nove minibus, sapendo che:

  • i minibus portano al massimo 10 passeggeri;
  • tutti i minibus ne avevano a bordo almeno quattro;
  • su tre minibus c'era lo stesso numero di passeggeri mentre gli altri sei ne avevano tutti un numero diverso;
  • tutti hanno dato una mancia di 10€ e le banconote sono state equamente divise tra gli autisti (tutti hanno avuto lo stesso numero di banconote da 10€)

In pratica abbiamo queste condizioni:

  • yi ∈ [4, 10] e quindi 36 ≤ n ≤ 90;
  • $n = 3y_0 + \sum_{i=1}^{6} y_i$ (dove yi con i > 0 è il numero di passeggeri nel minibus i-esimo, e 3y0 è il numero di passeggeri nei tre minibus che hanno lo stesso numero y0 di passeggeri);
  • yi ≠ yj per i ≠ j 1;
  • $n \equiv 0 \pmod 9$.

Ricerca della soluzione

Per l'ennesima volta facciamo una ricerca esaustiva nello spazio dei valori possibili, verificando ogni volta se le condizioni su elencate sono soddisfatte. Per ogni “vettore” y soddisfacente quelle condizioni, abbiamo una possibile soluzione. Il numero dei vettori che soddisfano i vincoli deve essere uno, oppure no, a patto che l'n trovato sia lo stesso per ognuno dei “vettori soluzione”; se così non fosse, dovremmo dire che il problema non è ben posto e Susi non può determinare con sicurezza quanto gli chiede Gianni.

All'inizio avevo usato questa condizione:

  • $n = 3x + \sum_{i=1}^{6} y_i$ (dove x è il numero di passeggeri in uno dei tre minibus con lo stesso numero di passeggeri, e 3x è quindi il numero totale dei passeggeri nei tre minibus).

Ma in questo modo troviamo diversi n. Nel codice il cambiamento di questa condizione in quella fornita prima si riflette nell'aver cambiato la riga

  .and. alldiff(y) &

in

  .and. alldiff([x,y]) &

Invece nell'elenco delle condizioni qui date ho preferito ribattezzare x in y0 in modo da poter esprimere la condizione seguente (yi ≠ yj per i ≠ j) nello stesso modo. Nel codice x = y0.

Il codice continua a scorrere i possibili “vettori”, senza fermarsi alla prima volta che uno soddisfa le condizioni; non è un problema se due diversi vettori soddisfano le condizioni, purché il numero complessivo dei passeggeri resti lo stesso; e questo è il motivo per cui memorizzo le diverse soluzioni trovate e scrivo n (e il “vettore”) solo se ho trovato un numero diverso — cosa che accade usando la seconda condizione come inizialmente l'avevo intesa.

L'output dell'esecuzione è circa questo (ho rimosso un po' di spazi):

      63
       7  7  7  10  9  8  6  5  4

Soluzione manuale

A noi interessa sapere n, che è dato dalla somma di sette numeri: 3y0 e i restanti yi. I vari yi sono sette e tutti diversi. Una volta scelto y0, ci rimangono sei numeri da assegnare agli altri yi, ma l'ordine è indifferente perché $\sum_{i=1}^6 y_i$ sarà sempre uguale. Questa somma possiamo riscriverla così:
$$ \sum_{i=0}^6 y_i - y_0= \frac{10(10+1)}{2} - \frac{3(3+1)}{2} - y_0 = 49 - y_0 $$
Poi dobbiamo calcolare la somma totale addizionandogli 3y0, per cui in realtà stiamo calcolando 49 + 2y0.

Per y0 abbiamo 7 possibili valori e quindi altrettante somme:

y0 49+2*y0
4 57
5 59
6 61
7 63
8 65
9 67
10 69

Di questi numeri solo il 63 è divisibile esattamente per 9. Quindi 63 è la soluzione.


  1. Gianni dice «mentre gli altri sei [oltre i 3 che ne hanno un numero uguale tra loro] ne avevano tutti un numero diverso», e Susi ribadisce che «tra gli altri sei minibus dunque non ce ne sono due che avevano a bordo lo stesso numero di passeggeri»); io avevo interpretato così: i sei minibus avevano tutti un numero di passeggeri diverso tra loro, ma non necessariamente diverso dal numero dei passeggeri di uno dei tre minibus con lo stesso numero di passeggeri. Ma è ambiguo: quando Gianni dice «ne avevano tutti un numero diverso» intende diverso tra loro sei (in contrasto con il fatto che gli altri tre avevano lo stesso numero di passeggeri) o diverso dal numero di passeggeri portato da uno dei tre minibus? Susi però rimarca il fatto che deve valere la prima interpretazione e che perciò nessuno dei restanti sei («tra gli altri sei minibus dunque […]») minibus ha lo stesso numero di passeggeri di uno qualunque degli altri cinque. Cioè niente si dice, mi sembra, sul fatto che il numero di passeggeri di ogni minibus dei sei deve essere diverso anche dal numero di passeggeri portati da uno dei tre minibus con uguale numero di passeggeri. Ma se non si mette questa condizione non si trova una soluzione unica. Perciò alla fine l'ho aggiunta.

4 commenti:

  1. Bello! Solo una preghiera: fai un cenno al fatto che le schede non si usano più da decenni. E anche il Fortran è cambiato (il tuo è il 90? o più recente dopo ancora). Qui da me i ggiovani ti guardano brutto appena lo nomini.

    RispondiElimina
  2. Come scrivo in questa nota: https://muapna.blogspot.it/p/quesiti-con-la-susi.html#fn2 vado minimo dal 90 in su… Quel codice si compila come Fortran 2003, ma solo per via della sintassi []; sostituiendola con (/ /) si compila come Fortran 95; non ho provato con Fortran 90: stranamente gfortran va dal 95 in su (e poi c'è f77, naturalmente!)

    Il primo Fortran che ho usato comunque era 77, e non ho mai visto una scheda dal vivo :-D

    RispondiElimina
  3. Io sono più vecchio: le schede perforate da studente (mai visto il computer su cui poi giravano) in Fortran IV (o 66, non so bene la differenza). Poi cominciato a usare il IV quasi contemporaneamente all'arrivo (da me) del 77 che era troppo esoso di risorse e scoraggiato (la compilazione la facevo di notte). Usato anche il 90, 95 e 2003 ma sporadicamente. L'istruzione che citi ha anche altri problema per il 77 (non ho controllato ma ne sono quasi sicuro) poi non vale la ricorsività, gli intent e forse altro ancora. Vero che la ricorsività c'era p.es. su Apollo; gli standards erano suggerimenti allora. E IBM... In ogni caso "deve girare sul VAX" (cit.).

    RispondiElimina
  4. P.S. ho modificato il commento sull'immagine così che nessuno possa pensare che abbia scritto quel codice su una scheda! Almeno spero che nessuno lo pensi ;-)

    RispondiElimina

Sii educato, costruisci con cura le frasi, rifletti prima di pubblicare, evita parolacce e offese dirette, non uscire dal tema, cerca di non omettere la punteggiatura, evita errori ortografici, rileggi quel che hai scritto.