アルファベットを渦巻きに転がす


22

与えられたときにn、必要に応じて繰り返されるnラテンアルファベットで構成される長いスパイラル文字を印刷するプログラムまたは関数を記述ABCDEFGHIJKLMNOPQRSTUVWXYZします。このスパイラルは、アルファベットだけ前方に進む必要があります。

アルファベットスパイラルに関連していますが、スパイラルはアルファベットを前後に走り、スパイラルは一定です。

テストケース

4   AB
    DC

40   UVWXYZ
     TGHIJA
    NSFABKB
    MREDCLC
    LQPONMD
    KJIHGFE

0

10  GHIJ
    FAB
    EDC

1000    UVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
        TGHIJKLMNOPQRSTUVWXYZABCDEFGHIJA
        SFABCDEFGHIJKLMNOPQRSTUVWXYZABKB
        REZCDEFGHIJKLMNOPQRSTUVWXYZABCLC
        QDYBMNOPQRSTUVWXYZABCDEFGHIJCDMD
        PCXALEFGHIJKLMNOPQRSTUVWXYZKDENE
        OBWZKDEFGHIJKLMNOPQRSTUVWXALEFOF
        NAVYJCDMNOPQRSTUVWXYZABCDYBMFGPG
        MZUXIBCLCDEFGHIJKLMNOPQREZCNGHQH
        LYTWHABKBABCDEFGHIJKLMNSFADOHIRI
        KXSVGZAJAZGHIJKLMNOPQROTGBEPIJSJ
        JWRUFYZIZYFUVWXYZABCDSPUHCFQJKTK
        IVQTEXYHYXETQRSTUVWXETQVIDGRKLUL
        HUPSDWXGXWDSPUVWXYZYFURWJEHSLMVM
        GTORCVWFWVCROTGHIJAZGVSXKFITMNWN
        FSNQBUVEVUBQNSFABKBAHWTYLGJUNOXO
        ERMPATUDUTAPMREDCLCBIXUZMHKVOPYP
        DQLOZSTCTSZOLQPONMDCJYVANILWPQZQ
        CPKNYRSBSRYNKJIHGFEDKZWBOJMXQRAR
        BOJMXQRARQXMLKJIHGFELAXCPKNYRSBS
        ANILWPQZQPWVUTSRQPONMBYDQLOZSTCT
        ZMHKVOPYPONMLKJIHGFEDCZERMPATUDU
        YLGJUNOXONMLKJIHGFEDCBAFSNQBUVEV
        XKFITMNWVUTSRQPONMLKJIHGTORCVWFW
        WJEHSLMLKJIHGFEDCBAZYXWVUPSDWXGX
        VIDGRKJIHGFEDCBAZYXWVUTSRQTEXYHY
        UHCFQPONMLKJIHGFEDCBAZYXWVUFYZIZ
        TGBEDCBAZYXWVUTSRQPONMLKJIHGZAJA
        SFAZYXWVUTSRQPONMLKJIHGFEDCBABKB
        REDCBAZYXWVUTSRQPONMLKJIHGFEDCLC
        QPONMLKJIHGFEDCBAZYXWVUTSRQPONMD
                                LKJIHGFE

ルール

  • 入力は負でない整数0 <= n <= 1000になりますが、コードは理論的には負でない整数を処理する必要があります。
  • 出力形式は、必要に応じて区切り文字を使用して任意の適切な形式にすることができます。
  • 回転と反射は同等です。
  • アルファベットは大文字でも小文字でもかまいません。
  • スパイラルの空のスペースには、アルファベット以外のヌルが適切に表示されます。
  • スパイラル自体は、適切と思われる任意の形状にすることができます。長方形スパイラルはASCIIソリューションで最適に機能しますが、グラフィカルソリューションは円形スパイラルで短くなる場合があります。
  • 先頭および末尾のスペースと改行が許可されます。
  • これはコードゴルフです。バイト(または同等の)での最短回答が勝ちです。

いつものように、何か不明確または間違っている場合は、コメントで知らせてください。幸運と良いゴルフ!


