Nghệ thuật ASCII được sắp xếp theo chiều ngang


20

Nhiệm vụ của bạn là chấp nhận làm hai "Nghệ thuật ASCII" đầu vào và căn chỉnh từng tác phẩm nghệ thuật cạnh nhau theo chiều ngang.

Ví dụ: giả sử bạn có hai chuỗi "abc\ndef""123\n456". Bạn cần căn chỉnh chúng theo chiều ngang để tạo ra chuỗi "abc123\ndef456". Tôi gọi đây là" căn chỉnh theo chiều ngang "bởi vì trong khi các đầu vào, khi được in, trông như thế này:

abc
def

và:

123
456

Đầu ra, khi được in, sẽ trông như thế này:

abc123
def456

Lưu ý cách một đầu vào được đặt bên cạnh đầu vào khác.


Đầu vào

  • Đầu vào sẽ là các chuỗi và có thể là hai đối số riêng biệt hoặc là một chuỗi các chuỗi.
  • Các nhân vật trong nghệ thuật sẽ có mã thập phân trong phạm vi 32-126 (đã bao gồm).
  • Thật tốt khi hỗ trợ một số lượng nghệ thuật tùy ý để căn chỉnh thay vì chỉ hai (nhưng rõ ràng bạn phải hỗ trợ ít nhất hai).
  • Bạn có thể giả định rằng mỗi nghệ thuật sẽ có cùng kích thước và chúng sẽ chứa ít nhất một dòng.
  • Bạn phải có khả năng hỗ trợ ít nhất 100x100 nhân vật nghệ thuật.

  • Để phù hợp với các quy ước trên trang web, thứ tự đối số không quan trọng. Không quan trọng nghệ thuật ở bên trái hay bên phải.


Đầu ra

  • Đầu ra sẽ là nghệ thuật căn chỉnh như đã đề cập ở trên, được trả về hoặc xuất ra thiết bị xuất chuẩn.

  • Bất kỳ khoảng trắng dấu trong tùy chọn.

  • Không được có sự phân tách thị giác giữa các nghệ thuật liên kết.


Nghệ thuật đầu vào và đầu ra phải là \nhoặc \rchuỗi phân cách. Sẽ là quá tầm thường khi cho phép mảng 2D.

Đệ trình có thể là chức năng hoặc chương trình đầy đủ.

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

"abc\ndef", "123\n456" -> "abc123\ndef456".

"qwertyuiop\n asdfghjkl", "Some other\nTextFiller" -> "qwertyuiopSome other\n asdfghjklTextFiller"

"  *  \n *** \n*****\n *** \n  *  \n", "  +  \n  +  \n+++++\n  +  \n  +  \n" -> "  *    +  \n ***   +  \n*****+++++\n ***   +  \n  *    +  \n"

1
Chúng ta có thể sử dụng một dấu phân cách tùy chỉnh thay vì dòng mới không? tức là "|"hay " "?
R

10
Tôi sẽ nói không được cho rằng sẽ làm hỏng bất kỳ nghệ thuật.
Carcigenicate 16/03/18

Chúng ta có thể sử dụng \rthay vì \n?
Adám

@ Adám Chắc chắn. Tôi sẽ cập nhật từ ngữ.
Carcigenicate

Là khoảng trắng hàng đầu ok?
Adám

Câu trả lời:


20

6
Vì ai không chỉ có nội dung cho việc này? : P
caird coinheringaahing 16/03/18

5
Điều đó thậm chí không công bằng. ; -;
hoàn toàn là

3
@KevinCruijssen Trên PPCG, nó thường được phép lấy đầu vào theo bất kỳ thứ tự nào bạn muốn và đối với ngôn ngữ dựa trên ngăn xếp, thứ tự hiện tại có ý nghĩa hơn ngược lại.
dzaima 16/03/18

5
@KevinCruijssen mặc dù tôi chỉ nhớ rằng tôi đã tích hợp sẵn tiện ích bổ sung ngược, vì vậy tôi đang cập nhật bài đăng: p
dzaima 16/03/18

2
Vì vậy, Canvas có hai nội dung cho việc này? Ok, tại sao không?
caird coinheringaahing 16/03/18


6

Python 2 , 59 byte

lambda y:'\n'.join(map(str.__add__,*map(str.splitlines,y)))

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


Nó cũng có thể được rút ngắn bằng cách loại bỏ không gian. : P
hoàn toàn là

Nếu bạn muốn nhập danh sách đầu vào và đầu ra của các dòng, như bạn đã có trước đây, bạn có thể giảm xuống còn 30: Hãy thử trực tuyến!

