Roulez l'alphabet en spirale


22

Écrivez un programme ou une fonction qui, une fois donné n, imprimera une spirale ncomposée de l'alphabet latin ABCDEFGHIJKLMNOPQRSTUVWXYZrépété au besoin. Cette spirale ne doit parcourir l'alphabet que vers l'avant.

Lié à la spirale alphabétique , bien que la spirale traverse l'alphabet vers l'avant et vers l'arrière, et la spirale est constante.

Cas de test

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

Règles

  • Votre entrée sera un entier non négatif 0 <= n <= 1000, mais votre code devrait théoriquement gérer tout entier non négatif.
  • Votre format de sortie peut être dans n'importe quel format sain, avec des délimiteurs si nécessaire.
  • Les rotations et les réflexions sont équivalentes.
  • Votre alphabet peut être en majuscule ou en minuscule.
  • Les espaces vides de votre spirale peuvent être remplis par les valeurs non alphabétiques que vous jugez appropriées.
  • La spirale elle-même peut avoir la forme que vous jugerez appropriée. Les spirales rectangulaires fonctionnent mieux avec les solutions ASCII, mais les solutions graphiques peuvent être plus courtes avec les spirales circulaires.
  • Les espaces de début et de fin et les nouvelles lignes sont autorisés.
  • C'est le golf de code. La réponse la plus courte en octets (ou équivalent) l'emporte.

Comme toujours, si quelque chose n'est pas clair ou incorrect, faites-le moi savoir dans les commentaires. Bonne chance et bon golf!


la plupart des éditeurs n'autorisent pas l'impression d'une chaîne aussi longue
t-clausen.dk

@ t-clausen.dk Je suis allé avec le maximum de 32 bits signé standard. Si vous avez une meilleure suggestion pour une limite supérieure, je serais heureux de la modifier.
Sherlock9

Agréable et délicat :-)
Joffan

Réponses:


12

Logo, 129 87 octets

Solution graphique, implémentée en fonction

Cela a été construit sur l'interpréteur de logo de Calormen.com . La Sfonction prend le nombre de caractères comme paramètre et les dessine en spirale. La Tfonction sort les lettres en position verticale pour les empêcher de tourner avec la spirale. . J'ai décidé qu'il semblait plus agréable (et joué 42 octets ) de ne pas corriger l'orientation des lettres. J'ai également resserré l'espacement qui n'a pas changé le nombre d'octets. Si vous deviez enrouler un alphabet, cela ressemblerait de toute façon à ceci.

Version mise à jour (rouleau de lettres)

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

Invocation

Appelez comme suit: S itérations

Exemple de sortie

S 1000

Exemple de sortie pour 1000 itérations

Ancienne version (lettres toujours droites)

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

Ancienne sortie supprimée pour économiser de l'espace. Voyez-le ici .


Ne me demandez pas comment je suis arrivé au calcul. J'ai essayé de rechercher des formules en ligne, mais la plupart ont résolu le problème en gardant l'angle de virage constant et en augmentant la longueur du segment, alors que je voulais garder la longueur du segment constante et changer l'angle. Les essais et erreurs semblent avoir conduit à une formule stable. Ajuster le 95changera l'étanchéité de la spirale, et 15changera ajustera l'espacement linéaire des lettres.
GuitarPicker

9

Javascript (ES6), 203 201 octets

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

Démo

La démonstration ci-dessous doit être exécutée de préférence en pleine page.


7

R, 46 ou 51 octets, selon l'espacement

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

entrez la description de l'image ici

