C, 775 771 caracteres
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);
}
Entrada : Palabra por línea, debe estar en minúscula. usr/share/dict/wordsestá bien.
Salida : palabra y números, por ejemplo:acceptances,89,58,15,73,7,6,99
Lógica :
c(w,o,l)verifica la palabra w, comenzando con el elemento l.
Se utiliza la recursión bidireccional: si el primer elemento coincide con el encabezado de la lista de elementos, compruebe el resto de wla lista de elementos completa. Si esta coincidencia falla, verifique la palabra en la cola de la lista.
El búfer oacumula los números de elementos a lo largo de la ruta exitosa. Después de una coincidencia, contendrá la lista de números y se imprimirá.
Problemas :
La lista no está codificada de manera eficiente, demasiado "y ,". Pero de esta manera es fácil de usar. Estoy seguro de que se puede mejorar mucho, sin demasiado costo en el código.