Đưa nghệ thuật ASCII lên chiều thứ 3


11

Trong thử thách này, Bạn phải mang nghệ thuật ASCII (thường là 2D) lên 3D!

Làm sao?

như thế này,

X X DD 
 X  D D
X X DD 

đến...

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

Vậy thì chúng ta làm điều đó như thế nào?

Đưa ra nghệ thuật ascii và N, lặp lại Nlần này .

  • cho mỗi nhân vật (chúng tôi sẽ gọi đây A):
  • hãy Blà nhân vật chính xác 1 đúng và 1 lên từA
  • nếu Blà một khoảng trắng hoặc không xác định:
  • đặt Bthành A.

Thông số kỹ thuật

  • Đầu vào đầu tiên có thể là một chuỗi với các ký tự dòng mới hoặc một danh sách các chuỗi đại diện cho nghệ thuật 2D ASCII.
  • Bạn được phép sử dụng %END%để gắn thẻ kết thúc đầu vào, nhưng điều này là không bắt buộc.
  • Đầu vào thứ hai sẽ là N. Nó sẽ là một số nguyên dương.
  • tất cả các dòng của chuỗi sẽ có cùng độ dài.

Ví dụ

Đầu vào: ("###\n###",1)

Đầu ra:

 ###
####
###

Quy tắc

Quy tắc cơ bản áp dụng.

Ngoài ra, nếu bạn có câu hỏi, hãy chắc chắn để hỏi trong các ý kiến!


Bạn có thể muốn làm rõ rằng "trống" đề cập đến không gian (U + 0020) hoặc không có gì.
Leaky Nun

@LeakyNun Nó đã được sửa chưa?

Là khoảng trắng thêm được phép?
Rò rỉ Nun

Vâng, những người được phép.

1
Tôi có thể cho rằng độ dài của mỗi dòng sẽ giống nhau không? (Tôi có thể đệm trước đầu vào với khoảng trắng ở bên phải không?)
Leaky Nun

Câu trả lời:


18

Perl, 81 byte

Mã 75 byte + 6 cho -i -n0.
Lưu ý rằng các \eký tự là ASCII \x1bnhưng \eđược sử dụng để dễ kiểm tra.

Xin lưu ý rằng giải pháp này sử dụng các chuỗi thoát ANSI và yêu cầu một thiết bị đầu cuối tương thích, cũng như sử dụng -iđối số dòng lệnh để truyền vào số lượng 'kích thước' bạn muốn.

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

Sử dụng:

Trong thiết bị đầu cuối tương thích với Linux, hãy chạy PS1=trước để đảm bảo lời nhắc của bạn không ghi đè lên hình ảnh được hiển thị.

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

Một khối không tên dự kiến ​​một danh sách các chuỗi và số lần lặp lại trên ngăn xếp và thay vào đó là một danh sách các chuỗi mới.

Kiểm tra nó ở đây. (Bao gồm trình bao bọc kiểm tra đọc chuỗi từ STDIN để thuận tiện.)

Giải trình