ほとんどのエディターは、長い文字列の出力を許可しません
t-clausen.dk

@ t-clausen.dk標準の符号付き32ビット整数の最大値を使用しました。上限についてより良い提案があれば、喜んで編集します
Sherlock9

ナイスでトリッキー:-)
ジョファン

回答:


12

ロゴ、129 87バイト

関数として実装されたグラフィカルソリューション

これはCalormen.comのロゴインタープリター上に構築されました。このS関数はパラメーターとして文字数を取り、それらを螺旋状に描きます。 このT関数は、文字が螺旋状に回転するのを防ぐために、文字を垂直に出力します。。文字の向きを修正することを省くと、見栄えが良くなる(そして42バイト出力される)と判断しました。また、バイトカウントを変更しない間隔を強化しました。実際にアルファベットをロールアップすると、とにかくこのようになります。

更新バージョン(レターロール)

TO S:r
PU IF:r[REPEAT:r[LABEL CHAR((REPCOUNT-1)%26)+65
RT 99/SQRT(REPCOUNT)FD 12]]END

呼び出し

次のように呼び出します:S 繰り返し

サンプル出力

S 1000

1000回の反復のサンプル出力

古いバージョン(常に直立した文字)

TO T:l:h
RT:h
LABEL CHAR(:l%26)+65
LT:h
END
TO S:r
PU IF:r[REPEAT:r[T REPCOUNT-1 90-HEADING
RT 95/SQRT(REPCOUNT)FD 15]]END

スペースを節約するために古い出力が削除されました。 こちらをご覧ください


どうやって数学を思いついたのか聞かないでください。オンラインで数式を検索しようとしましたが、ほとんどの場合、回転角度を一定に保ち、セグメントの長さを長くすることで問題を解決しました。一方、セグメントの長さを一定に保ち、角度を変更しました。試行錯誤の結果、安定した処方が得られたようです。を調整する95と、スパイラルの締め具合が変更され、変更する15と、文字の線形間隔が調整されます。
GuitarPicker

9

Javascript(ES6)、203 201バイト

n=>{for(a=[],i=d=k=z=0,p=526,j=1;i<n;){p+=[1,32,-1,-32][d&3];j--||(((z^=1)||k++),j=k,d++);(a[y=p>>5]=(a[y]||Array(32).fill` `))[p&31]=String.fromCharCode(65+(i++%26))}return a.map(r=>r.join``).join`
`}

デモ

以下のデモは、できれば全ページで実行する必要があります。


7

R、46または51バイト、間隔に応じて

s=1:scan();plot(s*sin(s),s*cos(s),pch=letters)

ここに画像の説明を入力してください

(プロットの更新バージョン:灰色のスパイラルはデフォルトではプロットされませんが、実際に文字がスパイラル上にあることを示すために追加しました。)

スパイラルの間隔は一定ではないため、これで問題ないことを願っています。一定の間隔が必要な場合は、s=(1:scan())^.5代わりに開始し、合計に5バイトを追加します。次に、出力は次のようになります(n = 150):

ここに画像の説明を入力してください


3
スパイラルの間隔は完全にあなた次第です。ただし、2つの提案があります。1)2番目のスパイラルを維持します。それはそれほどゴルフではない場合でも、あなたの答えに追加されます。2)最初のスパイラルの画像の文字を通るスパイラル線を描くことができますか?アルファベットのスパイラルをより明確にするためです。
Sherlock9

6

Python 3.5、180 157 152 147 141バイト

-6(Sherlock9による)

r=[[]]
for x in range(int(input())):
 r=len(r[-1])<len(r[0])and r or[*zip(*r[::-1]),[]];r[-1]+=[chr(x%26+65)]
print(*map(''.join,r),sep='\n')

Kapにより-5。

R=range
def g(n):
 r=[[]]
 for x in R(n):
  if len(r[-1])==len(r[0]):r=[*zip(*r[::-1]),[]]
  r[-1]+=[chr(x%26+65)]
 print(*map(''.join,r),sep='\n')

修正されたソリューション、python 3.x:

