KAIST의 정재승 교수가
트위터에 던진 질문인데, 인터넷에서 몇몇 분이 이 문제를 풀었다. 그 중,
조승연 씨가 파이썬으로 작성한 코드는 아래와 같다.
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import re
f = open("/usr/share/dict/words", 'r')
maxlen = 0
maxword = ""
pattern = r"^(Ac|Al|Am|Sb|Ar|As|At|Ba|Bk|Be|Bi|Bh|B|Br|Cd\
|Ca|Cf|C|Ce|Cs|Cl|Cr|Co|Cu|Cm|Ds|Db|Dy|Es|Er|Eu|Fm|F|Fr\
|Gd|Ga|Ge|Au|Hf|Hs|He|Ho|H|In|I|Ir|Fe|Kr|La|Lr|Pb|Li|Lu|Mg\
|Mn|Mt|Md|Hg|Mo|Nd|Ne|Np|Ni|Nb|N|No|Os|O|Pd|P|Pt|Pu|Po\
|K|Pr|Pm|Pa|Ra|Rn|Re|Rh|Rg|Rb|Ru|Rf|Sm|Sc|Sg|Se|Si|Ag\
|Na|Sr|S|Ta|Tc|Te|Tb|Tl|Th|Tm|Sn|Ti|W|Uuh|Uuo|Uup|Uuq\
|Uus|Uut|U|V|Xe|Yb|Y|Zn|Zr|Cn)+$"
for line in f:
ll = line.strip()
if re.match(pattern, ll, flags=re.IGNORECASE) and \
len(ll) > maxlen:
maxlen = len(ll)
maxword = ll
print maxlen, maxword
이 페이지에 나온 답은 22글자의 nonrepresentationalism이지만, 내가 가진 사전 파일에는 이 단어가 없다. 대신 19글자의 nonrepresentational이 걸린다. 이걸 매스매티카로 해보면?
FindMaxElementWord[dictFile_] :=
Module[{maxlen = 0, maxword = "", elements, pattern, dict, word},
elements = Table[ElementData[n, "Abbreviation"], {n, 118}];
pattern =
"^(" <> Drop[Flatten[Map[{#, "|"} &, elements]], -1] <> ")+$";
dict = OpenRead[dictFile];
word = Read[dict, Word];
While[word =!= EndOfFile,
If[StringMatchQ[word, RegularExpression[pattern],
IgnoreCase -> True] &&
StringLength[word] > maxlen, {maxlen,
maxword} = {StringLength[word], word}];
word = Read[dict, Word]];
Close[dict];
Return[{maxlen, maxword}]]
알고리듬은 위의 파이썬 코드와 같다. 다만, 원소기호를 자동으로 생성하도록 바꾸었다.
FindMaxElementWord["/usr/share/dict/words"]를 실행해보면, 역시 19글자의 nonrepresentational이 걸린다.