Cắt xén nghệ thuật ASCII của tôi


14

Hãy nói rằng tôi đã có một số nghệ thuật ASCII:

          ___
        ,"---".
        :     ;
         `-.-'
          | |
          | |
          | |
       _.-\_/-._
    _ / |     | \ _
   / /   `---'   \ \
  /  `-----------'  \
 /,-""-.       ,-""-.\
( i-..-i       i-..-i )
|`|    |-------|    |'|
\ `-..-'  ,=.  `-..-'/
 `--------|=|-------'
          | |
          \ \
           ) ) hjw
          / /
         ( (

( Nguồn )

Nhưng tôi muốn tập trung vào dây cáp của cần điều khiển này, bởi vì tôi thực sự muốn có một hình ảnh của một con đường vườn, dẫn đến một cánh cửa.

 ,=.
-|=|-
 | |
 \ \
  ) )
 / /
( (

Tôi có thể sao chép dòng sau dòng, tôi có thể sử dụng trình soạn thảo văn bản với chế độ chọn khối hoặc ... Tôi có thể viết một số mã!

Vì vậy, mã của tôi cần năm đối số:

  • Một tác phẩm nghệ thuật ASCII, một chuỗi phân tách dòng mới.
  • Trục X của góc trên cùng bên trái (được lập chỉ mục 1, từ cột bên trái, số nguyên dương)
  • Trục Y của góc trên cùng bên trái (được lập chỉ mục 1, từ hàng trên cùng, số nguyên dương)
  • Chiều rộng của hình ảnh kết quả (số nguyên dương)
  • Chiều cao của hình ảnh kết quả (số nguyên dương)

Các trường hợp thử nghiệm

Hình ảnh ASCII:

          ___
        ,"---".
        :     ;
         `-.-'
          | |
          | |
          | |
       _.-\_/-._
    _ / |     | \ _
   / /   `---'   \ \
  /  `-----------'  \
 /,-""-.       ,-""-.\
( i-..-i       i-..-i )
|`|    |-------|    |'|
\ `-..-'  ,=.  `-..-'/
 `--------|=|-------'
          | |
          \ \
           ) ) hjw
          / /
         ( (

Con đường vườn

  • X: 10
  • Y: 15
  • Chiều rộng: 5
  • Chiều cao: 7

Kết quả:

 ,=.
-|=|-
 | |
 \ \
  ) )
 / /
( (

Biểu tượng DB

  • X: 3
  • Y: 12
  • Chiều rộng: 6
  • Chiều cao: 4

Đầu ra:

,-""-.
i-..-i
|    |
`-..-'

Người cao tuổi ngoài hành tinh

  • X: 9
  • Y: 1
  • Chiều rộng: 7
  • Chiều cao: 10
  ___
,"---".
:     ;
 `-.-'
  | |
  | |
  | |
.-\_/-.
|     |
 `---'

Chữ ký

  • X: 16
  • Y: 19
  • Chiều rộng: 3
  • Chiều cao: 1
hjw

Quy tắc


8
Chúng ta có thể lấy X và Y làm chỉ số 0 không?
TFeld

8
Ngoài ra, trong testcase 1, Ynên bew 15, và trong TC 2, Xnên là3
TFeld

2
Chúng ta có thể giả sử đầu vào được đệm vào một hình chữ nhật có khoảng trắng không?
DLosc

6
Đó chính xác là những gì tôi nghĩ khi tôi thấy nghệ thuật ascii đó, một con đường trong vườn. Tôi không nghĩ gì khác cả ...
Jo King

3
Có vẻ như nhiều giá trị X và Y không chính xác trong các trường hợp thử nghiệm (có thể một số giá trị 0 được lập chỉ mục?!) - ít nhất: Y của Garden Path phải là 15; Biểu tượng X của DB phải là 3.
Jonathan Allan

Câu trả lời:


22

Canvas , 1 byte

Hãy thử nó ở đây!

Nó lấy nghệ thuật chiều cao, chiều rộng, Y, X và ASCII làm đầu vào, theo thứ tự đó.

Mặc dù hầu hết mọi thứ về các đối tượng nghệ thuật ASCII trong Canvas đều được lập chỉ mục 0, nhưng được lập chỉ mục 1 bởi một số lý do. ¯ \ _ (ツ) _ /


