sabato 12 settembre 2015

Quesito con la Susi n. 927

Gianni e Susi hanno fatto un salto all'enoteca, dove Gianni, con la complicità dell'uomo dietro il bancone, le sottopone il novecentoventisettesimo quesito.

C'è una seconda versione riveduta di questo problema, dalla quale però si fa riferimento ad alcune “elaborazione” fatte qui, per cui… Fate voi.

Gianni chiede a Susi di determinare1 il costo dello spumante: se ci riuscisse, gliene regalerebbe una bottiglia! (Gianni, se vuoi farla ubriacare compra una decina di bottiglie di quello che va giù meglio e paga tu senza pensarci due volte…)

Tralasciando la presentazione narrativa2, il problema chiede di determinare il costo (un numero) dello spumante (S) avendo alcuni vincoli/relazioni tra le altre variabili del problema, cioè il costo di una bottiglia di bianco (B), il costo di una di rosso (R), il costo di una cassa di sette bottiglie assortite.

Precisamente:

\[ R = 3B \]

\[ 7R = 3S \]

\[ aS + bB + cR = 119 \]

\[ a + b + c = 7 \]

Con a, b, c ho indicato il numero (incognito) di bottiglie di spumante, bianco e rosso (rispettivamente) contenute nella cassetta.

Se proviamo a risolvere il problema3 ignorando il vincolo sul prezzo («Solo prezzi interi») ci accorgiamo che possiamo trovare delle soluzioni insoddisfacenti: se non aggiungiamo un ulteriore vincolo sul prezzo: poiché è in euro, il prezzo di una bottiglia deve poter essere scritto con al più due cifre decimali, essendo il centesimo la più piccola frazione “pagabile” (tramite contanti). Ignorando il cartello «Solo prezzi interi», Detta altrimenti, possiamo potremmo lavorare in centesimi e assumere che i prezzi delle bottiglie debbano essere interi.

In pratica in tutte e due i casi (ignorando o considerando il cartello «Solo prezzi interi») tratteremo il prezzo come un numero intero, solo che espresso in centesimi di euro in un caso e in euro nell'altro.

Con tutti questi vincoli, potremmo usare un approccio non troppo diverso da quello usato nel precedente problema trattato. Ma visto che ho già usato Maxima, Octave, Haskell e Prolog, in questo giro di giostra userò il Python4, partendo però dal problema già manipolato.

Datemi una leva

Già era evidente che i vincoli non erano sufficienti e ne ho aggiunto uno, del tutto ragionevole (il prezzo non può avere più di due cifre decimali). Nonostante ciò, la La soluzione proposta in Python5 dà 3 risultati leciti. Se non ci fosse il cartello che dice «Solo prezzi interi» Possiamo tranquillamente dire che il problema è sarebbe mal posto perché è richiesta una soluzione unica6 ma ce ne sono invece tre plausibili e non sapremmo quale scegliere tra:

Spumante Bianco Rosso

1×49.00

4×7.00

2×21.00

2×33.32

2×4.76

3×14.28

4×23.80

1×3.40

2×10.20

Invece, visto che c'è il cartello, come gentilmente fatto notare da un lettore, possiamo concludere che la soluzione è la prima della tabella: lo spumante costa 49€.

La soluzione proposta usa il Python come “aiuto” per la ricerca delle risposte ma richiede comunque di aver manipolato le equazioni a disposizione; in particolare usa le relazioni in questa forma:

\[ B = \frac{R}{3} \]

\[ S = \frac{7}{3}R \]

\[ a = 7 - (b + c) \]

\[ R(49 - 6b - 4c) = 3 \cdot 119 \]

In un caso considereremo i prezzi in centesimi, come già detto In realtà considera un caso i prezzi in centesimi (quindi il prezzo della cassetta è 119 ⋅ 100 €cent).

