Calculate a Check Digit of JAN in Ruby One Liner
タイトルめっちゃかっこつけたけども.最近このブログでプログラミングの話してなかったんで久しぶりに. そういえばバーコードの最後って誤り確認用の符号なんだよな,それぐらいのプログラムだったら自分でも書けそうだな,と思ってから一体何ヶ月が経ったのか.ようやく手を動かしました. まずは普通に書いたものから. jancode = gets.chomp sum = 0 jancode.reverse.each_char.with_index do |e, i| i.even? ? sum += e.to_i * 3 : sum += e.to_i end print "Check Digit is: ", (10 - sum.to_s[-1].to_i).to_s[-1], "\n" JANコードについて調べてみるとどうやらいろんな桁数のものがあるとのことだったので,普通にひっくり返して偶数桁と奇数桁で場合分けすることに.しかも 10 から引く数が 0 だったときにチェックディジットも 10 になってしまうので,余計なことは考えずに「計算結果の下 1 桁」にしておきました. で.ここまでなら誰でも書けるんですよ.たぶん.これをどうやって一行にまとめるかが勘違いプログラマーの腕の見せどころなわけで.見せる腕無いけど. puts (10 - gets.chomp.reverse.split("").map(&:to_i).each_with_object([]).with_index{|(e, arr), i| i.even? ? arr << e * 3 : arr << e}.inject(:+).to_s[-1].to_i).to_s[-1] で,出来たのがこれと. 標準入力から読み込み→改行文字取り除き→ 1 文字ごとに分割し→各要素を文字列から数字にし→それぞれの要素について→添字もつけて→偶数桁なら 3 倍して,奇数桁ならそのまま新しい配列にプッシュしていく→その配列の総和を取る→その数の 1 桁目を 10 から引いた数の下 1 桁がチェックディジット という流れでした. each_with_object の部分はいろいろ迷走しました.each