{       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
Mười roflcopters! goo.gl/PEK4iB

Tại sao không Slàm việc cho không gian ban đầu? Ngoài ra, nó có được phép sử dụng các biến (có thể đã bị ghi đè) trong một hàm không?
Luis Mendo

@LuisMendo Skhông hoạt động, vì sau đó fsẽ ánh xạ qua chuỗi đó. Các chức năng của Re, tôi tin là như vậy, trong các ngôn ngữ "bình thường", cũng có nhiều chức năng đệ trình dựa trên toàn cầu mà không bị can thiệp giữa các yêu cầu.
Martin Ender

Cảm ơn. Tôi quên rằng một nhân vật trong CJam không giống với chuỗi một ký tự
Luis Mendo

1
Bạn có thể lưu một byte bằng cách sử dụng Convex vì nó có toán tử chuyển ngữ một char thay vì hai char: convex.tryitonline.net/ ((không biết xấu hổ)
GamrCorps

4

APL, 49 byte

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

Đầu vào: vectơ của vectơ ký tự. Thí dụ:

      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   

Làm thế nào nó hoạt động:

  • ↑⍵ biến đối số thành một ma trận ký tự
  • ⎕UCS từ char đến số nguyên
  • (32∘≠×⊣) thay thế khoảng trắng (32) bằng số không
  • ...⍣⍺⊣ áp dụng ⍺ (đối số bên trái) lần hàm bên trái
  • s←0⍪⍵,0 viền với các số 0 ở trên và bên phải đối số
  • 1⊖¯1⌽ xoay 1 lên và 1 phải
  • s+(s=0)× tổng cộng với phiên bản gốc đã thay đổi nhưng chỉ ở trên số 0 của bản gốc
  • 32⌈ biến các số 0 thành 32
  • ⎕UCS từ số nguyên đến char

4

MATL , 24 byte

:"ct32>*TTYatFTEqYSy~*+c

Định dạng đầu vào là

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

Vì vậy, ví dụ khác là

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

Đầu ra chứa thêm khoảng trắng, được cho phép bởi thử thách.

Hãy thử trực tuyến!


Nếu một mảng char 2D được chấp nhận làm đầu vào (tôi đã hỏi OP hai lần ...), thì mảng đầu tiên ccó thể bị xóa, vì vậy 23 byte :

:"t32>*TTYatFTEqYSy~*+c

Định dạng đầu vào trong trường hợp này là (tất cả các chuỗi có độ dài bằng nhau, có thể yêu cầu đệm phải có khoảng trắng):

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

Hãy thử trực tuyến!


Giải trình

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

Lồi , 23 byte

Số lượng byte giả định mã hóa CP-1252.

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

Một khối không tên dự kiến ​​một danh sách các chuỗi và số lần lặp lại trên ngăn xếp và thay vào đó là một danh sách các chuỗi mới.

Hãy thử trực tuyến!

Đây là một cổng trực tiếp của câu trả lời CJam của tôi cho Convex (chủ yếu dựa trên CJam). Sự khác biệt duy nhất là Convex sử dụng Ëthay vì erchuyển ngữ, tiết kiệm một byte. Cảm ơn GamrCorps đã cho tôi biết về nó.


2

Bình thường, 54 33 byte

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

Bộ thử nghiệm.


tại sao bạn cần hai ;?
Ven

@ven ;không phải là thông thường ;trong các ngôn ngữ lập trình.
Leaky Nun

;là một biến
Leaky Nun

ah quá tải pyth ;ở lambdas ...
Ven

@ven Khi bạn nhận được cùng với Pyth, bạn sẽ sử dụng I, .?, V, F, ;, (báo cáo rõ ràng) rất ít, và họ sẽ được thay thế bằng ?, 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

Chấp nhận và trả về một chuỗi các chuỗi, thêm một hàng bổ sung cho đầu ra, đảm bảo mỗi hàng chứa ít nhất một khoảng trắng, chia tất cả chúng thành các ký tự, các vòng lặp mặc dù cố gắng sao chép các ký tự vào hàng bên trên và cột bên phải, sau đó đệ quy gọi chính nó để hoàn thành vòng lặp.


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

Tôi sẽ chơi golf này sớm hơn.


Bạn có chắc lambdalà không ngắn hơn?
wizzwizz4

Tôi cần sự phân công etrong đó. Ngoài ra, execlà một tuyên bố, vì vậy nó không thể ở trong lambda.
Lynn

Đồng ý. Chỉ đảm bảo.
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":"")}}

Mỗi <Esc>là một ký tự ESC theo nghĩa đen ( 0x1b).

Sử dụng

Gán lambda cho một biến, ví dụ 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

Ung dung

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

Trình forwardtự thoát \e[1C, di chuyển con trỏ về phía trước (phải) 1 khoảng trắng và \e[<n>Adi chuyển nó lên ncác dòng. Về cơ bản những gì mã này làm là in các "lớp" trở lại phía trước, thay thế các khoảng trắng bằng forwardchuỗi để tránh ghi đè các lớp khác bằng một khoảng trắng .


1
Bạn vô tình đặt một f=trước khi ->trong phiên bản golf. Loại bỏ nó cho -2 byte.
wizzwizz4
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.