はじめに
気分転換にQiitaの記事を漁っていたら、こちらの記事に目が止まりました。
関連する記事を調べてみると、同様の試みが最近立て続けに投稿されているようです。
どうやら、ISBMという規格でISBM13からISBM10に変換するタスクで、__これを1行で実装するcode golf的タスク1__が俄に流行っている(?)ようです。しかも言語はcode golfによく使われるRubyではありませんか!
code golf好きとして、これは見逃せないということで自分も挑戦してみました。
code golfされたコード
と言っても、調べてみたら既にほとんど同じ試みが、かなり最適化された形でなされていました (64 byte)。
->n{v=n[3,9];c=11;v+"#{(c-v.chars.map{|i|i.to_i*c-=1}.sum)%11}"}
剰余が10ならば"x"に変化させるという条件を加えて、いくつか手直しすると以下のような形になります__(68 byte)__。
->n{a=n[3,9];a+"#{b=11;(c=-a.chars.sum{|d|d.to_i*b-=1}%11)>9?:x:c}"}
まとめ
最終的に__68 byte__まで削減できました。これならば、冒頭にラムダ式の変数への代入を含めても、「1行は80字以内に抑えるべきという古代からのしきたり2」をちゃんと守ることができます。めでたし、めでたし。
※余談
code golf用に作られた言語は別にして、相変わらずPerlは変態ですね…
s/^...|.$//g;$\=(eval s/./"-$&0+".$i++*$&/ger)%11
-
code golfは、特定のアルゴリズムをできるだけ短いコードで実装することを競う遊び (wikipedia) ↩
-
IBMの計算機で、80カラムのパンチカードが利用されていたことから来ているそうです ↩