Alla soluzione del problema del tirassegno ci sono arrivato solo seguendo l'indicazione subliminale di donnesudestbarese: occorreva «un terno secco sulle ali... centrare, a volte, fa cadere tutto il castello!!!». Vale a dire colpire i pupazzi 25, 6 e 19. Solo così il puntaggio di quelli colpiti sommava esattamente 50, come richiesto dal problema.Rimaneva da capire se esistevano altre soluzioni o se quella era l'unica possibile. Un problema costruito bene, come ci si aspetta che siano quelli di Sam Loyd, dovrebbe avere un'unica soluzione, d'altra parte le combinazioni possibili di un certo numero di pupazzi abbattuti sui 10 disponibili sono tante, per l'esattezza 2^10 - 1 = 1023, molte più del massimo totale possibile, 167, cioè la somma dei valori di tutti e 10 i pupazzi. Quindi il dubbio era legittimo.Il modo più semplice per risolvere la questione è quello di elencare tutti e 1023 i risultati possibili con un semplice programma basic, e poi analizzare i risultati con excel; o meglio, visto che sto usando il netbook, con il foglio elettronico di open office.Il risultato è che effettivamente quella soluzione (25, 6 e 19) è unica, mentre esistono diversi altri valori che è possibile ottenere in moltissimi modi. I punteggi più gettonati sono 76 e 91 (23 modi per realizzarli), seguiti da 82 e 85 (22 modi).Poi giù giù fino ai valori che si possono ottenere in un unico modo. Quelli ottenibili con almeno tre pupazzi (con uno o due sarebbe troppo banale) sono 47 (25, 3 e 19) e, appunto, 50.Per chi fosse interessato, il programma scritto in ubasic è riportato sotto.La logica è abbastanza semplice: ogni giocata può essere vista come la rappresentazione binaria di un numero, con il valore "1" in corrispondenza dei pupazzi abbattuti, e "0" per quelli rimasti al loro posto. Basta quindi scorrere i numeri da 1 a 1023, calcolarne la rappresentazione binaria e sommare i valori dei pupazzi corrispondenti agli "1".Buona domenica. ps delle 18e30: apportata una piccola modifica (in meglio!) al programma. 100 print = print + "pupazzi.csv"110 print "colpi,n.ro di colpi,somma"120 np=10: dim p(np): f="----------"130 nmax=2^np-1140 p(1)=25: p(2)=27: p(3)=3: p(4)=12: p(5)=6150 p(6)=15: p(7)=9: p(8)=30: p(9)=21: p(10)=19200 for n0=1 to nmax210 n=n0: s=0: j=1: a="": xp=0220 r=n-2*int(n/2)230 if r>0 then s=s+p(j): a=a+"x": xp=xp+1 else a=a+"-"240 j=j+1: n=int(n/2)250 if n>0 then 220260 print left(a+f,np);",";xp;",";s270 next n0990 print=print999 end
Al tirassegno - bis
Alla soluzione del problema del tirassegno ci sono arrivato solo seguendo l'indicazione subliminale di donnesudestbarese: occorreva «un terno secco sulle ali... centrare, a volte, fa cadere tutto il castello!!!». Vale a dire colpire i pupazzi 25, 6 e 19. Solo così il puntaggio di quelli colpiti sommava esattamente 50, come richiesto dal problema.Rimaneva da capire se esistevano altre soluzioni o se quella era l'unica possibile. Un problema costruito bene, come ci si aspetta che siano quelli di Sam Loyd, dovrebbe avere un'unica soluzione, d'altra parte le combinazioni possibili di un certo numero di pupazzi abbattuti sui 10 disponibili sono tante, per l'esattezza 2^10 - 1 = 1023, molte più del massimo totale possibile, 167, cioè la somma dei valori di tutti e 10 i pupazzi. Quindi il dubbio era legittimo.Il modo più semplice per risolvere la questione è quello di elencare tutti e 1023 i risultati possibili con un semplice programma basic, e poi analizzare i risultati con excel; o meglio, visto che sto usando il netbook, con il foglio elettronico di open office.Il risultato è che effettivamente quella soluzione (25, 6 e 19) è unica, mentre esistono diversi altri valori che è possibile ottenere in moltissimi modi. I punteggi più gettonati sono 76 e 91 (23 modi per realizzarli), seguiti da 82 e 85 (22 modi).Poi giù giù fino ai valori che si possono ottenere in un unico modo. Quelli ottenibili con almeno tre pupazzi (con uno o due sarebbe troppo banale) sono 47 (25, 3 e 19) e, appunto, 50.Per chi fosse interessato, il programma scritto in ubasic è riportato sotto.La logica è abbastanza semplice: ogni giocata può essere vista come la rappresentazione binaria di un numero, con il valore "1" in corrispondenza dei pupazzi abbattuti, e "0" per quelli rimasti al loro posto. Basta quindi scorrere i numeri da 1 a 1023, calcolarne la rappresentazione binaria e sommare i valori dei pupazzi corrispondenti agli "1".Buona domenica. ps delle 18e30: apportata una piccola modifica (in meglio!) al programma. 100 print = print + "pupazzi.csv"110 print "colpi,n.ro di colpi,somma"120 np=10: dim p(np): f="----------"130 nmax=2^np-1140 p(1)=25: p(2)=27: p(3)=3: p(4)=12: p(5)=6150 p(6)=15: p(7)=9: p(8)=30: p(9)=21: p(10)=19200 for n0=1 to nmax210 n=n0: s=0: j=1: a="": xp=0220 r=n-2*int(n/2)230 if r>0 then s=s+p(j): a=a+"x": xp=xp+1 else a=a+"-"240 j=j+1: n=int(n/2)250 if n>0 then 220260 print left(a+f,np);",";xp;",";s270 next n0990 print=print999 end