C, 775 771 символів
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);
}
Введення : Слово на рядок, повинне бути малим. usr/share/dict/wordsдобре.
Вихід : Слово та цифри, наприклад:acceptances,89,58,15,73,7,6,99
Логіка :
c(w,o,l)перевіряє слово w, починаючи з елемента l.
Застосовується двостороння рекурсія - якщо перший елемент відповідає заголовку списку елементів, перевірте залишок wна повний список елементів. Якщо цей збіг не вдається, перевірте слово проти хвоста списку.
Буфер oнакопичує номери елементів уздовж успішного шляху. Після збігу він буде містити список номерів і надрукується.
Проблеми :
Список не кодується ефективно - занадто багато "і ,". Але цей спосіб легкий у використанні. Я впевнений, що його можна значно покращити, не надто багато кодуючи.