楼梯挑战


20

您的工作是重现这件艺术品:

                        _____
                       |
                       |
                       |
                       |
                  _____| 
                 |
                 |
                 |
                 |
            _____|
           |
           |
           |
           |
      _____|
     |
     |
     |
     |
_____|

答案必须重新创建并打印出来。允许使用所有语言,无需直接印刷艺术品,也不需要某种程度的操纵。字节数最少的答案将获胜。

在世界标准时间周四上午6:30左右关闭。

我的朋友是使用Java进行此操作的,最初的内容是显示给我的,他拒绝向我显示源代码,现在我将以其他语言的出色表现使他眼花azz乱。:D

您不能使用任何其他字符 (这样更容易吗?)。


现任排行榜

  1. Pyth -28字节-ISAACG
  2. CJam -30字节-Runer112
  3. CJam -32位元组-MartinBüttner

最高投票: C -73个字节-Paul R


isaacg凭借与Pyth的楼梯挑战赛获得冠军。在PPCG上提防类似的更多挑战!


1
欢迎使用编程难题和代码高尔夫球堆栈交换!这里的所有挑战都需要一个客观的获胜标准,以无可争议地决定哪种解决方案应该获胜。这看起来像一个代码高尔夫球问题,即最短的代码获胜,但是如果您想使它有所不同,我将让您自己进行编辑。谢谢!
门把手

1
啊,对不起,我错过了。然后,我已经在您的问题中编辑了正确的标签。
门把手

13
我们是否必须在第6行上打印那1个奇怪的尾随空格?
Optimizer 2015年

4
更一般而言,是否允许尾随空间?我可以将其填充到第一行宽度的矩形吗?
马丁·恩德 Martin Ender)

8
我们可以换行吗?
TheNumberOne

Answers:


4

佩斯,29 28

V21++**6/-20N5d*5?d%N5\_<\|N

在这里尝试。

一个非常简单的解决方案,使用@xnor解决方案中的“追加五个空格或五个下划线”技巧,但循环是从0到20,而不是20到0。


1
伊萨克爵士,我通过了《楼梯挑战》,这是你的声音。
therewillcoffee

...现在您可以进入楼梯了
Anthony Pham

22

C,86 80 76 75 73字节

c;main(i){for(i=21;i--;c='|')printf("%*s%c\n",i/5*6+5,i%5?"":"_____",c);}

5
总会有那个发布C解决方案的家伙。为您投票。
therewillcoffee

1
通过将循环更改为for(i=25;i--;)
Felix Bytow,2015年

