Indice del forum Olimpo Informatico
I Forum di Zeus News
Leggi la newsletter gratuita - Attiva il Menu compatto
 
 FAQFAQ   CercaCerca   Lista utentiLista utenti   GruppiGruppi   RegistratiRegistrati 
 ProfiloProfilo   Messaggi privatiMessaggi privati   Log inLog in 

    Newsletter RSS Facebook Twitter Contatti Ricerca
* QUIZ: Le TRE taniche (forse anche di più)
Nuovo argomento   Rispondi    Indice del forum -> Enigmi e giochi matematici
Precedente :: Successivo  
Autore Messaggio
Taifu
Semidio
Semidio


Registrato: 24/10/06 10:13
Messaggi: 203

MessaggioInviato: 18 Gen 2007 18:47    Oggetto: Rispondi citando

36
Top
Profilo Invia messaggio privato
Taifu
Semidio
Semidio


Registrato: 24/10/06 10:13
Messaggi: 203

MessaggioInviato: 18 Gen 2007 18:56    Oggetto: Rispondi citando

35

Ora però devo andare a casa.
Domattina troverò la risposta finale.
Top
Profilo Invia messaggio privato
ulisse
Dio maturo
Dio maturo


Registrato: 02/03/05 01:09
Messaggi: 1531
Residenza: Bagnone (MS)

MessaggioInviato: 19 Gen 2007 00:21    Oggetto: Re: mi fido di taifu Rispondi citando

salmastro ha scritto:
...per cui abbandono i rimbalzi nel "trapezio" (?) legato alle configurazioni delle tre taniche, anche se a prima vista il fatto che i punti di arrivo siano ben 4 (036, 063, 306, 360) e siano tutti sul perimetro dovrebbe invitarmi a perseverare.

Per le 4 taniche sono curioso di vedere come si gioca a biliardo all'interno di una piramide tronca.

Salmastro


