Spirale aus dem Alphabet!


13

Schauen Sie sich die folgende Zeichenfolge an. Bemerken Sie ein Muster?

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

Wie einige vielleicht bemerkt haben, handelt es sich im Grunde genommen um eine Spirale des Alphabets, bei der sich die Abstände zwischen Zeilen / Spalten allmählich um 1 Leerzeichen / Zeilenvorschub erhöhen.

Rigorose Definition

  • Lassen Sie uns einen Zähler c haben , der anfangs 0 ist.
  • Wir schreiben das erste c + 1 Buchstaben des Alphabets von links nach rechts: A.
  • Dann wird von oben nach unten die nächste (c + 1) (C + 2) / 2 Buchstaben (add B): AB.

  • Von links nach rechts das nächste (c + 1) (c + 2) / 2 (addieren C):

    AB
     C
    
  • Und von unten nach oben die nächsten c + 1 Buchstaben (addieren D):

    AB
    DC
    
  • Das Ende des Zyklus erreicht. Erhöhen wir also c (das wird 1). Dann geht es vom ersten Schritt zurück. Der einzige Unterschied besteht darin, dass wir anstelle der ersten c + 1 Buchstaben des Alphabets die nächsten c + 1 Buchstaben verwenden, beginnend mit dem letzten Element dieses Zyklus ( Din diesem Fall also machen wir weiter mit EFG...). Wenn Zes erreicht ist, geht es zurück von A.

Aufgabe

Geben Sie die ersten N Zyklen der Spirale aus, wenn Sie eine Ganzzahl N (positiv für 1-Indizierung oder nicht negativ für 0-Indizierung) haben .

Regeln

  • Sie können entweder das Kleinbuchstaben- oder das Großbuchstaben-Alphabet verwenden, Ihre Auswahl muss jedoch konsistent sein (verwenden Sie nur eines davon, das Mischen ist nicht zulässig).

  • Sie können Eingaben und Ausgaben über eine der Standardmethoden in einer beliebigen Programmiersprache vornehmen und dabei beachten, dass diese Lücken standardmäßig verboten sind.

  • Zulässige Ausgabeformate: Mehrzeilige Zeichenfolge, eine Liste von Zeichenfolgen, die Zeilen darstellen, eine Liste mit mehreren Zeichenlisten, die jeweils eine Zeile darstellen, oder alles andere, was Sie für geeignet halten. Falls Sie das erste Format nicht auswählen, ist es hilfreich, eine hübsche Druckversion Ihres Codes beizufügen.

  • Das ist , also gewinnt der kürzeste Code in Bytes (in jeder Sprache), der die Anforderungen erfüllt!


Testfälle

Die eingegebene Ganzzahl wird durch eine neue Zeile von der entsprechenden Ausgabe getrennt, und die Tests werden durch Bindestriche getrennt. Beachten Sie, dass diese 1-indiziert sind.

1

AB
DC

--------

2

ABEF
DC G
MH
LKJI 

--------

3

ABEFNOP
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
OCHSE
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
ODER 
NMLKJIHGFEDCBAZYXWVUTS

Die Testfälle sollten n = 1,2,3,5,6 sein, denke ich.
TFeld

Antworten:


9

Kohle , 31 Bytes

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

Probieren Sie es online! Link ist eine ausführliche Version des Codes. Hinweis: Der Deverbosifier gibt aus irgendeinem Grund einen nachgestellten Separator aus. Erläuterung:

F⮌…⁰NB

Zeichnen Sie die Kästchen in umgekehrter Reihenfolge (vom größten zum kleinsten).

⁺²⊘×ι⁺³ι

Berechnen Sie die Größe der Box.

⭆α§α⁺λ

Zeichnen Sie den Rahmen der Box mit einem gedrehten Alphabet.

÷×ι⊕×ι⁺⁹⊗ι⁶

Berechnen Sie den Buchstaben, der oben links im Feld angezeigt wird (0-indiziert).


6

Python 2 , 176 Bytes

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

Probieren Sie es online!

Erläuterung

Wir konstruieren ein leeres Array von Räumen der richtigen Größe und bewegen uns dann wie folgt darüber, beginnend in der oberen linken Ecke:

  • 1 Schritt →, 1 Schritt ↓, 1 Schritt ←, 1 Schritt ↑

  • 3 Schritte →, 3 Schritte ↓, 3 Schritte ←, 3 Schritte ↑

  • 6 Schritte →, 6 Schritte ↓, 6 Schritte ←, 6 Schritte ↑

  • 10 Schritte →, 10 Schritte ↓, 10 Schritte ←, 10 Schritte ↑

Jedes Mal, wenn wir eine leere Zelle finden, platzieren wir dort einen Buchstaben und wechseln zum nächsten Buchstaben im Alphabet.

Im Code s%4ist die Richtung (→ ↓ ← ↑), und wir gehen so oft vor:

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

Golfmöglichkeiten

  • Gibt es einen kürzeren Weg zur Karte s%4zu 1,0,-1,0als abs(2-s%4)-1?

  • Gibt es einen kürzeren Weg zur Karte s%4zu 0,1,0,-1als s%2-s%4/3*2?

Credits

  • Mr. Xcoder hat ein Byte gespeichert.

2
+1 Wow, das ist einfach genial. Ich habe eine Weile gebraucht, um herauszufinden, wie es funktioniert. Ich habe eine Abkürzung gefunden für 21/(s%4+3)%3-1: s%2-2*(s%4>2)( 179 bytes ). Es könnte aber immer noch golffähig sein
Mr. Xcoder

4

C  305  281 Bytes

Vielen Dank an @Mr. Xcoder zum Speichern von vier Bytes!

#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++]);}

Probieren Sie es online!


1
Zum ersten Mal sehe ich ein #definefür for((das spart tatsächlich Bytes). +1 von mir. :)
Kevin Cruijssen

2

Python 2 , 262 260 254 245 Bytes

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

Probieren Sie es online!

Neue Methode mit mehr Mathematik!

Gibt eine Liste mit Zeichenlisten zurück.


Alte Version:

Python 2 , 322 321 308 298 Bytes

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]

Probieren Sie es online!


@ Mr.Xcoder Reicht das dann nicht .49aus oder scheitert es bei sehr großen Eingaben?
Kevin Cruijssen

1
@ KevinCruijssen Nicht sicher, aber das funktioniert mit Sicherheit, 260 Bytes .
Mr. Xcoder

Ich kenne Python nicht so gut, aber ist es möglich, eine Inline-Variable für zu erstellen i<j, da Sie sie viermal verwenden?
Kevin Cruijssen

1
245 Bytes durch Golfen +1==1+von meiner vorherigen Methode
Mr. Xcoder

1

Perl 5, 177 +2 (-nl) = 179 Bytes

2 Bytes gespart dank Xcali

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

Probieren Sie es online aus


Sie können ein Byte speichern, indem Sie -1anstelle von verwenden $#O. Auch unter Verwendung $,statt $nlassen Sie den Raum entfernen , bevor forin$_.=$"x$n for@O
Xcali

danke, ich war auf der Suche nach anderen Verbesserungen, konnte aber im Moment nicht finden
Nahuel Fouilleul

2 weitere Bytes gespeichert, Regex s/ (?=\S)/n/ezu änderns/.*\K /n/e
Nahuel Fouilleul

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.