1
@FelixBytow应该是i=26。除此之外,' '可以将更改为32额外的字符。经过这些优化后,我的解决方案要长2个字符:(
Allbeert

2
您似乎还有一个额外的步骤。要求的输出中有21行,而不是26行。还有一些优化:main(i){for(i=21;i--;)printf("%*s%c\n",i/5*6+5,i%5?"":"_____",i<20?'|':0);}1.简化长度公式2.如@Allbeert所说,您可以将ascii代码用于ASCII码,' '但是为什么当ASCII 0 可用时却以ASCII 32停止。同样对我来说也不错,""而不是" "
Level River St

1
如何在'|'打印中节省两个字节?c;main(i){for(i=21;i--;c='|')printf("%*s%c\n",i/5*6+5,i%5?"":"_____",c);}
Runer112

11

Java中,198个 158 156 146字节

这可能会大大缩短。像往常一样,欢迎提出建议。

void a(){String a="",b="_____",c=b;for(int i=-1;i<20;b=i%5<1?b.replace(c,"     "):i%5>3?b+" "+c:b)a=b+(++i>19?"":"|")+"\n"+a;System.out.print(a);}

缩进(种类):

void a(){
    String a="",b="_____",c=b;
    for(int i=-1;i<20;b=i%5<1?b.replace(c,"     "):i%5>3?b+" "+c:b)
        a=b+(++i>19?"":"|")+"\n"+a;
    System.out.print(a);
}

感谢MartinBüttner,Rainbolt和Geobits。


1
老实说,自从您使用Java做到了,我印象深刻。
therewillcoffee 2015年

9

Brainfuck(1065字节)

它不漂亮,也不短...但是我稍后会进行优化!

++++[->++++++++<]>........................
[->+++<]>-.....>++++++++++.[->+++<]>++....
...................-[->++++<]>.>++++++++++
.[->+++<]>++.......................-[->+++
+<]>.>++++++++++.[->+++<]>++..............
.........-[->++++<]>.>++++++++++.[->+++<]>
++.......................-[->++++<]>.>++++
++++++.[->+++<]>++..................[->+++
<]>-.....[->++++<]>.>++++++++++.[->+++<]>+
+.................-[->++++<]>.>++++++++++.
[->+++<]>++.................-[->++++<]>.>+
+++++++++.[->+++<]>++.................-[->
++++<]>.>++++++++++.[->+++<]>++...........
......-[->++++<]>.>++++++++++.[->+++<]>++.
...........[->+++<]>-.....[->++++<]>.>++++
++++++.[->+++<]>++...........-[->++++<]>.>
++++++++++.[->+++<]>++...........-[->++++<
]>.>++++++++++.[->+++<]>++...........-[->+
+++<]>.>++++++++++.[->+++<]>++...........-
[->++++<]>.>++++++++++.[->+++<]>++......[-
>+++<]>-.....[->++++<]>.>++++++++++.[->+++
<]>++.....-[->++++<]>.>++++++++++.[->+++<]
>++.....-[->++++<]>.>++++++++++.[->+++<]>+
+.....-[->++++<]>.>++++++++++.[->+++<]>++.
....-[->++++<]>.>++++++++++.[--->++<]>+++.
....[->++++<]>.

brainfuck从来不是很漂亮:)仅仅为了使其工作而
投票


ideone.com/ICtrhv 超出了时间限制,我的意思是..
–torebecoffee 2015年


8

CJam,36 30字节

在线尝试。

L{{S5*\+}/S'|5*+]'_5*+}5*1>zN*

我最初的36字节解决方案以输出方向生成结果。尽管我尝试从算法中挤出更多字节,但我没有。然后,我看到了马丁出色的生成而不是行并转置结果的策略。我意识到这可能是一种更好的方法,因此我着手创建了基于换位的解决方案。

但是,我实施该策略的方法差异很大。我没有生成完整的列,而是使用一种迭代解决方案,该解决方案缩进所有已经生成的“步骤”,并在每次迭代时添加一个新步骤。因此,主循环的第一次迭代会生成以下代码:

 |||||
_
_
_
_
_

主循环的第二次迭代使现有步骤缩进,并在其后添加一个新步骤:

      |||||
     _
     _
     _
     _
     _
 |||||
_
_
_
_
_

主循环的全部五次迭代生成以下代码:

                     |||||
                    _
                    _
                    _
                    _
                    _
                |||||
               _
               _
               _
               _
               _
           |||||
          _
          _
          _
          _
          _
      |||||
     _
     _
     _
     _
     _
 |||||
_
_
_
_
_

此后,所有需要做的就是消除第一行,否则第一行会成为底部台阶的多余立管,然后进行转置。


7

Python 2,80 77 74字节

n=24;exec"print' '*n+'_'*5+'|'*(n<24)+('\\n'+~-n*' '+'|')*4*(n>0);n-=6;"*5

摆脱了双重限制exec,一切都融入其中print


6

夹,46