Per dimostrare graficamente che il problema 5/7/9 non ha soluzioni bisogna disegnare il cammino (chiuso) che parte e finisce nello stato iniziale 009 e verificare che nessuno degli stati risolutivi vi appartiene o, viceversa, bisogna disegnare il cammino (anch'esso inesorabilmente chiuso) che parte e finisce in uno degli stati risolutivi e verificare che a tale cammino appartengono anche tutti gli altri stati risolutivi ma non lo stato iniziale 009.

Ecco il secondo grafico:



Il movimento nel tetraedro "pluritronco" è un po' più complesso.
Per capire quali sono le linee del reticolo tridimensionale che possono essere assunte come cammino lecito bisogna considerare due cose.
Da un lato (quello delle taniche) c'è da notare che una mossa tira in ballo due taniche e lascia il contenuto delle altre due inalterato.
Dall'altro (quello del grafico) che una mossa che lascia inalterato il contenuto di una tanica giace su un piano parallelo ad una delle quattro facce del tetraedro.
Quindi, dovendo lasciare inalterato il contenuto di due taniche simultaneamente, la mossa lecita deve giacere sulla retta interesezione di due piani paralleli a due distinte facce del tetraedro.

Per evitare il problema del nonhalting ai programmi basati su algoritmi brute force bisogna fare la seguente considerazione.

Gli n punti del reticolo non possono essere tutti collegati tra loro da un cammino inferiore a n-1 passi.
D'altro canto, ogni altro cammino che li tocchi tutti o è lungo anch'esso n-1 o qualche punto lo tocca più volte.
Quindi, nella peggiore delle ipotesi, il miglior cammino che raggiunge la configurazione desiderata è quello di lunghezza n-1 passante per tutti gli n punti perimetrali del reticolo.

Considerare cammini di lunghezza superiore è ridondante.

Nel caso 3/5/8 i punti perimetrali sono 16 ( 16=3+5+8 ) e il cammino più lungo che ha senso considerare ha, pertanto, lunghezza 15.

Nel caso 5/7/9 i punti perimetrali sono 21 ( 21=5+7+9 ) e quindi, Taifu, non ha senso far esplorare al programma cammini più lunghi di 20 passi.

Secondo voi quale può essere la massima lunghezza da considerare nel problema 5/8/13/26 ?
Sarà 52=5+8+13+26 o il giochetto della somma funziona solo sul piano?
Top
Profilo Invia messaggio privato HomePage
Taifu
Semidio
Semidio


Registrato: 24/10/06 10:13
Messaggi: 203

MessaggioInviato: 19 Gen 2007 10:34    Oggetto: Rispondi citando

Sono stato troppo ottimista.
Il programmillo ha trovato una soluzione in 28 mosse e da tutta la notte sta girato alla ricerca di una soluzione con 27 mosse.
Evidentemente questo spazio di ricerca o non ha soluzioni o ne ha poche per cui lo esplorando tutto.
Non ho idea di quanto tempo sia necessario.
Io lo lascio girare, tanto non mi da fastidio.
Ciao.
Marco.
Top
Profilo Invia messaggio privato
_L_
Semidio
Semidio


Registrato: 27/12/06 23:47
Messaggi: 215
Residenza: Brugherio (MI)

MessaggioInviato: 19 Gen 2007 19:45    Oggetto: Rispondi citando

per quanto riguarda il problema 5/7/9:
Citazione:

0 0 0 (configurazione iniziale)
0 7 0
5 2 0
0 2 0
2 0 0
2 0 9
5 0 6
0 5 6
5 5 6
3 7 6
3 0 6
in 10 mosse


mentre quello da 4 taniche 5/8/13/26
Citazione:

0 0 0 21 (conf. iniziale)
5 0 0 16
0 0 5 16
5 0 5 11
0 0 10 11
0 8 2 11
5 3 2 11
0 3 7 11
0 8 7 6
5 8 7 1
5 0 7 9
0 5 7 9
5 5 7 4
2 8 7 4
2 0 7 12
0 2 7 12
5 2 7 7
0 7 7 7
in 18 mosse
Top
Profilo Invia messaggio privato HomePage MSN
ulisse
Dio maturo
Dio maturo


Registrato: 02/03/05 01:09
Messaggi: 1531
Residenza: Bagnone (MS)

MessaggioInviato: 19 Gen 2007 21:17    Oggetto: Rispondi citando

_L_ ha scritto:
per quanto riguarda il problema 5/7/9:

0 0 0 (configurazione iniziale)
0 7 0
5 2 0
0 2 0
2 0 0
2 0 9
5 0 6
0 5 6
5 5 6
3 7 6
3 0 6
in 10 mosse


C'è qualcosa che non quadra!
Stai usando di nascosto una quarta tanica sufficientemente capiente da contenere almeno 16 galloni (tanti quanti ne ritroviamo nelle tre taniche alla ottava mossa: 5 5 6).

La tua sequenza con una tanica da 16 galloni piena può essere accorciata di due mosse:

0 0 0 16 (configurazione iniziale)
0 7 0 9
5 2 0 9
0 2 0 14
2 0 0 14
2 0 9 5
5 0 6 5
0 5 6 5 (mossa superflua)
5 5 6 0
3 7 6 0
3 0 6 7 (mossa superflua)

Credo che l'errore sia frutto di un fraintendimento: il liquido da travasare è già presente nelle tre taniche (la configurazione iniziale, infatti, non è 0 0 0 ma 0 0 9) e non abbiamo una fontana di fianco nella quale versare il liquido in eccesso e dalla quale attingere infinitamente il liquido necessario.
La quarta tanica "sufficientemente capiente" gioca il ruolo della fontana.

In un mio post precedente ho riportato la dimostrazione grafica dell'impossibilità del problema...

La verifica della soluzione al problema delle quattro taniche richiede un'attenzione che ora non ho.
Mi balza subito all'occhio, però, che la configurazione iniziale non è 0 0 0 21 ma 0 8 13 0 e quindi, a meno che ciò non risulti essere una facilitazione, la tua soluzione si allunga di un passo.
In ogni caso, leggo dalla fonte che ci sono soluzioni più brevi...
Top
Profilo Invia messaggio privato HomePage
_L_
Semidio
Semidio


Registrato: 27/12/06 23:47
Messaggi: 215
Residenza: Brugherio (MI)

MessaggioInviato: 19 Gen 2007 22:55    Oggetto: Rispondi citando

in effetti avevo fatto i conti con la fontana....
ci riprovo con quello da 4 taniche
Citazione:
0 8 13 0 (conf. iniziale)
5 3 13 0
0 3 13 5
5 3 8 5
5 0 11 5
0 0 11 10
5 0 6 10
5 8 6 2
5 1 13 2
0 1 13 7
1 0 13 7
1 8 5 7
5 4 5 7
0 4 10 7
4 0 10 7
4 8 2 7
5 7 2 7
0 7 7 7
17 mosse

va bene qst?
Top
Profilo Invia messaggio privato HomePage MSN
Taifu
Semidio
Semidio


Registrato: 24/10/06 10:13
Messaggi: 203

MessaggioInviato: 20 Gen 2007 02:10    Oggetto: Rispondi citando

Siccome non credo che tutti leggeranno sino in fondo, aggiungo subito alcuni nuovi sotto-indovinelli per il problema delle quattro taniche:
1) quante sono le differenti configurazioni raggiungibili dalla partenza 0/8/13/0 ?
2) quanto è distante la configurazione più lontana dal punto di partenza ?
3) e quante sono?
4) e quali sono? (ne basta una)

