Trazer arte ASCII para a 3ª dimensão

11

Neste desafio, você precisa trazer arte ASCII (que geralmente é 2D) para 3D!

Quão?

como isso,

X X DD 
 X  D D
X X DD 

para...

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

Então, como fazemos isso ?

Dada a arte ascii e N, repita esse Ntempo.

  • para cada personagem (vamos chamar isso A):
  • deixe Bser o personagem que é exatamente 1 direita e 1 a partir deA
  • se Bé um espaço ou é indefinido:
  • definido Bcomo A.

Especificações

  • A primeira entrada pode ser uma sequência com caracteres de nova linha ou uma lista de sequências representando a arte ASCII 2D.
  • Você tem permissão para usar %END%para marcar o final da entrada, mas isso não é necessário.
  • A segunda entrada será N. Será um número inteiro positivo.
  • todas as linhas das cordas terão o mesmo comprimento.

Exemplos

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

Resultado:

 ###
####
###

Regras

Aplicam-se regras básicas .

Além disso, se você tiver dúvidas, não deixe de perguntar nos comentários!


fonte
Você pode esclarecer que "em branco" se refere ao espaço (U + 0020) ou a nada.
Freira vazando
@LeakyNun Está consertado agora?
Espaços em branco extras são permitidos?
Leaky Nun
Sim, aqueles são permitidos.
1
Posso assumir que o comprimento de cada linha será o mesmo? (Posso preparar a entrada com espaços à direita?) #
Leaky Nun

Respostas:

18

Perl, 81 bytes

Código de 75 bytes + 6 para -i -n0.
Observe que os \ecaracteres são ASCII, \x1bmas \esão usados ​​para facilitar o teste.

Observe que esta solução usa seqüências de escape ANSI e requer um terminal compatível, além de usar o -iargumento de linha de comando para passar o número de 'dimensões' desejadas.

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

Uso:

Em um terminal compatível com Linux, execute PS1=primeiro para garantir que seu prompt não substitua a imagem exibida.

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
Dom Hastings
fonte
8

CJam, 25 24 bytes

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

Um bloco sem nome que espera uma lista de cadeias e o número de repetições na pilha e deixa uma nova lista de cadeias.

Teste aqui. (Inclui um invólucro de teste que lê a string do STDIN por conveniência.)

Explicação

{       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.
  }
}*
Martin Ender
fonte
5
Dez roflcopters! goo.gl/PEK4iB
Por que não Sfunciona para o espaço inicial? Além disso, é permitido usar variáveis ​​(que podem ter sido substituídas) em uma função?
Luis Mendo
O @LuisMendo Snão funciona, porque fseria o mapeamento dessa string. Re-funções, acredito que sim, em linguagens "normais", também existem muitas submissões de funções que dependem de globais que não são adulteradas entre invocações.
Martin Ender
Obrigado. Esqueci-me que um personagem em CJam não é o mesmo como uma string de um único caractere
Luis Mendo
1
Pode guardar um byte, usando convexa, uma vez que tem um operador transliterate um no carvão em vez de um dois-char: convex.tryitonline.net/... (plug descarado)
GamrCorps
4

APL, 49 bytes

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

Entrada: vetor de vetores de caracteres. Exemplo:

      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   

Como funciona:

  • ↑⍵ transforma o argumento em uma matriz de caracteres
  • ⎕UCS de char para inteiro
  • (32∘≠×⊣) substituir os espaços (32) por zeros
  • ...⍣⍺⊣ apply ⍺ (o argumento da esquerda) vezes a função à esquerda
  • s←0⍪⍵,0 borda com zeros no topo e à direita o argumento
  • 1⊖¯1⌽ gire 1 para cima e 1 para a direita
  • s+(s=0)× soma ao original a versão deslocada, mas apenas em cima dos zeros do original
  • 32⌈ volta os zeros em 32s
  • ⎕UCS de inteiro para char
lstefano
fonte
4

MATL , 24 bytes

:"ct32>*TTYatFTEqYSy~*+c

O formato de entrada é

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

Então o outro exemplo é

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

A saída contém espaço em branco extra, o que é permitido pelo desafio.

Experimente online!


Se uma matriz de caracteres 2D for aceitável como entrada (pedi duas vezes ao OP ...), a primeira cpode ser removida, então 23 bytes :

:"t32>*TTYatFTEqYSy~*+c

O formato de entrada neste caso é (todas as seqüências têm comprimentos iguais, o que pode exigir preenchimento à direita com espaços):

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

Experimente online!


Explicação

:        % 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
Luis Mendo
fonte
3

Convexo , 23 bytes

A contagem de bytes assume a codificação CP-1252.

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

Um bloco sem nome que espera uma lista de cadeias e o número de repetições na pilha e deixa uma nova lista de cadeias.

Experimente online!

Esta é uma porta direta da minha resposta CJam para Convex (que é fortemente baseada em CJam). A única diferença é que o Convex usa em Ëvez de ertransliteração, economizando um byte. Agradeço à GamrCorps por me informar.

Martin Ender
fonte
2

Pitão, 54 33 bytes

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

Suíte de teste.

Freira Furada
fonte
por que você precisa de dois ;?
Ven
@ven ;não é o habitual ;em linguagens de programação.
Freira vazando
;é uma variável
Freira vazando
ah sobrecargas pyth ;em lambdas ...
Ven
@ven Quando você se dá bem com Pyth, você usaria I, .?, V, F, ;, (declarações explícitas) muito menos, e eles serão substituídos por ?, m, u, F, M, L, R, #, ...
Leaky Nun
2

JavaScript (ES6), 128 bytes

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

Aceita e retorna uma matriz de seqüências de caracteres, acrescenta uma linha extra para a saída, garante que cada linha contenha pelo menos um espaço, as divide em caracteres, faz um loop enquanto tenta copiar os caracteres para a linha acima e a coluna para a direita; chama-se recursivamente para completar o loop.

Neil
fonte
2

Python 2, 116 bytes

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

Vou jogar isso mais em breve.

Lynn
fonte
Tem certeza de que um lambdanão é menor?
wizzwizz4
Eu preciso da atribuição de elá. Além disso, execé uma declaração, portanto, não pode estar em um lambda.
Lynn
Está bem. Apenas certificando-se.
Wizzwizz4
2

Ruby, 95 bytes

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

Cada <Esc>um é um caractere ESC literal ( 0x1b).

Uso

Atribua o lambda a uma variável, por exemplo 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
}

A forwardsequência de escape,, \e[1Cmove o cursor para a frente (direita) 1 espaço e \e[<n>Amove-o para cima nlinhas. Basicamente, o que esse código faz é imprimir as "camadas" de trás para frente, substituindo espaços pela forwardsequência para evitar a substituição das outras camadas por um espaço.

Jordânia
fonte
1
Você acidentalmente colocou um f=antes do ->na versão golfed. Remova-o por -2 bytes.
Wizzwizz4 23/07