Diamondize Some Text


20

Data una stringa di input di lunghezza 2o più lunga costituita esclusivamente da caratteri alfabetici [A-Z]o[a-z] (a scelta se sono tutti maiuscoli o tutti minuscoli), emette una stringa continua di caratteri che formano un doppio motivo a diamante.

La stringa di input inizia sulla linea centrale e si estende verso il basso e verso destra in diagonale fino a raggiungere la fine della stringa di input. Quindi, il motivo continua in alto e a destra in diagonale fino a quando non si è al di sopra della linea centrale quanto la lunghezza della stringa di input meno 1. Continuare verso il basso e verso destra fino alla linea centrale, quindi verso il basso e verso il basso sinistra, poi su e sinistra (andando "dietro" il personaggio centrale) e infine giù e sinistra di nuovo al personaggio iniziale.

È un po 'prolisso, ed è meglio dimostrato da alcuni esempi:

"YOU"
  U   Y
 Y O U O
Y   O   U
 O Y U Y
  U   O

  ^   ^
 ↙ ↖ ↗ ↘
↘   ↗   >
 ↘ ↗ ↖ ↙
  V   V

Guarda come YOUinizia alla linea centrale e segue in basso e a destra, poi in alto e a destra, ecc., Fino a quando non torna indietro. Nota in particolare come la parte Yin alto e a sinistra è "dietro" Oe quindi non mostrata.

Alcuni altri esempi:

"HI"
 I I
H H H
 I I

"TEST"
   E     E
  S T   T S
 T   T T   T
T     S     T
 E   E E   E
  S T   T S
   T     T

"HELLO"
    L       L
   O L     E L
  H   E   H   O
 E     H O     H
H       L       E
 E     L L     L
  L   E   L   L
   L H     E O
    O       H

  • Input e output possono essere forniti con qualsiasi metodo conveniente .
  • È garantito che l'input sia lungo almeno due lettere (ovvero, non riceverai mai ""come input).
  • È possibile stamparlo su STDOUT o restituirlo come risultato di una funzione.
  • È accettabile un programma completo o una funzione.
  • È accettabile qualsiasi quantità di spazio bianco estraneo, purché i caratteri siano allineati in modo appropriato (ad esempio, sentiti libero di riempire come un rettangolo).
  • Sono vietate le scappatoie standard .
  • Si tratta di quindi si applicano tutte le normali regole del golf e vince il codice più breve (in byte).

Non sei sicuro che sia importante, davvero, ma perché il secondo passaggio (in alto a sinistra) passa dietro il primo passaggio (in alto a destra)? Ha un senso meno intuitivo e anche un po 'fastidioso per saltare o ridisegnare quella lettera.
BradC

2
@BradC Stavo giocando con una striscia Möbius alla mia scrivania quando mi è venuta in mente la sfida, e la striscia va un po '"indietro", ecco perché. Nessun altro motivo.
AdmBorkBork,

Potrebbe essere un'idea includere un "disegno" del percorso usando i caratteri freccia, per aiutarci a visualizzarlo.
Shaggy

@Shaggy Aggiunto un disegno.
AdmBorkBork,

Bello, questo è più impegnativo del primo colpo d'occhio ..
booshlinux il

Risposte:


10

Carbone , 17 byte

GH<↗↘>↖↙LθθGH<Lθθ

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

GH

Disegna lungo un percorso.

<↗↘>↖↙

Disegna nelle direzioni ↘↗↗↘↙↖↖↙ (le <e >sono shorthands per quelle due coppie, ma le altre coppie non hanno shorthands.)

Lθ

Ogni segmento di percorso ha la stessa lunghezza, comprese le estremità, della lunghezza dell'input.

θ

Utilizzare l'input come testo da scrivere lungo il percorso.

GH<Lθθ

Stampa di nuovo le prime due parti del percorso in modo che il carattere medio sia corretto.


3
Questa sfida sembra fatta su misura per Charcoal
Jonah il

@Jonah Purtroppo, il comando del percorso del testo non disegna l'ultimo carattere se il percorso è chiuso, quindi non puoi usare il trucco del disegno inverso qui. (Anche se in tal caso, sarebbe lo stesso conteggio dei byte, poiché ruotare la stringa costa 6 byte.)
Neil

9

05AB1E , 12 byte

gIR7._•Íη•Λ

Provalo online!

           Λ    use the canvas function
g               with the length of input for each segment
 IR7._          the input reversed and rotated left by 7 characters (we will draw this backwards to have the right center character)
      •Íη•     and the directions 1, 3, 3, 1, 7, 5, 5, 7 as a compressed number. 

Volevi dire 1, 3, 3, 1, 7, 5, 5, 7?
Neil

Oh, hai ragione. Ho mescolato un po 'i numeri
Dorian il