Essendomi stufato di aspettare, ho interrotto il programma ancora fermo ad esplorare l'albero delle 27 mosse e ho ripensato completamente l'algoritmo passando da una versione a forza "brutta" ad una realmente a forza bruta.
Adesso, con un leggerissimo fattore di miglioramento, in 87 centesimi di secondo ho trovato una soluzione in 16 mosse.
Mi sono dato per metà dell'asino per non averci pensato prima e per metà mi sono beato del programmino...

Citazione:

In 16 mosse
<5 con 0> <8 con 8> <13 con 13> <26 con 0>
<5 con 5> <8 con 3> <13 con 13> <26 con 0>
<5 con 0> <8 con 3> <13 con 13> <26 con 5>
<5 con 3> <8 con 0> <13 con 13> <26 con 5>
<5 con 3> <8 con 8> <13 con 5> <26 con 5>
<5 con 5> <8 con 6> <13 con 5> <26 con 5>
<5 con 0> <8 con 6> <13 con 10> <26 con 5>
<5 con 5> <8 con 1> <13 con 10> <26 con 5>
<5 con 0> <8 con 1> <13 con 10> <26 con 10>
<5 con 1> <8 con 0> <13 con 10> <26 con 10>
<5 con 1> <8 con 8> <13 con 2> <26 con 10>
<5 con 5> <8 con 4> <13 con 2> <26 con 10>
<5 con 0> <8 con 4> <13 con 7> <26 con 10>
<5 con 4> <8 con 0> <13 con 7> <26 con 10>
<5 con 4> <8 con 8> <13 con 7> <26 con 2>
<5 con 5> <8 con 7> <13 con 7> <26 con 2>
<5 con 0> <8 con 7> <13 con 7> <26 con 7>


Per gli uomini di buona volontà questa è la nuova versione:
Codice:

class Tanica(object):
    def __init__(self, capacita, litri=0):
        self.capacita = capacita
        self.litri = litri

    def capacita_residua(self):
        return self.capacita - self.litri

    def __eq__(self, tanica):
        return self.capacita == tanica.capacita and self.litri == tanica.litri

    def versa_in(self, tanica, litri=None):
        if litri == None:
            litri = min(tanica.capacita_residua(), self.litri)
        self.litri -= litri
        tanica.litri += litri
        return litri

    def __repr__(self):
        return "<%d con %d>" % (self.capacita, self.litri)

class Stato(object):
    def __init__(self, taniche):
        self.stato = []
        for tanica in taniche:
            self.stato.append((tanica.capacita, tanica.litri))
               
    def __eq__(self, stato):
        return self.stato == stato.stato

    def __iter__(self):
        for coppia in self.stato:
            yield Tanica(*coppia)

    def __repr__(self):
        return " ".join(["<%d con %d>" % s for s in self.stato])

class Nodo(object):
    def __init__(self, stato, mosse):
        self.stato = stato
        self.mosse = mosse
   
def esplora(partenza):
    grafo = [Nodo(partenza, [])]
    history = [partenza]
    nextLast = 0
    while True:
        aggiunto = False
        last = nextLast
        nextLast = len(grafo)
        if last == nextLast:
            break
        for nodo in grafo[last:]:
            taniche = [tanica for tanica in nodo.stato]
            for prima in taniche:
                for seconda in taniche:
                    if prima != seconda and prima.litri > 0 and seconda.capacita_residua > 0:
                        litri = prima.versa_in(seconda)
                        if Stato(taniche) not in history:
                            history.append(Stato(taniche))
                            grafo.append(Nodo(Stato(taniche), nodo.mosse[:] + history[-1:]))
                        seconda.versa_in(prima, litri)
    return grafo

