Newsgroup: it.comp.lang.delphi
Titolo: Algoritmo "impossibile per me"...

Salve amici, vi chiedo un'aiuto per l'implementazione di 
un'algoritmo...(in fondo trovate la mia soluzione scritta a mano,non in 
delphi,non provata,e' solo un concetto...vorrei sapere se esiste 
un'approccio migliore...)
Situazione:
L'utente fornisce una stringa in un tedit del tipo 
"plutonio-12345678";nella cartella del progetto esiste un file .ini che 
contiene un numero non specificato di "sezioni" chiamate ad esempio 
"plutonio-12xxxxxx","plutonio-879xxxxx","plutonio-54xxxxxx" (si, ci sono 
i caratteri "x")
Quello che devo fare ï¿œ trovare la sezione che si avvicina maggiormente 
alla stringa fornita dall'utente (ovviamente considerando i caratteri da 
sinistra verso destra), per poi poter prendere il valore di "orbita".
[plutonio-
4747706624
]
orbita=69102X
[plutonio-479xxxxx]
orbita=67903X
[plutonio-480xxxxx]
orbita=67903X
[plutonio-481xxxxx]
orbita=67903X
[plutonio-538xxxxx]
orbita=67903X
[plutonio-54xxxxxx]
orbita=67903X
[plutonio-548xxxxx]
orbita=67903X
[plutonio-552xxxxx]
orbita=67904X
[plutonio-57xxxxxx]
orbita=69102X
[plutonio-57xxxxxx]
orbita=67902X
[plutonio-930xxxxx]
orbita=69101X
[plutonio-966xxxxx]
orbita=69102X
I caratteri sopo la stringa "plutonio-" sono sempre 8.
Quello che avevo in mente ï¿œ dare un "peso" ai valori dopo la stringa 
"plutonio-", ad esempio il piï¿œ significativo pesa 100000000,il secondo 
10000000,il terzo 1000000,e cosï¿œ via.
Enumerare tutte le sezioni (e non sï¿œ proprio come fare,ho cercato su 
google,ma senza successo :( ), per ogni sezione fare le moltiplicazioni 
del peso per la cifra, poi fare un'or "carattere per carattere" e 
trovare la "stringa che pesa di piï¿œ".
Idee? E' un'idea strampalata? Se mi dite che puï¿œ funzionare,esiste una 
funzione per enumerare le sezioni? (cosï¿œ da scorrerle tutte).
Grazie tante,spero di esser stato chiaro

Readsections restituisce le sezioni :)
Ma è possibile che trovo le funzioni subito dopo aver postato,ma dopo 3 
giorni di sbattimento?.
Il problema cmq persiste...io lo provo (ci vorrà un pò di tempo...ma non 
ho idea se funzionerà o no).

 Grazie tante,spero di esser stato chiaro
Io butterei tutto su DB e farei una locate con [loPartialKey], 
ovviamente questa è solo un idea.
Senza tanti sofismi, una tabella xml con tre campi  ELEMENTO, NUMERO, 
ORBITA, in base all'elemento si cerca con il locate sul numero e il 
risultato è il campo orbita.
^_Goblin_^

^_Goblin_^ ha scritto:

Mi ero scordato di dire che al massimo le "chiavi" sono 50 o 
100...quindi un db è esagerato, e l'utente deve essere in grado di 
modificare il file .ini a mano.
L'idea che ho proposto fà acqua o è un'algoritmo studiato bene?


Ho detto tabella XML che con l'accoppata ClientDataSet si comporta come 
una tabella di un DB, per la modifica da parte dell'utente non sarebbe 
sbagliato costruire un tool di modifica della tabella/file senza far 
toccare all'utente il file originario, in questo modo eviti errori di 
vario tipo. cmq la mia era solo un idea :)
^_Goblin_^

 orbita=67903X
[]
Se con "si avvicina maggiormente" significa che la differenza in
valore assoluto fra quanto specificato e l'indice deve essere minima,
banalmente (scritto qui e non testato):
needle := numberFromText(edInput.text); // restituisce un intero a 8
cifre
best := -1;
delta := maxint;
for i := 0 to pred(sections.count) do begin
   if abs(needle - config.numberFromSection[i]) >= delta then
continue;
   best := i;
   delta := abs(needle - numberFromText(sections[i]));
end;
if best >= 0 then return best;
function numberfromtext (atext: string);
var s: string;  i: integer;
begin
  s := '';
  i := pos('-'; atext) +1;
  while i < length(atext) do begin
    if not (ch[i] in ['0'..'9']) then break;
    s := s + ch[i]; inc(i);
  end;
  while length(s) < 9 do s := s + '0';
  result := strToIntDef(s, 0);
end;

Paolo Arosio ha scritto:

Analizzo e provo!
Grazie!

 Grazie!
Scusa la curiositŕ, se ho letto bene nel corso del thread i record non 
superano la sessantina. A questo punto dal momento che hai un numero 
costante di record (e che non deve variare nel tempo) anziché cercare la 
soluzione piů figa, perchč non metti tutti i record in un file e accedi 
direttamente usando il vecchio stile?
Mi sembra che ti stai complicando la vita, quando nel caso piů specifico la 
soluzione meno figa č quella piů comoda e pratica da seguire.
Brevemente inizializzi il file con tutti i dati e ci accedi :) 

 Brevemente inizializzi il file con tutti i dati e ci accedi :)
Infatti quello che avevo detto, io ho solo specificato il tipo di file 
"XML" e ClientDataSet, in modo da avere le potenzialità di ricerca 
(locate, findkey, FindNearest, ect ect) di un DB già pronte, e in questo 
modo si puo' dare all'utente una maschera per gestire i record.
btw ... :)
^_Goblin_^
-- 
Ibis et redibis non morieris in bello
http://goblinland.myminicity.com/

I record da confrontare potrebbero aumentare,oggi posto come ho risolto 
il problema (ora stò andando a lavoro sorry!)