Tôi ngồi đó khoảng 5 phút để quyết định xem tôi có nên cho phép điều đó không. Như câu trả lời của Haskell cho thấy, nó sẽ giảm thách thức xuống một thứ tầm thường hơn nhiều. Tôi cho rằng mặc dù các giải pháp quá tầm thường sẽ không phổ biến như vậy.
Carcigenicate 16/03/18




3

Bash + coreutils, 14

  • 4 byte được lưu nhờ @DavidFoerster.
paste -d "" $@

Đầu vào được đưa ra dưới dạng hai tên tệp dưới dạng tham số dòng lệnh.

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


Bạn có thể lưu 4 byte:paste -d "" $@
David Foerster

@DavidFoerster Cảm ơn! Lạ - Tôi đã thử điều đó sớm hơn và nó không hoạt động. Chỉnh sửa - Tôi thấy bây giờ - thay vì -d "", tôi đã thử -d"", tất nhiên là không khác gì-d
Chấn thương kỹ thuật số


2

APL (Dyalog Unicode) , 9 byte SBCS

Chương trình đầy đủ. Nhắc (STDIN) cho bất kỳ danh sách độ dài nào của các \rchuỗi được phân tách. Các chuỗi có thể bị rách và có độ rộng khác nhau miễn là chúng có cùng số dòng. In (STDOUT) kết quả nghệ thuật ASCII.

⊃,/⎕FMT¨⎕

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

 nhắc nhở đánh giá đầu vào

⎕FMT¨ định dạng (đánh giá tất cả các ký tự điều khiển và ma trận ký tự trả về) mỗi

,/ kết hợp chúng theo chiều ngang (giảm catenation)

 tiết lộ (vì giảm thứ hạng từ 1 xuống 0)


2

Java 8, 100 84 78 byte

a->b->{for(int i=0;;)System.out.println(a.split("\n")[i]+b.split("\n")[i++]);}

Thoát với ArrayIndexOutOfBoundsExceptionSTDERR sau khi nó đã in kết quả sang STDOUT, được phép .

-6 byte nhờ @ OlivierGrégoire .

Giải trình:

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

a->b->{                        // Method with two String parameters and no return-type
  for(int i=0;;)               //  Loop over the substrings of the first input
    System.out.println(        //   Print:
     a.split("\n")[i]          //    The substring of the first input
     +b.split("\n")[i++]);}    //    plus the same-indexed substring of the second input

1
a->b->{for(int i=0;;)System.out.println(a.split("\n")[i]+b.split("\n")[i++]);}78 byte. Không có gì được nói về việc không có bất kỳ tác dụng phụ thêm. Vì vậy, chúng tôi chỉ đơn giản là có thể đếm cho đến khi một ngoại lệ xảy ra.
Olivier Grégoire

@ OlivierGrégoire Cảm ơn! Và thoát khỏi lỗi với STDERR thực sự được cho phép sau khi nó đã in mọi thứ thành STDOUT.
Kevin Cruijssen 16/03/18

2

Ruby , 48 byte

->a,b{$;=$/;a.split.zip(b.split).map(&:join)*$/}

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

Một lambda lấy hai chuỗi và trả về một chuỗi. Đặt splitdấu phân cách mặc định thành dòng mới $;=$/;mà không lưu bất kỳ byte nào, nhưng nó làm cho phần còn lại trông đẹp hơn một chút.

Ruby , 49 byte (nhiều chuỗi tùy ý)

->s{s.map{|a|a.split$/}.transpose.map(&:join)*$/}

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

Chỉ để cho vui. Hóa ra chúng ta có thể chấp nhận một chuỗi các chuỗi với chi phí bổ sung chỉ 1 byte.


2

JavaScript (ES6), 51 byte

f=
(a,b)=>a.replace(/.+/g,a=>a+b.shift(),b=b.split`
`)
;document.write("<pre>"+f("abc\ndef", "123\n456")+"</pre>")


2

Kỳ quan , 21 byte

->#oN.zip#++.-> <>"
"

Ví dụ sử dụng:

(->#oN.zip#++.-> <>"
")["abc#ndef" "abc#ndef"]

#nđược sử dụng thay vì \nđể biểu thị dòng mới.

Giải trình

Phiên bản dài dòng:

(map #oN) . (zip #con) . (map split "#n")

Tách từng chuỗi trong mảng đầu vào dọc theo dòng mới, zip với chuỗi nối và xuất từng mục.







1

PowerShell , 51 49 byte

param($a,$b)$a-split"
"|%{$_+($b-split"
")[$i++]}

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

Đưa đầu vào dưới dạng chuỗi ký tự với dòng mới. Thay vào đó `n, bạn cũng có thể sử dụng (dấu phân cách dòng mới trong PowerShell \n).

Đầu tiên chúng ta -splitlà chuỗi đầu vào bên trái trên dòng mới, tạo ra một mảng và lặp qua đó |%{...}. Mỗi lần lặp, chúng tôi nối chuỗi với chuỗi đầu vào bên phải một lần nữa phân chia trên dòng mới, được lập chỉ mục và tăng dần.

Những cái còn lại trên đường ống và ẩn Write-Outputkhi hoàn thành cung cấp cho chúng ta đầu ra dưới dạng một chuỗi các chuỗi, được in với dòng mới giữa.




1

Japt -R , 8 7 byte

·íV· m¬

Thử nó


Giải trình

             :Implicit input of strings U & V
·            :Split U on newlines
  V·         :Split V on newlines
 í           :Interleave
     m       :Map
      ¬      :  Join
             :Implicitly join with newlines and output

Thay thế

·Ë+V·gE

Thử nó

             :Implicit input of strings U & V
·            :Split U on newlines
 Ë           :Map over each element at index E and rejoin with newlines
   V·        :  Split V on newlines
     gE      :  Get the element at index E
  +          :  Append to the current element
             :Implicitly join with newlines and output

1

Bash , 92 byte

a=();for b;do c=;while IFS= read -r d;do a[c++]+=$d;done<<<"$b";done;printf '%s\n' "${a[@]}"

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

Ung dung:

array=()                             # Initialize the array
for argument in "${@}"; do           # Loop over the arguments list
  index='0'                          # Reset the index
  while IFS='' read -r 'line'; do    # Loop over every line of the current argument
    array[index]+="${line}"          # Append the line to its corresponding place
    (( index++ ))                    # Increment the index
  done <<< "${argument}"             # End while loop
done                                 # End for loop
printf '%s\n' "${array[@]}"          # Print array's content

Ví dụ:

$ foo $'abc\ndef' $'123\n456'
abc123
def456

$ foo $'qwertyuiop\n asdfghjkl' $'Some other\nTextFiller'
qwertyuiopSome other
 asdfghjklTextFiller

$ foo \
>   $'  *  \n *** \n*****\n *** \n  *  \n' \
>   $'  +  \n  +  \n+++++\n  +  \n  +  \n'
  *    +  
 ***   +  
*****+++++
 ***   +  
  *    +  


# https://gist.github.com/nxnev/dad0576be7eb2996b860c320c01d0ec5
$ foo "$(< input1)" "$(< input2)" "$(< input3)" > output

Tôi cũng có một cái ngắn hơn nhưng nó thất bại nếu readcâu lệnh thứ hai trả về giá trị khác không.

Bash , 55 byte

while IFS= read -r a;IFS= read b<&3;do echo "$a$b";done

Lưu ý: <&3dường như không hoạt động trên tio.run

Cái này sử dụng mô tả tập tin ( 13) thay vì đối số:

$ foo <<< $'qwertyuiop\n asdfghjkl' 3<<< $'Some other\nTextFiller'
qwertyuiopSome other
 asdfghjklTextFiller

1

Than , 8 byte

PθM⌕θ¶→η

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Giải trình:

 θ          First input
P           Print without moving the cursor
    θ       First input
     ¶      Literal newline
   ⌕        Find index
  M   →     Move that many squares right
       η    Implicitly print second input

Thêm 2 byte để chấp nhận nhiều đầu vào:

FA«PιM⌕ι¶→

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Giải trình:

 A          Input
F «         Loop over all entries
   Pι       Print current entry
     M⌕ι¶→  Move to next entry

Thêm 4 byte để chấp nhận đầu vào không được đệm:

PθM⌈E⪪θ¶Lι→η

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Giải trình:

      θ         First input
       ¶        Literal newline
     ⪪          Split
    E           Map over each string
         ι      Current string
        L       Length
   ⌈            Maximum
  M       →     Move that many squares right



1

Swift 4 , 119 byte

func f(s:[String])->String{return s[0].split{$0=="\n"}.enumerated().map{$0.1+s[1].split{$0=="\n"}[$0.0]+"\n"}.joined()}

Giải trình

func f(s: [String]) -> String {
    return s[0].split{ $0=="\n" }       //splitting the first string after every \n
    .enumerated()                       //create a tuple of offsets and elements
    .map {
        $0.1 +                          //current element
        s[1].split{$0 == "\n"}[$0.0] +  //splitting the second string + indexing
        "\n"                            //new line after every line
     }
     .joined()
}

Hãy thử trực tuyế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.