grafo = esplora(Stato([Tanica(5), Tanica(8, 8), Tanica(13, 13), Tanica(26)]))
obiettivo = Stato([Tanica(5), Tanica(8, 7), Tanica(13, 7), Tanica(26, 7)])

for nodo in grafo:
    if obiettivo == nodo.stato:
        print "*" * 20
        print "In %d mosse" % len(nodo.mosse)
        print grafo[0].stato
        for mossa in nodo.mosse:
            print mossa


Cambiando le seguenti due righe si può risolvere qualunque problema trovando la soluzione ottimale (anche se non il numero di soluzioni univoche):
Codice:

grafo = esplora(Stato([Tanica(5), Tanica(8, 8), Tanica(13, 13), Tanica(26)]))
obiettivo = Stato([Tanica(5), Tanica(8, 7), Tanica(13, 7), Tanica(26, 7)])


Ciao.
Marco.
P.S. Il codice non è commentato ma sono assolutamente disponibile a spiegarlo riga per riga a chi me lo chiedesse.
Top
Profilo Invia messaggio privato
ulisse
Dio maturo
Dio maturo


Registrato: 02/03/05 01:09
Messaggi: 1531
Residenza: Bagnone (MS)

MessaggioInviato: 21 Gen 2007 13:49    Oggetto: Rispondi citando

_L_ ha scritto:
va bene qst?


Si, questa va bene!
Bel colpo! Applause

Leggo dal libro che hai trovato una delle circa 800 soluzioni in 17 mosse.

Ma ci sono 7 soluzioni in sole 16 mosse.

Penso che tu non sia molto lontano.

Una delle 7 soluzioni, infatti, percorre il segmento centrale della tua soluzione, da 0 3 13 5 a 1 8 5 7, con una mossa in meno. Il resto del cammino è identico al tuo.
Top
Profilo Invia messaggio privato HomePage
ulisse
Dio maturo
Dio maturo


Registrato: 02/03/05 01:09
Messaggi: 1531
Residenza: Bagnone (MS)

MessaggioInviato: 21 Gen 2007 14:02    Oggetto: Rispondi citando

Taifu ha scritto:
Siccome non credo che tutti leggeranno sino in fondo, aggiungo subito alcuni nuovi sotto-indovinelli per il problema delle quattro taniche:
1) quante sono le differenti configurazioni raggiungibili dalla partenza 0/8/13/0 ?
2) quanto è distante la configurazione più lontana dal punto di partenza ?
3) e quante sono?
4) e quali sono? (ne basta una)

Essendomi stufato di aspettare, ho interrotto il programma ancora fermo ad esplorare l'albero delle 27 mosse e ho ripensato completamente l'algoritmo passando da una versione a forza "brutta" ad una realmente a forza bruta.
Adesso, con un leggerissimo fattore di miglioramento, in 87 centesimi di secondo ho trovato una soluzione in 16 mosse.
Mi sono dato per metà dell'asino per non averci pensato prima e per metà mi sono beato del programmino...


Mi sono permesso di riscrivere la tua soluzione indicando solo le quantità e non le taniche (forse è l'età ma non riuscivo a tenere gli occhi solo sulle quantità senza confonderle con le taniche)
Citazione:

0 8 13 0
5 3 13 0
0 3 13 5
3 0 13 5
3 8 5 5
5 6 5 5
0 6 10 5
5 1 10 5
0 1 10 10
1 0 10 10
1 8 2 10
5 4 2 10
0 4 7 10
4 0 7 10
4 8 7 2
5 7 7 2
0 7 7 7

Applause Applause Applause Applause Applause Applause Applause Applause Applause

Perfetto!
Ora mi leggo il programma vecchio e poi attacco con quello nuovo.
Sono proprio curioso di vedere come lo hai impostato!
Top
Profilo Invia messaggio privato HomePage
ulisse
Dio maturo
Dio maturo


Registrato: 02/03/05 01:09
Messaggi: 1531
Residenza: Bagnone (MS)

MessaggioInviato: 21 Gen 2007 19:37    Oggetto: Rispondi citando

Taifu ha scritto:
Essendomi stufato di aspettare, ho interrotto il programma ancora fermo ad esplorare l'albero delle 27 mosse e ho ripensato completamente l'algoritmo passando da una versione a forza "brutta" ad una realmente a forza bruta.
Adesso, con un leggerissimo fattore di miglioramento, in 87 centesimi di secondo ho trovato una soluzione in 16 mosse.
Mi sono dato per metà dell'asino per non averci pensato prima e per metà mi sono beato del programmino...

Per gli uomini di buona volontà questa è la nuova versione:

P.S. Il codice non è commentato ma sono assolutamente disponibile a spiegarlo riga per riga a chi me lo chiedesse.


Ti prendo in parola e chiedo spiegazioni.
Prima, però, sottopongo a conferma quello che penso di aver capito.

Entrambi gli algoritmi partono da un nodo (una configurazione delle taniche) e provano a fare tutti i travasi possibili tra i 12 formalmente eseguibili, verificano se il nodo al quale ognuno di essi conduce è già presente nell'albero (segno inequivocabile che l'algoritmo è già passato da quel nodo in precedenza) e, in caso non lo sia lo aggiungono all'albero.
Questo sino a che il nodo raggiunto non coincide con quello finale richiesto dal problema.

