Bawa seni ASCII ke dimensi ke-3

11

Dalam tantangan ini, Anda harus membawa seni ASCII (yang biasanya 2D) ke 3D!

Bagaimana?

seperti ini,

X X DD 
 X  D D
X X DD 

untuk...

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

Kemudian Bagaimana kita melakukan itu ?

Mengingat seni ascii dan N, ulangi Nkali ini .

  • untuk setiap karakter (kami akan menyebutnya A):
  • biarlah Bkarakter yang tepat 1 benar dan 1 naik dariA
  • jika Bspasi atau tidak ditentukan:
  • diatur Bke A.

Spesifikasi

  • Input pertama dapat berupa string dengan karakter baris baru atau daftar string yang mewakili seni ASCII 2D.
  • Anda diperbolehkan menggunakan %END%untuk menandai akhir input, tetapi ini tidak diperlukan.
  • Input kedua adalah N. Ini akan menjadi bilangan bulat positif.
  • semua garis string akan memiliki panjang yang sama.

Contohnya

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

Keluaran:

 ###
####
###

Aturan

Aturan main berlaku.

juga, Jika Anda memiliki pertanyaan, pastikan untuk bertanya di komentar!


sumber
Anda mungkin ingin memperjelas bahwa "kosong" mengacu pada ruang (U + 0020) atau tidak sama sekali.
Leaky Nun
@ LeakyNun Apakah sudah diperbaiki sekarang?
Apakah ruang putih tambahan diizinkan?
Leaky Nun
Ya, itu diizinkan.
1
Dapatkah saya berasumsi bahwa panjang setiap baris akan sama? (Dapatkah saya melakukan pra-pad input dengan spasi di sebelah kanan?)
Leaky Nun

Jawaban:

18

Perl, 81 byte

75 byte kode + 6 untuk -i -n0.
Perhatikan bahwa \ekarakternya adalah ASCII \x1btetapi \edigunakan untuk kemudahan pengujian.

Harap dicatat bahwa solusi ini menggunakan urutan pelarian ANSI dan membutuhkan terminal yang kompatibel, serta menggunakan -iargumen commandline untuk memberikan jumlah 'dimensi' yang Anda inginkan.

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

Pemakaian:

Di terminal yang kompatibel dengan Linux, jalankan PS1=dahulu untuk memastikan prompt Anda tidak menimpa gambar yang ditampilkan.

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
sumber
8

CJam, 25 24 byte

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

Blok tanpa nama yang mengharapkan daftar string dan jumlah pengulangan pada stack dan meninggalkan daftar string yang baru sebagai gantinya.

Uji di sini. (Termasuk pembungkus uji yang membaca string dari STDIN untuk kenyamanan.)

Penjelasan

