challenge ナイツ関数(ボケの方)

入力した文章のところどころを言い間違えて出力する関数を実装してください。
(ナベアツ算を見てて思いつきました)

入出力の方法は標準入出力や引数・戻り値など、扱いやすい方法でかまいません。

文字単位でランダムに間違えても面白くないので、単語のリストから似た単語の候補を探すようにしてください。英単語でもOKです。単語のリストは参考ページからダウンロードしたものを加工して利用すると良いと思います。(4000個あります)

結果がつまらなくても構いませんが、面白いボケをうむ工夫があると良いです。
※人が考えたボケは求めてませんよ!

入力の例として「どう書く?org」の前文をお借りしました。ご自分でヤホーで調べたりして手ごろな文章を見つけて下しあ。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
<入力例>
ドウカク org ヘ ヨウコソ
コノ サイト ハ ダサレタ オダイ ヲ イカニ トクカ キソイアウ
 プログラマ ノ タメノ コロシアム デス
トウコウ ヲ タメシテ ミタイ カタ ハ テスト
トリアエズ ナガメテ ミタイ カタ ハ ゲンゴ ノ イチラン ガ オススメ デス

<出力例>
ドウモク org ヘ ヨウコソ
コノ ザレゴト ハ ダサレタ オダイ ヲ イワハダ トシシタ キソイアウ
 プログラマ ノ タチノミ コロシアム デス
トウコウ ヲ ハナシテ ミチノリ カタ ハ プリント
トリアエズ ナガメテ ミツリン カタ ハ ゲンゴ ノ キンラン ガ オススメ デス

Posted feedbacks - Python

Java版でレーベンシュタイン距離を使っていたのに触発されたRuby版に触発されて、同じようなものを書いてみました。if-else式のために、Python2.5以上です。

Java版そのままだと、総あたり検索していて遅かったので、先頭文字が一致する単語のみに絞ることにしました。あと、候補が複数ある場合はランダムに選択するようにしています。

ちなみに単語辞書は毎回元サイトから拾っているので、オフラインでは動きません。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#!coding: utf-8
import urllib, random

def download_words():
    prefix = "http://www.ais.riec.tohoku.ac.jp/lab/wordlist/"
    files = ["fam70_55.txt", "fam55_40.txt", 
             "fam40_25.txt", "fam25_10.txt"]
    words = []
    for f in files:
        fd = urllib.urlopen(prefix + f)
        for line in fd:
            if line.strip() != "":
                words.extend(line.strip().decode("sjis").split("\t"))
        fd.close()
    return words

allwords = download_words()

def Levenshtein_distance(word0, word1):
    d = dict()
    for i in range(len(word0) + 1): d[(i,0)] = i
    for j in range(len(word1) + 1): d[(0,j)] = j
    for i in range(1, len(word0) + 1):
        for j in range(1, len(word1) + 1):
            cost = 0 if word0[i-1] == word1[j-1] else 1
            d[(i,j)] = min(d[(i-1,j)]+1, d[(i,j-1)]+1, d[(i-1,j-1)]+cost)
    return d[(len(word0), len(word1))]

def similarity(word0, word1):
    l = max(len(word0), len(word1))
    return float(l - Levenshtein_distance(word0, word1)) / l

def find_alt_word(word):
    alt_words = filter(
        lambda alt: alt[0] == word[0] and similarity(word, alt) > 0.5,
        allwords)
    )
    return random.choice(alt_words) if alt_words else word

def knights(text):
    return  u" ".join([find_alt_word(w) for w in text.split(u" ")])

print knights(u'''ドウカク org ヘ ヨウコソ
コノ サイト ハ ダサレタ オダイ ヲ イカニ トクカ キソイアウ
プログラマ ノ タメノ コロシアム デス
トウコウ ヲ タメシテ ミタイ カタ ハ テスト
トリアエズ ナガメテ ミタイ カタ ハ ゲンゴ ノ イチラン ガ オススメ デス'''
).encode("sjis")

Index

Feed

Other

Link

Pathtraq

loading...