{:24S:5'_m[z{*4,:+5*6zS"|
":*6zS:5'_"|
"`}vR4`

说明

{               .- Put everything in a list -.
 :24S           .- 24 spaces                -.
 :5'_           .- 5 underscores            -.
 m[z            .- Map...                   -.
    {           .- A list                   -.
     *4         .- 4 of the following       -.
       ,        .- Append                   -.
        :+5*6zS .- 5 + 6 * the iteration of spaces  -.
        "|      .- A pipe and newline       -.
"
     :*6zS      .- 6 * the iteration of spaces      -.
     :5'_       .- 5 underscores            -.
     "|         .- A pipe and newline       -.
"
    `           .- End list (per iteration  -.
   }vR4         .- The mapping is onto {3,2,1,0}    -.

1
Clip甚至没有维基百科页面。我的意思是,什么……...
将会

4
@therewillbecoffee该网站上的许多语言都没有Wikipedia页面。那很有趣;)
Ypnypn

@Ypnypn您设计了吗?看起来真的很有趣!虽然我会对真正的藜感兴趣。;)(示例页面上的内容有点作弊。)
Martin Ender

6

CJam,36 32字节

{5*S*'_+a5*~_W<S+5'|*+}5/;]W%zN*

在这里测试。

我也尝试使用显式公式,但在CJam中使用的时间更长……也许对其他人有帮助:

21,29,ff{_2$5/)6*(=@@6/5*=_++" |_|"=}W%N*

说明

我发现,如果您a)移置网格和b)反转线,则可以更轻松地构建楼梯:

_
_
_
_
_
 |||||
     _
     _
     _
     _
     _
      |||||
          _
          _
          _
          _
          _
           |||||
               _
               _
               _
               _
               _
                |||||
                    _
                    _
                    _
                    _
                    _

所以首先我要构建它,然后反转,然后转置。

{                     }5/        "For i in [0 .. 4].";
 5*S*'_+                         "Get a string of 5*i spaces and append _.";
        a5*~                     "Get five such lines.";
            _W<S+                "Duplicate the last, remove the _, add a space.";
                 5'|*+           "Add 5 copies of |.";
                         ;       "The above creates a row too many, so discard the last one.";
                          ]W%zN* "Wrap everything in an array, reverse, transpose, riffle
                                  with newlines.";

好的,有人用了30个字节。
therewillcoffee

6

Python 2,59

n=21
exec"n-=1;print n/5*6*' '+' _'[n%5<1]*5+'|'*(n<20);"*n

这21行以nin 为索引[20,19,...,1,0]。首先为我们向上的每个“步骤”打印6个空格(减去1),计算为n/5*6。然后,打印五个空格,除非这些空格是五个的倍数下划线。最后,打印一条垂直线,顶行除外n=20


简洁明了。我喜欢!
Sp3000

6

JavaScript中,115 107 96 94 89 87 83字节

这太久了,无法获胜,但这是我第一次想出PCG.SE的答案,我为做出可发布的东西感到自豪。

借助一些有用的语法建议,我大大缩短了代码-甚至低于滚动条阈值!

for(s='',y=22;--y;s+='\n')for(x=0;++x<29;)s+=6*~(~-y/5)-~x?4+5*~(x/6)+y?' ':'_':'|'

不错的答案,您可以采取几种措施来缩短它alert。如果您在控制台中运行它,没有它就可以正常工作。另外,最后一个花括号内的分号也不是必需的。您可以使用(y/5-.2)而不是((y-1)/5)
qw3n 2015年

@ qw3n感谢您的建议;我不确定规则是否需要警报。
vvye 2015年

您也可以将s+='\n'后面y--的花括号移动,然后将花括号除去,使其看起来像for(s='',y=21;y>0;y--,s+='\n')。我还在for循环内初始化了s,因此您的代码都是一条语句
qw3n 2015年

1
我以为那是我的最后一个,但是对我来说应该是这样,for(s='',y=22;--y;s+='\n')for(x=0;++x<29;)s+=6*~~(y/5-.2)+5-x?5*~~(x/6)+1-y?' ':'_':'|'如果翻转三元表达式number - x,如果两个术语相等,则可以测试哪个为0 ,从而节省了2个字节。
qw3n

1
波浪游戏:for(s='',y=22;--y;s+='\n')for(x=0;++x<29;)s+=6*~(~-y/5)-~x?4+5*~(x/6)+y?' ':'_':'|'
〜n

6

的ECMAScript 6,142个 138 129 91字节

特别感谢@ edc65确实对其进行了重做。

a=o='',[for(x of!0+o)(o=(a+'     |\n').repeat(4)+a+'_____|\n'+o,a+='      ')],a+'_____\n'+o

原始版本的逻辑检查@ edc65注释的变形方式。

((f,l,p)=>                  //variables
f(24)+l+p[1]+               //add the non pattern line
[0,1,2,3].map(b=>f(18-6*b)) //add the right number of spaces in front of the 4 steps
.map((a,b)=>f(4,a+f(5)+p)   //the four repeating lines of the step 
+a+l)                       //the landing line
.join(p)+p)                 //put it all together
((n,s=' ')=>s.repeat(n)     //create an variable array of some character
,'_____','|\n')             //string literals

1
您可以安全地删除 new构造函数,然后Array再保存一些字节。
NinjaBearMonkey 2015年

@hsl出于某种原因,我认为这new很有必要。
qw3n 2015年

1
Array(n).join(s)就是ES5!你试过了吗repeat
edc65

[1,2,3,4].map((a,b)并仅使用b => [0,1,2,3].map(b(-4)
4

我运行Firefox,并且效果很好!
therewillcoffee

5

MATLAB,68个字节

我强烈认为MATLAB应该可以做得更好,但是我想不出办法。

p(1:5,6)='|';p(1,1:5)=95;w=blkdiag(p,p,p,p);w(21,25:29)=95;flipud(w)

上下颠倒创建楼梯并将其翻转。我的照度计由于周围的所有魔术常数而破裂。

'|'故意保留原样(而不是ascii代码点)进行初始化pw作为char数组。


1
'|' = 124无论如何,因此不会花费任何额外的字符。
彼得·科德斯

5

Ruby,48岁

25.times{|i|puts" "*(4-i/6)*5+(i%6==0??_*5:?|)}

旧方法,68

4.times{|i|(?_*5+"
|"*5).each_line{|l|puts" "*(4-i)*5+l}}
puts"_"*5

欢迎来到PPCG!Ruby高尔夫的几个技巧:1.那里有一些不必要的空格。2.像这样的单个字符串'_'可以写成?_。3.换行符可以直接嵌入字符串中(因此您实际上可以这样做"<linebreakhere>|")。4.不需要括号。最终版本puts可以替换为$><<(即使使用,也可以删除空格?_)。保持!:)
Martin Ender'3

是的,我只是摆脱了一些空白。谢谢!我不知道单个字符串。
psycotica0 2015年

您可能还可以替换(1..4).map4.times,然后使用4-i代替5-i
马丁·恩德

哦,打个好电话。做完了
psycotica0 2015年

4

朱莉娅83字节

for n=24:-6:0 print(" "^n*"_"^5*"|"^(n<24)*"\n"*(" "^(n>0?n-1:0)*"|\n"^(n>0))^4)end

在Julia中,使用*运算符执行字符串连接,并使用进行字符串重复^


4

> <> 108个 104 100字节

cc+::?v~'_____'o\/' 'o  \
?:o'|'\' 'o1-30.o\v!?:-1<}:{oav!?:<4;!
-20.12^?(+cc:ooo/ \~1-'!|'o1. \~ao6

一个简单的> <>解决方案,使用与我相同的策略 Python answer。主要区别在于> <>没有字符串乘法(甚至没有字符串),因此所有操作都是通过循环完成的。

说明

cc+                  Push 24 (call this "n")

[outer loop]
[loop 1, print n spaces]

:                    Copy n (call this "i")
:?                   If i is not zero...
' 'o1-30.                Print space, decrement i and go to start of loop 1

~'_____'ooooo        Pop i and print five underscores
:cc+(?               If n < 24...
'|'o                     Print a pipe
21.                  Otherwise skip pipe printing

[loop 2: print vertical parts of stairs]

?!;                  If n is zero, halt
4                    Push 4 (call this "j")
?!                   If j is zero...
~ao6-20.                 Pop j, print a newline, minus 6 from n and go to start of outer loop
ao                   Print a newline
}:{                  Copy n (call this "k")

[loop 3: print n-1 spaces]

1-                   Decrement k
:?!                  If k is zero...
    ~1-'!|'o1.           Pop k, decrement j, print a pipe and go to start of loop 2
' 'o                 Otherwise print a space and go to start of loop 3

我觉得我将始终支持> <>答案。
krs013 2015年

3

Groovy,98 71字节

// old: (25..5).each{i->println((1..(i-(i-1)%5)).collect{' '}.join()+(i%5?'|':('_____'+(i==25?'':'|'))))}

(25..5).each{i->println(' '*(i-(i-1)%5)+(i%5?'|':'_'*5+(i%25?'|':'')))}

(25..5).each { i ->
    println(
        ' '*(i - (i - 1) % 5) + (
            i % 5 ? 
            '|' : 
            '_'*5 + (i % 25 ? '|' : '')
        )
    )
}    

我很确定,可以通过某种方式减少它:)通过@Score_Under缩短


1
我要刮胡子几个字节:更换收集/用乘法加入' '*(i-(i-1)%5)来自各地,取出支架('_____'+(i==25?'':'|')),替换'_____''_'*5的,如果你翻过去的条件,你可以使用%作为一个非正统的不平等操作:(i%25?'|':'')。这应该让你失望,以71
Score_Under

@Score_Under好,谢谢,我不知道要乘字符串:D
Kamil Mikolajczyk 2015年

2

Perl,50岁

#!perl -l
print$"x6x(-$_/5),($_%5?$":_)x5,"|"x$|++for-20..0

试试


2

T-SQL,276个字节

declare @x int declare @y int declare @w varchar(30) declare @l char(5) set @l='_____' set @x=23 while @x > 4 begin set @w=replicate(' ',@x) set @y=0 if @x=23 print @w+' '+@l else print @w+' '+@l+'|' while @y < 4 begin set @y=1+@y print @w+'|' end set @x=@x-6 end print @l+'|'

2

Visual FoxPro 9.0,261个字节

n =步骤数

总共175个字符,但必须输出到文件才能正确显示-因此,文件操作的负43个字符= 132个字符。

n=10
c=CHR(13)
f="st.t"
ERAS (f)    
FOR i=n TO 1 STEP -1
    p=(i-1)*6
    =STRTO(PADL("_____",p+5)+IIF(i<n,"|","")+c+IIF(i>1,REPLI(PADL("|"+c,p+1),4),""),f,.t.)
    ?PADL("_____",p+5)+IIF(i<n,"|","")+c+IIF(i>1,REPLI(PADL("|"+c,p+1),4),"")
ENDFOR
MODI COMM (f)

回答者注意:字节数是绝对有效的源代码,字节计数器说的是261个字节,实际上是261个字节。


2

Bash(coreutils中的+ tac):110个字节

可以直接将其粘贴到终端中。

(n =;设置{1..4};因为我会回显“ $ {n} _____ |”; n + ='';因为我会回显“ $ n |”; done; n + = \; done; echo“ $ {n} _____“)| tac

没有|tac,它将无法正常工作。我在Git Bash上运行它,所以我应该自杀。
therewillcoffee 2015年

1

x86机器代码,48个字节

B1 05 B4 0E 80 E9 01 B0 5F B5 05 80 ED 01 CD 10 80 FD 00 75 F6 B5 05 80 ED 01 B0 0A CD 10 B0 08 CD 10 B0 7C CD 10 80 FD 00 75 EC 80 F9 00 75 D4

等效的汇编代码:

mov cl, 5
mov ah, 0Eh
main:
    sub cl, 1

print_step:
    mov al, '_'
    mov ch, 5

.loop:
    sub ch, 1

    int 10h

    cmp ch, 0
    jne .loop

print_stoop:
    mov ch, 5

.loop:
    sub ch, 1

    mov al, 0Ah;    ascii newline
    int 10h

    mov al, 8;      ascii backspace
    int 10h

    mov al, '|'
    int 10h

    cmp ch, 0
    jne .loop

cmp cl, 0
jne main

输出:

_____
    |
    |
    |
    |
    |_____
         |
         |
         |
         |
         |_____
              |
              |
              |
              |
              |_____
                   |
                   |
                   |
                   |
                   |_____
                        |
                        |
                        |
                        |
                        |

对不起,输出不一样;我希望这是可以接受的。

这是在DOSBOX中运行的

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.