作者godfat (godfat 真常)
看板Programming
标题Re: [请益] 没有想像中简单的小问题
时间Sun Mar 15 00:34:37 2009
昨天在 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)
1F:→ Schelfaniel:python果然看起来就没ruby直觉 122.126.50.231 03/15 10:47
2F:推 HudsonE:连 Haskell 都出来了... = = 203.73.243.167 03/16 00:36
3F:→ HudsonE:能得到这麽热烈的回响应该很意料之外吧 XD 203.73.243.167 03/16 00:39