代码高尔夫:谢尔宾斯基的三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上编译和运行良好。

如果你用intreplacechar ,它会保存一个字符,仍然有效,但是它的合法性是有问题的。

标志(不完全符合要求):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(_).