
ïŒå®å
šãªãœãŒã¹ã³ãŒãã¯ãã¡ã ïŒ
ååŠã®5æéã®ã¯ã©ã¹ã«åº§ã£ãŠãå£ã«æãã£ãŠããåšæè¡šãããèŠãŸããã æéãéããããã«ãããŒãã«ã®èŠçŽ ã®è¡šèšã®ã¿ã䜿çšããŠæžãããšãã§ããåèªãæ¢ãå§ããŸããã äŸïŒScAlEsãFeArSãErasureãWASTEãPoInTlEsSnEsSãMoISTeNãSALMONNãPuffInEsSã
ãããããæé·ã®åèªã¯äœã«ã§ããã®ã ãããšæããŸããïŒç§ã¯ãªããšãTiNTiNNaBULaTiONSãèŠã€ããããšãã§ããŸãã ïŒã®ã§ãååŠå
çŽ ã®è¡šèšãããªãåèªãæ¢ãPythonããã°ã©ã ãæžãããšã«ããŸããã 圌女ã¯ãã®èšèãåãåã£ãŠãååŠå
çŽ ã®ã»ããã«å€æããããã®ãã¹ãŠã®å¯èœãªãªãã·ã§ã³ãè¿ããªããã°ãªããŸããã§ããïŒ
- å
¥ãå£ïŒåæ
- åºåïŒAmPuTaTiONSãAmPUTaTiONS
ã·ã³ãã«ã°ã«ãŒãã®çæ
ãã¹ãŠã®èŠçŽ ã®æå®ãåãé·ãã§ããã°ãã¿ã¹ã¯ã¯ç°¡åã«ãªããŸãã ãã ããäžéšã®æå®ã¯2æåã§æ§æãããäžéšã¯1æåã§ãã ããã¯åé¡ãéåžžã«è€éã«ããŸãã ããšãã°ãåæã®puã¯ããã«ãããŠã ïŒPuïŒãŸãã¯ãŠã©ã³ãå«ããªã³ïŒPUïŒãæå³ããå ŽåããããŸãã å
¥åã¯ãŒãã¯ã1æåãš2æåã®æå®ã®ãã¹ãŠã®å¯èœãªçµã¿åããã«åå²ããå¿
èŠããããŸãã
ãã®ãããªå€æããã°ã«ãŒãåããšåŒã¶ããšã«ããŸããã åèªã®è¡šèšæ³ãžã®ç¹å®ã®åºåãæ±ºå®ããŸãã ã°ã«ãŒãåã¯ããŠããããš2ã®ã¿ãã«ãšããŠè¡šãããšãã§ããŸãã1ã¯1æåã®æå®ã衚ãã2ã¯2æåã®æå®ã衚ããŸãã åèŠçŽ åã¯ã°ã«ãŒãåã«å¯Ÿå¿ããŠããŸãã
- ãAmPuTaTiONSã
- ãApPUTaTiONSã
åé¡ãåæãããã¿ãŒã³ãèŠã€ããããã«ãããŒãããã¯ã«ãã®ãããªããŒãã«ãæžããŸããã
質åïŒé·ãnã®æååãäžããããå Žåãããã«å¯ŸããŠãŠããããš2ã®ã·ãŒã±ã³ã¹ãããã€ååšã§ããã®ã§ãåã·ãŒã±ã³ã¹ã®æ¡æ°ã¯nã«çãããªããŸããïŒ
n | ïŒã°ã«ãŒãå | ã°ã«ãŒãã³ã° |
---|
0 | 1 | () |
1 | 1 | (1) |
2 | 2 | (1,1), (2) |
3 | 3 | (1,1,1), (2,1), (1,2) |
4 | 5 | (1,1,1,1), (2,1,1), (1,2,1), (1,1,2), (2,2) |
5 | 8 | (1,1,1,1,1), (2,1,1,1), (1,2,1,1), (1,1,2,1), (1,1,1,2), (2,2,1), (2,1,2), (1,2,2) |
6 | 13 | (1,1,1,1,1,1), (2,1,1,1,1), (1,2,1,1,1), (1,1,2,1,1), (1,1,1,2,1), (1,1,1,1,2), (2,2,1,1), (2,1,2,1), (2,1,1,2), (1,2,2,1), (1,2,1,2), (1,1,2,2), (2,2,2) |
7 | 21 | (1,1,1,1,1,1,1), (2,1,1,1,1,1), (1,2,1,1,1,1), (1,1,2,1,1,1), (1,1,1,2,1,1), (1,1,1,1,2,1), (1,1,1,1,1,2), (2,2,1,1,1), (2,1,2,1,1), (2,1,1,2,1), (2,1,1,1,2), (1,2,2,1,1), (1,2,1,2,1), (1,2,1,1,2), (1,1,2,2,1), (1,1,2,1,2), (1,1,1,2,2), (2,2,2,1), (2,2,1,2), (2,1,2,2), (1,2,2,2) |
åçïŒ fib(n + 1)
ïŒïŒ
ãã£ããããæ°åããã®ãããªäºæ³å€ã®å Žæã«ããããšã«é©ããã ãã®åŸã®èª¿æ»ã§ããã®ãã¿ãŒã³ãäºå幎åã«ç¥ãããŠããããšãç¥ã£ãŠããã«é©ããã å€ä»£ã€ã³ãã®ãããœãã£ã¹ã詩人ã¯ããŽã§ãŒãã®èæã®çãé³ç¯ãšé·ãé³ç¯ã®å€åã調ã¹ãããšã§ãããçºèŠããŸããã Donald Knuthã«ããThe Art of Computer Programmingæ¬ã®7.2.1.7ç« ã§ããã®ããšãçµã¿åããè«ã®æŽå²ã«ãããä»ã®åªããç ç©¶ã«ã€ããŠèªãããšãã§ããŸãã
ãã®çºèŠã«ã¯æéãåããŸããããããã§ãåœåã®ç®æšã§ããã°ã«ãŒãèªäœãçæããããšã«ã¯éããŸããã§ããã ããã€ãã®èããšå®éšã®åŸãç§ãæãã€ãæãç°¡åãªè§£æ±ºçã«å°éããŸããïŒå¯èœãªãã¹ãŠã®ãŠããããš2ã®ã·ãŒã±ã³ã¹ãçæããèŠçŽ ã®åèšãå
¥åèªã®é·ããšäžèŽããªããã®ããã£ã«ã¿ãŒã§é€å€ããŸãã
from itertools import chain, product def generate_groupings(word_length, glyph_sizes=(1, 2)): cartesian_products = ( product(glyph_sizes, repeat=r) for r in range(1, word_length + 1) ) # , groupings = tuple( grouping for grouping in chain.from_iterable(cartesian_products) if sum(grouping) == word_length ) return groupings
ãã«ã«ãç©ã¯ãæ¢åã®èŠçŽ ã»ããããé
眮ããããã¹ãŠã®ã¿ãã«ã®ã³ã¬ã¯ã·ã§ã³ã§ãã Pythonæšæºã©ã€ãã©ãªã¯itertools.product()
颿°ãæäŸããŸãããã®é¢æ°ã¯ã itertools.product()
ãitertools.product()
ã®èŠçŽ ã®ãã«ã«ãç©ãè¿ããŸãã cartesian_products
- word_length
æå®ãããé·ããŸã§ã®glyph_sizes
ã®èŠçŽ ã®ãã¹ãŠã®å¯èœãªå€æãåéããçæåŒã
word_length
ã3ã®å Žåã cartesian_products
çæããŸãã
[ (1,), (2,), (1, 1), (1, 2), (2, 1), (2, 2), (1, 1, 1), (1, 1, 2), (1, 2, 1), (1, 2, 2), (2, 1, 1), (2, 1, 2), (2, 2, 1), (2, 2, 2) ]
次ã«ãçµæã«ãã£ã«ã¿ãŒãé©çšããããããèŠçŽ æ°ãword_length
æºãã倿ã®ã¿ãgroupings
å«ãŸãword_length
ã
>>> generate_groupings(3) ((1, 2), (2, 1), (1, 1, 1))
ãã¡ãããäœåãªäœæ¥ããããããããŸãã ãã®é¢æ°ã¯14åã®å€æãèšç®ããŸããããæ®ãã¯3åã®ã¿ã§ããã ããããåŸã§ããã«æ»ããŸãã ãããŸã§ã®éãç§ã¯äœæ¥æ©èœãåŸãŠã次ã®ã¿ã¹ã¯ã«é²ã¿ãŸããã
ã°ã«ãŒãã³ã°ãšåèªã®äžèŽ
åèªã®ãã¹ãŠã®å¯èœãªã°ã«ãŒãåãèšç®ããåŸãåã°ã«ãŒããšãæ¯èŒãããå¿
èŠããããŸããã
def map_word(word, grouping): chars = (c for c in word) mapped = [] for glyph_size in grouping: glyph = "" for _ in range(glyph_size): glyph += next(chars) mapped.append(glyph) return tuple(mapped)
ãã®é¢æ°ã¯ãã°ã«ãŒãå
ã®åæå®ãã«ãããšããŠæ±ããŸããæåã«ãåèªããå¯èœãªéãå€ãã®æåãå
¥åããæ¬¡ã«æ¬¡ã®æåã«ç§»åããŸãã ãã¹ãŠã®æåãæ£ããè¡šèšæ³ã§é
眮ããããšããããã³ã°ãããçµæã®åèªãã¿ãã«ãšããŠè¿ãããŸãã
>>> map_word('because', (1, 2, 1, 1, 2)) ('b', 'ec', 'a', 'u', 'se')
ç
§ååŸãåèªã¯ååŠå
çŽ ã®èšå·ã®ãªã¹ããšæ¯èŒããæºåãã§ããŠããŸãã
ã¹ãã«ãæ€çŽ¢ãã
以åã®ãã¹ãŠã®æäœãäžç·ã«åéããspell()
颿°ãäœæããŸããã
def spell(word, symbols=ELEMENTS): groupings = generate_groupings(len(word)) spellings = [map_word(word, grouping) for grouping in groupings] elemental_spellings = [ tuple(token.capitalize() for token in spelling) for spelling in spellings if set(s.lower() for s in spelling) <= set(s.lower() for s in symbols) ] return elemental_spellings
spell()
ã¯ãã¹ãŠã®å¯èœãªã¹ãã«ãååŸããèŠçŽ è¡šèšã§å®å
šã«æ§æãããŠãããã®ã®ã¿ãè¿ããŸãã äžé©åãªãªãã·ã§ã³ã广çã«ãã£ã«ã¿ãªã³ã°ããããã«ãã»ããã䜿çšããŸããã
Pythonã®ã»ããã¯æ°åŠã»ããã«éåžžã«äŒŒãŠããŸãã ãããã¯ãäžæã®èŠçŽ ã®é äžåã®ã³ã¬ã¯ã·ã§ã³ã§ãã èå°è£ã§ã¯ããããã¯ããŒãæã€ãå€ã®ãªãèŸæžïŒããã·ã¥ããŒãã«ïŒãšããŠå®è£
ãããŸãã ã»ããã®ãã¹ãŠã®èŠçŽ ãããã·ã¥ããããããã¡ã³ããŒã·ãããã¹ãã¯éåžžã«å¹ççã«æ©èœããŸãïŒ å¹³åããŠOïŒ1ïŒ ïŒã ãããã®å¹ççãªã¡ã³ããŒã·ããæ€èšŒæäœã䜿çšããŠãµãã»ããããã§ãã¯ããããã«ãæ¯èŒæŒç®åããªãŒããŒããŒããããŸãã Luciano Ramalhoã«ããèåãªFluent Pythonã®æ¬ã«ã¯ãå€ãã®ã»ãããšèŸæžã詳ãã説æãããŠããŸãã
æåŸã®ã³ã³ããŒãã³ããç²åŸããæ©èœããããã°ã©ã ãå
¥æããŸããïŒ
>>> spell('amputation') [('Am', 'Pu', 'Ta', 'Ti', 'O', 'N'), ('Am', 'P', 'U', 'Ta', 'Ti', 'O', 'N')] >>> spell('cryptographer') [('Cr', 'Y', 'Pt', 'Og', 'Ra', 'P', 'H', 'Er')]
äžçªé·ãèšèïŒ
åºæ¬æ©èœã®å®è£
ã«æºè¶³ããããããã°ã©ã ã«Stoichiographãšããååãä»ããã³ãã³ãã©ã€ã³ã䜿çšããŠã©ãããŒãäœæããŸããã ã©ãããŒã¯ãåŒæ°ãšããŠããŸãã¯ãã¡ã€ã«ããåèªãåãåããã¹ãã«ãªãã·ã§ã³ã衚瀺ããŸãã åèªãéé ã«äžŠã¹æ¿ãã颿°ã远å ããããšã§ãããã°ã©ã ãåèªã®ãªã¹ãã«èšå®ããŸããã
$ ./stoichiograph.py --sort --batch-file /usr/share/dict/american-english NoNRePReSeNTaTiONaL NoNRePReSeNTaTiONAl [...]
ãããïŒ ç§èªèº«ã¯ãã®èšèãèŠã€ããããªãã£ãã§ãããã ããã°ã©ã ã¯ãã§ã«ã¿ã¹ã¯ã解決ããŠããŸãã ç§ã¯éãã§ãé·ãåèªãèŠã€ããŸããïŒ
$ ./stoichiograph.py nonrepresentationalisms NoNRePReSeNTaTiONaLiSmS NONRePReSeNTaTiONaLiSmS NoNRePReSeNTaTiONAlISmS NONRePReSeNTaTiONAlISmS
é¢çœãã ãããå®éã«æãé·ãåèªïŒ ãã¿ã㬠ïŒã§ãããã©ãããç¥ãããã£ãã®ã§ãé·ãåèªã調æ»ããããšã«ããŸãã ã ããããæåã«ãããã©ãŒãã³ã¹ã«å¯ŸåŠããå¿
èŠããããŸããã
ããã©ãŒãã³ã¹ã®åé¡ã解決ãã
119,095ã¯ãŒãïŒãã®å€ãã¯ããªãçãïŒã®åŠçã«ã¯ãããã°ã©ã ã«çŽ16åããããŸããã
$ time ./stoichiograph.py --sort --batch-file /usr/share/dict/american-english [...] real 16m0.458s user 15m33.680s sys 0m23.173s
1ç§ãããå¹³åçŽ120ã¯ãŒãã ãã£ãšæ©ãã§ãããšç¢ºä¿¡ããŠããŸããã æãå ŽæãèŠã€ããããã«ããã詳现ãªããã©ãŒãã³ã¹æ
å ±ãå¿
èŠã§ããã
ã©ã€ã³ãããã¡ã€ã©ãŒã¯ãPythonã³ãŒãã®ããã©ãŒãã³ã¹ã®ããã«ããã¯ãèå¥ããããã®ããŒã«ã§ãã 圌女ã23æåã®åèªã®ã¹ãã«ãæ¢ããŠãããšãã«ãããã°ã©ã ããããã¡ã€ã«ããããã«äœ¿çšããŸããã ã¬ããŒãã®ç°¡æœãªããŒãžã§ã³ã¯æ¬¡ã®ãšããã§ãã
Line # % Time Line Contents =============================== 30 @profile 31 def spell(word, symbols=ELEMENTS): 32 71.0 groupings = generate_groupings(len(word)) 33 34 15.2 spellings = [map_word(word, grouping) for grouping in groupings] 35 36 elemental_spellings = [ 37 0.0 tuple(token.capitalize() for token in spelling) 38 13.8 for spelling in spellings 39 if set(s.lower() for s in spelling) <= set(s.lower() for s in symbols) 40 ] 41 42 0.0 return elemental_spellings Line # % Time Line Contents =============================== 45 @profile 46 def generate_groupings(word_length, glyhp_sizes=(1, 2)): 47 cartesian_products = ( 48 0.0 product(glyph_sizes, repeat=r) 49 0.0 for r in range(1, word_length + 1) 50 ) 51 52 0.0 groupings = tuple( 53 0.0 grouping 54 100.0 for grouping in chain.from_iterable(cartesian_products) 55 if sum(grouping) == word_length 56 ) 57 58 0.0 return groupings
generate_groupings()
ãé·ãéå®è¡ãããŠããã®ãäžæè°ã§generate_groupings()
ãããŸããã 圌女ã解決ããããšããŠããåé¡ã¯ããµãã»ããã®åèšã®åé¡ã®ç¹æ®ãªã±ãŒã¹ã§ãããããã¯NPå®å
šåé¡ã§ãã ãã«ã«ãç©ãèŠã€ããããšã¯ããã«é«äŸ¡ã«ãªãã generate_groupings()
ã¯å€æ°ã®ãã«ã«ãç©ãæ¢ããŸãã
挞è¿è§£æãå®è¡ããŠããã¹ãŠãã©ãã»ã©æªãããçè§£ã§ããŸãã
glyph_sizes
åžžã«2ã€ã®èŠçŽ ïŒ1ãš2ïŒãå«ãŸãããšä»®å®ããŸããproduct()
ã¯ã2ã€ã®èŠçŽ ã®ã»ããã®ãã«ã«ãç©ã®r
åãæ±ããããã product()
æéèšç®éã¯O(2^r)
ã§ããproduct()
ã¯word_length
åç¹°ãè¿ãã«ãŒãã§åŒã³åºãããããã n
ãword_length
ãšword_length
ãšãã«ãŒãå
šäœã®æéã®è€éãã¯O(2^r * n)
ãŸãã- ãããã
r
ã¯ãµã€ã¯ã«ã®å®è¡ããšã«ç°ãªãå€ãååŸãããããå®éã«ã¯æéã®è€é床ã¯O(2^1 + 2^2 + 2^3 + ... + 2^(n-1) + 2^n)
è¿ããªããŸãã - ãŸãã
2^0 + 2^1 + ... + 2^n = 2^(n+1) - 1
ãçµæã®æéã®è€éãã¯O(2^(n+1) - 1)
ãŸãã¯O(2^n)
ã
O(2^n)
ã䜿çšãããšã word_length
å¢åããšã«ã©ã³ã¿ã€ã ã2åã«ãªãããšãæåŸ
ã§ããŸãã ã²ã©ã
ç§ã¯äœé±éãããã©ãŒãã³ã¹ã®åé¡ã«ã€ããŠèããŸããã çžäºã«é¢é£ãã2ã€ã®ç°ãªãã¿ã¹ã¯ã解決ããå¿
èŠããããŸããã
- ç°ãªãé·ãã®åèªã®ãªã¹ããåŠçããŸãã
- 1ã€ã®éåžžã«é·ãåèªã®åŠçã
2çªç®ã®ã¿ã¹ã¯ã¯ãæåã®ã¿ã¹ã¯ã«åœ±é¿ãäžãããããã¯ããã«éèŠã§ããããšã倿ããŸããã 2çªç®ã®ã±ãŒã¹ã§ã¯åŠçãæ¹åããæ¹æ³ãããã«ã¯çè§£ããŸããã§ããããæåã®ã±ãŒã¹ã«ã€ããŠã¯ã¢ã€ãã¢ããã£ãã®ã§ãããããå§ããŸããã
ã¿ã¹ã¯1ïŒæ ãè
ã«ãªã
æ azineã¯ã ããã°ã©ããŒã ãã§ãªããããã°ã©ã èªäœã«ãšã£ãŠãçŸåŸ³ã§ãã æåã®åé¡ã®è§£æ±ºã«ã¯ãæ ã®è¿œå ãå¿
èŠã§ããã ããã°ã©ã ãåèªã®é·ããªã¹ãããã§ãã¯ããå Žåãã©ãããã°ã§ããã ãäœæ¥ãå°ãªãããã®ã§ããïŒ
ç¡å¹ãªæåã確èªããŠãã ãã
åœç¶ããªã¹ãã«ã¯ããããåšæè¡šã§ã¯è¡šãããªãæåãå«ãåèªãå«ãŸãããšèããŸããã ãã®ãããªåèªã®ã¹ãã«ãæ€çŽ¢ããã®ã«æéãè²»ããããšã¯æå³ããããŸããã ãã®ããããã®ãããªåèªããã°ããèŠã€ããŠæšãŠãã°ããªã¹ããããéãåŠçã§ããŸãã
æ®å¿µãªããã衚ã«ç€ºãããŠããªãæåã¯jãšqã ãã§ããã
>>> set('abcdefghijklmnopqrstuvwxyz') - set(''.join(ELEMENTS).lower()) ('j', 'q')
ãããŠç§ã®èŸæžã§ã¯ããããã®æåãå«ãŸããŠããåèªã¯3ïŒ
ã ãã§ããã
>>> with open('/usr/share/dict/american-english', 'r') as f: ... words = f.readlines() ... >>> total = len(words) >>> invalid_char_words = len( ... [w for w in words if 'j' in w.lower() or 'q' in w.lower()] ... ) ... >>> invalid_char_words / total * 100 3.3762962340988287
ããããæšãŠãŠãç§ã¯ããã2ïŒ
ã®ããã©ãŒãã³ã¹åäžãåŸãŸããïŒ
$ time ./stoichiograph.py --sort --batch-file /usr/share/dict/american-english [...] real 15m44.246s user 15m17.557s sys 0m22.980s
ããã¯ç§ãæãã§ããæ¹åã§ã¯ãªãã£ãã®ã§ã次ã®ã¢ã€ãã¢ã«ç§»ããŸããã
ã¡ã¢å
ã¡ã¢åã¯ã颿°ã®åºåãä¿åããåãå
¥åã§é¢æ°ãå床åŒã³åºãããå Žåã«ãããè¿ãããã®ææ³ã§ãã ã¡ã¢åããã颿°ã¯ãç¹å®ã®å
¥åã«åºã¥ããŠ1åã ãåºåãçæããå¿
èŠããããŸãã ããã¯ãåãè€æ°ã®å
¥åããŒã¿ã§ç¹°ãè¿ãåŒã³åºãããé«äŸ¡ãªé¢æ°ã䜿çšããå Žåã«éåžžã«äŸ¿å©ã§ãã ãã ããã¡ã¢åã¯çŽç²ãªé¢æ°ã«å¯ŸããŠã®ã¿æ©èœããŸãã
generate_groupings()
ã¯å®ç§ãªåè£ã§ããã éåžžã«åºç¯å²ã®å
¥åããŒã¿ã«ééããå¯èœæ§ã¯äœããé·ãåèªãåŠçãããšãã«å®è¡ããã®ã«éåžžã«ã³ã¹ããããããŸãã functools
ããã±ãŒãžã¯ã @lru_cache()
ãã³ã¬ãŒã¿ãŒãæäŸããããšã§ã¡ã¢åã容æã«ããŸãã
generate_groupings()
ã®ã¡ã¢åã¯ãå®è¡æéã®ççž®ããããããŸãã-ååã§ã¯ãããŸããããèããïŒ
$ time ./stoichiograph.py --sort --batch-file /usr/share/dict/american-english [...] real 11m15.483s user 10m54.553s sys 0m17.083s
ããããæšæºã©ã€ãã©ãªã®åäžã®ãã³ã¬ãŒã¿ã«ãšã£ãŠã¯ãŸã æªããããŸããïŒ
ã¿ã¹ã¯2ïŒã¹ããŒãã«
ç§ã®æé©åã¯æåã®ã¿ã¹ã¯ã§å°ãå©ããŸããããéèŠãªæªè§£æ±ºã®åé¡ã¯generate_groupings()
éå¹çæ§ã§ããã倧ããªåã
ã®åèªã¯ãŸã åŠçã«éåžžã«é·ãæéãããããŸããïŒ
$ time ./stoichiograph.py nonrepresentationalisms [...] real 0m20.275s user 0m20.220s sys 0m0.037s
æ azineã¯ããçšåºŠã®é²æ©ã«ã€ãªããå¯èœæ§ããããŸãããæã«ã¯è³¢ãããå¿
èŠããããŸãã
ååž°ãšDAG
ããå€ãå±
ç ããããŠãã€ã³ã¹ãã¬ãŒã·ã§ã³ã®éå
ãçµéšãããã¯ã€ãããŒãã«èµ°ã£ãŠãããæããŸããã

