代码高尔夫:谢尔宾斯基三角形

37

挑战

输出N次迭代的Sierpinski三角形的ASCII表示形式的最短代码,该三角形由以下ASCII三角形制成:

 /\
/__\

输入为一个正整数。

测试用例

Input:
    2
Output:
       /\
      /__\
     /\  /\
    /__\/__\

Input:
    3
Output:
           /\
          /__\
         /\  /\
        /__\/__\
       /\      /\
      /__\    /__\
     /\  /\  /\  /\
    /__\/__\/__\/__\

Input:
    5
Output:
                                   /\
                                  /__\
                                 /\  /\
                                /__\/__\
                               /\      /\
                              /__\    /__\
                             /\  /\  /\  /\
                            /__\/__\/__\/__\
                           /\              /\
                          /__\            /__\
                         /\  /\          /\  /\
                        /__\/__\        /__\/__\
                       /\      /\      /\      /\
                      /__\    /__\    /__\    /__\
                     /\  /\  /\  /\  /\  /\  /\  /\
                    /__\/__\/__\/__\/__\/__\/__\/__\
                   /\                              /\
                  /__\                            /__\
                 /\  /\                          /\  /\
                /__\/__\                        /__\/__\
               /\      /\                      /\      /\
              /__\    /__\                    /__\    /__\
             /\  /\  /\  /\                  /\  /\  /\  /\
            /__\/__\/__\/__\                /__\/__\/__\/__\
           /\              /\              /\              /\
          /__\            /__\            /__\            /__\
         /\  /\          /\  /\          /\  /\          /\  /\
        /__\/__\        /__\/__\        /__\/__\        /__\/__\
       /\      /\      /\      /\      /\      /\      /\      /\
      /__\    /__\    /__\    /__\    /__\    /__\    /__\    /__\
     /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\
    /__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\

代码行数包括输入/输出(即完整程序)。


9
我开始没有更多的想法了……你一直在大力挖掘“控制台输出数据”这一点。也许现在是放弃这个点子的时候了。《Lasers》不同寻常的地方之一就是输入并不平凡。或者干脆整个放松一下,但我已经习惯了周四的打球时间。即使我没有提交很多解决方案,我仍会对你的大部分问题进行摸索。 - dmckee --- ex-moderator kitten
11
LiraNuna,你做得非常棒。你的挑战获得最多的投票是有原因的。即使你再也不发表任何内容,你仍将成为Stack Overflow的传奇人物。感谢你带来的乐趣! - DigitalRoss
2
@dmckee:那我会尝试更多地思考激光的方式。虽然设计激光很困难,但我有一些想法,只是还没有完善。我可以始终开始“反向”系列!(反向蜂巢!) - LiraNuna
ephemient: *"文本格式化"*?方块或沙漏式呢?它们是使用输入变量从ASCII创建的。那些不好吗?我个人喜欢方块和蜂巢 - 它们足够简单,适合新手创建长答案并参与,但是具有适当代码可以缩短答案的潜力。 - LiraNuna
@LiraLuna:这些都很有趣,我感到很遗憾自己来晚了,没能做出什么好的贡献。尽管我“不喜欢”,但还是回答了(可能因为只用几分钟就写出了J语言的解决方案,而不是通常需要几个小时)。 - ephemient
显示剩余9条评论
21个回答

0

Prolog,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(_).

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接