最短的代码,按字符计数输出由以下ASCII三角形构成的Sierpinski三次N次迭代的ASCII表示:
/\
/__\
输入是一个正数。
Input:
2
Output:
/\
/__\
/\ /\
/__\/__\
Input:
3
Output:
/\
/__\
/\ /\
/__\/__\
/\ /\
/__\ /__\
/\ /\ /\ /\
/__\/__\/__\/__\
Input:
5
Output:
/\
/__\
/\ /\
/__\/__\
/\ /\
/__\ /__\
/\ /\ /\ /\
/__\/__\/__\/__\
/\ /\
/__\ /__\
/\ /\ /\ /\
/__\/__\ /__\/__\
/\ /\ /\ /\
/__\ /__\ /__\ /__\
/\ /\ /\ /\ /\ /\ /\ /\
/__\/__\/__\/__\/__\/__\/__\/__\
/\ /\
/__\ /__\
/\ /\ /\ /\
/__\/__\ /__\/__\
/\ /\ /\ /\
/__\ /__\ /__\ /__\
/\ /\ /\ /\ /\ /\ /\ /\
/__\/__\/__\/__\ /__\/__\/__\/__\
/\ /\ /\ /\
/__\ /__\ /__\ /__\
/\ /\ /\ /\ /\ /\ /\ /\
/__\/__\ /__\/__\ /__\/__\ /__\/__\
/\ /\ /\ /\ /\ /\ /\ /\
/__\ /__\ /__\ /__\ /__\ /__\ /__\ /__\
/\ /\ /\ /\ /\ /\ /\ /\ /\ /\ /\ /\ /\ /\ /\ /\
/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\
代码计数包括输入/输出(即完整程序)。
答案 0 :(得分:27)
46个字符,从stdin读取。
(,.~,~[,.~' '$~#,#)^:(<:".1!:1]3)' /\',:'/__\'
\n
总是划分句子,这使得它无法适应S 3 (只有54个字符可以玩)。 S 4 在162处有点大,所以我填充它以适应。偶然,/\
是一个合法的副词。 ☺
/\ i=:3 /\ /\ %r=:1!:1 /\ /\ t=:] [r+i /\ /\ /\ /\ b=:' /\',:'/__\' /\ /\ i=:1 -".t /\ /\ /\ /\ h=:(' '$ ~#,#),.] /\ /\ /\ /\ s=:( h^:1 ,d=: ,.~) /\ /\ /\ /\ /\ /\ /\ /\ (,,&(10{a.)"1[s^:(-i)b)(1!:2)(4)
答案 1 :(得分:24)
&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
答案 2 :(得分:20)
' /\ /__\ '4/{).+: ;.{ \ ++}%\{.+}%+~ ]}@~(*n*
Golfscript - 47
' /\ /__\ '4/): ;{ +: ;.{ \ ++}%\{.+}%+}@~(*n*
Golfscript - 48
' ': '/\ /__\\'+4/{2 *: ;.{ \ ++}%\{.+}%+}@~(*n*
Golfscript - 51
~' ': '/\ /__\\'+4/\(,{;2 *: ;.{ \ ++}%\{.+}%+}%;n*
与我的较短python(和ruby)回答相同的算法
Golfscript - 78
2\~(?,{-1*}$1: ;{" ":$*. 2base.{[$$+' /\ ']=}%n+@@{[$$+"/__\\"]=}%n .2*^: ;}%
与我更长的python解决方案相同的算法
这个有重要的换行符
2\~(?,{-1*}$1: ;{" ":
*. 2base.{[
2*' /\ ']=}%n+@@{[
2*"/__\\"]=}%n .2*^: ;}%
答案 3 :(得分:16)
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'
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 golf here有了很好的暗示。
答案 4 :(得分:10)
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)
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
答案 5 :(得分:9)
此版本不再打印尾随换行符。只需要第一个换行符:
$_=' /\
/__\\';
for$x(2..<>){
my$y;
$".=$";
s#.+#$y.=$/.$&x2,$".$&.$"#ge;
$_.=$y
}
print
如果允许命令行开关,那么通过传统的Perl高尔夫球得分,这是77 + 3杆(第一个换行是字面的):
#!perl -p
$\=' /\
/__\\';
$y="",
$".=$",
$\=~s#.+#$y.=$/.$&x2,$".$&.$"#ge,
$\.=$y
for 2..$_
如果您找到了改进,请随时编辑我的答案。
答案 6 :(得分:8)
使用尾递归:
(%)=zipWith(++)
p=" ":p
g t _ 1=t
g t s(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=f n;s=replicate(2^n)' ':s
main=interact$unlines.f.read
使用(刚刚弃用!)n+k pattern保存了4个字符。
我喜欢它是如何在压缩形式的中途可读的。
编辑:旧主页
main=do{n<-getLine;putStr$unlines$f$read n}
答案 7 :(得分:7)
94个字符。
$c=2**<>;$\=$/;for$a(0..--$c){print$"x($c-$a&~1),
map$_*2&~$a?$"x4:$a&1?'/__\\':' /\ ',0..$a/2}
答案 8 :(得分:7)
a=' /\ ','/__\\'
j=' '
2.upto(gets.to_i){j+=j;a=a.map{|x|j+x+j}+a.map{|x|x+x}}
puts a
<小时/> 101 字符 -
/\
- 已修改solution from Rosetta Code
(a=2**gets.to_i).times{|y|puts" "*(a-y-1)+(0..y).map{|x|~y&x>0?' ':y%2>0?x%2>0?'_\\':'/_':'/\\'}*''}
答案 9 :(得分:4)
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
答案 10 :(得分:4)
to F:n if:n[repeat 3[F(:n-1)fd 2^:n rt 120]]end
我只用http://www.calormen.com/Logo/对此进行了测试,所以我不知道它是否可移植。它不符合要求,但肯定徽标必须是适当的语言吗? :)我喜欢在写作时,logo是一个与golfscript和J相等的角色。
答案 11 :(得分:4)
这假设您已在工作区中定义变量N
:
A=[' /\ ';'/__\'];for i=1:N-1,B=32*ones(2^i);A=[B A B;A A];end;A
将N
作为参数传递给函数s
:
function A=s(N),A=[' /\ ';'/__\'];for i=1:N-1,B=32*ones(2^i);A=[B A B;A A];end
答案 12 :(得分:4)
与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上编译和运行。
如果您将char
替换为int
,它会保存一个字符并仍然有效,但它的合法性有问题。
答案 13 :(得分:2)
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"))
答案 14 :(得分:2)
$ 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
. b l m o
. b l n p
. b m l assign
. push n l
. nr a +1
.\}
.de t
\\*[\\$1]
..
.b l zz t
答案 15 :(得分:1)
从上面的其他人那里窃取算法。
(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 z z)))))(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 z z))))) (read))]
(println q))
答案 16 :(得分:1)
Python,120个字符(递归解决方案)
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离开的绿色......
答案 17 :(得分:1)
let rec p n=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
答案 18 :(得分:1)
~(' /\ /__\ '4/)@{.+\.{[2$.]*}%\{.+}%+\}*;n*
与gnibbler的解决方案类似。我最初的尝试已经非常相似,然后我看着他并借用了一些想法。
答案 19 :(得分:0)
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[i-x];p[i]=q+q
答案 20 :(得分:0)
:- 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(_).