(version mise à jour de l'intrigue: la spirale grise n'est pas tracée par défaut mais je l'ai ajoutée après pour montrer que les lettres reposent bien sur une spirale.)

La spirale n'est pas à espacement constant, donc j'espère que ça va. Si un espacement constant est requis, commencez par à la s=(1:scan())^.5place et ajoutez 5 octets au total. Ensuite, la sortie est comme ci-dessous (n = 150):

entrez la description de l'image ici


3
La façon dont vous espacez votre spirale dépend entièrement de vous. J'ai cependant deux suggestions: 1) Gardez la deuxième spirale. Cela ajoute à votre réponse même si c'est moins golfique; 2) Pouvez-vous tracer une ligne en spirale passant par les lettres dans l'image de votre première spirale? Juste pour rendre la spirale de l'alphabet plus claire.
Sherlock9

6

Python 3,5, 180 157 152 147 141 octets

-6 en raison de 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 en raison de 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')

Solution révisée, 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')

Solution précédente:

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

Explication

rest une liste de listes qui contient la spirale. L'idée de base est que de nouvelles lettres sont ajoutées à la ligne inférieure de la spirale ( r[-1].append(chr(x%26+65))). Lorsque la rangée du bas est remplie, la spirale pivote de 90 dans le sens des aiguilles d'une montre et une nouvelle rangée vide est ajoutée en bas ( r = list(zip(*r[::-1]))+[[]]).

L'astuce consiste à déterminer quand faire tourner la spirale. Dans la première solution, le générateur (j<1for i in R(n)for j in R(i//2+1))produit une séquence de valeurs Vrai / Faux qui indiquent quand faire tourner la spirale. Dans la solution révisée, j'ai changé la façon dont rest initialisé. Maintenant, lorsque la longueur de la rangée inférieure est égale à la longueur de la rangée supérieure, la spirale doit être tournée.


Vous pouvez remplacer if len(r[-1])==len(r[0]):r=list(zip(*r[::-1]))+[[]]par if len(r[-1])==len(r[0]):r=[*zip(*r[::-1]),[]]pour économiser 5 octets.
R. Kap

Comme vous ne l'utilisez rangequ'une seule fois, vous pouvez le supprimer Rpour économiser des octets. Vous pouvez également économiser des octets en convertissant votre réponse en un programme complet, mais pour conserver l'utilisation de [*zip(*r[::-1]),[]], vous devrez utiliser range(int(input())).
Sherlock9

De plus, 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)]puisque vous vérifiez quand la dernière ligne est égale ou supérieure à la première ligne.
Sherlock9

Deux choses: 1) Vous pouvez faire de la boucle for une ligne en séparant les instructions par des points-virgules; et 2) vous n'avez pas défini ndans cette version. Vous devez int(input())soit utiliser, soit envelopper dans une fonction.
Sherlock9

2 octets de la condensation de la forboucle: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 octets

X^Xk1YL1Y2y)wG>~*c

L'entrée se 0termine avec une erreur (ce qui est autorisé par défaut ).

Essayez-le en ligne!

Explication

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 octets

J'utilise à nouveau Turtle. C'est tellement amusant! :RÉ

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

Essayez-le en ligne

Malheureusement, Trinket.io a une toile horriblement petite. J'ai changé 9+ià 9+i/9et ajusté le point de départ de la tortue dans le but de l' écran de capture cette image, de sorte que plus de la sortie cadrerait:

sortie


Un octet de si vous supprimez un espace de l'importation: from turtle import*et un autre de passer de whileàfor i in range(input())
Sherlock9

4

Pyth, 32 octets

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

Un programme qui imprime une spirale ASCII rectangulaire en minuscules. Selon l'entrée, une ligne ou une colonne d'espaces blancs de début ou de fin peut être présente.

Essayez-le en ligne

Comment ça marche

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 octets

Veuillez noter que TSQL n'a aucun moyen de faire pivoter le texte. Ce script part de A et calcule dans quelle direction la prochaine lettre doit être placée. (droite, bas, gauche, gauche, gauche, haut, haut, droite ...)

Le script peut gérer un maximum de 7744 lettres.

Golfé:

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

Non golfé:

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

Violon


2

Python 2, 243 octets

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 it!


0

PHP , 219 octets

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

Essayez-le en ligne!

PHP, 260 octets

Ancienne 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";}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.