Newsgroup: it.hobby.enigmi
Titolo: Aiuto per il Calcolo enigmatico (spero non sia OT...)

Salve a tutti!
Sto cercando di scrivere un programma per la generazione (non la risoluzione
perche' quella mi diverto a farla io... :-) ) di schemi come quelli del Calcolo
Enigmatico della Settimana Enigmistica.
Ho provato con la forza bruta (generazione attraverso numeri casuali), ma dopo
aver girato per varie ore, il programma comunque non tira fuori nulla.
Qualcuno sa se esiste letteratura raggiungibile in Internet sull'algoritmo di
generazione (in qualunque formato), o ancora meglio, qualche matematico e'
disposto a darmi dritte su un possibile algoritmo?
Grazie in anticipo!
         Bruno Gentili
   (
bruno_...@hotmail.com
)
-- 
Posted from  [170.252.64.1] 
via Mailgate.ORG Server - 
http://www.Mailgate.ORG


Non conosco letteratura e non sono un matematico. Pero' i calcoli enigmatici
li so creare.
Io procedo cosi': innanzitutto creo lo schema delle operazioni chiamando le
cifre in modo simbolico, per esempio (monospace, please...)
A + B = C
-   + = +
D * E = F
---------
G - H = I
E quindi procedo a scrivere per esteso le singole equazioni:
A+B=C
DE = F
G-H=I
A-D=G
B+E=H
C+F=I
A questo punto cerco di ridurre il piu' possibile il numero di variabili
facendo delle opportune sostituzioni. naturalmente, avendo 9 incognite ma
solo 6 relazioni, il problema risulta indeterminato. Questo lo risolvi tu
imponendo dall'esterno altre condizioni. Per esempio, D=7 e E=5.
Sostituendo, con un po' di matematica e, se occorre, fantasia, ecco che hai
il tuo schema.
Ciao.
--
--AG

 ha scritto nel messaggio
news:2144951bc6ebabe9895...@mygate.mailgate.org...



Che ne dite di farlo a mente...come faccio io !! :-))))))
Ciao
Ida


Ok,ok, però se vuoi ti basta scaricare Derive, per questi giochetti è
fantastico !

 Io procedo cosi': ...