ã©ã¡ãã®å Žåã§ããä»»æã®è¡ã䜿çšããŠã1æåãš2æåã®è¡šèšããã¹ãŠåŒãåºããæ®ããååž°ã§ãããšèããŸããã è¡å
šäœã調ã¹ãåŸãèŠçŽ ã®ãã¹ãŠã®è¡šèšæ³ãèŠã€ããæãéèŠãªããšã«ã¯ãèŠçŽ ã®æ§é ãšé
眮ã«é¢ããæ
å ±ãååŸããŸãã ãŸããã°ã©ãã¯ãã®ãããªæ
å ±ãä¿åããããã®çŽ æŽããããªãã·ã§ã³ãããããªããšèããŸããã
äžé£ã®ååž°é¢æ°ãçŸããåèªã®åæãèŠæ±ããå Žåãæ¬¡ã®ããã«ãªããŸãã
'a' 'mputation' 'm' 'putation' 'p' 'utation' 'u' 'tation' 't' 'ation' 'a' 'tion' 't' 'ion' 'i' 'on' 'o' 'n' 'n' '' 'on' '' 'io' 'n' 'ti' 'on' 'at' 'ion' 'ta' 'tion' 'ut' 'ation' 'pu' 'tation' 'mp' 'utation' 'am' 'putation'
åšæè¡šãæºãããªããã¹ãŠã®æå®ããã£ã«ã¿ãªã³ã°ãããšãåæ§ã®ã°ã©ããååŸã§ããŸãã

