Faites sortir l'alphabet en spirale!

13

Regardez la chaîne suivante. Vous remarquez un motif?

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

Comme certains l'ont peut-être remarqué, il s'agit essentiellement d'une spirale de l'alphabet, où les distances entre les lignes / colonnes augmentent progressivement de 1 espace / nouvelle ligne.

Définition rigoureuse

  • Ayons un compteur c , qui est initialement 0.
  • Nous écrivons le premier c + 1 lettres de l'alphabet de gauche à droite: A.
  • Puis, de haut en bas suivant (c + 1) (c + 2) / 2 lettres (add B): AB.

  • De gauche à droite, le suivant (c + 1) (c + 2) / 2 (ajouter C):

    AB
     C
    
  • Et de bas en haut, les c + 1 lettres suivantes (ajouter D):

    AB
    DC
    
  • Atteint la fin du cycle. Par conséquent, incrémentons c (qui devient 1). Puis, il commence à revenir de la première étape, la seule différence étant qu'au lieu d'utiliser le premier c + 1 lettres de l'alphabet, nous utilisons le suivant c + 1 lettres, à partir du dernier élément de ce cycle ( Ddans ce cas, nous continuons donc avec EFG...). Une fois Zatteint, il revient de A.

Tâche

Étant donné un entier N (qui est positif pour l'indexation 1 ou non négatif pour l'indexation 0), sortez les N premiers cycles de la spirale.

Règles

  • Vous pouvez utiliser l'alphabet en minuscules ou en majuscules, mais votre choix doit être cohérent (utilisez uniquement l'un d'eux, le mélange n'est pas autorisé).

  • Vous pouvez prendre des entrées et fournir des sorties via l'une des méthodes standard , dans n'importe quel langage de programmation , tout en notant que ces failles sont interdites par défaut.

  • Formats de sortie acceptables: chaîne multiligne, une liste de chaînes représentant des lignes, une liste contenant plusieurs listes de caractères, chacune représentant une ligne, ou tout autre élément que vous jugez approprié. Dans le cas où vous ne choisissez pas le premier format, ce serait bien d'inclure une jolie version imprimée de votre code.

  • C'est le , donc le code le plus court en octets (dans chaque langue) qui remplit les conditions gagne!


Cas de test

L'entier en entrée sera séparé par sa sortie correspondante via une nouvelle ligne, et les tests seront séparés en utilisant des tirets. Notez que ceux-ci sont indexés 1.

1

UN B
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
SPERME
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
BŒUF
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
OU 
NMLKJIHGFEDCBAZYXWVUTS
M. Xcoder
la source
Les tests devraient être n = 1,2,3,5,6, je pense.
TFeld

Réponses:

9

Fusain , 31 octets

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

Essayez-le en ligne! Le lien est vers la version détaillée du code. Remarque: Le déverbosificateur génère un séparateur de fin pour une raison quelconque. Explication:

F⮌…⁰NB

Dessinez des boîtes dans l'ordre inverse de la taille (du plus grand au plus petit).

⁺²⊘×ι⁺³ι

Calculez la taille de la boîte.

⭆α§α⁺λ

Dessinez la bordure de la boîte à l'aide d'un alphabet pivoté.

÷×ι⊕×ι⁺⁹⊗ι⁶

Calculez la lettre qui apparaîtrait en haut à gauche de la boîte (index 0).

Neil
la source
6

Python 2 , 176 octets

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

Essayez-le en ligne!

Explication

Nous construisons un tableau vide d'espaces de la bonne taille, puis nous le déplaçons comme ceci, en commençant dans le coin supérieur gauche:

  • 1 étape →, 1 étape ↓, 1 étape ←, 1 étape ↑

  • 3 étapes →, 3 étapes ↓, 3 étapes ←, 3 étapes ↑

  • 6 étapes →, 6 étapes ↓, 6 étapes ←, 6 étapes ↑

  • 10 étapes →, 10 étapes ↓, 10 étapes ←, 10 étapes ↑

Chaque fois que nous trouvons une cellule vide, nous y mettons une lettre et passons à la lettre suivante de l'alphabet.

Dans le code, s%4est la direction (→ ↓ ← ↑), et nous faisons ce pas plusieurs fois:

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

Possibilités de golf

  • Est - il un moyen plus court à la carte s%4à 1,0,-1,0que abs(2-s%4)-1?

  • Est - il un moyen plus court à la carte s%4à 0,1,0,-1que s%2-s%4/3*2?

Crédits

  • M. Xcoder a enregistré un octet.
Lynn
la source
2
+1 Wow, c'est tout simplement génial. Cela m'a pris un certain temps pour comprendre comment cela fonctionne. J'ai trouvé un raccourci pour 21/(s%4+3)%3-1: s%2-2*(s%4>2)( 179 octets ). Il pourrait encore être jouable au golf
M. Xcoder
4

C,  305  281 octets

Merci à @Mr. Xcoder pour économiser quatre octets!

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

Essayez-le en ligne!

Steadybox
la source
1
La première fois que je vois un #definefor for((qui économise en fait des octets). +1 de moi. :)
Kevin Cruijssen
2

Python 2 , 262 260 254 245 octets

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

Essayez-le en ligne!

Nouvelle méthode avec plus de maths!

Renvoie une liste de listes de caractères.


Ancienne version:

Python 2 , 322 321 308 298 octets

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]

Essayez-le en ligne!

TFeld
la source
@ Mr.Xcoder N'est-ce pas .49suffisant dans ce cas ou échoue-t-il pour de très grandes entrées?
Kevin Cruijssen
1
@KevinCruijssen Pas sûr, mais cela fonctionne à coup sûr, 260 octets .
M. Xcoder
Je ne connais pas bien Python, mais est-il possible de faire une variable en ligne pour i<j, puisque vous l'utilisez quatre fois?
Kevin Cruijssen
1
245 octets en jouant au golf à +1==1+partir de ma méthode précédente
M. Xcoder
1

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

2 octets économisés grâce à 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

Essayez-le en ligne

Nahuel Fouilleul
la source
Vous pouvez enregistrer un octet en utilisant -1au lieu de $#O. Utiliser également $,au lieu de $nvous permettra de supprimer l'espace avant ford' $_.=$"x$n for@O
entrer
merci, je cherchais d'autres améliorations mais je n'ai pas trouvé pour le moment
Nahuel Fouilleul
enregistré 2 octets supplémentaires en changeant de regex s/ (?=\S)/n/eens/.*\K /n/e
Nahuel Fouilleul