Una "volpe marrone rapida" zelante "saltata" lungo la spirale Groovy


12

introduzione

Scrivi un programma per generare la spirale in uscita del famoso pangramma seguendo le regole date.

Sfida

Un pangram è una frase che usa ogni lettera di un dato alfabeto almeno una volta. Uno dei più famosi pangrammi è quello ampiamente utilizzato nel visualizzatore di font di Windows, ovvero " La rapida volpe marrone salta sul cane pigro ". La sfida è produrre una spirale basata su questo testo.

Alla tua attività viene inviato questo testo esatto:

heeeeellllllllllllazzzzzzzzzzz
hummmmmmmmmmmmmppppppppppppppy
hubrrrrrrrrrrrrrrrrrrooooooosy
hukyddddoooooooooooooooggggwsy
hukyveeeeerrrrrrrrrrrrrrrrtwsy
hukyvxjjjjjjjjjjuuuuuuuuuttwsy
hukyvxkbbrrrrrrrrrrrrrrrmttwsy
hukyvxkogggggggttttttttomttwsy
tukyvokoellllllllllllahomttwsy
tukyvokoeovvvvvvvvvvvzhomttwsy
tukyvocoeoummmmmmmmmezhomttwsy
tukyvocoeoufooooooopezhomttwsy
tukyvocohoufroooooxpezhomttwsy
tukyvoiohoufrquuuwxpezhomttwsy
tucyvoiohoufbqttiwxpezhomttwsy
tucyvoiohoufbeehiwxprzhomttwsy
tucyvoiohoufkccciwxprzeomttwsy
tjiyvoidhounnnnnnwxprzeomttwsy
tjiyvoidhojjjjjjjjxprzeomttwsy
tjiyvoidhssssssssssprzeopttwsy
tjiyvoidttttttttttttrzeopttwsy
tjiyvoiyyyyyyyyyyyyyyzqopttwoy
tjiyvouuuuuuuuuuuuuuuuqwpttwoy
tjiyvffffnnnnnnnnnnnnnnwpttwoy
tjiyossssssssssssssssssspthwoy
tjizzzzalllllllllllleeeeehhwoy
tjuuqqqqqqqqqqqqqqqqqeeeeehnod
txxxxxoooooooooooooooffffffnod
reeeeevvvvvvvvvvvvvvvvvvvvvvod
       gggggggoooooooooooooood

Ecco come viene generato,

  • C'era una volpe zelante che si godeva il pangram "La rapida volpe marrone salta sul cane pigro". Un giorno era al centro di una spirale esterna e decise di saltarci dentro e dipingere.
  • Vorrebbe scorrere il diagramma dall'inizio alla fine, e se una lettera è l'ennesima lettera dell'alfabeto, vorrebbe dipingerla n volte.
  • Tuttavia, la volpe non era molto brava a girare gli angoli, quindi al raggiungimento di ogni angolo doveva anche fermarsi e passare alla lettera successiva.
  • Decise anche di ripetere il pangram tre volte per sottolineare che è la veloce volpe marrone.
  • Il tuo compito è mostrare come sarebbe la spirale dopo che la volpe avesse dipinto tutte quelle lettere.

(Versione normale senza narrazione)

  • Il famoso pangramma "La rapida volpe marrone salta sopra il cane pigro" viene ripetuto tre volte, con gli spazi rimossi e tutte le lettere in minuscolo, per generare

    thequickbrownfoxjumpsoverthelazydogthequickbrownfoxjumpsoverthelazydogthequickbrownfoxjumpsoverthelazydog
    
  • La spirale inizia dal centro e inizia con la lettera "t", inizia andando a destra e va verso l'esterno in senso orario. Se il carattere corrente è la nona lettera dell'alfabeto, passa ogni volta al carattere successivo

    • la spirale raggiunge un angolo, o
    • le lettere correnti vengono stampate esattamente n volte.

Per illustrarlo meglio, spiegherò come viene generata la spirale correlata alle prime tre parole "thequickbrown".

 rooooo
 rquuuw
 bqttiw
 beehiw
 kccciw
nnnnnnw

La volpe inizia da "t", va a destra, raggiunge la 1a curva, la dipinge con la "t" e poi passa a "h" e scende, raggiunge la 2a curva, passa a "e" e va a sinistra, raggiunge la 3a curva, passa a "q" e sale, raggiunge la 4a curva, passa a "u" e va a destra, raggiunge un angolo e passa a "i", scende, raggiunge un angolo e passa a "c", va a sinistra, dipinge con successo 3 "c" s prima di raggiungere l'angolo successivo , passa a "k" e prosegue a sinistra , raggiunge subito un angolo, passa a "b" e sale, dipinge 2 "b" s prima di raggiungere nell'angolo successivo, passa a "r"e prosegue verso l'alto , raggiunge un angolo e passa a "o", va a destra, quindi "w", in basso, "n", a sinistra.

