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


<< 回到主頁