Câu trả lời mong đợi từ canvas: D (mb than có một cái gì đó tương tự)
Dead Possum

Cái gì là phù thủy!
AJFaraday

@AJFaraday Ý tôi là, bạn có mong đợi rằng một ngôn ngữ được tạo riêng cho thao tác nghệ thuật ASCII sẽ không được tích hợp để có được một phần cụ thể của nghệ thuật ascii không? : p
dzaima


4

Than , 7 byte

δJθηTζε

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Có tọa độ 0 chỉ số. Giải trình:

δ

In nghệ thuật ASCII.

Jθη

Nhảy đến góc trên cùng bên trái của hình chữ nhật mong muốn.

Tζε

Cắt vải theo kích thước mong muốn.


3

Pip -n , 21 byte

_@>--b@<dM(a^n--c+,e)

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

Hoặc, nếu cho phép lập chỉ mục 0 ...

Pip -n, 17 byte :

_@>b@<dM(a^nc+,e)

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

Giải trình

Có tất cả năm đối số là đối số dòng lệnh.

                   a-e are the 5 cmdline args; n is newline
         a^n       Split a on newlines
              ,e   Range(e)
            c+     Add c to each element
        (       )  Use the resulting range(c,c+e) to slice into the list of lines
       M           To each line, map this function:
_                   The line
 @>b                Slice, keeping indices b and greater
    @<d             Slice, keeping indices less than d
                   Print, joining on newlines (-n flag)

Các giải pháp trên cũng cho rằng đầu vào là một hình chữ nhật hoàn hảo - tức là các đường có cùng độ dài. Mặt khác, cần thêm 2 byte (sử dụng -lthay vì -n):

(Z(a^nZDsb+,d)c+,e)      0-indexed, 19 bytes
(Z(a^nZDs--b+,d)--c+,e)  1-indexed, 23 bytes


3

Japt -R , 13 11 byte

·tWÉY ®tVÉX

Thử nó

Lưu 2 byte nhờ Kamil Drakari

9 byte nếu không phải là yêu cầu không cần thiết mà các giải pháp sử dụng lập chỉ mục dựa trên 1.

·tWY ®tVX

Giải trình

                :Implicit input of string U and integers V=X, W=Y, X=Width & Y=Height
·               :Split U on newlines
 t              :Slice
  WÉ            : From 0-based index W-1
    Y           : To length Y
      ®         :Map
       t        :  Substring
        VÉ      :   From 0-based index V-1
          X     :   To length X
                :Implicitly join with newlines and output

Trong thử nghiệm của tôi, bạn có thể lưu 2 byte bằng cách chuyển lát t2 byte khác bằng cách lập chỉ mục 0. Có thể đáng để chờ đợi ở lần thứ hai vì OP chưa làm rõ liệu lập chỉ mục 0 có được chấp nhận hay đã sửa các trường hợp kiểm tra.
Kamil Drakari

Một điều tuyệt vời, @KamilDrakari - cũng hoàn toàn quên tphương thức hoạt động trên mảng.
Xù xì


2

J , 45 byte

f=:4 :0
'a b c d'=.x-#:10
y{~<(a+i.b);c+i.d
)

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

Ghi chú: J chấp nhận tối đa 2 đối số, trái và phải. Đối số bên phải là chuỗi nghệ thuật ASCII, bên trái - danh sách các giá trị UHXW

Tôi mô phỏng dòng mới và lệnh gọi hàm có mã để chuyển chuỗi thành một mảng.


2

V , 16 byte

ÀGÀ|<C-v>@cl@djyHVGp

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

Đầu vào dự kiến ​​sẽ được đệm với các khoảng trống để trở thành một hình chữ nhật hoàn hảo. Ngoài ra, đầu vào 'Y' xuất hiện trước 'X'.

Hexdump:

00000000: c047 c07c 1640 636c 4064 6a79 4856 4770  .G.|.@cl@djyHVGp

2

C (gcc) , 118 109 byte

Đầu vào có thể chứa các đường răng cưa: dòng mới được in nếu chúng tồn tại trong phạm vi y.

Cảm ơn trần nhà cho lời đề nghị.

f(s,x,y,w,h,a,b,c)char*s;{for(b=1,a=0;*s;a=c?!b++:a,s++)((c=*s==10)|++a>=x&a-x<w)&b>=y&b-y<h-c&&putchar(*s);}

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




