Porta l'arte ASCII nella terza dimensione


11

In questa sfida, devi portare l'arte ASCII (che di solito sono in 2D) in 3D!

Come?

come questo,

X X DD 
 X  D D
X X DD 

per...

  X X DD 
 X X DD D
X X DDDD 
 X XDDD
X X DD

Allora come facciamo quello ?

Vista l'arte ascii e N, ripeti questa Nvolta.

  • per ogni personaggio (lo chiameremo A):
  • lascia che Bsia il personaggio che è esattamente 1 a destra e 1 in suA
  • se Bè uno spazio o non è definito:
  • impostato Bsu A.

Specifiche

  • Il primo input può essere una stringa con caratteri di nuova riga o un elenco di stringhe che rappresentano l'arte ASCII 2D.
  • È consentito utilizzare %END%per contrassegnare la fine dell'input, ma ciò non è necessario.
  • Il secondo input sarà N. Sarà un numero intero positivo.
  • tutte le linee delle stringhe avranno la stessa lunghezza.

Esempi

Ingresso: ("###\n###",1)

Produzione:

 ###
####
###

Regole

Si applicano le regole base del .

Inoltre, se hai domande, assicurati di chiedere nei commenti!


Potresti voler chiarire che "vuoto" si riferisce allo spazio (U + 0020) o niente.
Leaky Nun,

@LeakyNun È stato risolto ora?

Sono ammessi spazi aggiuntivi?
Leaky Nun,

Sì, quelli sono ammessi.

1
Posso presumere che la lunghezza di ogni riga sarà la stessa? (Posso pre-pad dell'input con spazi sulla destra?)
Leaky Nun,

Risposte:


18

Perl, 81 byte

75 byte codice + 6 per -i -n0.
Si noti che i \ecaratteri sono ASCII \x1bma \evengono utilizzati per facilitare i test.

Si noti che questa soluzione utilizza sequenze di escape ANSI e richiede un terminale compatibile, oltre a utilizzare l' -iargomento della riga di comando per passare il numero di "dimensioni" che si desidera.

$n=s/^//mg-1;s/ /\e[1C/g;print(s/^/\e[${^I}C/grm."\e[${n}A"),--$^I for($_)x$^I

Uso:

In un terminale compatibile Linux, eseguire PS1=prima per assicurarsi che il prompt non sovrascriva l'immagine visualizzata.

perl -i10 -n0e '$n=s/^//mg-1;s/ /\e[1C/g;print(s/^/\e[${^I}C/grm."\e[${n}A"),--$^I for($_)x$^I' <<< ' 
ROFL:ROFL:ROFL:ROFL
         _^___
 L    __/   [] \    
LOL===__        \ 
 L      \________]
         I   I
        --------/
'

          ROFL:ROFL:ROFL:ROFL
         ROFL:ROFL:ROFL:ROFL
        ROFL:ROFL:ROFL:ROFL
       ROFL:ROFL:ROFL:ROFL\
      ROFL:ROFL:ROFL:ROFL\_]
     ROFL:ROFL:ROFL:ROFL\_]
    ROFL:ROFL:ROFL:ROFL\_]/
   ROFL:ROFL:ROFL:ROFL\_]/
  ROFL:ROFL:ROFL:ROFL\_]/
 ROFL:ROFL:ROFL:ROFL\_]/
   LOL==___^___]_\_\_]/
  LOL==__/ \_[]_\_\_]/
 LOL===__ \______\_]/
  L      \________]/
          I---I---/
         --------/

perl -i3 -n0e '$n=s/^//mg-1;s/ /\e[1C/g;print(s/^/\e[${^I}C/grm."\e[${n}A"),--$^I for($_)x$^I' <<< 'X X DD
 X  D D
X X DD
'
   X X DD
  X X DD D
 X X DDDD
  X XDDD
 X X DD

8

CJam, 25 24 byte