çµæã¯æåéåšæã°ã©ã ïŒDAGïŒã§ããã®åããŒãã«ã¯ååŠå
çŽ ã®æå®ãå«ãŸããŠããŸãã æåã®ããŒãããæåŸã®ããŒããŸã§ã®ãã¹ãŠã®ãã¹ã¯ãååŠèŠçŽ ã®åœ¢ã§å
ã®åèªã®æå¹ãªã¹ãã«ã«ãªããŸãïŒ
ãã以åã¯ãã°ã©ããæ±ã£ãŠããŸããã§ãããã2ã€ã®ããŒãéã®ãã¹ãŠã®ãã¹ã®å¹ççãªæ€çŽ¢ãªã©ãåºæ¬ã説æããéåžžã«æçšãªãšãã»ã€ãèŠã€ããŸããã 500 Lines or Lessãšããåªããæ¬ã«ã¯ãPythonã§ã®ã°ã©ãã®å¥ã®å®è£
äŸã«é¢ããç« ããããŸãã ãããã®äŸãåºç€ãšããŠåãäžããŸããã
ç°¡åãªã°ã©ãã¯ã©ã¹ãå®è£
ããŠãã¹ãããåŸãããŒãäžã®æç»ã颿°ã«å€æããŸããã
# . . Node = namedtuple('Node', ['value', 'position']) def build_spelling_graph(word, graph, symbols=ELEMENTS): """ , - . , . """ def pop_root(remaining, position=0, previous_root=None): if remaining == '': graph.add_edge(previous_root, None) return single_root = Node(remaining[0], position) if single_root.value.capitalize() in symbols: graph.add_edge(previous_root, single_root) if remaining not in processed: pop_root( remaining[1:], position + 1, previous_root=single_root ) if len(remaining) >= 2: double_root = Node(remaining[0:2], position) if double_root.value.capitalize() in symbols: graph.add_edge(previous_root, double_root) if remaining not in processed: pop_root( remaining[2:], position + 2, previous_root=double_root ) processed.add(remaining) processed = set() pop_root(word)
åã€
é¡ã®ã¢ã«ãŽãªãºã ãéåžžã«é·ãå®è¡ãããŠããéïŒ O(2^n)
ïŒãååž°ã¢ã«ãŽãªãºã ã¯O(n)
ç¶ããŸããã ã¯ããã«è¯ãïŒ èŸæžã§åããŠæé©åãããããã°ã©ã ãå®è¡ãããšããã·ã§ãã¯ãåããŸããã
$ time ./stoichiograph.py --sort --batch-file /usr/share/dict/american-english [...] real 0m11.299s user 0m11.020s sys 0m0.17ys
æ¯ç§120ã¯ãŒã-10,800ã¯ãŒãã§ã¯ãªãã16åã§ã¯ãªã10ç§ã«ãªããŸããïŒ
ããŒã¿æ§é ãšã¢ã«ãŽãªãºã ã®åšåãšäŸ¡å€ã«åããŠæè¬ããŸããã
æé·åèª
æ°ãã«çºèŠãããæ©èœã«ãããååŠèŠçŽ ã«åè§£ãããæãé·ãåèªã§ããfloccinaucinihilipilificatiousnessãèŠã€ããããšãã§ããŸããã ããã¯floccinaucinihilipilificationã®æŽŸçç©ã§ãã ãäœãã説æããããäœããéèŠã§ãªãã䟡å€ã®ãªãããŸãã¯äŸ¡å€ã®ãªããã®ãšããŠæ±ãè¡åãŸãã¯ç¿æ
£ãæå³ããŸãã ãã®åèªã¯ãè±èªã§æãé·ãéæè¡çãªåèªãšåŒã°ããããšããããããŸãã
Floccinaucinihilipilificatiousnessã¯54ã®ã¹ãã«ãšããŠè¡šãããšãã§ããŸãããããã¯ãã¹ãŠãã®çŸããåã§æå·åãããŠããŸãã

