Rotoli l'alfabeto in una spirale


22

Scrivi un programma o una funzione che, una volta dato n, stamperà una spirale di ncaratteri costituiti a lungo dall'alfabeto latino ABCDEFGHIJKLMNOPQRSTUVWXYZripetuti secondo necessità. Questa spirale dovrebbe attraversare l'alfabeto solo in avanti.

Relativo alla spirale dell'alfabeto , sebbene la spirale attraversi l'alfabeto avanti e indietro e la spirale è costante.

Casi 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

Regole

  • Il tuo input sarà un numero intero non negativo 0 <= n <= 1000, ma il tuo codice dovrebbe teoricamente gestire qualsiasi numero intero non negativo.
  • Il formato di output può essere in qualsiasi formato sano, con delimitatori se necessario.
  • Rotazioni e riflessioni sono equivalenti.
  • L'alfabeto può essere maiuscolo o minuscolo.
  • Gli spazi vuoti nella tua spirale possono essere riempiti con qualsiasi null non alfabetico che ritieni opportuno.
  • La spirale stessa può essere in qualsiasi forma ritenga opportuno. Le spirali rettangolari funzionano meglio con le soluzioni ASCII, ma le soluzioni grafiche possono essere più brevi con le spirali circolari.
  • Sono ammessi spazi iniziali e finali e newline.
  • Questo è il codice golf. Vince la risposta più breve in byte (o equivalente).

Come sempre, se qualcosa non è chiaro o errato, per favore fatemi sapere nei commenti. Buona fortuna e buon golf!


la maggior parte dei redattori non consentirà di stampare una stringa così lunga
t-clausen.dk

@ t-clausen.dk Sono andato con il massimo intero a 32 bit con firma standard. Se hai un suggerimento migliore per un limite superiore, sarei felice di modificarlo.
Sherlock9

Bello e difficile :-)
Joffan

Risposte:


12

Logo, 129 87 byte

Soluzione grafica, implementata come funzione

Questo è stato costruito sull'interprete Logo di Calormen.com . La Sfunzione prende il numero di caratteri come parametro e li disegna in una spirale. La Tfunzione emette le lettere in posizione verticale per impedire loro di ruotare con la spirale. . Ho deciso che sembrava più bello (e tirato fuori 42 byte ) omettere di correggere l'orientamento della lettera. Ho anche stretto la spaziatura che non ha modificato il conteggio dei byte. Se dovessi effettivamente arrotolare un alfabeto, sembrerebbe comunque più simile a questo.

Versione aggiornata (rotolo di lettere)

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

Invocazione

Invocare come segue: S iterazioni

Uscita campione

S 1000

Output di esempio per 1000 iterazioni

Vecchia versione (lettere sempre in posizione verticale)

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

Vecchio output rimosso per risparmiare spazio. Vedi qui .


Non chiedere come mi è venuta la matematica. Ho provato a cercare formule online, ma la maggior parte ha risolto il problema mantenendo costante l'angolo di virata e aumentando la lunghezza del segmento, mentre volevo mantenere costante la lunghezza del segmento e cambiare l'angolo. Prove ed errori sembrano aver portato a una formula stabile. La regolazione della 95modifica della tenuta della spirale e la 15modifica della spaziatura lineare delle lettere.
GuitarPicker,

9

Javascript (ES6), 203 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`
`}

dimostrazione

La demo seguente dovrebbe essere eseguita preferibilmente a pagina intera.


7

R, 46 o 51 byte, a seconda della spaziatura

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

inserisci qui la descrizione dell'immagine