R=range
def g(n):
 r=[[]]
 for x in R(n):
  if len(r[-1])==len(r[0]):r=list(zip(*r[::-1]))+[[]]
  r[-1]+=[chr(x%26+65)]
 print(*map(''.join,r),sep='\n')

以前のソリューション:

R=range
def g(n):
 r=[]
 for x,f in zip(R(n),(j<1for i in R(n)for j in R(i//2+1))):
  if f:r=list(zip(*r[::-1]))+[[]]
  r[-1].append(chr(x%26+65))
 print(*map(''.join,r),sep='\n')

説明

rスパイラルを保持するリストのリストです。基本的な考え方は、新しい文字がスパイラルの一番下の行に追加されることr[-1].append(chr(x%26+65))です()。一番下の行がいっぱいになると、スパイラルが時計回りに90度回転し、新しい空の行が一番下に追加されます(r = list(zip(*r[::-1]))+[[]])。

秘Theは、スパイラルを回転させるタイミングを把握することです。最初のソリューションでは、ジェネレーター(j<1for i in R(n)for j in R(i//2+1))はスパイラルをいつ回転させるかを示す一連のTrue / False値を生成します。修正されたソリューションでrは、初期化の方法を変更しました。ここで、一番下の行の長さが一番上の行の長さと等しい場合、スパイラルを回転させる必要があります。


に置き換えif len(r[-1])==len(r[0]):r=list(zip(*r[::-1]))+[[]]if len(r[-1])==len(r[0]):r=[*zip(*r[::-1]),[]]、5バイト節約できます。
R.ガプス

range一度しか使用しないので、削除Rしてバイトを節約できます。回答を完全なプログラムに変換することでバイトを節約することもできますが、の使用を維持するには[*zip(*r[::-1]),[]]、を使用する必要がありますrange(int(input()))
Sherlock9

また、for x in range(int(input())):r=len(r[-1])<len(r[0])and r or[*zip(*r[::-1]),[]];r[-1]+=[chr(x%26+65)]最後の行が最初の行と同じかそれ以上であるかどうかをチェックしているためです。
シャーロック

2つのこと:1)ステートメントをセミコロンで区切ることにより、forループを1行長くすることができます。2)nこのバージョンでは定義していません。int(input())関数を使用するか、関数でバックアップする必要があります。
シャーロック

forループの圧縮から2バイト:for x in range(int(input())):r=len(r[-1])<len(r[0])and r or[*zip(*r[::-1]),[]];r[-1]+=[chr(x%26+65)]
Sherlock9

5

MATL21 18バイト

X^Xk1YL1Y2y)wG>~*c

入力0はエラーで終了します(デフォルト許可されています)。

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

説明

X^Xk   % Input n implicitly. Take square root and round up
1YL    % Square matrix of that size containing a spiral of numbers
1Y2    % Predefined literal: string "AB···YZ"
y      % Duplicate the spiral matrix onto the top
)      % Apply as an index inth the string. Gives 2D array of chars
w      % Swap: move copy of the spiral matrix to top
G>~    % Set entries that exceed the input to 0, and the rest to 1 
*      % Multiply. This makes unwanted entries equal to 0
c      % Convert to char. 0 is shown as a space. Display implicitly

5

Python 2、84 82バイト

私は再びタートルを使用しています。とても楽しい!:D

from turtle import*
up()
for i in range(input()):write(chr(i%26+65));rt(9);fd(9+i)

オンラインで試す

残念なことに、Trinket.ioには非常に小さなキャンバスがあります。この画像をスクリーンキャプチャするために、タートルの開始点を変更9+i9+i/9て調整し、より多くの出力が収まるようにしました。

出力


:インポートからスペースを削除した場合の1バイトfrom turtle import*から変更することから、別whilefor i in range(input())
Sherlock9

4

Pyth、32バイト

JS@Q2ju+.t_G)Hc<*GQQ.u+NY.iJJZ]Y

長方形の小文字のASCIIスパイラルを印刷するプログラム。入力に応じて、先頭または末尾の空白が1行または1列存在する場合があります。

オンラインで試す

