LoginSignup
1

More than 3 years have passed since last update.

posted at

updated at

13桁のISBNコードを10桁に変換するコードをコードゴルフする

はじめに

気分転換にQiitaの記事を漁っていたら、こちらの記事に目が止まりました。

関連する記事を調べてみると、同様の試みが最近立て続けに投稿されているようです。

どうやら、ISBMという規格でISBM13からISBM10に変換するタスクで、これを1行で実装するcode golf的タスク1が俄に流行っている(?)ようです。しかも言語はcode golfによく使われるRubyではありませんか!

code golf好きとして、これは見逃せないということで自分も挑戦してみました。

code golfされたコード

と言っても、調べてみたら既にほとんど同じ試みが、かなり最適化された形でなされていました (64 byte)

convert.rb
->n{v=n[3,9];c=11;v+"#{(c-v.chars.map{|i|i.to_i*c-=1}.sum)%11}"}

剰余が10ならば"x"に変化させるという条件を加えて、いくつか手直しすると以下のような形になります(68 byte)

convert_rev.rb
->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は変態ですね…

convert.pl
s/^...|.$//g;$\=(eval s/./"-$&0+".$i++*$&/ger)%11

  1. code golfは、特定のアルゴリズムをできるだけ短いコードで実装することを競う遊び (wikipedia) 

  2. IBMの計算機で、80カラムのパンチカードが利用されていたことから来ているそうです 

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
1