私の子供のために階段を作ります


25

先日、息子はレゴのようなブロックを使って階段を作るように頼みました。そして、私はこのようなものを思いつきました:

階段

それから私の子供は、コンピューター画面で同様の階段を生成する最小バイト数を使用するプログラムを私に尋ねました。私はが得意ではないので、あなたの助けが必要です。次のプログラムが必要です。

  • 階段に必要なレベルの数を持つ正の整数を受け取ります。
  • 画像に表示されているパターンを使用して、階段の図面を出力します。

出力はテキスト形式になりますが、ブリックは互いに区別できます。たとえば、「█」文字をブロックの半分として使用して、好きな色で塗りつぶしたり、任意の文字を選択したりできます。

制限事項:

  • ブロックは3種類の色である必要があり、できるだけ長く使用されます(入力が1または2の場合、3色すべてを使用するのに十分なブロックがありません)。必要に応じて、たとえば「░▒▓」文字を使用するか、3つの異なる文字を選択するだけです。
  • 同じ色またはパターンの2つのブロックを1列に並べて配置することはできません。

私の息子は、階段が描かれている限り、後続のスペースや改行を気にしません。

例(文字の選択が悪いのでごめんなさい):

Input: 1
Output:
██

Input: 2
Output:
██
 ▓▓

Input: 3
Output:
██
 ▓▓
██░░

Input: 5
Output:
██
 ██
██░░
 ██░░
██░░▓▓

17
子供に自分で構築/プログラミングするのが楽しいことを伝えてください:
ルイスメンドー

3
サイトへようこそ!通常、ASCIIアートとグラフィック出力の組み合わせは、2つの並行した課題のようなものになるため、眉をひそめます。あなたはASCIIのために行く場合も、私はいくつかの言語は、非ASCII文字の難しさを有することができるよう、(私はあなたがすでにやると思いますが、おそらくより明確にする)実際のASCII文字を使用することができるようになる
ルイスMendo


10
@cairdcoinheringaahing duploには丸いボタンはありません。
クリストフ

3
@cairdcoinheringaahing質問のブロックはデュプロではなく、デュプロはレゴと互換性があり、それらはレゴベイビーです。彼らはされた当初、デュプロプリモと呼ばれ、私は、彼らがより別の名前を持っていた希望のどちらかそれら二つの、しかし、彼らは技術的レゴデュプロとの両方とは異なる製品です。
Draco18s

回答:


5

ゼリー 21 19  16 バイト

d2SR+%3x2⁶;ṙḂµ€Y

結果を印刷する完全なプログラム。

用途0011および22ブロックなど。

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

どうやって?

d2SR+%3x2⁶;ṙḂµ€Y - Main link: number n
             µ€  - for €ach "row" in n (i.e. for row, r = 1 to n inclusive):
