C, 775 771 znaków
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);
}
Wprowadzanie : słowo w wierszu, musi być pisane małymi literami. usr/share/dict/wordsjest w porządku.
Wyjście : słowo i liczby, np .:acceptances,89,58,15,73,7,6,99
Logika :
c(w,o,l)sprawdza słowo w, zaczynając od elementu l.
Wykorzystywana jest dwukierunkowa rekurencja - jeśli pierwszy element pasuje do nagłówka listy elementów, sprawdź resztę wwzględem pełnej listy elementów. Jeśli to dopasowanie się nie powiedzie, sprawdź słowo na końcu listy.
Bufor ogromadzi numery elementów wzdłuż udanej ścieżki. Po dopasowaniu będzie zawierać listę liczb i zostanie wydrukowany.
Problemy :
lista nie jest zakodowana efektywnie - za dużo "i ,". Ale w ten sposób jest łatwa w użyciu. Jestem pewien, że można ją znacznie ulepszyć bez nadmiernych kosztów w kodzie.