きれいに配置されたASCIIスパイラル


13

このスパイラルを考えてください

###########
#
# #######
# #     #
# # ### #
# # # # #
# # # # #
# #   # #
# ##### #
#       #
#########

中心から開始:

  • 最初の行(上)には3文字があります。
  • 2行目の文字数は同じ(3)です
  • 次に、次の2辺に2つの文字(5)を追加します。
  • このパターンは継続し、両側が同じ長さで、長さを2ずつ増やします。

このスパイラルをN行に生成します。

  • 任意の言語で書きます。
  • 入力/引数などは、スパイラルの行数です。
  • 各行は、前の行の時計回りに90度の方向に、前の行の終了文字で始まります。
  • スパイラルの要素が並んでいる限り、各行の前後にある空白の量は気にしません。
  • テキストを出力して、選択した非空白文字でスパイラルを描画します。
  • 最小バイト数でこれを試みます。

テストケース(出力としてハッシュを使用):

N = 1

#
#
#

N = 2

###
#
#

N = 3

###
# #
# #
  #
  #

N = 10

###########
#
# #######
# #     #
# # ### #
# # # # #
# # # # #
# #   # #
# ##### #
#       #
#########

@Shaggy「テキストを出力して、選択した空白以外の文字でスパイラルを描画します。」うん、好きなものは何でも。
-AJFaraday


3
初期画像にはの*代わりにがあり#ます。期待?
ヴェルニッシュ

@Wernischこれは有用な出発点となることを目的としていましたが、誤解を招くものと思われます。好きなキャラクターを使用できます。
AJFaraday

回答:


11

05AB1E13 11バイト

コード:

2バイトを節約してくれたEmignaに感謝します!

LDÈ-Ì'#3Ý·Λ

05AB1Eエンコードを使用します。オンラインでお試しください!

説明

スパイラル上の個々のエッジの長さは長さ3から始まり、2ステップごとに2ずつ徐々に増加します。

3355779

nn

L                # Create a list from [1 .. input]
 DÈ              # Duplicate and check for each number if even
   -             # Subtract that from the first list
    Ì            # Add 2

これにより、基本的に必要な長さのリストが得られます。

     '#          # Push the '#' character
       0246S     # Push the array [0, 2, 4, 6]
            Λ    # Write to canvas

キャンバスは、3つのパラメーター(右端のパラメーターが最初にポップされる)をポップする関数として機能します:<length(s)><char(s)><direction(s)>。この場合、directionsパラメーターは数字のリストです。方向に対応する番号は次のとおりです。

[70162543]

この場合、[0、2、4、6]は方向リストに対応します[↑, →, ↓, ←]。キャンバスは、長さのリストから取得した各長さを反復処理し、「#」文字を使用して、経路リストを周期的に反復します。


0246S=3Ý·
エミグナ

@Emignaああ、私はそれを考えなかった、ありがとう!
アドナン

6

パイソン2176の 170 165 161 157バイト

g=lambda a,r:r and g(map(''.join,zip(*a))[::-1],r-1)or a
R=['#']
n=1
exec"R=g(['  '+l for l in g(R,n)][:-1]+[(n+2)*'#'],3*n);n+=1;"*input()
print'\n'.join(R)

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

繰り返し:用途 gしてn、スパイラルのth番目の反復を「標準」位置(N = 3またはN = 7と同様)に回転し、既存の各行の左側に2つのスペースを追加して新しいセグメントを追加し、最後の行を置き換えますすべて'#'のsで(N = 4またはN = 8に匹敵する位置になります)、最後にgもう一度使用して正しい位置に戻します。泡立て、すすぎ、繰り返します。


4

16 15 14 バイト

↶FN«¶×#⁺³⊗÷ι²↷

@Neilのおかげで-2バイト。

オンラインで試す(詳細)または(純粋)オンラインそれを試してみてください

説明:

印刷方向はデフォルトで右であり、上方向に開始したいので、反時計回りに45度回転して開始します。

PivotLeft();
↶

次にi、範囲内でループします[0, input)

For(InputNumber()){ ... }
FN« ...

改行を印刷して、1つの位置に戻る効果を模倣します。

Print("\n");
¶

x現在の方向に「#」回印刷します。

Print(Times("#", ... ));
×# ...

ここで、x次のとおりです3 + i // 2 * 2

Add(3,Doubled(IntegerDivide(i,2))
⁺³⊗÷ι²

次に、ループの次の反復のために時計回りに45度回転します。

PivotRight();
↷

木炭には後方に移動するコマンドがないと思いますか?
エミグナ

@Emigna確かではありませんが、私もそれを見つけることができませんでした。私がこの答えを書いていたとき、本当に自分自身を探していました。特定の方向のMoveと特定の座標のJumpがありますが、残念ながらMoveBackはありません。
ケビンCruijssen

1
⊗÷ι²は、より短いバイトです⁻ι﹪ι²。また、sの\n前にaを出力することにより、元に戻す効果を得ること#ができます。これにより、を削除し»#て、全体的なバイトをさらに節約できます。
ニール

@Neilに感謝し⊗÷ι²ますが\n#sの前にaを印刷するための変更は何ですか?を追加すると、スパイラルが正しくなくなりPrint("\n")ます。
ケビンクルーッセン

腕が重なったため、腕をさらに#長くする必要があります。
ニール

3

Pythonの2179の 178バイト

-1バイトのKevin Cruijssenに感謝します。

n=input()
S,H=' #'
m=[S*n]*(n%2-~n)
x=n/4*2
y=0--n/4*2
k=2
m[y]=S*x+H+S*n
M=[1,0,-1,0]*n
exec'exec k/2*2*"x+=M[~k];y+=M[k];m[y]=m[y][:x]+H+m[y][x+1:];";k+=1;'*n
print'\n'.join(m)

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


Python 2、179バイト

このアプローチでは、ルックアップリストの代わりに式xyデルタが使用されます。

n=input()
S,H=' #'
m=[S*n]*(n%2-~n)
x=n/4*2
y=0--n/4*2
k=2
m[y]=S*x+H+S*n
exec'exec k/2*2*"x+=k%-2+k%4/3*2;y-=(k%2or k%4)-1;m[y]=m[y][:x]+H+m[y][x+1:];";k+=1;'*n
print'\n'.join(m)

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


n+1+n%2以下のn%2-~nため-1バイト。そして私0--n/4*2は1より短いことを覚える必要があります-(-n/4*2)。いい答え、私からの+1。
ケビンクルーッセン

1

JavaScript(ES6)、185バイト

確かにこれはもっとカレーでゴルフできるかもしれませんが、ここに私の謙虚な試みがあります。最後から2番目の文字を除く読みやすさのために改行が追加されました

r=(a,n=1)=>n?r(a.reduce((_,c)=>c).map((_,i)=>a.map(e=>e[i])).reverse(),n-1):a,
s=n=>n?r(s(n-1)).map((r,i)=>[...r,w,w].map(x=>i?x:'#')):[[w=' ']],
d=n=>r(s(n),1-i).map(r=>r.join``).join`
`

使用法:d(10)N = 10チャレンジの例に従って文字列を返します。

r(a,n)配列an交互に回転させる関数を定義します。再帰的に回転して間隔と行を追加することによりs(n)、サイズのらせんを表す2次元配列を生成する関数n(回転して開始位置に戻りません)。そして、チャレンジごとに一貫して回転し、返される文字列としてレンダリングされる、d(n)サイズのスパイラルを描画する関数n

これは本当に楽しいチャレンジでした:¬)

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