6

JavaScript (ES6),  157 155  154 byte

Restituisce una matrice di caratteri.

s=>(y=n=s.length,y+=i=X=Y=-1,m=[...Array(y+n)].map(_=>r=Array(4*n-3).fill` `),g=x=>x?g(x-=r[m[y][++i==6*n-6||+x]=s[i%n],y-=m[y-Y]?Y:Y=-Y,x-X]?X:X=-X):m)``

Provalo online!

Come?

nw×h

  • w=4n-3
  • h=2n-1

(0,n-1)

L'indice in base 0 del carattere centrale che deve essere ignorato a forma di diamante è:

p=6n-6

n=4 :

inserisci qui la descrizione dell'immagine

Commentate

s => (                           // s = input string
  y = n = s.length,              // n = length of s
  y += i = X = Y = -1,           // y = n - 1; i = X = Y = -1
  m =                            // create a matrix m[]:
    [...Array(y + n)].map(_ =>   //   - of height 2n-1
      r = Array(4 * n - 3)       //   - of width 4n-3 (save one of these rows in r[])
          .fill` `               //   - initially filled with spaces
    ),                           //
    g = x =>                     // g is a recursive function taking x
      x ?                        //   if x is truthy:
        g(                       //     do a recursive call:
          x -= r[                //       update x:
            m[y][                //         update m[y][x]:
              ++i == 6 * n - 6   //           unless this is the 2nd pass through the
              || +x              //           center cell, set it to the next character
            ] = s[i % n],        //           in s (otherwise we write to m[y][true]
                                 //           instead, which has no effect)
            y -=                 //         update y:
              m[y - Y] ? Y       //           bounce vertically if m[y - Y] is undefined
                       : Y = -Y, //
            x - X                //         bounce horizontally
          ] ? X                  //         if r[x - X] is undefined
            : X = -X             //
        )                        //     end of recursive call
      :                          //   else:
        m                        //     stop recursion and return m[]
)``                              // initial call to g with x = [''] (zero-ish but truthy)

Ho una soluzione a 136 byte che si ispira alla tua soluzione, anche se penso che ormai potrebbe essere abbastanza diverso da qualificarsi come risposta separata.
Neil,

@Neil Probabilmente dovresti pubblicarlo come una nuova risposta.
Arnauld

3

JavaScript (ES6), 136 byte

f=
(s,l=s.length-1,z=l*4,a=[...Array(l-~l)].map(_=>Array(z+1).fill` `),g=x=>x--?g(x,a[a[y=(x+l)%z]?y:z-y][x>z?z+z-x:x]=s[x%-~l]):a)=>g(z+z)
<input oninput=o.textContent=f(this.value).map(c=&gt;c.join``).join`\n`><pre id=o>

Restituisce un array bidimensionale. Funziona disegnando la stringa nell'array calcolando direttamente le coordinate di destinazione lavorando all'indietro dalla fine in modo che la cella centrale venga sovrascritta automaticamente. Spiegazione:

(s

Stringa di input.

,l=s.length-1

Distanza tra "rimbalzi", anche metà dell'indice dell'ultima riga e uno in meno della lunghezza.

,z=l*4

Indice dell'ultima colonna, anche metà della lunghezza del testo da disegnare.

,a=[...Array(l-~l)].map(_=>Array(z+1).fill` `)

Matrice di spazi.

,g=x=>x--

Conto alla rovescia dall'ultima cella alla prima.

  ?g(x

Chiamata ricorsiva per elaborare le celle rimanenti.

    ,a[a[y=(x+l)%z]?y:z-y]

Calcola la riga di questa cella.

      [x>z?z+z-x:x]=s[x%-~l])

Calcola la colonna di questa cella e il carattere che vi appartiene.

  :a

Termina restituendo l'array.

)=>g(z+z)

Inizia alla fine del testo.




1

C (clang) , 201 196 188 byte

x,y,i,v,m,n;f(s,z){char*a=s,o[i=(y=z*2-1)*(x=y+y)];for(v=x*2-2;i;n=m=1)o[--i]=i%x?32:10;for(i=x*--z;v--;i+=x*m+n)o[i]==32?o[i]=*a:0,a=*++a?a:s,n=i%x>x-3?-1:n,m=i/x?i/x<y-1?m:-1:1;puts(o);}

Provalo online!

-13 suggerimenti @ceilingcat


0

Python 2 , 137 byte

s=input();n=len(s);m=2*n-2
for r in range(m+1):print''.join([s[[x,-8-x][(x<=m)==(m>2*r)]%n],' '][r!=(x+1-n)%m!=m-r]for x in range(4*n-3))

Provalo online!

Un programma completo che accetta una stringa come input mentre stampa la versione diamantata.

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.