Asterisco a spirale


29

Data la spirale di dimensioni Se il gradino N, emette la S*Sspirale "quadrata" con Nasterischi, costruita dal raggio esterno a quello interno in senso orario.

Casi di prova (esempi) di seguito.

  1. Ingresso: 4 3

    Produzione:

    ***
    
  2. Ingresso: 4 6

    Produzione:

    ****
       *
       *
    
  3. Ingresso: 4 11

    Produzione:

    ****
       *
    *  *
    ****
    
  4. Ingresso: 6 18

    Produzione:

    ******
         *
         *
    *    *
    *    *
    ******
    
  5. Ingresso: 6 22

    Produzione:

    ******
    ***  *
    *    *
    *    *
    *    *
    ******
    
  6. Ingresso: 6 27

    Produzione:

    ******
    ******
    *   **
    *   **
    *   **
    ******
    
  7. Ingresso: 1 1

    Produzione:

    *
    

Non è necessario gestire i casi quando:

  • purché gli Nasterischi non possano "adattarsi" alla spirale di determinate S*Sdimensioni.

  • o No Sè zero.

La sfida è il code-golf, i byte più brevi rispondono alle vittorie, è possibile utilizzare qualsiasi lingua.

Il tuo output potrebbe avere tutti gli spazi / newline finali (ma non iniziali) che desideri.


Possiamo avere spazi finali / newline?
user202729

2
Definirei la S dimensione (o almeno il diametro ) anziché il raggio
Luis Mendo,

@Luis punto giusto!
nicael

3
Cari amici , votate anche le risposte, non solo le domande. È facile fare questa sfida. Fornire una risposta è (penso) decisamente più difficile.
nicael

2
Solo tu la pensi così. Scrivere una sfida ben accolta e chiara è molto difficile. (guarda il thread dei commenti proprio qui, ci sono alcuni suggerimenti dopo che la sfida è stata pubblicata)
user202729

Risposte:


16

MATL , 17 16 byte

UGlYLGoQ&P->42*c

Provalo online!

Spiegazione (con esempio)

Considera gli input 4e 11come esempio.

U       % Implicit input: S. Push S^2
        % STACK: 16
G       % Push S again
        % STACK: 16, 4
lYL     % Outward, clockwise, east-first spiral of that size
        % STACK: 16,
                 [ 7  8  9 10;
                   6  1  2 11;
                   5  4  3 12;
                  16 15 14 13]
GoQ     % Push S, compute parity, add 1. Gives 1 for even S, 2 for odd
        % STACK: 16,
                 [ 7  8  9 10;
                   6  1  2 11;
                   5  4  3 12;
                  16 15 14 13],
                 1
&P      % Flip along that dimension (1 is vertical, 2 is horizontal).
        % This corrects for the orientation of the spiral
        % STACK: 16,
                 [16 15 14 13;
                   5  4  3 12;
                   6  1  2 11;
                   7  8  9 10]
-       % Subtract, element-wise. The upper-left corner becomes 0
        % STACK: [ 0  1  2  3
                  11 12 13  4
                  10 15 14  5
                   9  8  7  6]
>       % Implicit input (below): N. Greater than?, element-wise.
        % This transforms the first N entries, starting from
        % upper-left, inward, east-first, into 1, and the rest
        % into 0
        % STACK: [1 1 1 1;
                  0 0 0 1;
                  1 0 0 1;
                  1 1 1 1]
42*     % Multiply each entry by 42
        % STACK: [42 42 42 42;
                   0  0  0 42;
                  42  0  0 42;
                  42 42 42 42]
c       % Convert to char. Char 0 will be displayed as space.
        % Implicit display
        % STACK: ['****';
                  '   *';
                  '*  *';
                  '****']

1
Caspita, non sono mai stato bravo a giocare a golf, ma risolverlo con 17 byte ... Sembra magico :) (So che probabilmente arrivano le risposte più brevi, ma tu sei la prima e ecco le mie impressioni :)
nicael

1
Parte del lavoro è svolta da una funzione a spirale integrata. Ho appena aggiunto una spiegazione
Luis Mendo,

@nicael Benvenuti nel mondo delle lingue del golf per scopi specifici. :)
Erik the Outgolfer

3
+1 per l'esempio completo accanto alla spiegazione
IanF1


6

Stax , 19 byte

±♪☺ÿzMæ¡♠à╣♂7☼V♀§9↓

Esegui ed esegui il debug

Inizia costruendo una stringa che abbia tutti i caratteri nel risultato con tutti gli asterischi allineati a sinistra. Quindi prende sezioni sempre più grandi dall'estremità della stringa e le "avvolge" attorno a una griglia mentre ruota la griglia.

Ecco lo stesso programma, decompresso, non modificato e commentato.

'**     repeat "*" specified number of times
,J(     square the top of the input stack, and right-pad string to that length
z       push an empty array - this is the result grid built up in the loop
{       begin a block to loop
  ~     push grid to the input stack
  ihNv  push -(i / 2) - 1 where i is the 0-based iteration index using integer division
  :/]   split the string at that index and wrap the second half in a singleton array
  ,     pop the grid from the input stack
  rM+   rotate the grid clockwise, then prepend the split string as the new first row
  n     copy what's left of the original string to top of stack for the loop condition
w       while; execute block until condition is truthy
m       display resulting grid

Esegui ed esegui il debug


2
Incredibilmente mi diverte il fatto che su Android questa risposta contenga uno smiley arancione.
StarWeaver

@StarWeaver Ci sono molte risposte in Stax che lo fanno.
Weijun Zhou

Ero davvero confuso quando ho letto la spiegazione e non ne ho visto uno. Pensavo solo che Stax avesse una tabella codici davvero strana!
ndm13,

@ ndm13: suppongo che abbia una strana codepage. Deriva da CP437 che è una codifica "reale" che ha lo stesso carattere. Dovresti vedere la stessa faccia sorridente se segui quel link sul tuo telefono.
ricorsivo

5

Python 2 , 117 byte

n,k=input()
i=0;d=1
l=(' '*n+'\n')*n
exec"l=l[:i]+'*'+l[i+1:];d=[~n/d*cmp(d*d,2),d][' '<l[i+d:]<'*'];i+=d;"*k
print l

Provalo online!


4

APL (Dyalog) , 65 byte

' *'[1+⎕>⊖∘⌽⍣o(⊖×⍨-,⍨⍴∘(⍋+\)×⍨↑(⌈2÷⍨×⍨),(+⍨⍴1,⊢,¯1,-)(/⍨)2/⍳)o←⎕]

Provalo online!

Il codice per la matrice a spirale è preso da un'altra mia risposta .


Il tuo codice disegna la spirale nella direzione sbagliata se Nè dispari :)
nicael

@nicael risolto (più come patchato). grazie
Uriel


Forse sto usando l'input nel modo sbagliato?
nicael

@nicael arghh. OK, penso che ora vada bene.
Uriel



3

Carbone , 34 byte

NθFE⮌E⊗N∨ι¹÷⁺鬬겫F‹θι≔θι×ι*≧⁻ιθ↷

Provalo online! Il collegamento è alla versione dettagliata del codice. Spiegazione:

Nθ

Input N.

FE⮌E⊗N∨ι¹÷⁺鬬겫

Le lunghezze dei bracci a spirale (esclusi gli angoli) sono S-1, S-1, S-1, S-2, S-2, S-3, ..., 3, 2, 2, 1, 1, 1. Questo si forma iniziando con l'intervallo da 0fino a ma escludendo 2S, modificando lo 0 in 1, invertendolo, aggiungendo 1 a ciascun elemento dopo il primo, e infine intero dividendo tutti gli elementi per 2. Questo elenco viene quindi ripetuto.

F‹θι≔θι

Se sono rimaste meno stelle da disegnare rispetto alla lunghezza del braccio successivo, ridurre il braccio a quella lunghezza.

×ι*

Disegna il numero appropriato di stelle.

≧⁻ιθ

Sottrai dal numero di stelle rimanenti.

Ruota la direzione del disegno di 90 ° in senso orario.


3

J, 60 56 byte

-4 byte modificando il processo di compilazione per la spirale in modo che non fosse necessario sottrarlo da y ^ 2

