アルファベットをスパイラルアウト!


13

次の文字列を見てください。パターンに気づきましたか?

ABEFNOPEFGH
DC GQI
MHRJ
LKJI SK
DTL
CUM
BAZYXWV N
EO
DP
CQ
BAZYXWVUTSR

気づいたかもしれませんが、基本的にはアルファベットのらせん状で、行/列間の距離は1スペース/改行で徐々に増加しています。

厳格な定義

  • 最初は0であるカウンターcを用意しましょう。
  • アルファベットの最初のc + 1文字を左から右に書きますA
  • 次に、上から下に次の(c + 1)(c + 2)/ 2文字(add B):を追加しますAB

  • 左から右へ、次の(c + 1)(c + 2)/ 2(add C):

    AB
     C
    
  • そして、下から上へ、次のc + 1文字(add D):

    AB
    DC
    
  • サイクルの終わりに達しました。したがって、cをインクリメントしてみましょう(1になります)。次に、最初のステップから戻ります。唯一の違いは、アルファベットの最初のc + 1文字を使用する代わりに、このサイクルの最後の要素から始まる次のc + 1文字を使用することです(Dこの場合、EFG...)に進みます。にZ達すると、から循環しAます。

仕事

整数N(1インデックスの場合は正、0インデックスの場合は非負)を指定すると、最初のを指定すると、スパイラルの Nサイクルが。

ルール

  • 小文字または大文字のアルファベットを使用できますが、選択は一貫している必要があります(そのうちの1つのみを使用し、ミキシングは許可されません)。

  • これらの抜け穴に注意しながら、任意のプログラミング言語標準メソッドのいずれかを使用して入力を取得し、出力を提供できます。デフォルトではが禁止されているます。

  • 許容される出力形式:複数行の文字列、行を表す文字列のリスト、それぞれが1行を表す文字の複数のリストを含むリスト、またはその他の適切なもの。最初の形式を選択しない場合は、きれいに印刷されたバージョンのコードを含めると便利です。

  • これはであるため、要件を満たす(各言語の)バイト単位の最短コードが優先されます!


テストケース

入力整数は、対応する出力によって改行で区切られ、テストはダッシュを使用して区切られます。これらは1インデックスであることに注意してください。

1

AB
DC

--------

2

ABEF
DC G
MH
LKJI 

--------

3

アベフノップ
DC GQ
MHR
LKJI S
DT
CU
BAZYXWV

-------

4

ABEFNOPEFGH
DC GQI
MHRJ
LKJI SK
DTL
CUM
BAZYXWV N
EO
DP
CQ
BAZYXWVUTSR

-------
5

ABEFNOPEFGHFGHIJ
DC GQIK
MHRJL
LKJI SKM
DTLN
CUMO
BAZYXWV NP
EOQ
DPR
CQS
BAZYXWVUTSR T
RU
QV
PW
OX
NMLKJIHGFEDCBAZY

------

6

ABEFNOPEFGHFGHIJSTUVWX
DC GQIKY
MHRJLZ
LKJI SKMA
DTLNB
CUMOC
BAZYXWV NPD
EOQE
DPRF
CQSG
BAZYXWVUTSR TH
RUI
QVJ
PWK
OXL
NMLKJIHGFEDCBAZY M
SN
RO
QP
PQ
または 
NMLKJIHGFEDCBAZYXWVUTS

テストケースはn = 1,2,3,5,6でなければなりません。
TFeld

回答:


9

、31バイト

F⮌…⁰NB⁺²⊘×ι⁺³ι⭆α§α⁺λ÷×ι⊕×ι⁺⁹⊗ι⁶

オンラインでお試しください!リンクは、コードの詳細バージョンです。注:deverbosifierは、何らかの理由で末尾の区切り文字を出力します。説明:

F⮌…⁰NB

サイズの逆順(最大から最小)でボックスを描画します。

⁺²⊘×ι⁺³ι

ボックスのサイズを計算します。

⭆α§α⁺λ

回転したアルファベットを使用して、ボックスの境界線を描画します。

÷×ι⊕×ι⁺⁹⊗ι⁶

ボックスの左上に表示される文字(0から始まる)を計算します。


6

Python 2、176バイト

n=input()
k=n*-~n/2+1
a=eval(`[[' ']*k]*k`)
x=y=z=0
for s in range(4*n+4):exec s/4*(s/4+1)/2*"if'!'>a[y][x]:a[y][x]=chr(z%26+65);z+=1\nx+=abs(2-s%4)-1;y+=s%2-s%4/3*2\n"
print a

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

説明

