Re: [請益] 沒有想像中簡單的小問題

看板Programming作者 (godfat 真常)時間16年前 (2009/03/15 00:34), 編輯推噓1(102)
留言3則, 2人參與, 最新討論串10/34 (看更多)
昨天在 Java 板上提到 Scala, 不禁就想試試看: class Star(max: Int){ val mid = max / 2 + 1 def row(n: Int): List[Int] = for (i <- List.range(mid, max + mid - 2 * (mid - n - 1).abs)) yield i val result = for (i <- List.range(0, max)) yield List.range(0, (mid - i - 1).abs).map{s=>' '} ++ row(i) override def toString: String = result.foldRight(""){ (l, s) => "\n" + l.foldRight(s){ (i, s) => i.toString + s } }.drop(1).toString } println(new Star(5)) 不過 functional 還是 Haskell 漂亮多了... module Main where star :: Integer -> String star max = drop 1 $ to_s rectangle where rectangle :: [[String]] rectangle = [spaces i ++ row i | i <- [0..max-1]] spaces i = map (\x->" ") [0..abs (mid-i-1)-1] mid = max `div` 2 + 1 row :: Integer -> [String] row n = [ show i | i <- [mid..( max+mid-2 * abs (mid-n-1) ) - 1] ] to_s = foldr (\l s -> ("\n" ++ foldr (\i s -> i ++ s) s l)) "" main = putStrLn $ star 5 而 Ruby 寫起來還是最順手 class Star attr_reader :max, :mid, :result def initialize max @max = max @mid = max / 2 + 1 @result = (0...max).map{ |i| ([' '] * (mid-i-1).abs) + row(i) } end def row n (mid...max + mid - 2 * (mid - n - 1).abs).to_a end def to_s result.reverse.inject(''){ |s, l| "\n" + l.reverse.inject(s){ |s, i| i.to_s + s } }[1..-1] end end puts Star.new((ARGV.first || 5).to_i) 那麼也想試試 Python, 算是第一次試寫吧,寫得有點爛 :s 和 Ruby 一樣沒有 foldr, 只好 reverse 一次, 不過為什麼 reverse 沒有 in-place 版..? import copy from functools import reduce class Star: def __init__(self, max): self.max = max self.mid = max // 2 + 1 self.result = [[' '] * abs(self.mid-i-1) + list(self.row(i)) for i in range(max)] def row(self, n): return range(self.mid, self.max + self.mid - 2 * abs(self.mid - n - 1)) def __str__(self): result = copy.copy(self.result) result.reverse() for l in result: l.reverse() result = reduce(lambda s,l: "\n" + reduce(lambda s,i: i.__str__() + s, l, s), result, '') return result[1:len(result)] print(Star(5)) 補連結 http://gist.github.com/79112 -- 生死去来、棚頭傀儡、一線断時、落落磊磊 《花鏡》-世阿弥 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.135.28.18 ※ 編輯: godfat 來自: 220.135.28.18 (03/15 00:35)

03/15 10:47, , 1F
python果然看起來就沒ruby直覺
03/15 10:47, 1F

03/16 00:36, , 2F
連 Haskell 都出來了... = =
03/16 00:36, 2F

03/16 00:39, , 3F
能得到這麼熱烈的迴響應該很意料之外吧 XD
03/16 00:39, 3F
文章代碼(AID): #19kzoWw2 (Programming)
討論串 (同標題文章)
文章代碼(AID): #19kzoWw2 (Programming)