ãªãªãžãã«
ããéãããŸãã
äžèšã®ãã¹ãŠãå®å
šã«ãã³ã»ã³ã¹ã§ãããšèšã人ããããããããŸããããç§ã«ãšã£ãŠã¯è²Žéã§éèŠãªçµéšã«ãªããŸããã ç§ããããžã§ã¯ããå§ãããšããç§ã¯ããã°ã©ãã³ã°ã®çµéšãæ¯èŒçæµ
ããã©ãããå§ããã°ããã®ãåãããŸããã§ããã ç©äºã¯ãã£ãããšåããæºè¶³ã®ããçµæãåŸããŸã§ã«å€ãã®æéãçµéããŸããïŒ ã³ãããã®å±¥æŽãåç
§ããŠãã ãããä»ã®ãããžã§ã¯ãã«åãæ¿ãããšãã«å€§ããªäžæããããŸãïŒã
ããã«ãããããããç§ã¯å€ãã®ããšãåŠã³ãå€ãã®ããšã«åºäŒããŸããã ããã¯ïŒ
- çµã¿åããè«
- ããã©ãŒãã³ã¹ãããã¡ã€ãªã³ã°
- æéã®è€éã
- ã¡ã¢å
- ååž°
- ã°ã©ããšããªãŒ
ãããã®æŠå¿µãçè§£ããããšã«ãããç¹°ãè¿ãå©ããããŠããŸããã ç¹ã«ã näœã®ååž°ãšæšãã·ãã¥ã¬ãŒãããç§ã®ãããžã§ã¯ãã«ãšã£ãŠéèŠã§ããããšã倿ããŸããã
æåŸã«ãããªãèªèº«ã®æåã®è³ªåã«å¯ŸããçããèŠã€ããããšãã§ããŠè¯ãã£ãã§ãã ç§ã¯ãã®ããã®ããŒã«ãæã£ãŠããã®ã§ãååŠèŠçŽ ã«åè§£ããããšãèããå¿
èŠããªããªã£ãããšãç¥ã£ãŠããŸããããã¯pip install stoichiograph
ã§ãååŸã§ããŸãã
è°è«
åè¯ãªäººã
ïŒããã³ããã€ãã®åæã®ãããïŒã¯ãr /ããã°ã©ãã³ã°ã¹ã¬ããã§ãã®èšäºã®è°è«ã«åå ããŸããã
ãµããããªã¢ã«
ãšã¬ã¬ã³ããªãœãªã¥ãŒã·ã§ã³ããããã€ãã®è峿·±ãåé¡ãžã®ã€ã³ã¹ãã¬ãŒã·ã§ã³ã®ããªãã®éšåãåŸãŸããããããã®ãœãªã¥ãŒã·ã§ã³ã¯Peter Norvigã®ãã®ã§ãã
Pythonã®ããã©ãŒãã³ã¹ãããã¡ã€ãªã³ã°ã«é¢ãã2ã€ã®æçãªèšäºïŒ