Specifiche

  • È possibile accettare un input facoltativo che contiene qualsiasi forma standard della stringa

    thequickbrownfoxjumpsoverthelazydogthequickbrownfoxjumpsoverthelazydogthequickbrownfoxjumpsoverthelazydog
    
  • L'output deve essere formattato come stringa e deve passare a STDOUT anziché a file o STDERR, con le nuove righe posizionate correttamente. L'intestazione e il trascinamento di righe vuote non contano. Gli spazi di intestazione e di coda in ogni riga sono consentiti, ma devono essere coerenti. Quindi, se aggiungi 5 spazi prima di una riga del testo dato, dovrai aggiungere esattamente 5 spazi prima di ogni riga in modo che la spirale appaia uguale.

  • Questo è , vince il numero più basso di byte.

  • Come al solito, qui si applicano scappatoie predefinite .


Le spiegazioni sono benvenute, sebbene non necessarie.

Titolo modificato per renderlo un diagramma per commento di caird coinheringaahing.

Il cane pigro è troppo pigro per apparire nella storia.

Sto mirando a creare una sfida stringa in cui la lettera da emettere non può essere calcolata da semplici funzioni delle coordinate.


2
È un peccato che il titolo non sia un
pangram

@cairdcoinheringaahing Un buon punto, proverò a trovarne uno. Eventuali suggerimenti?
Weijun Zhou

4
@cairdcoinheringaahing Aggiornato
Weijun Zhou

Punto minore: la 'h' nel primo 'la' non dovrebbe essere ripetuta due volte, non la 't'?
mudkip201

@ mudkip201 L'angolo è dipinto con la lettera originale prima di passare al personaggio successivo. Forse dovrei chiarire.
Weijun Zhou

Risposte:


5

Stax , 35 34 33 32 byte

é╛îá%ⁿ┌○iê}→Ug=╩◙╘Ç⌐)QX↑L╓₧╗▌╧▬q

Eseguilo ed esegui il debug online

Stax è una lingua su cui lavoro da circa 6 mesi. Questo è il primo golf pubblico con esso. Andiamo al sodo.

Stax è normalmente scritto nel set di caratteri ASCII stampabile. Questo invio di 34 byte è racchiuso in una variante del set di caratteri CP437. La corrispondente rappresentazione ASCII è

't],{]_96-*~cHT,+nh%^(XUs&xH{rM}MF|<mr

Stax è un linguaggio basato su stack, ma ha due pile di dati, "principale" e "input". La maggior parte delle operazioni utilizza lo stack principale, ma l'input inizia sullo stack di input. Le istruzioni Stax sono principalmente sequenze ASCII di uno o due caratteri. Molti di essi sono sovraccarichi, il che significa che il loro comportamento è determinato dai primi pochi valori negli stack.

Ad un livello elevato, questo programma crea una griglia aggiungendo ripetutamente le stringhe all'ultima riga. Quando l'ultima riga si riempie, ruota la griglia in senso orario. Alla fine, riflette la griglia in orizzontale. Più in dettaglio, il programma funziona in questo modo.

