代码高尔夫:谢尔宾斯基的三angular形
挑战
最短的代码,通过字符计数来输出由以下ASCII三angular形构成的Sierpinski的N次迭代的ASCII表示:
/\ /__\
input是一个单一的正数。
testing用例
Input: 2 Output: /\ /__\ /\ /\ /__\/__\
Input: 3 Output: /\ /__\ /\ /\ /__\/__\ /\ /\ /__\ /__\ /\ /\ /\ /\ /__\/__\/__\/__\
Input: 5 Output: /\ /__\ /\ /\ /__\/__\ /\ /\ /__\ /__\ /\ /\ /\ /\ /__\/__\/__\/__\ /\ /\ /__\ /__\ /\ /\ /\ /\ /__\/__\ /__\/__\ /\ /\ /\ /\ /__\ /__\ /__\ /__\ /\ /\ /\ /\ /\ /\ /\ /\ /__\/__\/__\/__\/__\/__\/__\/__\ /\ /\ /__\ /__\ /\ /\ /\ /\ /__\/__\ /__\/__\ /\ /\ /\ /\ /__\ /__\ /__\ /__\ /\ /\ /\ /\ /\ /\ /\ /\ /__\/__\/__\/__\ /__\/__\/__\/__\ /\ /\ /\ /\ /__\ /__\ /__\ /__\ /\ /\ /\ /\ /\ /\ /\ /\ /__\/__\ /__\/__\ /__\/__\ /__\/__\ /\ /\ /\ /\ /\ /\ /\ /\ /__\ /__\ /__\ /__\ /__\ /__\ /__\ /__\ /\ /\ /\ /\ /\ /\ /\ /\ /\ /\ /\ /\ /\ /\ /\ /\ /__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\
代码计数包括input/输出(即完整程序)。
Golfscript – 46
' /\ /__\ '4/{).+: ;.{ \ ++}%\{.+}%+~ ]}@~(*n*
Golfscript – 47
' /\ /__\ '4/): ;{ +: ;.{ \ ++}%\{.+}%+}@~(*n*
Golfscript – 48
' ': '/\ /__\\'+4/{2 *: ;.{ \ ++}%\{.+}%+}@~(*n*
Golfscript – 51
~' ': '/\ /__\\'+4/\(,{;2 *: ;.{ \ ++}%\{.+}%+}%;n*
与我的较短的Python(和ruby)答案相同的algorithm
Golfscript – 78
2\~(?,{-1*}$1: ;{" ":$*. 2base.{[$$+' /\ ']=}%n+@@{[$$+"/__\\"]=}%n .2*^: ;}%
与我的更长的Python解决scheme相同的algorithm
这个有重要的换行符
2\~(?,{-1*}$1: ;{" ": *. 2base.{[ 2*' /\ ']=}%n+@@{[ 2*"/__\\"]=}%n .2*^: ;}%
Ĵ
46个字符,从标准input读取。
(,。〜,〜[,。〜''$〜#,#)^:(<:“。1!:1] 3)'/ \',:'/ __ \'
\n
总是划定句子,这使得它不适合S 3 (只有54个angular色)。 S 4在162有点大,所以我填充它适合。 偶然地, /\
是一个合法的副词。 ☺
/ \ I =:3 / \ / \ %R = 1:1 / \ / \ t =:] [r + i / \ / \ / \ / \ b =:'/ \',:'/ __ \' / \ / \ 我=:1 - “ / \ / \ / \ / \ h = :(''$〜#,#),.] / \ / \ / \ / \ s = :( h ^:1,d =:,。〜) / \ / \ / \ / \ / \ / \ / \ / \ (,,&(10 {A)“1 [S ^:( - I)B)(1:2)(4)
不好意思我迟到了。 这是基于A.雷克斯的Perl解决scheme:
&I ;for $x (2 ..<>){$E .= $E ;my$ y;3* 33 +3 ** 3; s".+"$y.=$n.$&x2 ,$ E. $&.$ E"ge ;; $_ .= $y }print;; sub I{($ E, $n ,$ F, $B,$ U)=( $",$ /,qw (/ \ _ )) ;$ _= $E .$ F.$B.$E.$n.$F.$U.$U.$B};33333333
去 ,273个字符
package main import(f"fmt";"os";s"strconv";)func main(){var t=[2]string{" /\\ ","/__\\"}; n,_:=s.Atoi(os.Args[1]);a:=1;N:=a<<uint(n);for N>0{N-=2;for k:=0;k<2;k++{for j:=0;j<N;j++{f.Print(" ")}b:=a;for b>0{o:=t[k];if b&1==0{o=" "}f.Print(o);b>>=1}f.Print("\n")}a^=a*2}}
空白是重要的。
用gofmt sierpinski-3.go | perl -p -e's/\t/ /g'
gofmt sierpinski-3.go | perl -p -e's/\t/ /g'
:
package main import ( "fmt"; "os"; "strconv"; ) func main() { var t = [2]string{" /\\ ", "/__\\"}; n, _ := strconv.Atoi(os.Args[1]); a := 1; N := a << uint(n); for N > 0 { N -= 2; for k := 0; k < 2; k++ { for j := 0; j < N; j++ { fmt.Print(" ") } b := a; for b > 0 { o := t[k]; if b&1 == 0 { o = " " } fmt.Print(o); b >>= 1; } fmt.Print("\n"); } a ^= a * 2; } }
我在这里得到了Go高尔夫的一个好消息。
Python – 102
a=" /\ ","/__\\" j=' ' for n in~-input()*j:j+=j;a=[j+x+j for x in a]+[x*2for x in a] print"\n".join(a)
Python – 105
a=" /\ ","/__\\" j=' ' for n in(input()-1)*j:j+=j;a=[j+x+j for x in a]+[x+x for x in a] print"\n".join(a)
Python – 109
a=" /\ ","/__\\" for n in range(1,input()):j=' '*2**n;a=[j+x+j for x in a]+[x+x for x in a] print"\n".join(a)
Python2.6 – 120
N=1<<input() a=1 while N: N-=2 for s in" /\ ","/__\\":print' '*N+bin(a)[2:].replace('0',' '*4).replace('1',s) a=a^a*2
Perl,第82招
这个版本不再打印结尾的换行符。 只有第一个换行是必要的:
$_=' /\ /__\\'; for$x(2..<>){ my$y; $".=$"; s#.+#$y.=$/.$&x2,$".$&.$"#ge; $_.=$y } print
如果命令行开关被允许,那么通过传统的Perl高尔夫得分,这是77 + 3笔(第一个换行是字面的):
#!perl -p $\=' /\ /__\\'; $y="", $".=$", $\=~s#.+#$y.=$/.$&x2,$".$&.$"#ge, $\.=$y for 2..$_
请随时编辑我的答案,如果你发现一个改进。
Haskell, 153 149 137 125 118 112个字符:
使用尾recursion:
(%)=zipWith(++) p=" ":p gt _ 1=t gts(n+1)=g(s%t%s++t%t)(s%s)n main=interact$unlines.g[" /\\ ","/__\\"]p.read
较早的版本,@ 118个字符:
(%)=zipWith(++) f 1=[" /\\ ","/__\\"] f(n+1)=s%t%s++t%t where t=fn;s=replicate(2^n)' ':s main=interact$unlines.f.read
使用(公正的!) n + k模式保存了4个字符。
我喜欢它即使是压缩forms也可以半读出来。
编辑:老主要
main=do{n<-getLine;putStr$unlines$f$read n}
Perl的
当换行符被删除时,有94个字符。
$c=2**<>;$\=$/;for$a(0..--$c){print$"x($c-$a&~1), map$_*2&~$a?$"x4:$a&1?'/__\\':' /\ ',0..$a/2}
ruby – 85
a=' /\ ','/__\\' j=' ' 2.upto(gets.to_i){j+=j;a=a.map{|x|j+x+j}+a.map{|x|x+x}} puts a
来自Rosetta Code的 101个字符/\
– 修改的解决scheme
(a=2**gets.to_i).times{|y|puts" "*(ay-1)+(0..y).map{|x|~y&x>0?' ':y%2>0?x%2>0?'_\\':'/_':'/\\'}*''}
Python,135个字符
S=lambda n:[" /\\ ","/__\\"]if n==1 else[" "*(1<<n-1)+x+" "*(1<<n-1)for x in S(n-1)]+[x+x for x in S(n-1)] for s in S(input()):print s
MATLAB – 64个字符(脚本版本)
这假设你已经在你的工作空间中定义了variablesN
:
A=[' /\ ';'/__\'];for i=1:N-1,B=32*ones(2^i);A=[BAB;AA];end;A
MATLAB – 78个字符(m文件function版本)
将N
作为parameter passing给函数s
:
function A=s(N),A=[' /\ ';'/__\'];for i=1:N-1,B=32*ones(2^i);A=[BAB;AA];end
C
与Perl的答案相同,但体重更重,有131个必要的字符。
a,b;main(c,v)char**v;{c=1<<atoi(v[1]);for(a=0;a<c;a++,puts("")) for(b=c;b--;write(1,b&~a?" ":a&1?"/__\\":" /\\ ",4-2*(b>a)))--b;}
我认为write(1,…)
是UNIX API,但是这似乎在Windows上编译和运行良好。
如果你用int
replacechar
,它会保存一个字符,仍然有效,但是它的合法性是有问题的。
标志(不完全符合要求):47个字符
to F:n if:n[repeat 3[F(:n-1)fd 2^:n rt 120]]end
我只用http://www.calormen.com/Logo/testing了这个,所以我不知道它是否可移植。; 它不符合要求,但肯定标志必须在这里适当的语言? :)我喜欢在写作的时候标志是一个字符等于golfscript和J.
卢阿,139个字符
t={" /\\ ","/__\\"}for i=2,(...)do for j=1,#t do t[#t+1]=t[j]:rep(2)k=(" "):rep(#t[j]/2)t[j]=k..t[j]..k end end print(table.concat(t,"\n"))
Nroff,542
$ nroff -rn=5 file.n
.pl 1 .nf .de b . nr i 0 . while d\\$1\\ni \{\ . \\$3 \\$1\\ni \\$2\\ni . nr i +1 . \} .. .de push . nr i 0 . while d\\$2\\ni \{\ . nr i +1 . \} . nr j 0 . while d\\$1\\nj \{\ . ds \\$2\\ni \&\\*[\\$1\\nj] . nr i +1 . nr j +1 . \} .. .ds l0 \& /\[rs] \& .ds l1 "/__\[rs] .ds s \&\ .de o . ds \\$2 \&\\*s\\*[\\$1]\\*s .. .de p . ds \\$2 \&\\*[\\$1]\\*[\\$1] .. .de assign . ds \\$2 \&\\*[\\$1] .. .nr a 2 .while \na<=\nn \{\ . ds s \&\*s\*s . blmo . blnp . bml assign . push nl . nr a +1 .\} .de t \\*[\\$1] .. .bl zz t
F#,225个字符
let rec pn=if n=1 then" "else p(n-1)+p(n-1) and S n=if n=1 then[" /\\ ";"/__\\"]else let s=S(n-1)in List.append(List.map(fun s->p(n)+s+p(n))s)(List.map(fun x->x+x)s) for s in S(int(System.Console.ReadLine()))do printfn"%s"s
Clojure:174个字符
algorithm从上面的其他人盗取。
(剂量q [q((fn f [n])(如果(= n 1)['/ \\“”/ __ \\“](let [z(f(dec n))](concat(map# [y(repeat(Math / pow 2(dec n))\)](apply str(concat y%y)))z)(map str zz))))(read))](println q))
这些字符中有38个是括号。 🙁
(doseq [q ((fn f [n] (if (= n 1) [" /\\ " "/__\\"] (let [z (f (dec n))] (concat (map #(let [y (repeat (Math/pow 2 (dec n))\ )] (apply str (concat y % y))) z) (map str zz))))) (read))] (println q))
Python,120个字符(recursion解决scheme)
S=lambda n:n<2and[" /\ ","/__\\"]or[" "*n+x+" "*n for x in S(n/2)]+[x+x for x in S(n/2)] print"\n".join(S(1<<input()-1))
我开始在绿色的地方@fserb离开…
GolfScript( 45 44个字符)
~(' /\ /__\ '4/)@{.+\.{[2$.]*}%\{.+}%+\}*;n*
类似于gnibbler的解决scheme。 我最初的尝试已经非常相似,然后我看着他,并借用了一些想法。
Python,186个字符(UNIX行终止)
for j in range(1,n): for s in p: print s x=2**j;y=2*x;p.extend(['']*x) for i in range(y-1,-1,-1): if i<x: s=' '*x;p[i]=s+p[i]+s else: q=p[ix];p[i]=q+q
序言,811字符
:- module(sierpinsky, [draw/1]). % draw(+Level) draw(N) :- K is 2^(N+1)-1, for(Line, 0, K), draw2(N, Line, true, nl), fail. draw(_). % draw2(+Level, +Line, +Before, +After) draw2(0, 0, Before, After) :- !, Before, write(' /\\ '), After. draw2(0, 1, Before, After) :- !, Before, write('/__\\'), After. draw2(N, Line, Before, After) :- N>0, K is 2^N, Line < K, !, M is N-1, draw2(M, Line, (Before, tab(K)), (tab(K), After)). draw2(N, Line, Before, After) :- N>0, K is 2^N, Line >= K, !, M is N-1, Line2 is Line - K, draw2(M, Line2, Before, draw2(M, Line2, true, After)). % for(+Variable, +Integer, +Integer) for(V, N, M) :- N =< M, V = N. for(V, N, M) :- N < M, K is N+1, for(V, K, M). % tab(+Integer) tab(N) :- for(_, 1, N), write(' '), fail. tab(_).