Help us understand the problem. What is going on with this article?

ランダムに生成した数字列を、SKKの辞書から抽出した語呂合わせリストで語呂合わせする

More than 1 year has passed since last update.

ランダムに生成した数字列を語呂合わせしたい

昨日、数字に語呂合わせ可能な文字列をSKKの辞書データから探すという実装を行ってみましたが、こういう方法でリストが出来上がったら実際にやってみたいのは、ランダムな数字列への語呂合わせですよね。

というわけで実際にやってみることにします。実装例は後半に記載しますが、まずは実際に動かしてみたものを。

動作例

実装例ではこんな感じになります。

4077 しれいななつななつ /指令;†上からの命令/司令;†軍隊などの指揮/死霊/使令;†命じて使役する//七つ/七ツ//七つ/七ツ/
8193 はいきゅうみっつ /配給/配球/排球/廃休//三つ/3つ/3つ/
1670 いちろなれ /一路//慣れ/熟れ;-鮨/馴/
3797 みなきゅうしち /皆/美奈/美菜/美那//久七/
5265 ごじるいつつ /呉汁/豆汁//五つ/5つ/5つ/
75489 ななつごよやく /七つ/七ツ//御予約/

左から順に、入力数字列、語呂合わせ読み、語呂合わせの漢字です。まあまあ使えそうな、使えなさそうな?

でも網羅的に試してみると、なかなか厳しい語呂合わせもあります。網羅的に試す場合はこんな感じで行えますので気になる方はお手元でお試しください。

seq -w 000 999 | mapping-number2goroawase.awk
seq -w 0000 9999 | ./mapping-number2goroawase.awk

実装例

5行目の infile の箇所で、あらかじめ作成しておいた語呂合わせリストを読み込んでいます。
あとは標準入力から渡された数字列の全桁を語呂合わせに置換し終わるまで処理を行います。

ただしこの記事を作成するにあたり 数字に語呂合わせ可能な文字列をSKKの辞書データから探す で生成するデータの形式を少し変えています。この記事はすでに更新していますが、古い記事の内容でリストを作成済みの場合は、この内容を試す場合にはリストを再作成してください。

また、この実装には少々問題がありまして、ある数字列に複数の語呂合わせが適用できたとしても、そのうちの1つしか適用していません。そういう意味ではせっかくのリストを使いきれていないのですが、あくまでこれは実装例ということでご容赦を。

mapping-number2goroawase.awk
#!/usr/bin/awk -f

BEGIN {
    idx=0
    infile = "cat goroawase_list.txt"

    while ( infile | getline ) {
        goroawase_num[idx]=$2
        goroawase_yomi[idx]=$3
        goroawase_kanji[idx]=$4
        idx++
    }
    close(infile)
}

{
    goroawase_buffer = $1
    goroawase_output = $1
    goroawase_output_kanji = $1

    # 入力された数値の桁数だけループする
    for ( looploop = 0 ; looploop < length($1) ; looploop++ ) {
        # 語呂合わせリストを総当たりで当てて語呂合わせを試行する
        for ( loop = 0 ; loop < length(goroawase_num) ; loop ++ ) {
            if ( match(goroawase_output,goroawase_num[loop]) ) {

                # 語呂合わせ済みの数字列はバッファから消す
                gsub(goroawase_num[loop],"",goroawase_buffer)

                # 出力文字列(初期値は数字列)から語呂合わせ部分を読みに置換する
                gsub(goroawase_num[loop],goroawase_yomi[loop],goroawase_output)

                # 出力文字列(初期値は数字列)から語呂合わせ部分を漢字に置換する
                gsub(goroawase_num[loop],goroawase_kanji[loop],goroawase_output_kanji)
#print $1,goroawase_buffer,goroawase_output,goroawase_num[loop]
            }
            if ( length(goroawase_buffer) == 0 ) break;
        }
        if ( length(goroawase_buffer) == 0 ) break;
    }

    print $1, goroawase_output,goroawase_output_kanji
}
kazinoue
ワンソースでWindows/macOS/iOS/Android/Linux向けアプリを作れるようになったDelphi/C++Builderや、Sencha Ext JSのセールスコンサルタント。Qiitaの投稿は自分の実務の効率化のネタも極力書いているので、Delphi/C++Builderのネタは案外少なめ。過去の勤務先ではISO27001構築運用や脆弱性情報収集分析に関わったことも。
https://community.idera.com/members/kazuhiro-inoue/blogs
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした