Una spirale ASCII ben spaziata


13

Considera questa spirale

###########
#
# #######
# #     #
# # ### #
# # # # #
# # # # #
# #   # #
# ##### #
#       #
#########

A partire dal centro:

  • La prima riga (verso l'alto) ha 3 caratteri.
  • La seconda riga ha lo stesso numero di caratteri (3)
  • Quindi, aggiungiamo due caratteri (5) per i due lati successivi.
  • Questo motivo continua, due lati della stessa lunghezza quindi aumentano la lunghezza di 2.

Voglio generare questa spirale per N linee.

  • Scrivi in ​​qualsiasi lingua.
  • L'input / argomento, ecc. È il numero di righe nella spirale.
  • Ogni riga inizia con il carattere finale della riga precedente nella direzione di 90 gradi in senso orario della riga precedente.
  • Non mi interessa quanto spazio bianco sia prima o dopo ogni riga, purché gli elementi della spirale si allineino.
  • Stampa il testo per disegnare la spirale con qualsiasi carattere non bianco che scegli.
  • Tentare di farlo nel minor numero di byte.

Casi di test (utilizzando un hash come output):

N = 1

#
#
#

N = 2

###
#
#

N = 3

###
# #
# #
  #
  #

N = 10

###########
#
# #######
# #     #
# # ### #
# # # # #
# # # # #
# #   # #
# ##### #
#       #
#########

@Shaggy "Stampa il testo per disegnare la spirale con qualsiasi carattere non bianco che scegli." Sì, qualunque cosa tu voglia.
AJFaraday,


3
L'immagine iniziale ha un *invece di #. Previsto?
Wernisch,

@Wernisch Doveva essere un utile punto di partenza, ma suppongo che sia fuorviante. Puoi usare qualsiasi personaggio che ti piace.
AJFaraday,

Risposte:


11

05AB1E , 13 11 byte

Codice:

Grazie a Emigna per aver salvato due byte!

LDÈ-Ì'#3Ý·Λ

Utilizza 05AB1E codifica . Provalo online!

Spiegazione

Le lunghezze di ogni singolo bordo della spirale iniziano con la lunghezza 3 e aumentano gradualmente ogni due passi di due:

3,3,5,5,7,7,9,...

nn

L                # Create a list from [1 .. input]
 DÈ              # Duplicate and check for each number if even
   -             # Subtract that from the first list
    Ì            # Add 2

Questo in sostanza ci dà l'elenco desiderato di lunghezze.

     '#          # Push the '#' character
       0246S     # Push the array [0, 2, 4, 6]
            Λ    # Write to canvas

Le opere tela come funzione che appare tre parametri (dove il parametro più a destra viene estratto prima): <lunghezza (i)> , <char (s)> , <direzione (s)> . Il parametro direzioni è in questo caso un elenco di numeri. I numeri che corrispondono alle indicazioni sono:

[70162543]

In questo caso, [0, 2, 4, 6] corrisponde all'elenco delle direzioni [↑, →, ↓, ←]. La tela scorre su ogni lunghezza recuperata dall'elenco delle lunghezze, usa il carattere '#' e ciclica ciclicamente sull'elenco delle direzioni.


0246S=3Ý·
Emigna,

@Emigna Ah non ci avevo pensato, grazie!
Adnan,

6

Python 2 , 176 170 165 161 157 byte

g=lambda a,r:r and g(map(''.join,zip(*a))[::-1],r-1)or a
R=['#']
n=1
exec"R=g(['  '+l for l in g(R,n)][:-1]+[(n+2)*'#'],3*n);n+=1;"*input()
print'\n'.join(R)

Provalo online!

Ripetutamente: utilizza gper ruotare la niterazione della spirale in una posizione "canonica" (simile a N = 3 o N = 7), aggiunge un nuovo segmento aggiungendo 2 spazi a sinistra di ogni riga esistente, quindi sostituendo l'ultima riga con tutte le '#'s (risultante in una posizione paragonabile a N = 4 o N = 8), e infine griutilizzando per riportarlo nella posizione corretta. Raccogliere, sciacquare, ripetere.


4

Carbone , 16 15 14 byte

↶FN«¶×#⁺³⊗÷ι²↷

-2 byte grazie a @Neil .

Provalo online (dettagliato) o Provalo online (puro) .

Spiegazione:

La direzione di stampa è a destra per impostazione predefinita e vogliamo iniziare verso l'alto, quindi iniziamo ruotando di 45 gradi in senso antiorario:

PivotLeft();
↶

Quindi loop inell'intervallo [0, input):

For(InputNumber()){ ... }
FN« ...

Stampa una nuova riga per imitare l'effetto di tornare indietro di una posizione:

Print("\n");
¶

Stampa "#" il xnumero di volte nella direzione corrente:

Print(Times("#", ... ));
×# ...

Dove si xtrova 3 + i // 2 * 2::

Add(3,Doubled(IntegerDivide(i,2))
⁺³⊗÷ι²

E quindi ruota di 45 gradi in senso orario per la successiva iterazione del loop:

PivotRight();
↷

Presumo che non ci sia alcun comando in Carbone per spostarsi indietro?
Emigna,

@Emigna Non sono sicuro, ma non sono riuscito a trovarlo neanche. In effetti stavo cercando uno me stesso quando stavo scrivendo questa risposta. C'è un Move con una data direzione, così come un Jump con determinate coordinate, ma sfortunatamente non un MoveBack.
Kevin Cruijssen,

1
⊗÷ι²è un byte più corto di ⁻ι﹪ι². Inoltre, puoi ottenere l'effetto di tornare indietro stampando una \nprima della #s, che ti permetterà di rimuovere la »#per un ulteriore risparmio di byte complessivo.
Neil,

@Neil Grazie per il ⊗÷ι², ma quali sarebbero le modifiche per la stampa di una \nprima della #s? La spirale non è corretta se aggiungo ilPrint("\n") .
Kevin Cruijssen,

Poiché le braccia ora si sovrappongono, è necessario #allungarle ulteriormente .
Neil,

3

Python 2 , 179 178 byte

grazie a Kevin Cruijssen per -1 byte.

n=input()
S,H=' #'
m=[S*n]*(n%2-~n)
x=n/4*2
y=0--n/4*2
k=2
m[y]=S*x+H+S*n
M=[1,0,-1,0]*n
exec'exec k/2*2*"x+=M[~k];y+=M[k];m[y]=m[y][:x]+H+m[y][x+1:];";k+=1;'*n
print'\n'.join(m)

Provalo online!


Python 2 , 179 byte

In questo approccio vengono utilizzate le formule xe i ydelta anziché un elenco di ricerca.

n=input()
S,H=' #'
m=[S*n]*(n%2-~n)
x=n/4*2
y=0--n/4*2
k=2
m[y]=S*x+H+S*n
exec'exec k/2*2*"x+=k%-2+k%4/3*2;y-=(k%2or k%4)-1;m[y]=m[y][:x]+H+m[y][x+1:];";k+=1;'*n
print'\n'.join(m)

Provalo online!


n+1+n%2a n%2-~nper -1 byte. E devo ricordare di 0--n/4*2essere 1 in meno di -(-n/4*2). Bella risposta, +1 da parte mia.
Kevin Cruijssen,

1

JavaScript (ES6), 185 byte

Certo questo può essere giocato a golf di più, forse con il curry, ma ecco il mio tentativo molto umile. Le interruzioni di riga sono state aggiunte per la leggibilità tranne il penultimo carattere

r=(a,n=1)=>n?r(a.reduce((_,c)=>c).map((_,i)=>a.map(e=>e[i])).reverse(),n-1):a,
s=n=>n?r(s(n-1)).map((r,i)=>[...r,w,w].map(x=>i?x:'#')):[[w=' ']],
d=n=>r(s(n),1-i).map(r=>r.join``).join`
`

Utilizzo: d(10)restituisce una stringa come nell'esempio di sfida N = 10.

Definisce una funzione r(a,n)per ruotare una matrice aa nturno; una funzione s(n)per generare un array bidimensionale che rappresenta una spirale di dimensioni nruotando in modo ricorsivo e aggiungendo spaziature e linee (non ruotate di nuovo alla posizione iniziale); e una funzione d(n)per disegnare una spirale di dimensioni n, ruotata in modo coerente secondo la sfida e resa come una stringa restituita.

Questa è stata una sfida davvero divertente: ¬)

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.