Il primo algoritmo però è ricorsivo-condizionale: la ricorsione viene eseguita solo se il nuovo nodo raggiunto non è ancora censito nell'albero; viceversa la ricorsione si chiude.

La condizione di uscita dalla ricorsione è data o dal raggiungimento della soluzione o dal raggiungimento della massima profondità dell'albero (prevista a priori fuori dal programma).

Quando l'algoritmo esce da una ricorsione, risale l'albero a ritroso (ogni uscita dalla ricorsione è un passo indietro) fino a che non ritorna ad un nodo che non ha finito di esplorare.

Ciò vuol dire, sostanzialmente, che l'algoritmo gironzola sistematicamente per tutto l'albero fino a che non trova una soluzione.

Il secondo algoritmo, invece, è composto da due parti.
La prima è iterativa (ciclo while) e scrive sistematicamente l'albero a partire dal nodo iniziale indicato dal problema.
L'uscita dal ciclo while avviene solo quando l'ultimo ciclo eseguito non è stato in grado di aggiungere nuovi nodi all'albero.
Poi l'algoritmo,o dopo aver scritto tutto l'albero, controlla se la soluzione è presente tra i nodi individuati.

In più rispetto al primo algoritmo, il secondo tiene anche traccia, per ogni nodo, del numero di passi necessari al suo raggiungimento.

Fermo restando che abbia analizzato correttamente ed esaustivamente gli algoritmi, non riesco a capire cosa determini l'efficienza del secondo.
Top
Profilo Invia messaggio privato HomePage
Taifu
Semidio
Semidio


Registrato: 24/10/06 10:13
Messaggi: 203

MessaggioInviato: 21 Gen 2007 23:01    Oggetto: Rispondi citando

ulisse ha scritto:
Ti prendo in parola e chiedo spiegazioni.
Prima, però, sottopongo a conferma quello che penso di aver capito.
...
Fermo restando che abbia analizzato correttamente ed esaustivamente gli algoritmi, non riesco a capire cosa determini l'efficienza del secondo.


Innanzitutto hai capito e interpretato perfettamente entrambi gli algoritmi.
Ti faccio i miei più sinceri complimenti! Applause

Detto ciò, siccome io capisco di più così, provo a spiegarmi con un esempio.
Immaginiamo un grafo di possibilità siffatto:
Codice:

  B---E--F
 / \ /
A   D--G
 \ /
  C


Dove A è il punto di partenza, B, C, D ed E sono nodi intermedi, F e G sono delle possibili configurazioni finali.

Vediamo come esplorano l'albero i due algoritmi:
Codice:

Primo algoritmo:
ABEF   3
ABEDG  4
ABEDC  4
ABDEF  4
ABDG   3
ABDC   3
ACDBEF 5
ACDEF  4
ACDG   3

Secondo algoritmo:
AB    1
AC    1
 BE   2
 BD   2
  EF  3
  DG  3


Il primo percorre gli stessi segmenti più volte per il solo fatto che vi giunge attraverso cammini diversi sprecando così un sacco di tempo inutilmente. Il segmento EF varrà sempre 1 sia che arrivo da AB sia che arrivo da ACD: inutile calcolarlo due volte.

Il secondo invece si allarga a "macchia d'olio" individuando subito i cammini più rapidi verso ogni nodo. In questo modo, in maniera molto più rapida, esploro subito ogni possibile punto del grafo e posso permettermi di non dare nessuna profondità massima. Inoltre posso rispondere a domande come "quante sono le configurazioni raggiungibili?", "quanto è distante la più lontana" etc. etc.