適切なサイズの空白の空の配列を作成し、左上隅から次のようにその上を移動します。

  • 1ステップ→、1ステップ↓、1ステップ←、1ステップ↑

  • 3ステップ→、3ステップ↓、3ステップ←、3ステップ↑

  • 6ステップ→、6ステップ↓、6ステップ←、6ステップ↑

  • 10ステップ→、10ステップ↓、10ステップ←、10ステップ↑

空白のセルを見つけるたびに、そこに文字を置き、アルファベットの次の文字に循環します。

コードでs%4は、方向(→↓←↑)であり、これを何度もステップします。

TriangularNumber(s/4) = s/4*(s/4+1)/2.

ゴルフの機会

  • マッピングs%4する1,0,-1,0より短い方法はありabs(2-s%4)-1ますか?

  • マッピングs%4する0,1,0,-1より短い方法はありs%2-s%4/3*2ますか?

クレジット

  • Xcoder氏は1バイトを保存しました。

2
+1うわー、これは素晴らしいです。それがどのように機能するかを理解するためにしばらくかかりました。21/(s%4+3)%3-1s%2-2*(s%4>2)179バイト)の短縮形を見つけました。それでもゴルフができるかもしれない
ミスターXcoder

4

C、 305  281バイト

@Mrに感謝します。4バイトを節約するためのXcoder!

#define L(x,y)l[x][y]=a++%26+65;
#define F for(
c,i,j,a,p;f(n){char**l=calloc(8,i=a=n*n*4);F;i--;memset(l[i],32,a))l[i]=malloc(a);F c=a=p=i=0;c<n;++c){F i=p;i<c+p+!c;)L(j=0,c+i++)F p=i;j<=-~c*(c+2)/2;)L(j++,c+i)F;c+i-1;)L(j-1,c+--i)F i=0;i<=c;)L(j+~i++,0)}F i=0;i<j;)puts(l[i++]);}

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


1
初めて#definefor for((実際にバイトを節約します)を見ます。私から+1。:)
ケビンクルーイッセン

2

Pythonの2262 260 254 245バイト

lambda n:[[[' ',chr(65+(4*(i<j)+sum((i<j)*8+2+I*[5,9][i<j]+sum(2*R(I))for I in R(S(i,j)-1))+[i+j,-i-j][i<j])%26)][max(i,j)==S(i,j)*-~S(i,j)/2or i*j<1]for i in R(1+n*-~n/2)]for j in R(1+n*-~n/2)]
R=range
S=lambda x,y:int((8*max(x,y)+1)**.5+.99)/2

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

より多くの数学を持つ新しいメソッド!

文字リストのリストを返します。


古いバージョン:

パイソン2322の 321 308 298バイト

R=range
n=input()
w=1+n*-~n/2;r=[w*[' ']for _ in R(w)];r[0][0]='A';l=R(1,w*w*9);c=lambda:chr(65+l.pop(0)%26)
for i in R(n+1):
 w=1+i*-~i/2;W=w-i
 for x in R(W,w):r[0][x]=c()
 for y in R(1,w):r[y][w-1]=c()
 for x in R(1,w):r[w-1][w+~x]=c()
 for x in R(1,w-W):r[w+~x][0]=c()
for l in r:print`l`[2::5]

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


@ Mr.Xcoder .49その場合、それだけでは十分ではありませんか、それとも非常に大きな入力に対して失敗しますか?
ケビンCruijssen

1
@KevinCruijssen確かではありませんが、これは確かに機能し、260バイトです。
ミスターXcoder

Pythonについてはよく知りませんが、のインライン変数を作成することは可能i<jですか?
ケビンCruijssen

1
+1==1+私の以前の方法からゴルフで245バイト
Mr. Xcoder

1

Perl 5、177 +2(-nl)= 179バイト

Xcaliのおかげで2バイト節約

sub n{chr 65+$c++%26}@O=(n);while($,++<$_){$_.=$"x$,for@O;push@O,($"x length$O[0])x$,;$O[0]=~s/ /n/eg;s/ $/n/e for@O;1while$O[-1]=~s/.*\K /n/e;s/^ /n/e for reverse@O}print for@O

オンラインで試す


-1代わりにを使用してバイトを保存できます$#O。また、使用して$,の代わりには、$nあなたが前にスペースを削除できるようになるfor$_.=$"x$n for@O
Xcali

ありがとう、私は他の改善を探していましたが、今のところ見つけることができませんでした
ナウエルFouilleul

正規表現s/ (?=\S)/n/eを変更するためにさらに2バイトを保存s/.*\K /n/e
ナウエルフイユ

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