(versione aggiornata della trama: la spirale grigia non è tracciata di default ma l'ho aggiunta dopo per mostrare che le lettere si trovano effettivamente su una spirale.)

La spirale non ha una spaziatura costante, quindi spero che vada bene. Se è richiesta una spaziatura costante, iniziare con s=(1:scan())^.5invece e aggiungere 5 byte al totale. Quindi l'output è il seguente (n = 150):

inserisci qui la descrizione dell'immagine


3
Il modo in cui distanzi la spirale dipende completamente da te. Ho due suggerimenti, però: 1) Mantieni la seconda spirale. Aggiunge alla tua risposta anche se è meno golfy; 2) Riesci a disegnare una linea a spirale che passa attraverso le lettere nell'immagine della tua prima spirale? Solo per rendere più chiara la spirale dell'alfabeto.
Sherlock9

6

Python 3.5, 180 157 152 147 141 byte

-6 a causa di 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 a causa di 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')

Soluzione rivista, 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')

Soluzione precedente:

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

Spiegazione

rè un elenco di elenchi che contiene la spirale. L'idea di base è che nuove lettere vengono aggiunte alla riga inferiore della spirale ( r[-1].append(chr(x%26+65))). Quando la riga inferiore viene riempita, la spirale viene ruotata di 90 in senso orario e una nuova riga vuota viene aggiunta alla parte inferiore ( r = list(zip(*r[::-1]))+[[]]).

Il trucco è capire quando ruotare la spirale. Nella prima soluzione, il generatore (j<1for i in R(n)for j in R(i//2+1))produce una sequenza di valori Vero / Falso che indica quando ruotare la spirale. Nella soluzione rivista, ho cambiato il modo in cui rè inizializzato. Ora, quando la lunghezza della riga inferiore è uguale alla lunghezza della riga superiore, la spirale deve essere ruotata.


È possibile sostituire if len(r[-1])==len(r[0]):r=list(zip(*r[::-1]))+[[]]con if len(r[-1])==len(r[0]):r=[*zip(*r[::-1]),[]]per salvare 5 byte.
R. Kap

Dal momento che si utilizza solo rangeuna volta, è possibile rimuovere Rper salvare byte. Puoi anche salvare byte convertendo la tua risposta in un programma completo, anche se per preservarne l'uso [*zip(*r[::-1]),[]]dovrai utilizzarlo range(int(input())).
Sherlock9

Inoltre, 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)]poiché stai verificando quando l'ultima riga è uguale o superiore alla prima riga.
Sherlock9,

Due cose: 1) Puoi creare il ciclo for di una riga lunga separando le istruzioni con punti e virgola; e 2) non hai definito nin questa versione. O è necessario utilizzare int(input())o avvolgere il backup in una funzione.
Sherlock9,

2 byte dalla condensazione del forloop: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 byte

X^Xk1YL1Y2y)wG>~*c

L'input viene 0chiuso con un errore ( consentito per impostazione predefinita ).

Provalo online!

Spiegazione

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 byte

Sto usando di nuovo Turtle. È così divertente! : D

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

Provalo online

Sfortunatamente, Trinket.io ha una tela orribilmente piccola. Ho cambiato 9+iper 9+i/9e regolato punto di partenza della tartaruga allo scopo di cattura schermo questa immagine, in modo che più dell'uscita si adatterebbe:

produzione


Un byte da se si rimuove uno spazio dall'importazione: from turtle import*e un altro dal passaggio da whileafor i in range(input())
Sherlock9

4

Pyth, 32 byte

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

Un programma che stampa una spirale ASCII minuscola rettangolare. A seconda dell'input, potrebbe essere presente una riga o colonna di spazi bianchi iniziali o finali.

Provalo online

Come funziona

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 byte

Si noti che TSQL non ha un modo per ruotare il testo. Questo script parte da A e calcola in quale direzione deve essere posizionata la lettera successiva. (destra, giù, sinistra, sinistra, sinistra, su, su, destra ...)

Lo script può gestire un massimo di 7744 lettere.

golfed:

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

Violino


2

Python 2, 243 byte

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


0

PHP , 219 byte

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

Provalo online!

PHP, 260 byte

Vecchia versione

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";}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.