サポーター

しあ
@xia4913

Annictサポーターになると広告を非表示にできます。
良い

SQちゃんと覚えるRuby String#succ
A, B, Cから始まってZまで行ったら、

p "A".succ         # => "B"
p "B".succ         # => "C"
p "Y".succ         # => "Z"

次はAA, AB, ACって数えていくと、

p "Z".succ         # => "AA"
p "AA".succ        # => "AB"
p "AB".succ        # => "AC"

SQって何番目になると思う?

p "A".upto("SQ").count  # => 511

String#uptoはString#succを使ってEnumeratorオブジェクトを返し、Enumerable#countが要素数を数えて返すので、組み込みライブラリのみで簡潔に数えられる。
愚直に数えるので実行効率はよくないけれど、SQちゃんに問われた際に間違う余地なく安心して即答できる。
範囲式を使えばより短く書けるけど、閉区間と半開区間を間違えないよう注意。

p ("A".."SQ").count   # => 511
p ("A"..."SQ").count  # => 510

乗算使いつつRubyぽく書くならこう?

ALPHA = 26
NUM = 10
p "SQ".chars.map { (it.to_i(ALPHA + NUM) - NUM + 1).tap { raise unless it.positive? } }.reverse.map.with_index {|i, idx| i * ALPHA ** idx }.sum


Loading...