Re: [請益] 沒有想像中簡單的小問題
昨天在 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
03/15 10:47, 1F
推
03/16 00:36, , 2F
03/16 00:36, 2F
→
03/16 00:39, , 3F
03/16 00:39, 3F
討論串 (同標題文章)
Programming 近期熱門文章
PTT數位生活區 即時熱門文章
7
20