2006/07/06

ACM#100 in Ruby

未加解釋用的註解以前共 17 行。

#!/usr/local/bin/ruby -w
  # 如此就能在 shell 下直接執行這個 script

while s = gets  # 讀取一行字串
  i, j = s.split(/\s+/).collect {|t| t.to_i}
    # s.split(/\s+/):以 whitespace 為分隔符號,
    #                 將 s 裂解為多個字串,置於一個 Array 之內
    # collect:將 Array 內每個元素傳給呼叫時隨附的 block,
    #          將 block 所回返的東西收集置於一個新的 Array 之內
    #          類似 STL transform algorithm
    # to_i:轉換為整數(Fixnum or Bignum)
    # parallel assignment:把右側的 Array 元素「同時」指派給
    #                      左側的 i 和 j
    # 這個算式看起來很炫,但只是反映一個事實:
    # 我找不到「讀取一個整數」的函式 XD
  print "#{i} #{j} "
    # #{expr} 會直接被代換為「expr 核算後的值」所轉成的字串
  i, j = j, i if i > j
    # 直接以 parallel assignment 置換(swap)i 和 j
    # 使用 if(後)飾詞(modifier)
  max = 0
  (i..j).each do |k|
      # each:即 Ruby 的 iterator,把區間(Range)內每個元素
      #       依序傳入呼叫時隨附的 block 之內
      # do ... end:另一種 block 形式,慣用於多行程式碼
      #             {...} 慣用於單行程式碼
      #             |k| 即這個 block 接收的參數
    count = 1
    until k == 1  # 即 while k != 1
      k = k % 2 == 0 ? k / 2 : 3 * k + 1
      count += 1
    end
    max = count if max < count
  end
  puts max  # 印出並換行
end