使い方

JS@Q2ju+.t_G)Hc<*GQQ.u+NY.iJJZ]Y  Program. Input: Q
  @Q2                             Yield sqrt(Q)
JS                                Unary range, J=[1, 2, 3, ..., floor(sqrt(q))]
                         .iJJ     Interleave J with itself, yielding [1, 1, 2, 2, 3, 3, ...
                                  floor(sqrt(Q)), floor(sqrt(Q))]
                    .u+NY    Z    Cumulatively reduce by addition with base case 0,
                                  yielding [0, 1, 2, 4, 6, 9, 12, 16, 20...]
                *GQ               Repeat the lower-case alphabet Q times
               <   Q              Truncate to legth Q
              c                   Split the above at the indices in the above list
      u                       ]Y  Reduce the above, with base case [[]]:
          _G                       Reverse
        .t  )                      Transpose
       +     H                     Add the next arm of the spiral
     j                            Join on newlines and implicitly print

3

TSQL、386の 362 358 306バイト

TSQLにはテキストを回転させる方法がないことに注意してください。このスクリプトはAから始まり、次の文字を配置する方向を計算しています。(右、下、左、左、左、上、上、右...)

スクリプトは、最大7744文字を処理できます。

ゴルフ:

DECLARE @z INT = 7744

DECLARE @ INT=2+SQRT(@z-1)DECLARE @o varchar(max)=REPLICATE(SPACE(@-1)+char(10),@-1);WITH C as(SELECT 0i,@/2a,@/2b UNION ALL SELECT i+1,a+z/2,b+z%2FROM(SELECT*,IIF(a>@/2*2-b,IIF(a<b,2,-1),IIF(a>b,-2,1))z FROM C)t WHERE i<@z-1)SELECT @o=STUFF(@o,@*a-@+b,1,char(i%26+65))FROM c OPTION(maxrecursion 0)PRINT @o

ゴルフをしていない:

DECLARE @z INT = 7744

DECLARE @ INT=2+SQRT(@z-1)
DECLARE @o varchar(max)=REPLICATE(SPACE(@-1)+char(10),@-1)

;WITH C as
(
  SELECT
    0i,@/2a,@/2b
  UNION ALL
  SELECT
    i+1,a+z/2,b+z%2
    FROM 
      (SELECT*,
         IIF(a>@/2*2-b,
           IIF(a<b,2,-1),
             IIF(a>b,-2,1))z FROM C)t
  WHERE
    i<@z-1
)
SELECT 
  @o=STUFF(@o,@*a-@+b,1,char(i%26+65))
FROM c  
OPTION(maxrecursion 0)

PRINT @o

フィドル


2

Python 2、243バイト

r=range(input())
a=[1j**int((4*i+1)**.5)for i in r]
b=[map(int,(-sum(a[:i]).real,sum(a[:i]).imag))for i in r]
c,d=zip(*b)
for i in range(min(c),max(c)+1):print''.join([i,j]in b and chr(b.index([i,j])%26+65)or' 'for j in range(min(d),max(d)+1))

できた!


0

PHP、219バイト

for($q=ceil(sqrt($a=$argn))**2,$d=1,$x=$y=$w=0;$i<$q;$i++,${yx[$w%2]}+=[-1,1][$d&1],$i%$d?:$d+=$w++&1)$e[$c[]=$x-!($a&1)][$l[]=$y]=$i<$a?chr(65+$i%26):" ";for($k=min($c);$e[$k];print join($e[+$k++])."\n")ksort($e[+$k]);

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

PHP、260バイト

古いバージョン

for($y=$x=$d=$i=0;$i<$m=ceil(sqrt($n=$argv[1]))**2;$i++){$a[$y][$x]=$i<$n?chr($i%26+65):" ";$d=$y==$x&$y<1?0:(1-$y==$x&$x>0?1:($y==$x&$y>0?2:($y==-$x&$x<0?3:$d)));$d>2?$y--:($d>1?$x--:($d>0?$y++:$x++));}ksort($a);foreach($a as$r){ksort($r);echo join($r)."\n";}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.