't],{]_96-*~cHT,+nh%^(XUs&xH{rM}MF|<mr
't]                                         ["t"]
   ,                                        Pop from input, push to main ("thequick...")
    {                            F          For each character in input, execute block...
     ]_96-*                                 Produce string using character appropriate
                                                number of times (a=1, b=2, etc)
           ~                                Pop from main, push to input for use later
            cH                              Copy last row from grid.
              T                             Right-trim whitespace
               ,+                           Pop from input stack and append
                 nh%                        Get the width of the first row of the grid
                    ^                       Add 1
                     (                      Right-pad/truncate string to this length
                      X                     Store in the x register
                       Us&                  Overwrite last row of the grid with new value.
                          xH                Get the last element from x.
                                                Basically, the lower right corner.
                             {  }M         Conditionally execute block.  This will happen 
                                                when the bottom right corner isn't a space.
                              rM            Reverse and transpose (aka rotate clockwise)
                                  |<        Left-justify grid; give all rows equal size.
                                     m      For each row, execute the rest of the program
                                               and then print the result to output
                                      r     Reverse the row

Wow, sono davvero sorpreso che la sfida vedrà la prima apparizione pubblica nel golf per un linguaggio golfistico. Grazie mille per il vostro sostegno! Ti interessa la lingua del mese? Spero di vedere più utenti che lo usano e che presto comparirà nell'elenco dei candidati!
Weijun Zhou

@WeijunZhou: Intendi questo ? Non sapevo che fosse una cosa fino ad ora. Non mi dispiacerebbe una nomination. Sembra che potrebbe essere più adatto a linguaggi più affermati, ma non mi oppongo.
ricorsivo

Sì. Potrei nominarlo quando sarà meglio stabilito, come dici tu. Spero non ci vorrà molto.
Weijun Zhou

Poiché "lo spazio di direzione in ciascuna riga non ha importanza finché sono coerenti", è possibile salvare un altro byte se lo si desidera.
Weijun Zhou

1
Ho appena fatto una richiesta tramite Stax. Se lo desideri, puoi consigliarlo. Modifica: che coincidenza. Cercherò di imparare dalla tua presentazione.
Weijun Zhou,

11

Carbone , 66 40 36 byte

≔²ηFS«F¬η«¶↷⊞υη≔⊕÷Lυ²η¶»F⊕⌕βι¿η«≦⊖ηι

Provalo online! Il collegamento è alla versione dettagliata del codice. Modifica: salvato 16 byte prendendo il testo come input. Spiegazione:

≔²η

Inizia con 2 ts per qualche motivo.

FS«

Scorri tutte le lettere nel riquadro.

F¬η«

Abbiamo già raggiunto un angolo?

Spostati verso il basso (o qualunque sarà la direzione successiva) di una riga.

Ruotare la direzione di stampa di 90 ° in senso orario.

⊞υη≔⊕÷Lυ²η

Calcola la lunghezza del lato successivo.

¶»

Terminare il fissaggio della posizione del cursore. (Il carbone avrebbe preferito che il lato finisse appena prima dell'angolo, in modo da ruotare sull'angolo stesso.)

F⊕⌕βι

Ripeti ciclicamente quante volte la posizione della lettera corrente nell'alfabeto.

¿η«

Se non abbiamo raggiunto l'angolo,

≦⊖ηι

Decrementa il conteggio e stampa la lettera corrente.


Grazie. Ottimo lavoro e ben spiegato. Un piccolo errore di battitura: ci volte -> tre volte.
Weijun Zhou

Questa versione a 43 byte è accettabile anche in base alle specifiche. tio.run/##rY7NTsMwEITPzlNYPW2kcumVExJCikRRhLgBh9Rx4oV4nfon/…
Weijun Zhou

1
@WeijunZhou Grazie, non avevo notato quella clausola nella domanda prima.
Neil,

2

Rubino , 217 212 209 208 byte

->s{s+=' '*8
x=0
a=[""]*30
i=14
a[i]=?t
l=->{a[i]=s[x]+a[i]}
r=->{a[i]+=s[x]}
(0..58).map{|g|c=0
(0..g/2).map{c>s[x].ord-97&&(x+=1;c=0)
c+=1
eval %w{r i+=1;r l i-=1;l}[g%4]+"[]"}
x+=1}
a[-1].slice!0
$><<a*$/}

Provalo online!

Trascorre un bel po 'di tempo a gestire i puntatori, quindi potrebbe esserci spazio per più golf.

-5 byte: triplicare il pangram prima di immettere. Grazie a Weijun Zhou .

-3 byte: riempire la stringa di input e tagliare l'ultima gamba, invece di generare l'ultima gamba da zero.

-1 byte: utilizzare al &&posto di un operatore ternario con un valore usa e getta.

Spiegazione:

->s{
  s += " " * 8                             # These spaces will show on the bottom row
  x = 0                                    # x is a pointer into s
  a = [""] * 30                            # a is an array of row strings
  i = 14                                   # i is a pointer into a
  a[i] = ?t                                # "Starts with two t's for some reason"
  l = ->{ a[i] = s[x]+a[i] }               # lambda to prepend char x to row i
  r = ->{ a[i] += s[x] }                   # lambda to append char x to row i
  (0..57).map{|g|                          # There are 58 "legs" to the spiral
    c = 0                                  # c is the print count of s[x]
    (0..g/2).map{                          # Leg g has g/2+1 characters
      c > s[x].ord-97 && (x+=1;c=0)        # Possibly switch to next letter
      c += 1
      eval %w{r i+=1;r l i-=1;l}[g%4]+"[]" # Call the appropriate lambda
    }
    x += 1                                 # Definitely switch to next letter
  }
  a[-1].slice!0                            # Remove the first char from the bottom row
  $> << a*$/                               # Join with newlines and print
}

1
Bella presentazione e spiegazione chiara. Apprezzo l'uso di re llambdas. Sulla base delle risposte attuali, l'ultima tappa sembra essere un creatore di problemi, anche se non è stato quando ho scritto il mio frammento di C per generare l'output del campione ...
Weijun Zhou

1
Sembra che tu possa salvare del s*=3tutto e anche omettere 0l' ?:operatore. tio.run/…
Weijun Zhou

1
@WeijunZhou Ahh, grazie per la segnalazione. Ne ho bisogno 0, o Ruby tirerà su c+=1dalla riga successiva e la eseguirà solo la maggior parte del tempo. E bella sfida!
benj2240,

Hai ragione. Non sono sembrato abbastanza attento. Grazie per il tuo apprezzamento. Sono contento che ti sia piaciuto.
Weijun Zhou
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.