4 :'''* ''{~x<|."1|.(|:@|.,<:@{:@{:-i.@#)^:(+:<:y),.*:y'

Provalo online!

Spiegazione venire presto ora.

Spiegazione:

4 :'''* ''{~x<|."1|.(|:@|.,<:@{:@{:-i.@#)^:(+:<:y),.*:y'  | Explicit dyad definition
                    (|:@|.,<:@{:@{:-i.@#)^:(+:<:y),.*:y   | Generate a y by y inward spiral
                                                  ,.*:y   | The matrix [[y^2]]
                    (                   )^:(+:<:y)        | 2*(y-1) times...
                     |:@|.                                | Rotate
                          ,                               | Append
                                    i.@#                  | [0..len(n)-1]
                           <:@{:@{:-                      | Subtracted from the previous value and decremented
              |."1|.                                      | Flip around antidiagonal
            x>                                            | Test if each entry is less than x
    '' *''{~                                              | ' ' for 0, '*' for 1

Esempi:

   3 :'(|:@|.,<:@{:@{:-i.@#)^:(+:<:y),.*:y' 4
7  8  9 10
6 15 16 11
5 14 13 12
4  3  2  1
   3 :'|."1|.(|:@|.,<:@{:@{:-i.@#)^:(+:<:y),.*:y' 4
1  2  3 4
12 13 14 5
11 16 15 6
10  9  8 7
   11(4 :'x<|."1|.(|:@|.,<:@{:@{:-i.@#)^:(+:<:y),.*:y') 4
0 0 0 0
1 1 1 0
0 1 1 0
0 0 0 0
   11(4 :'''* ''{~x<|."1|.(|:@|.,<:@{:@{:-i.@#)^:(+:<:y),.*:y') 4
****
   *
*  *
****

Puoi anche aggiungere un link all'esempio eseguibile?
nicael

@nicael Aggiunto :)
Bolce Bussiere

2

Kotlin , 361 355 353 334 byte

6 byte salvati grazie a Jonathan
2 byte salvati cambiando in quando
19 byte salvano il passaggio a lambda e il rilevamento dei bordi esterni

{s:Int,n:Int->var a=Array(s,{_->Array(s,{_->' '})})
var r=0
var c=0
var d=0
var e=0
var f=1
var g=s-1
var h=g
for(i in 1..n){a[r][c]='*'
when(d){0->if(c<g)c++
else{d=1
r++
g--}
1->if(r<h)r++
else{d=2
c--
h--}
2->if(c>e)c--
else{d=3
r--
e++}
3->if(r>f)r--
else{d=0
c++
f++}}}
for(i in 0..s-1){for(j in 0..s-1)print(a[i][j])
println()}}

Provalo online!


1
Non sono davvero sicuro di come provarlo poiché il campo di input è vuoto.
nicael

1
@nicael È una funzione. questo può essere più facile da usare: la chiamata viene effettuata nel piè di pagina.
Jonathan Allan,

1
Non conosco molto Kotlin ma credo che ==' 'possa essere sostituito da <'*'. Anche d==0con d<1e d==3con d>2. Questi sembrano golf piuttosto fondamentali, quindi probabilmente ce ne sono anche altri!
Jonathan Allan,

@nicael puoi inserire due numeri interi nel campo di input, dimensione sulla prima riga, numero sulla seconda.
JohnWells,

1
@JohnWells, in effetti, funziona. In qualche modo è troppo lento, ma non importa.
nicael

2

Java 10, 284 282 281 263 byte

s->n->{var c=new char[s][s];for(var d:c)java.util.Arrays.fill(d,' ');for(int i=0,j=0,y=0,x=1,u=s-1,l=0;n-->0;c[j][i]=42,i+=x,j+=y,l+=i==l&x==0?1:0,u-=i==l&j==l&y<1?1:0)if(x!=0){var b=x>0?i<u:i>l;y=b?0:x;x=b?x:0;}else{var b=y>0?j<u:j>l;x=b?0:-y;y=b?y:0;}return c;}

Una sfida divertente!

Provalo online qui .

Grazie a Kevin Cruijssen per il golf 18 byte.

Versione non golfata:

s -> n -> { // lambda taking two integer arguments in currying syntax
    var c = new char[s][s]; // the matrix containing the spiral
    for(var d : c) // for every row
        java.util.Arrays.fill(d, ' '); // fill it with spaces
    for(int i = 0, j = 0, // the coordinates of the next '*'
            y = 0, x = 1, // the direction to move in
            u = s-1, l = 0; // the upper and lower bounds
        n-- > 0; // decrecement the length of the spiral and repeat as many times
        c[j][i] = 42, // draw the '*', 42 is ASCII code
        i += x, j += y, // move to the next cell
        l += i == l & x == 0 ? 1 : 0, // adjust lower bound if necessary
        u -= i == l & j == l & y < 1 ? 1 : 0) // adjust upper bound if necessary
        if(x != 0) { // if moving in x direction
            var b = x > 0 ? i < u : i > l; // if we hit the bounds
            y = b ? 0 : x; // flip directions,
            x = b ? x : 0; // turning around
        } else { // if moving in y direction
            var b = y > 0 ? j < u : j > l; // if we hit the bounds
            x = b ? 0 : -y; // flip directions,
            y = b ? y : 0;  // turning around
        }
    return c; // return the matrix
}

263 byte Gli ultimi due loop vengono modificati principalmente e var bviene aggiunto un, quindi è necessario eseguire solo x>0?i<u:i>le y>0?j<u:j>luna volta ciascuno, anziché due volte ciascuno.
Kevin Cruijssen,

@KevinCruijssen ottimo golf, grazie!
OOBalance,

2

JavaScript (Node.js) , 167 164 163 byte

  • grazie a @Erik the Outgolfer e @nicael per gli spazi (3 byte)
  • grazie a @micha per join``split ,invece di map (1 byte)
(l,s)=>{a=(b=[...Array(l)]).map(x=>b.map(_=>" "))
for(d=1,x=y=D=0;s--;x+=d,y+=D)a[y][x]="*",(a[y+D]||[])[x+d]!=" "?[d,D]=[-D,d]:0
return a.join`
`.split`,`.join``}

Provalo online!


1
Bello, funziona! Riesci a rimuovere spazi / newline per renderlo ancora più breve?
nicael


1
Bellissimo! Se Kotlin e la versione Java usassero lo stesso metodo sarebbero molto più brevi! Un modo così elegante di rilevare quando colpisci la spirale o il bordo e poi giri la "tartaruga". Molto intelligente! Un byte in meno: modifica il ritorno in return a.join` `.split`,`.join``.
micha,

@micha innanzitutto grazie :). secondo a.join` .split, `.join`` non emette la spirale" bene "(con nuove linee) quindi penso che sia un problema
DanielIndie

@DanielIndie, la nuova riga è stata formattata, il primo join dovrebbe avere una nuova riga. Guardalo
Micha
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.