jkr_2255 jkr_2255 2013-03-07 22:23:39

[Ruby] 新宿二丁目の処理に失敗 このエントリーをはてなブックマークに追加

投稿者からのアピールポイント

昔から、Iとlと1とか、Oと0とかを見分けやすいフォントは普及していますが、日本語で似たような文字を容易に判別できるフォントはあまり見ない気がします。

#住所の変換処理
address=address.gsub('一丁目','1丁目')
  .gsub('ニ丁目','2丁目')
  .gsub('三丁目','3丁目')
  .gsub('四丁目','4丁目')
  .gsub('五丁目','5丁目')
#(実際にはもっと続くし、もう少し複雑な処理をしていますが省略)

使い方ヒント: 「これは臭う」という行を見付けたら、各行のsmellをクリックしてマーキングしておきましょう(要Twitter OAuth認証)

コメント(24)

#1 keiichiroh keiichiroh 2013-03-08 21:46:08  

ニと二は・・・どうしようもないねぇ。コード表記したとしても可読性は向上しないし。 明朝でセリフつけるくらい?

#2 token7 token7 2013-03-10 09:15:15  

うん?なんでコード書いてるのに肉眼に頼ろうとしてんの?

#3 InternalServerE InternalServerE 2013-03-12 08:18:00  

文字列検索・置換が数珠つなぎになってる点はツッコまなくていいものなん?

#4 keiichiroh keiichiroh 2013-03-12 09:48:58  

うん・・・コード表記なんて曖昧なこと言ってごめんなさい。普通にUnicodeエスケープシーケンスの事と分かってくれると思ってしまった。"\u93f1丁目"とかと書いても可読性が向上しないと。

#5 Miraranran Miraranran 2013-03-15 12:57:48  

ユーザーが「に」からの変換でやらかす場合があるからカタカナニと数字二の両方の処理をつくっておくほうがいいに違いない。 数珠つなぎはjquery普及しすぎてみんな感覚麻痺してないかな。jqueryキモイ...

#6 jkr_2255 jkr_2255 2013-03-15 18:40:01  

Ruby自身も、1.9から「メソッド呼び出し直前のピリオドの前で改行できるようになった」と文法を変えているぐらいだからなあ>数珠つなぎ

#7 InternalServerE InternalServerE 2013-03-17 07:54:38  

もちろん数珠つなぎ自体が悪いわけじゃなく、使い方と程度次第だぁね。
このコードだと、「一丁目」がヒットした場合、二丁目以降は事実上ヒットしないわけで、空振りの検索置換が延々と続く構図になる。
無駄にCPUパワーを浪費する悪の枢軸です。

#8 keiichiroh keiichiroh 2013-03-20 19:28:47  

最初のヒットで抜けることが出来るなんて条件は一つも書かれていない。 "一丁目10番,五丁目3番"とかという可能性も考慮しようよ。

#10 InternalServerE InternalServerE 2013-03-21 05:00:09  

ええと、
> "一丁目10番,五丁目3番"
という文字が入力なら、この実装は妥当、というご意見ですかね。ホントにほんとかなぁ。。
自分ならまずこんな実装はしないし、臭いが変わるだけでいずれにせよウンコに見えてしまう。。

#11 slimymars slimymars 2013-04-01 22:08:07  

そんなんより十一丁目の処理のがうんこっぽそう。

#12 InternalServerE InternalServerE 2013-04-08 13:28:14  

「実際にはもっと続く」らしいし、十一以降も延々とgsubでないの。

#13 kuma056 kuma056 2013-04-08 18:55:00  

