2010년 9월 26일 일요일

주기율표에 나오는 원소기호로 만들 수 있는 가장 긴 단어는?

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이 걸린다.

댓글 1개:

  1. 루비 소습니다. 저 역시 결과는 19자의 "nonrepresentational"이 나오네요. 아마 사전의 차이인 듯 싶습니다. (댓글이 plain text라 들여쓰기 무시될 것 같네요.)

    pattern = %r{^(AC|AG|AL|AM|AR|AS|AT|AU|B|BA|BE|BH|BI|BK|BR|C|CA|CD|CE|CF|CL|CM|CN|CO|CR|CS|CU|DB|DS|DY|ER|ES|EU|F|FE|FM|FR|GA|GD|GE|H|HE|HF|HG|HO|HS|I|IN|IR|K|KR|LA|LI|LR|LU|MD|MG|MN|MO|MT|N|NA|NB|ND|NE|NI|NO|NP|O|OS|P|PA|PB|PD|PM|PO|PR|PT|PU|RA|RB|RE|RF|RG|RH|RN|RU|S|SB|SC|SE|SG|SI|SM|SN|SR|TA|TB|TC|TE|TH|TI|TL|TM|U|UUH|UUO|UUP|UUQ|UUS|UUT|V|W|XE|Y|YB|ZN|ZR)+$}i

    maxlen = 0
    maxword = ""

    File.open("/usr/share/dict/words").grep pattern do |word|
    word.chomp!
    if word.length > maxlen
    maxlen = word.length
    maxword = word
    end
    end

    puts maxlen, maxword

    답글삭제