LoginSignup
2
1

More than 3 years have passed since last update.

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

Last updated at Posted at 2019-06-21

はじめに

気分転換に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カラムのパンチカードが利用されていたことから来ているそうです 

2
1
0

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
  3. You can use dark theme
What you can do with signing up
2
1