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
<< 回到主頁