C, 775 771 caratteri
char*e[]={"h","he","li","be","b","c","n","o","f","ne","na","mg","al","si","p","s","cl","ar","k","ca","sc","ti","v","cr","mn","fe","co","ni","cu","zn","ga","ge","as","se","br","kr","rb","sr","y","zr","nb","mo","tc","ru","rh","pd","ag","cd","in","sn","sb","te","i","xe","cs","ba","la","ce","pr","nd","pm","sm","eu","gd","tb","dy","ho","er","tm","yb","lu","hf","ta","w","re","os","ir","pt","au","hg","tl","pb","bi","po","at","rn","fr","ra","ac","th","pa","u","np","pu","am","cm","bk","cf","es","fm","md","no","lr","rf","db","sg","bh","hs","mt","ds","rg","cn","uut","fl","uup","lv","uus","uu",0};
b[99],n;
c(w,o,l)char*w,*o,**l;{
return!*w||!strncmp(*l,w,n=strlen(*l))&&c(w+n,o+sprintf(o,",%d",l-e+1),e)||*++l&&c(w,o,l);
}
main(){
while(gets(b))c(b,b+9,e)&&printf("%s%s\n",b,b+9);
}
Input : parola per riga, deve essere minuscola. usr/share/dict/wordsè ok.
Output : parole e numeri, ad es .:acceptances,89,58,15,73,7,6,99
Logica :
c(w,o,l)controlla la parola w, iniziando con l'elemento l.
Viene utilizzata la ricorsione a due vie: se il primo elemento corrisponde alla testa dell'elenco di elementi, controllare il resto di wcontro l'elenco di elementi completo. Se questa corrispondenza fallisce, controlla la parola in fondo alla lista.
Il buffer oaccumula i numeri degli elementi lungo il percorso corretto. Dopo una partita, conterrà l'elenco dei numeri e verrà stampato.
Problemi :
l'elenco non è codificato in modo efficiente, troppo "e ,". Ma in questo modo è facile da usare. Sono sicuro che può essere molto migliorato, senza troppi costi nel codice.