d2               -   divmod 2   -> [integer-divide by 2, remainder] i.e. [r/2, r%2]
  S              -   sum        -> r/2 + r%2
   R             -   range      -> [1, 2, 3, ..., r/2 + r%2]
    +            -   add r      -> [r+1, r+2, r+3, ..., r + r/2 + r%2]
     %3          -   modulo 3   -> [r%3+1, r%3+2, r%3+0, ..., (r + r/2 + r%2)%3]
                 -   e.g.: r: 1  , 2  , 3    , 4    , 5      , 6      , 7       , ...
                             [2], [0], [1,2], [2,0], [0,1,2], [1,2,0], [2,0,1,2], ...
       x2        -   times 2 - repeat each twice (e.g. [2,0,1,2] -> [2,2,0,0,1,1,2,2]
         ⁶       -   literal space character
          ;      -   concatenate (add a space character to the left)
            Ḃ    -   r mod 2 (1 if the row is odd, 0 if it is even (1 at the top))
           ṙ     -   rotate (the list) left by (r mod 2)
               Y - join with newlines
                 - implicit print (no brackets printed due to the presence of characters)

11

Python 2、55バイト

i=2
exec"print(i%2*' '+`2%i*1122`*i)[:i];i+=1;"*input()

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

のブロック間のサイクルは22, 44、最上行を除く00。たとえば、入力10では、印刷します

00
 22
2244
 2244
224422
 224422
22442244
 22442244
2244224422
 2244224422

i=2,3,..奇数の長さのスペースを作成し、パターンのi時間を繰り返し、lengthに切り捨てることにより、長さが増加する行を印刷しますi。パターンは2244最初のものを除いてすべての行のためにi=2、それはだたため0。これは算術式で実現されます2%i*1122


1
ケース3には2色のみを使用します
クリストフ

非常に巧妙な修正!
チャーリー

4

JavaScript(ES6)、80バイト

n=>eval(`for(s=11,i=1;i++<n;)s+='\\n'+(' '+'2233'.repeat(n)).substr(i%2,i+1);s`)


JavaScript(ES6)、87バイト

以前のソリューション。

n=>[11,...Array(n).fill(' '+'2233'.repeat(n)).map((r,n)=>r.slice(n%2,n+3+n%2))].join`
`

3

SOGL31 28 27 25 バイト

∫³2\@*O"²b“2⁵I%*r*;I»«nKp

説明:

∫                          iterate input times, pushing 1-indexed counter
 ³                         get 3 total copies of it on stack
  2\                       1 if divides by 2, else 0
    @*                     get that many spaces
      O                    output in a new line
       "²b“                push 1122
           2⁵I%*           multiply 1122 by 2%(iteration+1)
                r          convert to string
                 *         multiply by iteration
                  ;I»«     get one iteration variable ontop of stack
                      n    increase, floor divide by 2, multiply by 2 (gets the amount of bricks in a line)
                       Kp  split that multiplied string in pieces of that length

このテクニックの使用
9の出力例:

00
 22
2244
 2244
224422
 224422
22442244
 22442244
2244224422

非競合、22バイト

∫³2\@*O"²b“2⁵I%*;I»«mp

コマンドm最初のSOGLコミットで文書化されましたが実装されていません。


3

05AB1E22 21 20 18 17バイト

興味深い事実を使用しています 4^(N+2)/5 = [3,12,51,204,...] = b[11,1100,110011,11001100,...]

F4NÌm5÷bDðì}r·IF,

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

説明

F                     # for N in 0...input-1 do
 4                    # push 4
  NÌ                  # push N+2
    m                 # push 4^(N+2)
     5÷               # integer division by 5
       b              # convert to binary
        D             # duplicate
         ðì           # prepend a space to the copy
           }          # end loop
            r         # reverse stack
             ·        # multiply top of stack by 2
              IF      # input times do
                ,     # print with newline

申し訳ありませんが、答えを改善しました-いい方法です!
ジョナサンアラン

@ジョナサンアラン:もちろんあなたがやった;)ありがとう!あなたの答えでmod2回転を使用してインデントを処理するというかなりクールなアイデア
エミグナ

2

PHP、61 59

aa<?for(;++$i<$argn;)echo"
",str_pad(" "[~$i&1],2+$i,bbcc);

Pythonバージョンとほとんど同じように機能しますが、可能であれば3色すべてを使用します。末尾の改行はありません。

-2 bytes by @user63956. Thanks !

1
で2バイト節約できますaa<?for...
user63956

1

Pyth、29バイト

VQI!%hN2pd)Vh/N2p*2@G%+NH3)pb

オンラインでテストしてください!

説明

VQI!%hN2pd)Vh/N2p*2@G%+NH3)pb

VQ                               For N in range(0, input)
  I!%hN2pd)                      If N is odd, print a leading space
           Vh/N2          )      For H in range(0, N / 2 + 1)
                   @G%+NH3       Select the letter at position (N + H) % 3 in the alphabet
                 *2              Then make it a two letters string ("aa" or "bb" or "cc")
                p                Print it
                           pb    End the line by printing a new line

そのコードを短縮する方法はたくさんあると思いますが、今は疲れています。


0

バッチ、125バイト

@set s=█
@for /l %%i in (2,1,%1)do @call:c
:c
@set s= %s:█= %
@set s=%s:▓=█%
@set s=%s:░=▓%
@set s=%s:  =░░%
@echo %s%

注:CP437またはCP850などで保存してください。毎回色を回転させることで機能します。回転を実行するために文字列をマップすることはできないため、一時的なステージとしてスペースを使用して4つの置換を使用します。これにより、行ごとにスペースをプレフィックスすることができ、2つのスペースが新しいブロックに変わります。サンプル出力:

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