Come si intuisce dagli emendamenti al testo aveva sviluppato la soluzione ignorando l'esistenza del cartello «Solo prezzi interi». Di conseguenza il codice non prendeva in considerazione questa importante informazione e perciò generava le tre soluzioni date nella tabella.

Visto che i prezzi devono essere interi, l'approccio “manuale” alla soluzione può essere migliore (si possono fare delle considerazioni ulteriori); e anche il codice potrebbe essere riscritto “meglio”. Visto che tanto già non è un gran che, mi sono limitato ad aggiungere una variabile per attivare il controllo necessario. In questo modo il lettore può riprodurre anche le due soluzioni con i prezzi non interi (quando espressi in euro) — così non le tolgo dal testo.


  1. Il testo dice «indovinare», ma io riserverei questo verbo per il caso in cui le informazioni non siano sufficienti a determinare un'unica soluzione. Questo è il caso, come è chiaro dalla ricerca della soluzione… tuttavia non si sa se è voluto o no.

  2. Come accade a volte, c'è qualcosa di strano (oltre a Gianni e alla complicità con i vari personaggi, che siano suoi amici o meno): il barman gli propone una cassetta con sette bottiglie. L'idea è quella di fargli assaggiare sia lo spumante che il rosso e il bianco, dal momento che Gianni ha detto che «sembrano buoni tutti e tre». Ma allora sarebbe bastato acquistare una bottiglia di rosso, una di bianco e una di spumante! Proporre una cassetta di sette bottiglie assortite con il pretesto di permettergli di assaggiare tutte e tre le “tipologie” avrebbe senso solo se il costo totale della cassetta fosse (un po') inferiore alla somma dei prezzi delle singole bottiglie in essa contenute. In tal caso, però, i dati forniti non consentirebbero di arrivare ad una soluzione: Susi si troverebbe davvero a dover indovinare!

  3. Per esempio esprimete B e S in funzione di R usando le prime due relazioni; sostituite nella terza, usate la quarta e giocate un po' con il numero delle bottiglie: assumendo che il numero delle bottiglie di spumante sia 1, trovate già due soluzioni valide (soddisfacenti tutte le equazioni), che però è difficile immaginare “corrette” nel contesto del problema in esame poiché i prezzi che otteniamo sono numeri periodici.

  4. In realtà mi ero avviato a farlo in Mozart/Oz; purtroppo ho smanettato un po' con il sistema e le librerie e ho scoperto che l'installazione standard (nel repo Debian) non mi funziona più; anche dopo aver accrocchiato qualcosa smanettando un po' qui e un po' lì, ho notato dei comportamenti strani e l'impossibilità di compilare… Quindi per ora l'ho messo da parte e mi riprometto di riconsiderarlo quando Mozart2 sarà pronto (attualmente il sito dice che “Mozart 2 does not provide support for constraints”, ed è proprio ciò che avrei usato, per cui…)

  5. Python3, ma con modifiche insignificanti va bene anche per Pyton2(.7).

  6. Per chi ha partecipato al concorso spero che vengano accettate tutte e tre le soluzioni. Se non fosse così, sarebbe ingiusto; se fosse così, la mia affermazione «è richiesta una soluzione unica» sarebbe sbagliata. In realtà si richiede di fornire una soluzione, ma non si dice che la soluzione del problema sia effettivamente unica… In realtà la soluzione è unica, poiché c'è un cartello che dice «Solo prezzi interi» (grazie a Stefano Castellani)

3 commenti:

  1. Questo commento è stato eliminato dall'autore.

    RispondiElimina
  2. Basta leggere il cartello a sinistra che recita:"SOLO PREZZI INTERI"......cosi rimane solo una soluzione valida senza tanti ragionamenti cervellotici....take it easy

    RispondiElimina
    Risposte
    1. Cappero, mi era sfuggito del tutto il cartello! La fretta di restituire La Settimana a mia madre prima di farla andare in astinenza :-)
      Provvedo ad integrare l'informazione; grazie.

      Elimina

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.