{{' 1$f+La@+..{sS@er}}*}

Un blocco senza nome che prevede un elenco di stringhe e il numero di ripetizioni nello stack e lascia invece un nuovo elenco di stringhe.

Provalo qui. (Include un wrapper di test che legge la stringa da STDIN per comodità.)

Spiegazione

{       e# Repeat this block N times...
  '     e#   Push a space character.
  1$    e#   Copy the current grid.
  f+    e#   Prepend the space to each line of the grid.
  La    e#   Push [[]].
  @+    e#   Pull up the other copy of the grid and prepend the [].
        e#   We've now got two copies of the grid, one shifted right by
        e#   a cell and one shifted down by a cell. We now want to replace
        e#   spaces in the latter with the corresponding character in the
        e#   former.
  ..{   e#   For each pair of characters in corresponding positions...
    s   e#     Turn the character in the down-shifted grid into a string.
    S   e#     Push " ".
    @   e#     Pull up the character from the right-shifted grid.
    er  e#     Replace spaces with that character.
  }
}*

5
Dieci roflcopters! goo.gl/PEK4iB

Perché non Sfunziona per lo spazio iniziale? Inoltre, è consentito utilizzare variabili (che potrebbero essere state sovrascritte) in una funzione?
Luis Mendo,

@LuisMendo Snon funziona, perché fsarebbe invece mappare su quella stringa. Per quanto riguarda le funzioni, credo di si, nelle lingue "normali", ci sono anche molte presentazioni di funzioni che fanno affidamento su globi che non sono manomessi tra invocazioni.
Martin Ender,

Grazie. Ho dimenticato che un personaggio in CJam non è lo stesso di una stringa di un carattere
Luis Mendo,

1
Puoi salvare un byte usando Convex in quanto ha un operatore traslitterato a un carattere invece di un doppio carattere: convex.tryitonline.net/… (plug spudorato)
GamrCorps,

4

APL, 49 byte

{⎕UCS 32⌈{s+(s=0)×1⊖¯1⌽s←0⍪⍵,0}⍣⍺⊣(32∘≠×⊣)⎕UCS↑⍵}

Input: vettore di vettori di caratteri. Esempio:

      2 {⎕UCS 32⌈{s+(s=0)×1⊖¯1⌽s←0⍪⍵,0}⍣⍺⊣(32∘≠×⊣)⎕UCS↑⍵} 'X X DD' ' X  D D' 'X X DD'
  X X DD 
 X X DD D
X X DDDD 
 X XDDD  
X X DD   

Come funziona:

  • ↑⍵ trasforma l'argomento in una matrice di caratteri
  • ⎕UCS da carattere a numero intero
  • (32∘≠×⊣) sostituire gli spazi (32) con zero
  • ...⍣⍺⊣ applica ⍺ (l'argomento di sinistra) per la funzione a sinistra
  • s←0⍪⍵,0 bordo con zero in alto e a destra l'argomento
  • 1⊖¯1⌽ ruota 1 su e 1 a destra
  • s+(s=0)× somma all'originale la versione spostata ma solo in cima agli zero dell'originale
  • 32⌈ trasforma gli zeri in 32 secondi
  • ⎕UCS da intero a carattere

4

MATL , 24 byte

:"ct32>*TTYatFTEqYSy~*+c

Il formato di input è

2
{'X X DD', ' X  D D', 'X X DD'}

Quindi l'altro esempio è

1
{'###', '###'}

L'output contiene spazi bianchi extra, consentiti dalla sfida.

Provalo online!


Se un array di caratteri 2D è accettabile come input (ho chiesto all'OP due volte ...), il primo cpuò essere rimosso, quindi 23 byte :

:"t32>*TTYatFTEqYSy~*+c

Il formato di input in questo caso è (tutte le stringhe hanno lunghezze uguali, il che può richiedere il riempimento a destra con spazi):

2
['X X DD '; ' X  D D'; 'X X DD ']

Provalo online!


Spiegazione

:        % Input number n implicitly. Generate [1 2 ... n]
"        % For loop: repeat n times
  c      %   Convert to char array. In the first iteration it inputs a cell array of
         %   strings implicitly and converts to a 2D char array, right-padding with
         %   spaces. In the next iterations it does nothing, as the top of the stack
         %   is already a 2D char array
  t32>*  %   Convert characters below 32 into 0
  TT     %   Push array [1 1]
  Ya     %   Pad the 2D char array with one zero in the two directions (up/down,
         %   left/right), on both sides
  t      %   Duplicate
  FTEq   %   Push array [-1 1]
  YS     %   Circularly shift the 2D char array one unit up and one unit right
  y      %   Push a copy of the non-shifted 2D array
  ~      %   Logical negate: nonzero entries become 0, zero entries become 1. This
         %   will be used as a mask for entries that need to be changed. Since the
         %   values at those entries are zero, we can simply add the new values. We do
         %   that by multiplying the mask by the shifted array and adding to the
         %   non-shifted array
  *      %   Multiply element-wise
  +      %   Add element-wise
  c      %   Convert the 2D array back to char
         % End for
         % Implicitly display

3

Convesso , 23 byte

Il conteggio dei byte presuppone la codifica CP-1252.

{{' 1$f+La@+..{sS@Ë}}*}

Un blocco senza nome che prevede un elenco di stringhe e il numero di ripetizioni nello stack e lascia invece un nuovo elenco di stringhe.

Provalo online!

Questa è una porta diretta della mia risposta di CJam a Convex (che è fortemente basata su CJam). L'unica differenza è che Convex utilizza Ëanziché erper traslitterazione, salvando un byte. Grazie a GamrCorps per avermelo informato.


2

Pyth, 54 33 byte

ju+++dhG.bsmh|-d;;.t,Y+dNdtGGeG.*

Suite di test.


perché ne hai bisogno di due ;?
Ven

@ven ;non è il solito ;nei linguaggi di programmazione.
Leaky Nun,

;è una variabile.
Leaky Nun,

ah pyth overloads ;in lambdas ...
Ven

@ven Quando si arriva insieme a Pyth, si usa I, .?, V, F, ;, (dichiarazioni esplicite) molto meno, e saranno sostituiti da ?, m, u, F, M, L, R, #, ...
Leaky Nun

2

JavaScript (ES6), 128 byte

f=(a,n)=>n?f((a=[``,...a].map(s=>[...s||` `])).map((b,i)=>i--&&b.map((c,j)=>a[i][++j]>' '?0:a[i][j]=c))&&a.map(b=>b.join``),n-1):a

Accetta e restituisce una matrice di stringhe, antepone una riga aggiuntiva per l'output, assicura che ogni riga contenga almeno uno spazio, li divide tutti in caratteri, i cicli anche se tenta di copiare i caratteri nella riga sopra e la colonna a destra, quindi si chiama ricorsivamente per completare il ciclo.


2

Python 2, 116 byte

S=' '
def f(a,d):e=[S*len(`a`)];exec"a=[''.join(t[t[1]>S]for t in zip(S+x,y+S))for x,y in zip(a+e,e+a)];"*d;return a

Lo golfò più presto.


Sei sicuro che lambdanon sia più corto?
wizzwizz4,

Ho bisogno del compito di elì dentro. Inoltre, execè un'affermazione, quindi non può essere in una lambda.
Lynn,

Ok. Solo per essere sicuro.
wizzwizz4,

2

Rubino, 95 byte

->a,n{n.downto(0){|i|f="<Esc>[1C"
$><<a.gsub(/^/,f*i).gsub(" ",f)+(i>0?"<Esc>[#{a.lines.size-1}A":"")}}

Ognuno <Esc>è un letterale carattere ESC ( 0x1b).

uso

Assegna lambda a una variabile, ad es func.

art = <<END
X X DD
 X  D D
X X DD
END

func[art, 2]
# Prints:
#   X X DD
#  X X DD D
# X X DDDD
#  X XDDD
# X X DD

Ungolfed

->(art, num) {
  num.downto(0) do |i|
    forward = "\e[1C"
    $> << art.gsub(/^/, forward * i).gsub(" ", forward) +
            (i > 0 ? "\e[#{art.lines.size - 1}A" : "")
  end
}

La forwardsequenza di escape \e[1C, sposta il cursore in avanti (a destra) di 1 spazio e lo \e[<n>Asposta verso l'alto delle nlinee. Fondamentalmente ciò che questo codice fa è stampare gli "strati" dalla parte anteriore, sostituendo gli spazi con la forwardsequenza per evitare di sovrascrivere gli altri livelli con uno spazio.


1
Hai accidentalmente messo un f=prima ->nella versione golf. Rimuoverlo per -2 byte.
wizzwizz4,
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.