1

Bash + coreutils, 37

cut -b$1-$[$1+$3-1]|tail +$2|head -$4

Thật thú vị, GNU tail 8.28 (trên Ubuntu 18.04) cho phép +NUMđịnh dạng, trong khi GNU tail 8.29 trên TIO yêu cầu thêm 2 byte cho việc này -n+NUM.

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

Tôi nghĩ rằng làm tất cả trong này sedcó thể ngắn hơn, nhưng ở mức 50 byte thì không:

sed -nr "$2,$[$2+$4-1]s/.{$[$1-1]}(.{,$3}).*/\1/p"

1

K4 , 31 byte

Giải pháp:

{[a;x;y;w;h]a .-1+(y;x)+!:'h,w}

Ví dụ:

q)ASCII:("          ___";"        ,\"---\".";"        :     ;";"         `-.-'";"          | |";"          | |";"          | |";"       _.-\\_/-._";"    _ / |     | \\ _";"   / /   `---'   \\ \\";"  /  `-----------'  \\";" /,-\"\"-.       ,-\"\"-.\\";"( i-..-i       i-..-i )";"|`|    |-------|    |'|";"\\ `-..-'  ,=.  `-..-'/";" `--------|=|-------'";"          | |";"          \\ \\";"           ) ) hjw";"          / /";"         ( (")
q)k){[a;x;y;w;h]a .-1+(y;x)+!:'h,w}[ASCII;10;15;5;7]
" ,=. "
"-|=|-"
" | | "
" \\ \\ "
"  ) )"
" / / "
"( (  "
q)k){[a;x;y;w;h].[a;-1+(y;x)+!:'h,w]}[ASCII;3;12;6;4]
",-\"\"-."
"i-..-i"
"|    |"
"`-..-'"
q)k){[a;x;y;w;h].[a;-1+(y;x)+!:'h,w]}[ASCII;9;1;7;10]
"  ___  "
",\"---\"."
":     ;"
" `-.-' "
"  | |  "
"  | |  "
"  | |  "
".-\\_/-."
"|     |"
" `---' "
q)k){[a;x;y;w;h].[a;-1+(y;x)+!:'h,w]}[ASCII;16;19;3;1]
"hjw"

Giải trình:

Lấy đầu vào 1 chỉ mục, tạo tọa độ x / y và chỉ mục thành nghệ thuật ascii.

{[a;x;y;w;h]a .-1+(y;x)+!:'h,w} / the solution
{[a;x;y;w;h]                  } / lambda taking 5 inputs, a(scii), x, y, w(idth), h(eight)
                           h,w  / concatenate height and width, e.g. 7 5
                        !:'     / range til each, e.g. (0 1 2 3 4 5 6;0 1 2 3 4)
                  (y;x)+        / add list y x to it, e.g. (15 16 17 18 19 20 21;10 11 12 13 14)
               -1+              / subtract 1, e.g. (14 15 16 17 18 19 20;9 10 11 12 13)
            a .                 / index into a at these coordinates

1

R , 62 byte

Có lẽ giải pháp ngắn đáng ngạc nhiên cho một thách thức văn bản trong R, bởi vì chúng ta không thực sự cần phải đọc toàn bộ văn bản thành một ma trận.

function(x,y,w,h)write(substr(readLines()[y+1:h-1],x,x+w-1),1)

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


1

\ / \ /> , 123 byte

j:j8+}j+}j}pppp80x
{:}i:0(?v:a=?x@s1+:
~~~~1+0!/000y
yp:qqqq~
q{y?=p:+1q:}}g$q:pp:
1}x}p}ap:q~q+1{{y!?:-
ys{{
~!u.*2(0:;!?h

Đầu vào bao gồm một dòng duy nhất của các biến đầu vào không gian được phân định x, y, w, vàh , tiếp theo là nghệ thuật ascii trên dòng tiếp theo trở đi.

Giải trình

Mã này sử dụng khả năng tự sửa đổi của \ / \ /> bằng cách đặt nghệ thuật ascii vào chính mã, kết thúc giống như thế này:

mã

Sau đó, nó lấy các ký tự trong hình chữ nhật được chỉ định ra khỏi mã và xuất ra nó.

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.