E` chiaro che, per un grafo così poco profondo (o per un problema di tre taniche) i tempi dei due algoritmi sono comunque accettabili (pochi secondi contro pochi centesimi). Con un grafo molto più profondo (o per un problema di quattro o più taniche) allora le cose cambiano.

Visti i tempi, con la seconda versione posso permettermi di scoprire dei problemi tosti. Magari provare a individuare il problema a tre taniche minori di 10 litri con la profondità maggiore... Wink

Spero (ma non credo) di essermi spiegato meglio. Se così non fosse ti prego di dirmelo perchè ci tengo a ricambiare, almeno in parte, il tempo che hai dedicato ai due algoritmi.

Ciao.
Marco.
Top
Profilo Invia messaggio privato
Taifu
Semidio
Semidio


Registrato: 24/10/06 10:13
Messaggi: 203

MessaggioInviato: 22 Gen 2007 01:58    Oggetto: Rispondi citando

Detto, fatto!

Questo è il più "lungo" con taniche di massimo 8 litri:
Partenza (4,4) - (5,0) - (8,4)
Arrivo (4,0) - (5,2) - (8,6)

Vi interessa sapere qual'è il più lungo in assoluto con taniche più capienti?

Ciao.
Marco.
Top
Profilo Invia messaggio privato
Taifu
Semidio
Semidio


Registrato: 24/10/06 10:13
Messaggi: 203

MessaggioInviato: 22 Gen 2007 08:37    Oggetto: Rispondi citando

Per risolvere questo servono un bel po' di mosse:

Da (9,0) - (13,4) - (14,14)
A (9,9) - (13,2) - (14,7).

Ciao.
Marco.
Top
Profilo Invia messaggio privato
ulisse
Dio maturo
Dio maturo


Registrato: 02/03/05 01:09
Messaggi: 1531
Residenza: Bagnone (MS)

MessaggioInviato: 22 Gen 2007 10:13    Oggetto: Rispondi citando

Taifu ha scritto:
Innanzitutto hai capito e interpretato perfettamente entrambi gli algoritmi.
Ti faccio i miei più sinceri complimenti! Applause

Non era difficile: sono scritti bene!
L'unica difficoltà è nelle istruzioni specifiche di Python e nella comprensione delle variabili per le quali, deduco, Python non impone la dichiarazione.
Ma con un po' di immaginazione ci si arriva.

Ciò che non doveva sfuggirmi, invece, era l'interpretazione!

Ora è chiaro.
Pensando ai cuccioli che giorno per giorno esplorano il territorio circostante la tana.
Il primo algoritmo li farebbe partire radialmente: corro corro corro...
Il secondo, invece, li farebbe muovere a spirale con raggi sempre più grandi: giro giro giro...
Per la cronaca, i cuccioli usano il secondo algoritmo!

Ottima strategia! Ora che ho capito posso confermare che la seconda strategia è decisamente più efficiente!

Mi chiedo se sono possibili ottimizzazioni.
Ci rifletterò un pochetto. Se mi riesce provo a imbastire un programmino anch'io (lavorerò in VBA, però, che conosco già. Anche se ho visto che Python non è per nulla difficile).

Grazie per le spiegazioni chiare e illuminanti.
Hai mai pensato di darti all'insegnamento? (lo dico seriamente)

Chiudo con qualche domandina specifica di Python

Ma le variabili non si dichiarano?
A cosa serve il metodo (si chiama così, vero?) __EQ__ ?
Lo inserisci per completezza o è indispensabile dichiararlo?

Un'ultima cosa. Secondo me c'è uno sfrido nel codice: la prima istruzione del ciclo while ( aggiunto = False )
Top
Profilo Invia messaggio privato HomePage
Taifu
Semidio
Semidio


Registrato: 24/10/06 10:13
Messaggi: 203

MessaggioInviato: 22 Gen 2007 11:33    Oggetto: Rispondi citando

ulisse ha scritto:
Grazie per le spiegazioni chiare e illuminanti.


Prego, prego. Dovere Smile

ulisse ha scritto:
Hai mai pensato di darti all'insegnamento? (lo dico seriamente)


Urka! Detto da te questo è davvero un bel complimento! Grazie!
In realtà per due settimane molti anni fa ho insegnato matematica al mio vecchio liceo e ricordo ancora lo stress dei momenti prima di entrare in classe. Ricordi a parte ho già 42 anni e oramai la mia strada lavorativa è già tracciata almeno per un po' di anni. Per ora il mio sforzo "insegnativo" è dedicato ai miei due figli. Poi si vedrà Smile

ulisse ha scritto:
Chiudo con qualche domandina specifica di Python
Ma le variabili non si dichiarano?


No. Però se usi una variabile senza averla dichiarata otterrai un'eccezione. Python è un linguaggio a forte tipizzazione dinamica. E` assolutamente eccezionale in questo.

