階段の挑戦


20

あなたの仕事は、この芸術作品を再現することです。

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

答えはこれを再作成し、結果としてこれを印刷する必要があります。すべての言語が許可され、アートの直接印刷は行われず、ある程度の操作が必要です。最小バイトの答えが勝ちです。

UTC木曜日の午前6時30分頃に閉まります。

Javaでこれを行った友人が元のことを見せてくれたので、彼はソースコードを見せることを拒否しました。:D

代替文字を使用することはできません (簡単になりますか?)。


現在のリーダーボード

  1. Pyth -28バイト-isaacg
  2. CJam -30バイト-Runer112
  3. CJam -32バイト-MartinBüttner

最高票: C -73バイト-Paul R


isaacgは、PythのStaircase Challengeを通過したことで冠を獲得しました。PPCGでこれらのような課題に注意してください!


1
プログラミングパズルとCode Golf Stack Exchangeへようこそ!ここでのすべての課題には、どのソリューションが勝つべきかを決定的に決定するための客観的な勝利基準が必要です。これはコードゴルフの質問のように見えます。つまり、最短のコードが勝ちますが、何か違うものにしたい場合は自分で編集させてください。ありがとう!
ドアノブ

1
ああ、すみませんでした。それでは、質問に適切なタグを編集しました。
ドアノブ

13
6行目に1つの奇妙な末尾のスペースを印刷する必要がありますか?
オプティマイザー

4
より一般的には、末尾のスペースは許可されますか?これを最初の行の幅の長方形にパディングできますか?
マーティンエンダー

8
末尾に改行を入れることはできますか?
TheNumberOne

回答:


4

ピス、29 28

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

ここで試してみてください。

@xnorのソリューションの「5つのスペースまたは5つのアンダースコアを追加する」トリックを使用する、20〜0ではなく0〜20のループを使用する、非常に簡単なソリューションです。


1
ステアケースチャレンジを通過したことについて、アイザックir
コーヒーがあります

...そして今、あなたは階段に入ることができます
アンソニーファム

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のソリューションを投稿する人が必ずいなければなりません。あなたのために賛成票を投じてください。
therewillbecoffee

1
ループをfor(i=25;i--;)
Felix Bytow

1
@FelixBytowする必要がありますi=26。これに加えて、を追加のキャラクター用' 'に変更できます32。私の解決策は、これらの最適化後に2文字長くなります:(
Allbeert

2
余分なステップがあるようです。必要な出力には26行ではなく21行がありmain(i){for(i=21;i--;)printf("%*s%c\n",i/5*6+5,i%5?"":"_____",i<20?'|':0);}ます。さらに最適化を行います。1.長さの式を簡略化し' 'ます。また、それはと私のために罰金を実行している""代わりに" "
レベル川セント

1
'|'印刷で2バイト節約するためにこれはどうですか?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でそれをやったので、私は感銘を受けました。
コーヒー

9

Brainfuck(1065バイト)

それはきれいではありません、それは短くはありません...しかし、私は後で最適化します!

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

Brainfuckは決してきれいではありません:)それを動作させるためだけに
賛成


ideone.com/ICtrhv 時間制限を超え、私が何を意味するか....
therewillbecoffee

Bizzare ...ここで試してください:esoteric.sange.fi/brainfuck/impl/interp/i.html
ジョシュhpbarron

8

CJam、36 30バイト

オンラインでお試しください。

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

最初の36バイトのソリューションでは、出力方向で結果が生成されました。アルゴリズムからより多くのバイトを圧縮しようとしても、できませんでした。それから、行ではなくを生成して結果を転置するというマーティンの素晴らしい戦略を見ました。私はそれがおそらくより良いアプローチであることに気づいたので、転置ベースのソリューションを作成するために出発しました。

ただし、その戦略を実装するための私のアプローチはかなり異なります。完全な列を生成する代わりに、既に生成された「ステップ」をインデントし、各反復で新しいステップを追加する反復ソリューションを使用します。したがって、メインループの最初の反復でこれが生成されます。

 |||||
_
_
_
_
_

