Rollen Sie das Alphabet in eine Spirale

22

Schreiben Sie ein Programm oder eine Funktion, die bei Bedarf neine nlange Spirale aus lateinischem Alphabet ABCDEFGHIJKLMNOPQRSTUVWXYZausgibt. Diese Spirale soll nur vorwärts durch das Alphabet laufen.

Bezogen auf Alphabet-Spirale , obwohl die Spirale vorwärts und rückwärts durch das Alphabet läuft und die Spirale konstant ist.

Testfälle

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

Regeln

  • Ihre Eingabe ist eine nicht negative Ganzzahl 0 <= n <= 1000 , aber Ihr Code sollte theoretisch jede nicht negative Ganzzahl verarbeiten können.
  • Ihr Ausgabeformat kann in jedem vernünftigen Format vorliegen, gegebenenfalls mit Trennzeichen.
  • Drehungen und Reflexionen sind gleichwertig.
  • Ihr Alphabet kann in Groß- oder Kleinbuchstaben geschrieben sein.
  • Die leeren Stellen in Ihrer Spirale können mit allen nicht-alphabetischen Nullen gefüllt werden, die Sie für richtig halten.
  • Die Spirale selbst kann jede Form haben, die Sie für richtig halten. Rechteckige Spiralen funktionieren am besten mit ASCII-Lösungen, grafische Lösungen können jedoch mit kreisförmigen Spiralen kürzer sein.
  • Führende und nachfolgende Leerzeichen und Zeilenumbrüche sind zulässig.
  • Das ist Code Golf. Die kürzeste Antwort in Bytes (oder Äquivalent) gewinnt.

Wie immer, wenn etwas unklar oder falsch ist, lassen Sie es mich bitte in den Kommentaren wissen. Viel Glück und gutes Golfen!

Sherlock9
quelle
Die meisten Redakteure erlauben es nicht, einen so langen
Text auszudrucken
@ t-clausen.dk Ich ging mit dem Standard vorzeichenbehafteten 32-Bit-Integer-Maximum. Wenn Sie einen besseren Vorschlag für eine Obergrenze haben, würde ich ihn gerne bearbeiten.
Sherlock9
Schön und knifflig :-)
Joffan

Antworten:

12

Logo, 129 87 Bytes

Grafische Lösung, als Funktion implementiert

Dies basiert auf dem Logo-Interpreter von Calormen.com . Die SFunktion nimmt die Anzahl der Zeichen als Parameter und zeichnet sie spiralförmig. Die TFunktion gibt Buchstaben aufrecht aus, um zu verhindern, dass sie sich mit der Spirale drehen. . Ich entschied, dass es schöner aussah (und 42 Bytes ausgab ), die Buchstabenausrichtung nicht zu korrigieren. Ich habe auch den Abstand verschärft, der die Byteanzahl nicht verändert hat. Wenn Sie tatsächlich ein Alphabet aufrollen würden, würde es sowieso eher so aussehen.

Aktualisierte Version (Buchstabenrolle)

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

Aufruf

Rufen Sie Folgendes auf: S Iterationen

Beispielausgabe

S 1000

Beispielausgabe für 1000 Iterationen

Alte Version (Buchstaben immer aufrecht)

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

Alte Ausgabe aus Platzgründen entfernt. Sehen Sie es hier .

GuitarPicker
quelle
Fragen Sie nicht, wie ich auf die Mathematik gekommen bin. Ich habe versucht, online nach Formeln zu suchen, aber die meisten haben das Problem gelöst, indem sie den Drehwinkel konstant gehalten und die Segmentlänge erhöht haben, während ich die Segmentlänge konstant halten und den Winkel ändern wollte. Versuch und Irrtum scheinen zu einer stabilen Formel geführt zu haben. Durch Anpassen von 95wird die Enge der Spirale geändert, und 15durch Anpassen von wird der lineare Abstand der Buchstaben angepasst.
GuitarPicker
9

Javascript (ES6), 203 bis 201 Byte

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`
`}

Demo

Die Demo unten sollte vorzugsweise ganzseitig ausgeführt werden.

Arnauld
quelle
7

R, 46 oder 51 Bytes, je nach Abstand

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

Bildbeschreibung hier eingeben

(Aktualisierte Version des Plots: Die graue Spirale wird standardmäßig nicht gezeichnet, aber ich habe sie nachträglich hinzugefügt, um zu zeigen, dass die Buchstaben tatsächlich auf einer Spirale liegen.)

Die Spirale hat keinen konstanten Abstand, also hoffe ich, dass dies in Ordnung ist. Wenn ein konstanter Abstand erforderlich ist, beginnen Sie s=(1:scan())^.5stattdessen mit und addieren Sie 5 Byte zur Gesamtsumme. Dann ist die Ausgabe wie folgt (n = 150):

Bildbeschreibung hier eingeben