Ti consiglio di dedicare un'oretta al tutorial di Python: io ci sono cascato così anni fa e da allora lo uso e diffondo a più non posso (il dominio www.python.it fu registrato da me tempo fa e il sito è ospitato gratuitamente nella azienda in cui lavoro). Tieni conto che ho usato nella mia vita lavorativa almeno una quindicina di linguaggi (e ne ho studiati altri quattro o cinque) per cui se ti dico che per me è di gran lunga il miglior linguaggio di programmazione esistente, lo dico a ragion veduta (ripeto: parere personale ovviamente).
Il tutoral in inglese: http://www.python.org/doc/tut/
Il tutoral in italiano: http://www.python.it/doc/Python-Docs/html/tut/tut.html

ulisse ha scritto:
A cosa serve il metodo (si chiama così, vero?) __EQ__ ?
Lo inserisci per completezza o è indispensabile dichiararlo?


Due istanze di una classe normalmente non sono confrontabili perchè vengono, giustamente, ritenute diverse dal linguaggio in quanto oggetti distinti. Definendo il metodo __eq__ posso dire a Python cosa deve fare per considerare uguali due oggetti. Per esempio con il codice seguente stabilisco che due taniche sono uguali se hanno stessa capacità e stessa quantità di acqua:
Codice:

    def __eq__(self, tanica):
        return self.capacita == tanica.capacita and self.litri == tanica.litri


Se non lo definisco nel seguente codice l'ultimo test ritornerebbe False:
Codice:

a = Tanica(5, 3)
b = Tanica(5, 3)
a == b


ulisse ha scritto:
Un'ultima cosa. Secondo me c'è uno sfrido nel codice: la prima istruzione del ciclo while ( aggiunto = False )


Bellissima la definizione di sfrido: mi piace!
Sì, è chiaramente uno sfrido. Solo in un secondo momento mi sono accorto di poter usare last e nextLast come condizione di uscita ma mi sono dimenticato di togliere l'assegnamento della variabile "aggiunto".

Hai mai pensato di dedicarti alla programmazione? Laughing Laughing Laughing

Ciao.
Marco.
Top
Profilo Invia messaggio privato
ulisse
Dio maturo
Dio maturo


Registrato: 02/03/05 01:09
Messaggi: 1531
Residenza: Bagnone (MS)

MessaggioInviato: 22 Gen 2007 12:45    Oggetto: Rispondi citando

Taifu ha scritto:
Urka! Detto da te questo è davvero un bel complimento! Grazie!

L'ho detto perché si vede che provi piacere nel "travasare" (visto che parliamo di taniche!) le tue competenze.

Taifu ha scritto:
Python è un linguaggio a forte tipizzazione dinamica.
Ohi! Mi serve una traduzione!

Taifu ha scritto:
Ti consiglio di dedicare un'oretta al tutorial di Python: io ci sono cascato così anni fa e da allora lo uso e diffondo a più non posso (il dominio www.python.it fu registrato da me tempo fa e il sito è ospitato gratuitamente nella azienda in cui lavoro).

Ma dai! Sto parlando al signor Python.it in persona! Evviva

Taifu ha scritto:
Due istanze di una classe normalmente non sono confrontabili perchè vengono, giustamente, ritenute diverse dal linguaggio in quanto oggetti distinti.

Eh, si. Quando definisci un nuovo insieme di oggetti devi definire anche le operazioni che puoi eseguire con essi altrimenti il pc che ne sa? Embarassed

La verità è che avevo cercato dove, nel codice, facessi uso dell'operatore == non trovandolo. Che idiota! Ho cercato l'operatore "uguale" ma non l'operatore "diverso" !!!

Taifu ha scritto:
Bellissima la definizione di sfrido: mi piace!