Si, cosi' e' perfetto, il problema e' che questo tipo di procedura e' troppo
"umana", ossia non e' applicabile ad un programma per computer!
Quello che sto cercando di trovare e' un algoritmo tale che io possa dare 
in input le sei operazioni desiderate, e eventualmente un "seme" random, 
e in uscita venga fuori lo schema del Calcolo Enigmatico...
Risolvere il sistema funziona caso per caso, non in generale (o almeno io 
non ho un'idea precisa di come farlo funzionare in generale)!
Comunque il fatto di lavorarci sopra mi ha dato un po' di idee, anche se
ancora tutte allo stato embrionale. Grazie!
Saluti a tutti 
      Bruno


 
Beh, in generale e' difficile dare dei suggerimenti generali, ma ti posso
riportare quello che ho risolto una o due settimane fa:
Riporto il calcolo enigmatico preso da una delle ultime settimane enigmistiche:
   AA x B = CBD
    +   +     -
  DED : F =  GC
  -------------
  FHG + G = FBE
  Ho sostituito i simboli grafici con lettere dell'alfabeto, ma e' lo stesso...
  Parto dalle cose piu' evidenti; in questo caso, e' facile vedere che la
lettera
  G deve essere il numero 9, perche' in una sottrazione, se il risultato ha la
stessa
  cifra del minuendo (quella delle decine, B), il sottraendo deve avere in
quella
  posizione o 0 o 9. In questo caso poiche' la cifra delle centinaia e' diversa
  dal minuendo al risultato, vuol dire che ha "prestato" una unita' (come si
diceva
  alle elementari), e quindi G non e' 0. Di conseguenza, e' 9
   AA x B = CBD
    +   +     -
  DED : F =  9C
  -------------
  FH9 + 9 = FBE
  Ora e' banale notare che E e' 8 (perche' 9+9=18).
   AA x B = CBD
    +   +     -
  D8D : F =  9C
  -------------
  FH9 + 9 = FB8
  Ok! Ora lo schema si puo' ulteriormente risolvere in piu' modi; propongo un
  modo relativamente semplice:
  dovrebbe essere semplice da vedere che F e' di una unita' piu' grande di D (a
causa
  del riporto) e C una unita' piu' grande di C; a sua volta, B+F=9 (operazione
centrale
  in verticale)
  dunque, B puo' essere un numero che va da 2 a 7 (non puo' essere 1, perche' F
  sarebbe 8, e la cifra 8 e' gia' assegnata), F e' il suo complemento a 9, C e'
  uno piu' di F e D uno di meno. Di conseguenza i possibili valori del numero
  CBD in alto a destra sono:
  826 (non possibile perche' 8 e' gia' assegnato)
  735
  642
  553 (non possibile perche' avrebbe due cifre uguali)
  462
  371
  Ora, essendo il numero CBD il risultato di AA x B, deve essere
necessariamente
  un multiplo di 11, e il vecchio criterio di divisibilita' per 11 ci dice che
  un numero e' divisibile per 11 solo se la somma delle cifre di posto dispari
  e' uguale a quella di quelle di posto pari, ossia nel nostro caso, deve
essere
  C+D=B. L'unico numero tra quelli possibili con queste caratteristiche e' 462;
  di conseguenza, abbiamo:
   AA x 6 = 462
    +   +     -
  282 : F =  94
  -------------
  FH9 + 9 = F68
  Naturalmente, a questo punto abbiamo quasi finito, perche' sappiamo che F e'
3,
  e dalla prima somma viene che A e' 7 (7+2=9). Quindi:
   77 x 6 = 462
    +   +     -
  282 : 3 =  94
  -------------
  3H9 + 9 = 368
  E' rimasto solo H, che e' 5 perche' e' 7+8 (15). Quindi lo schema risolto e':
 
   77 x 6 = 462
    +   +     -
  282 : 3 =  94
  -------------
  359 + 9 = 368
  In questo caso, ho sfruttato questo tipo di proprieta'. In altri casi, capita
ad
  esempio una moltiplicazione in cui magari il risultato ha la stessa cifra
delle
  unita' di uno dei fattori: in questo caso uno dei fattori finisce per 1 o 0,
  oppure finisce per 5 e l'altro e' dispari, oppure per 6 e l'altro e' pari...
  Non riesco a mettere giu' una lista completa dei possibili "trucchi"
aritmetici
  che uso per risolvere i calcoli enigmatici, ma dovrebbe essere abbastanza
semplice
  crearsene una facendoli...
  In bocca al lupo!
  Saluti
      Bruno


 non ho un'idea precisa di come farlo funzionare in generale)!
Non ho capito bene di che cosa si parla (qui in Inghilterra non trovo la
Settimana Enigmistica). Quali sono le regole del calcolo enigmatico?
Tu cerchi un programma che, dato un insieme di equazioni come quello proposto da
AG:
A+B=C
DE = F
G-H=I
A-D=G
B+E=H
C+F=I
ti fornisca uno schema:
A + B = C
-   + = +
D * E = F
---------
G - H = I
che ammetta una ed una sola soluzione, e` cosi`? Sembra un problema simile a
creare uno schema di parole crociate dato un insieme di parole (con qualche
vincolo in piu`).
Le lettere sono cifre o numeri qualsiasi?
Ciao,
Marco
-- 
http://www.ing.unife.it/docenti/MarcoGavanelli

 non ho un'idea precisa di come farlo funzionare in generale)!
Lo terro' presente come compitino per le vacanze !
Tipicamente i numeri hanno da 1 a 3 cifre, o possono essere piu' lunghi ?
Ciao,
Giovanni.

Tipicamente i numeri hanno da 1 a 3 cifre, o possono essere piu' lunghi ?
Ovviamente non c'e' limite ma il buon senso consiglia di non superare
le quattro cifre.
-- 
ing. Franco Varoli
fva...@tin.it
fva...@libero.it

 Le lettere sono cifre o numeri qualsiasi?
Le lettere sono numeri qualsiasi nell'ambito dei numeri naturali (ossia interi
e positivi), e per ragioni di semplicita' di solito si considerano numeri al
massimo di 4 cifre (cioe' al massimo 9999)...
Il problema, come accennavo, non e' quello di risolvere il sistema in questo
caso, per generare uno schema con queste sei operazioni, ma di risolverlo
in termini generali:
cioe', date 6 operazioni scelte a caso (in questo caso erano -, +, +, +, *, -)
generare uno o piu' schemi (per logica ci dovrebbero essere piu' soluzioni 
possibili, dato un set di operazioni), o dichiarare l'impossibilita' di 
generare uno schema con numeri interi e positivi, quindi stampare (ma questa 
parte e' banale) lo schema da risolvere in cui ad ogni cifra nei numeri e'
sostituito un simbolo.
L'algoritmo che cerco, e' proprio questo, in grado cioe' di risolvere il 
sistema SENZA dover esplicitare il set di operazioni aritmetiche.
(Teoricamente, si potrebbe tentare anche un approccio brutale, dato che i 
possibili set di operazioni sono "solo" 4^6, e risolverli tutti... ;-) )
Saluti e auguri a tutti di buon solstizio d'inverno!


 Ciao Marco, saluti alla nebbiosa (nebbiosa?) Inghilterra...
A dire il vero mi sembra piu` nebbiosa Bologna, dove abito di solito ;-)
Saluti anche a te!

Sembra uno di quei problemi fatti apposta per sfruttare la reversibilita` del
Prolog ;-)
In Prolog (ed in programmazione logica in generale) un programma che risolve un
problema puo` essere usato "al contrario": data una soluzione ti genera il
problema. Se poi usi CLP(FD), che altro non e` che Prolog con aggiunto un
sistema a vincoli sui domini finiti, diventa anche molto efficiente.
Ecco il mio programma in ECLiPSe (un sistema Prolog-CLP); dovrebbe eseguire
quasi inalterato anche in altri sistemi CLP(FD), come SICStus, SWI_Prolog, ecc.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
:- lib(fd).
:- lib(fd_global).
% A Op1 B = C
% Op2  Op3= Op4
% D Op5 E = F
% -------------
% G Op6 H = I
enigmatico(Lop) :-
% Dichiaro che ho 9 variabili che spaziano da 0 a 9999
    length(Lvar,9),
    Lvar :: 0..9999,
% impongo i vincoli del calcolo enigmatico
    imponi_vincoli(Lop,Lvar),
% impongo che tutti i numeri siano diversi
    fd_global:alldifferent(Lvar),
% Faccio partire la search
    labeling(Lvar).
imponi_vincoli([Op1,Op2,Op3,Op4,Op5,Op6],[A,B,C,D,E,F,G,H,I]) :-
    operation(A,Op1,B,C),
    operation(A,Op2,D,G),
    operation(B,Op3,E,H),
    operation(C,Op4,F,I),
    operation(D,Op5,E,F),
    operation(G,Op6,H,I).
operation(A,Op,B,C) :-
% In Prolog dati e programmi sono la stessa cosa, quindi si puo`
% "eseguire" il dato "A+B=C". L'operatore e` generico
    Operation =.. [Op,A,B],
    Operation #= C.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Ecco come si usa il programma:
Carico il programma:
[eclipse 1]: [calcolo_enigmatico].
fd_domain.eco loaded traceable 0 bytes in 0.05 seconds
fd_arith.eco loaded traceable 0 bytes in 0.20 seconds
fd_util.eco loaded traceable 0 bytes in 0.02 seconds
fd_chip.eco loaded traceable 0 bytes in 0.04 seconds
fd_elipsys.eco loaded traceable 0 bytes in 0.03 seconds
fd.eco     loaded traceable 0 bytes in 0.33 seconds
fd_global.eco loaded traceable 0 bytes in 0.10 seconds
calcolo_enigmatico.ecl compiled traceable 1396 bytes in 0.43 seconds
Yes (0.43s cpu)
Verifico se esiste una soluzione per l'esempio fornito:
[eclipse 2]: enigmatico([+, -, +, +, *, -]).
No (6.22s cpu)
(La soluzione non esiste)
Vediamo un'altra possibilita` (banale):
[eclipse 3]: enigmatico([+, +, +, +, +, +]).
More (4.42s cpu) ? ;
More (4.42s cpu) ? ;
More (4.42s cpu) ? ;
More (4.42s cpu) ? ;
More (4.42s cpu) ? ;
More (4.42s cpu) ? ;
More (4.42s cpu) ? ;
More (4.42s cpu) ? 
Abbiamo varie soluzioni. Ho strutturato il programma in modo che non dica quali
sono le soluzioni, senno` che gusto c'e` a risolvere il problema? ;-)
Il programma si puo` modificare semplicemente per generare anche le operazioni,
oppure per richiedere che ci sia una soluzione sola; se ti interessa, dimmelo.
Ciao ciao,
Marco
-- 
http://www.ing.unife.it/docenti/MarcoGavanelli

 Prolog ;-)
Ci avevo anche pensato, ho usato il Prolog in una versione vecchia
(MicroProlog)
qualche anno fa, all'universita'...
Il problema e' che sarebbe sfruttabile solo da chi avesse un motore Prolog
(poche persone, credo); anche un altro mi aveva proposto di usare il Derive
(un programma che fa matematica in simbolico, originariamente scritto in Lisp);
io, personalmente, non ho ne' un motore prolog, ne' il Derive, e cercavo
un sistema di risolvere il problema senza usare motori specializzati...
In realta', il mio obiettivo e' usare il VBScript (o un qualunque derivato 
del Basic) per scrivere una pagina HTML liberamente fruibile da chi la voglia 
usare...
Saluti e ancora auguri!
         BRUNO
-- 
Posted from 
adsl-ull-57-69.42-151.net24.it
 [151.42.69.57] 