JDL
quelle
3
Wie Sie Ihre Spirale platzieren, liegt ganz bei Ihnen. Ich habe jedoch zwei Vorschläge: 1) Behalte die zweite Spirale bei. Es fügt Ihrer Antwort hinzu, selbst wenn es weniger Golf spielt. 2) Können Sie eine Spirallinie zeichnen, die durch die Buchstaben im Bild Ihrer ersten Spirale verläuft? Nur um die Alphabetspirale deutlicher zu machen.
Sherlock9
6

Python 3.5, 180 157 152 147 141 Bytes

-6 wegen 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')

-5 wegen Kap.

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')

Überarbeitete Lösung, 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')

Vorherige Lösung:

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')

Erläuterung

rist eine Liste von Listen, die die Spirale enthält. Die Grundidee ist, dass der unteren Reihe der Spirale ( r[-1].append(chr(x%26+65))) neue Buchstaben hinzugefügt werden . Wenn die unterste Reihe gefüllt ist, wird die Spirale um 90 im Uhrzeigersinn gedreht und eine neue leere Reihe hinzugefügt (r = list(zip(*r[::-1]))+[[]] ).

Der Trick besteht darin, herauszufinden, wann die Spirale gedreht werden muss. In der ersten Lösung (j<1for i in R(n)for j in R(i//2+1))erzeugt der Generator eine Folge von Richtig / Falsch-Werten, die angeben, wann die Spirale gedreht werden soll. In der überarbeiteten Lösung habe ich die Art der rInitialisierung geändert . Wenn die Länge der unteren Reihe der Länge der oberen Reihe entspricht, muss die Spirale gedreht werden.

RootTwo
quelle
Sie können ersetzen if len(r[-1])==len(r[0]):r=list(zip(*r[::-1]))+[[]]mit if len(r[-1])==len(r[0]):r=[*zip(*r[::-1]),[]]zu speichern 5 Byte.
R. Kap
Da Sie nur rangeeinmal verwenden, können Sie entfernen R, um Bytes zu sparen. Sie können auch speichern Bytes durch Ihre Antwort auf ein volles Programm konvertieren, obwohl die Verwendung von zu erhalten [*zip(*r[::-1]),[]], müssen Sie verwenden müssen range(int(input())).
Sherlock9
Außerdem 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)]prüfen Sie, ob die letzte Zeile mit der ersten Zeile übereinstimmt oder größer ist.
Sherlock9
Zwei Dinge: 1) Sie können die for-Schleife eine Zeile lang machen, indem Sie die Anweisungen durch Semikolons trennen. und 2) Sie haben nin dieser Version nicht definiert . Entweder müssen Sie int(input())eine Funktion verwenden oder eine Sicherungskopie erstellen.
Sherlock9
2 Bytes von der Verdichtung der forSchleife: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

MATL , 21 18 Bytes

X^Xk1YL1Y2y)wG>~*c

Die Eingabe wird 0mit einem Fehler beendet (was standardmäßig zulässig ist ).

Probieren Sie es online!

Erläuterung

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
Luis Mendo
quelle
5

Python 2, 84 82 Bytes

Ich benutze wieder Turtle. Es macht so viel Spaß! : D

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

Probieren Sie es online aus

Leider hat Trinket.io eine schrecklich kleine Leinwand. Ich änderte 9+ian 9+i/9und die Schildkröte Ausgangspunkt für die Zwecke der Screen Capturing dieses Bildes eingestellt, so dass mehr von dem Ausgang passen würde:

Ausgabe

mbomb007
quelle
Ein Byte von, wenn Sie ein Leerzeichen aus dem Import entfernen: from turtle import*und ein anderes vom Ändern von whilezufor i in range(input())
Sherlock9
4

Pyth, 32 Bytes

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

Ein Programm, das eine rechteckige ASCII-Spirale in Kleinbuchstaben druckt. Abhängig von der Eingabe kann eine Zeile oder Spalte mit führenden oder nachfolgenden Leerzeichen vorhanden sein.

Probieren Sie es online aus

Wie es funktioniert

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
TheBikingViking
quelle
3

TSQL, 386 362 358 306 Bytes

Bitte beachten Sie, dass TSQL keine Möglichkeit hat, Text zu drehen. Dieses Skript beginnt bei A und berechnet, in welche Richtung der nächste Buchstabe gesetzt werden soll. (rechts, unten, links, links, links, oben, oben, rechts ...)

Das Skript kann maximal 7744 Buchstaben verarbeiten.

Golf gespielt:

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

Ungolfed:

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

Geige

t-clausen.dk
quelle
2

Python 2, 243 Bytes

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))

Ideone es!

Undichte Nonne
quelle
0

PHP , 219 Bytes

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]);

Probieren Sie es online!

PHP, 260 Bytes

Alte Version

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";}
Jörg Hülsermann
quelle