Eheh. Chi pensa che sia nato con carta e matita in mano si sbaglia!
Mio padre lavorava in fabbrica e io mi divertivo a rompere le scatole ai suoi operai con tremila domande del tipo "cos'è questo?" "cos'è quello?" "come funziona?" "a cosa serve?" e quindi prima di dire "radice quadrata" ho imparato a dire "sfrido" ! Very Happy Very Happy Very Happy
Citazione:
Hai mai pensato di dedicarti alla programmazione?

Eheheh. Che fai, ricambi le lusinghe? Wink
Dedicarmi interamente no.
Non credo potrei mai svolgere una singola attività a tempo pieno. Mi annoierei dopo un giorno.
La programmazione è uno dei miei hobbies (come hai notato se ti sei scaricato i miei programmini postati nel forum), è anche uno dei miei lavori (sviluppo software gestionale) e una delle materie di insegnamento (tengo un piccolo corso - veramente all'acqua di rose - di algoritmi di teoria dei numeri).
Top
Profilo Invia messaggio privato HomePage
Taifu
Semidio
Semidio


Registrato: 24/10/06 10:13
Messaggi: 203

MessaggioInviato: 23 Gen 2007 01:16    Oggetto: Rispondi citando

ulisse ha scritto:
Taifu ha scritto:
Python è un linguaggio a forte tipizzazione dinamica.
Ohi! Mi serve una traduzione!


Tipizzazione statica: il programmatore deve dichiarare prima le variabili.

Tipizzazione dinamica: il programmatore non deve dichiarare prima le variabili.

Tipizzazione forte: (qui uso un esempio) il programmatore non può sommare tra di loro variabili di tipo diverso (per esempio una stringa ad un numero come si può fare in javascript) senza convertire esplicitamente una delle due variabili.

Tipizzazione debole: il contrario della precedente... Smile

Python unisce il meglio: forte tipizzazione dinamica.

Inoltre previene la stragrande maggioranza degli errori in questo campo impedendoti di usare una variabile non inizializzata.

Ciao.
Marco.
Top
Profilo Invia messaggio privato
Taifu
Semidio
Semidio


Registrato: 24/10/06 10:13
Messaggi: 203

MessaggioInviato: 23 Gen 2007 09:14    Oggetto: Rispondi citando

[quote="ulisse"]Eheh. Chi pensa che sia nato con carta e matita in mano si sbaglia!
Mio padre lavorava in fabbrica e io mi divertivo a rompere le scatole ai suoi operai con tremila domande del tipo "cos'è questo?" "cos'è quello?" "come funziona?" "a cosa serve?" e quindi prima di dire "radice quadrata" ho imparato a dire "sfrido" ! Very Happy Very Happy Very Happy
[quote]

Dimenticavo, anche io conosco il significato del termine sfrido per lo stesso tuo motivo: anche mio padre ha lavorato in fabbrica. Solo che io le scatole le rompevo a lui e non ai suoi operai... Smile

Ciao.
Marco.
Top
Profilo Invia messaggio privato
Taifu
Semidio
Semidio


Registrato: 24/10/06 10:13
Messaggi: 203

MessaggioInviato: 25 Gen 2007 11:15    Oggetto: Rispondi

Taifu ha scritto:
Siccome non credo che tutti leggeranno sino in fondo, aggiungo subito alcuni nuovi sotto-indovinelli per il problema delle quattro taniche:
1) quante sono le differenti configurazioni raggiungibili dalla partenza 0/8/13/0 ?
2) quanto è distante la configurazione più lontana dal punto di partenza ?
3) e quante sono?
4) e quali sono? (ne basta una)


Ok, visto il grande interesse, vi do le risposte Laughing

Citazione:

1) 395
2) 17
3) 4
4) 5/1/1/14 , 1/6/0/14 , 1/1/0/19 , 0/1/1/19
Top
Profilo Invia messaggio privato
Mostra prima i messaggi di:   
Nuovo argomento   Rispondi    Indice del forum -> Enigmi e giochi matematici Tutti i fusi orari sono GMT + 1 ora
Vai a Precedente  1, 2, 3  Successivo
Pagina 2 di 3

 
Vai a:  
Non puoi inserire nuovi argomenti
Non puoi rispondere a nessun argomento
Non puoi modificare i tuoi messaggi
Non puoi cancellare i tuoi messaggi
Non puoi votare nei sondaggi