{       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
sumber
5
Sepuluh roflcopters! goo.gl/PEK4iB
Mengapa tidak Sbekerja untuk ruang awal? Juga, apakah diizinkan menggunakan variabel (yang mungkin telah ditimpa) dalam suatu fungsi?
Luis Mendo
@LuisMendo Stidak berfungsi, karena dengan begitu fakan memetakan string itu. Kembali fungsi, saya percaya begitu, dalam bahasa "normal", ada juga banyak fungsi pengiriman yang bergantung pada global yang tidak dirusak di antara doa.
Martin Ender
Terima kasih. Saya lupa bahwa karakter dalam CJam tidak sama dengan string satu karakter
Luis Mendo
1
Anda dapat menyimpan satu byte dengan menggunakan Convex karena memiliki operator transliterasi satu-char alih-alih dua-char: convex.tryitonline.net/… (plug shameless)
GamrCorps
4

APL, 49 byte

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

Input: vektor vektor karakter. Contoh:

      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   

Bagaimana itu bekerja:

  • ↑⍵ mengubah argumen menjadi matriks karakter
  • ⎕UCS dari char ke integer
  • (32∘≠×⊣) gantilah spasi (32) dengan nol
  • ...⍣⍺⊣ berlaku ⍺ (argumen kiri) kali fungsi di sebelah kiri
  • s←0⍪⍵,0 berbatasan dengan nol di atas dan di sebelah kanan argumen
  • 1⊖¯1⌽ putar 1 ke atas dan 1 ke kanan
  • s+(s=0)× jumlah ke versi asli bergeser tetapi hanya di atas nol dari aslinya
  • 32⌈ mengubah kembali nol menjadi 32-an
  • ⎕UCS dari integer ke char
lstefano
sumber
4

MATL , 24 byte

:"ct32>*TTYatFTEqYSy~*+c

Format input adalah

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

Jadi contoh lainnya adalah

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

Outputnya berisi spasi kosong tambahan, yang diizinkan oleh tantangan.

Cobalah online!


Jika array char 2D dapat diterima sebagai input (saya sudah meminta OP dua kali ...), yang pertama cdapat dihapus, jadi 23 byte :

:"t32>*TTYatFTEqYSy~*+c

Format input dalam kasus ini adalah (semua string memiliki panjang yang sama, yang mungkin memerlukan bantalan-kanan dengan spasi):

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

Cobalah online!


Penjelasan

:        % 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
sumber
3

Cembung , 23 byte

Hitungan byte mengasumsikan pengkodean CP-1252.

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

Blok tanpa nama yang mengharapkan daftar string dan jumlah pengulangan pada stack dan meninggalkan daftar string yang baru sebagai gantinya.

Cobalah online!

Ini adalah port langsung jawaban CJam saya untuk Convex (yang sebagian besar didasarkan pada CJam). Satu-satunya perbedaan adalah Convex menggunakan Ëalih-alih eruntuk transliterasi, menghemat satu byte. Terima kasih kepada GamrCorps karena memberi tahu saya tentang hal itu.

Martin Ender
sumber
2

Pyth, 54 33 byte

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

Suite uji.

Biarawati Bocor
sumber
kenapa kamu butuh dua ;?
Mulia
@ven ;tidak biasa ;dalam bahasa pemrograman.
Leaky Nun
;adalah variabel.
Leaky Nun
ah pyth overloads ;dalam lambdas ...
Ven
@ven Bila Anda bergaul dengan Pyth, Anda akan menggunakan I, .?, V, F, ;, (pernyataan eksplisit) sangat kurang, dan mereka akan digantikan oleh ?, 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

Menerima dan mengembalikan array string, menambahkan baris tambahan untuk output, memastikan setiap baris mengandung setidaknya satu spasi, membaginya menjadi karakter, loop meskipun mencoba untuk menyalin karakter ke baris di atas dan kolom ke kanan, lalu secara rekursif memanggil dirinya sendiri untuk menyelesaikan loop.

Neil
sumber
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

Saya akan golf ini lebih cepat.

Lynn
sumber
Apakah Anda yakin lambdatidak lebih pendek?
wizzwizz4
Saya perlu tugas edi sana. Juga, execadalah pernyataan, jadi itu tidak bisa di lambda.
Lynn
Baik. Hanya memastikan.
wizzwizz4
2

Ruby, 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":"")}}

Masing <Esc>- masing adalah karakter ESC literal ( 0x1b).

Pemakaian

Tetapkan lambda ke variabel misalnya 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

Tidak disatukan

->(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
}

The forwardUrutan escape, \e[1C, menggerakkan kursor maju (kanan) 1 ruang dan \e[<n>Abergerak ke atas ngaris. Pada dasarnya yang dilakukan kode ini adalah mencetak "lapisan" kembali ke depan, mengganti spasi dengan forwardurutan untuk menghindari menimpa layer lain dengan spasi.

Yordania
sumber
1
Anda secara tidak sengaja meletakkan f=sebelum ->di versi golf. Hapus untuk -2 byte.
wizzwizz4