.gsub('十一丁目','11丁目) だと期待通りに動かないから .gsub('十1丁目','11丁目') ってことでしょうか.....どっちにしてもちょっと...

#14 InternalServerE InternalServerE 2013-04-08 19:51:36  

ああ、確かに
slimymarsさんの主旨に気づけなかったorz

#15 keiichiroh keiichiroh 2013-04-18 23:01:46  

んー、うんこって簡単に言ってる人、代案あって言ってるんだよね?

#16 kuma056 kuma056 2013-04-19 14:54:37  

Rubyの場合、ブロックを使って、「マッチした内容を元に演算した値で置換」ってことができますから

address=address.gsub(/([[:漢数字:]]+)丁目/) { "#{Kansuuji2Int($1)}丁目" }

ってやり方があります。[:漢数字:]文字クラスとかKansuuji2Intメソッドとかは疑似コードですけど。

#17 Chiether Chiether 2013-04-19 18:50:11  

(ネタ発言) とりあえず。だいたい北海道のせい。

#18 InternalServerE InternalServerE 2013-04-19 19:32:49  

> keiichirohさん
簡易な住所パーサー書くかな。自分に限らず、わりとよく使われる手じゃなかろうか。

#19 InternalServerE InternalServerE 2013-04-19 19:56:01  

もちろん自分の方法がベストと言うつもりは更々ないんで、その辺は誤解なきよう。他にも代案なんて考えたらコロコロ出てきそうなものだし。
ちなみに、keiichirohさんは数珠つなぎがベストという見解?

#20 jkr_2255 jkr_2255 2013-04-19 22:45:55  

その後、ちゃんと十の位と一の位を分けて扱って、九十九丁目まで対応しました。

Chietherさん>日本国内で平然と「四十丁目」なんてものが現れる地域は北海道くらいですね。

#22 keiichiroh keiichiroh 2013-04-20 18:56:52  

うん!だって「二丁目」はkuma056さんの方式でいいけど、そもそもの問題である「ニ丁目」はその方式じゃ処理できないから。という理由で、結局はイレギュラーな例に関しては数珠つなぎするしか無いと思うんだ。それならば正規表現混ぜるよりもいっそ全部・・・というのは個人的な嗜好かな。正規表現で大枠押さえて数珠つなぎでフォローというのがベストなのかな。

#23 keiichiroh keiichiroh 2013-04-20 21:33:46  

よく考えると、「ニ丁目」という入力間違いの対処が入っていたけど、その代わりに(元々入っていた?)漢数字の「二丁目」の変換コードを削ってしまったっていうデグレードじゃないかと思ったわけなんだけど、元データにはそういう入力間違いはありえないという要件だったりする?こういう変換をするってことは、手入力データかなと思った。カタカナの「ニ丁目」とかは「にちょうめ」って打って変換すると起こったりする入力間違いだから。あり得ないなら正規表現だけでOKのはず。

#24 InternalServerE InternalServerE 2013-04-20 21:34:44  

> 結局はイレギュラーな例に関しては数珠つなぎするしか無いと思うんだ
はて、それはいったい何故だろう。
昔(バイトでプログラマーしてた頃だから、十数年前かな)、漢数字⇒int変換用の簡易なパーサー&変換器を書いたことがあるんだ。
その時は、実用性半分、遊び心半分で、「拾⇒10」、「四拾⇒40」、「一〇⇒10」、「二十一⇒21」、「二一⇒21」、「七拾五萬百二⇒750102」、「I⇒1」「O(オー)⇒0」等々、考えうる様々な表記の揺らぎや誤記に対応しまくったんだけど、大した苦労もなく、割と簡単に書けた記憶がある。後から誤記の対応表を増やすのも至極簡単だった。

そこまでやる必要はないと思うけど、ある程度「まとも」な漢数字解析を計算コスト考慮で作るなら、正規表現や、増してや数珠つなぎなんかでは相当難しいと思うけど。

コメント投稿には、twitter認証が必要です。

Twitter認証

このウンコードに臭った人は、こちらのウンコードにも臭ってます

[C] すげーちゃんと動く!

このエントリーをはてなブックマークに追加

結合試験2日前に脱退したうんkプログラマ...

return 0;

鑑賞する »

[Ruby] えっ?こんなんあるの?

このエントリーをはてなブックマークに追加

レビューでやられました。陽の光を浴びない...

  def next_exp(level, exp)
    level_a ...

鑑賞する »

[C] switch-caseは現場の臭いがする

このエントリーをはてなブックマークに追加

"とりあえず"で書いた 2010 年 4...

// switch-case にしたいが、関数で値を取得しないといけないため、
...

鑑賞する »