メインループの2回目の反復では、既存のステップをインデントし、その後に新しいステップを追加します。

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

そして、メインループの5つの完全な反復がこれを生成します。

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

この後、行う必要があるのは、最初の行を削除することです。そうしないと、ボトムラインの不要なライザーになり、トランスポーズされます。


7

パイソン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
クリップにはウィキペディアのページすらありません。つまり、…
。– therewillbecoffee

4
@therewillbecoffeeこのサイトの多くの言語には、ウィキペディアのページがありません。それは楽しいです;)
Ypnypn

@Ypnypn設計しましたか?本当に面白いですね!本当のことに興味がありますが馬に。;)(例のページの1つは少しチートです。)
マーティンエンダー

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バイトでそれをしました。
コーヒー

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。次に、5つのスペースを印刷しますが、これらは5の倍数の代わりにアンダースコアです。最後に、一番上の行を除き、垂直線を印刷し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。短くするためにできることはいくつかあります。コンソールで実行すると、それがなくても正常に機能します。また、最後の中括弧内のセミコロンは必要ありません。あなたは使用して1つのバイトを保存することができます(y/5-.2)代わりに((y-1)/5)
qw3n

@ qw3nこれらの提案に感謝します。ルールでアラートが必要かどうかはわかりませんでした。
vvye

また、s+='\n'後に移動しy--、中括弧を取り除くと、次のようになりfor(s='',y=21;y>0;y--,s+='\n')ます。あなたのコードは、すべての1文ですので、私はまた、forループの内部の初期化
qw3n

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?' ':'_':'|'3項式を反転させてnumber - x、両方の項が2バイト節約された場合にどちらが0であるかをテストすることができれば、これはそれであるはずです。
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
数バイトを保存するnewArrayに、コンストラクターを安全に削除できます。
NinjaBearMonkey

@hslなんらかの理由で、ありがとうと思ったnew
qw3n

1
Array(n).join(s)はES5です!あなたは試すんでしたrepeat
edc65

[1,2,3,4].map((a,b)b => [0,1,2,3].map(b
-edc65

Firefoxを実行すると、かなりうまく動作します!
コーヒー

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)

階段を上下逆にして作成します。周りのすべての魔法の定数のために、私のタウオメーターが壊れました。

'|'初期化するためp、およびwchar配列として意図的に(asciiコードポイントの代わりに)そのままにしておきます。


1
'|' = 124とにかく、追加の文字はかかりません。
ピーターコーデス

5

ルビー、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.その周りの括弧は必要ありません。final puts$><<(を使用した後でも、スペースを取り除くことができる)に置き換えることができます?_。がんばり続ける!:)
マーティンエンダー

ええ、私はいくつかの空白を取り除きました。ありがとう!単一の文字列については知りませんでした。
psycotica0

おそらくに置き換え(1..4).map4.times4-i代わりにを使用することもでき5-iます。
マーティンエンダー

いいね できた
psycotica0

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の答えと同じ戦略を使用した単純な> <>ソリューション。主な違いは、> <>には文字列の乗算(または文字列)がないため、すべてループで行われることです。

説明

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

3

グルーヴィー、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
数バイト削る必要があります:collect / joinをmultiply:に置き換え、' '*(i-(i-1)%5)角かっこを削除し('_____'+(i==25?'':'|'))'_____'withを置き換え'_'*5ます。最後の条件を反転する場合、非正統的な不等式演算子として%を使用できます(i%25?'|':'')。これは、71にあなたを降りなければならない
Score_Under

@Score_Underの素敵は、おかげで、私は、文字列を掛ける知りませんでした:D
カミルMikolajczyk


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バイトだと言っているので、そうです。


2

Bash(coreutilsからの+ tac):110バイト

これは、ターミナルに直接貼り付けることができます。

(n =; set {1..4}; for echo "$ {n} _____ |"; n + = ''; for do echo "$ n |"; done; n + = \; done; echo " $ {n} _____ ")| tac

なし|tacでは、まったく機能しません。そして、これをGit Bashで実行したため、自殺する必要があります。
コーヒーがあります

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で実行されました

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.