จัดแนว ASCII Art ตามแนวนอน


20

งานของคุณคือการยอมรับเป็นอินพุต "ASCII Art" สองรายการและจัดเรียงแต่ละชิ้นของศิลปะถัดจากแนวนอน

ตัวอย่างเช่นสมมติว่าคุณมีสองสายและ"abc\ndef" "123\n456"คุณจำเป็นต้องจัดแนวพวกเขาในแนวนอนเพื่อสร้างสตริง"abc123\ndef456"ฉันกำลังเรียกสิ่งนี้ว่า" การจัดตำแหน่งแนวนอน "เพราะในขณะที่อินพุตเมื่อพิมพ์ออกมาจะมีลักษณะดังนี้:

abc
def

และ:

123
456

เอาต์พุตเมื่อพิมพ์จะมีลักษณะดังนี้:

abc123
def456

โปรดทราบว่าจะมีการป้อนข้อมูลใดรายการหนึ่งถัดจากอีกรายการหนึ่ง


อินพุต

  • อินพุตจะเป็นสตริงและสามารถเป็นอาร์กิวเมนต์สองตัวแยกกันหรือเป็นลำดับของสตริง
  • ตัวละครในศิลปะจะมีรหัสทศนิยมในช่วง 32-126 (รวม)
  • มันเป็นเรื่องปกติที่จะสนับสนุนจำนวนศิลปะโดยพลการให้เข้ามาแทนที่เพียงแค่สองชิ้น
  • คุณสามารถสันนิษฐานได้ว่างานศิลปะแต่ละชิ้นจะมีขนาดเท่ากันและจะมีอย่างน้อยหนึ่งบรรทัด
  • คุณต้องสามารถรองรับศิลปะตัวละครอย่างน้อย 100x100 ตัว

  • เพื่อจัดแนวกับอนุสัญญาบนไซต์ลำดับอาร์กิวเมนต์ไม่สำคัญ ไม่สำคัญว่าศิลปะใดจะอยู่ทางซ้ายหรือขวา


เอาท์พุต

  • การส่งออกจะเป็นศิลปะที่สอดคล้องดังกล่าวข้างต้นไม่ว่าจะกลับมาหรือส่งออกไปยัง stdout

  • ช่องว่างต่อท้ายใด ๆ ในตัวเลือก

  • ต้องไม่มีตัวคั่นที่มองเห็นได้ระหว่างศิลปะที่จัดแนว


อินพุตและเอาต์พุตศิลปะต้องเป็น\nหรือมีการ\rคั่นสตริง มันเป็นเรื่องเล็กน้อยมากที่จะอนุญาตให้ใช้อาร์เรย์ 2 มิติ

ที่ส่งอาจเป็นฟังก์ชั่นหรือโปรแกรมเต็มรูปแบบ

กรณีทดสอบ:

"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
เราสามารถใช้ตัวคั่นที่กำหนดเองแทนการขึ้นบรรทัดใหม่ได้หรือไม่ เช่น"|"หรือ" "?
Rɪᴋᴇʀ

10
ฉันจะไม่บอกว่าจะทำลายศิลปะใด ๆ
Carcigenicate

เราขอใช้\rแทนได้\nไหม
อดัม

@ Adámแน่นอน ฉันจะอัปเดตข้อความ
Carcigenicate

ช่องว่างชั้นนำตกลงหรือไม่?
อดัม

คำตอบ:


20

6
สาเหตุที่ไม่เพียงมี builtin สำหรับสิ่งนี้ : P
caird coinheringaahing

5
นั่นไม่ยุติธรรมเลย ; -;
สิ้นเชิงมนุษย์

3
@KevinCruijssen บน PPCG โดยปกติแล้วจะอนุญาตให้ป้อนข้อมูลตามลำดับที่คุณต้องการและสำหรับภาษาที่ใช้สแต็กคำสั่งปัจจุบันจะสมเหตุสมผลมากกว่าการย้อนกลับ
dzaima

5
@KevinCruijssen แม้ว่าฉันเพิ่งจะจำได้ว่าฉันมี built-in สำหรับการเพิ่มแบบย้อนกลับดังนั้นฉันจึงอัปเดตโพสต์: p
dzaima

2
ดังนั้น Canvas จึงมีสองบิลด์สำหรับสิ่งนี้ ตกลงทำไมล่ะ
caird coinheringaahing


6

Python 2 , 59 ไบต์

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

ลองออนไลน์!


นอกจากนี้ยังสามารถทำให้สั้นลงได้โดยการลบพื้นที่ : P
เต็มเปาโดยมนุษย์

ถ้าคุณต้องการที่จะใส่รายการของบรรทัดตามที่คุณมีมาก่อนหน้านี้คุณสามารถลงไปที่ 30: ลองออนไลน์!

ฉันนั่งอยู่ที่นั่นประมาณ 5 นาทีเพื่อพยายามตัดสินใจว่าควรอนุญาตหรือไม่ ดังที่คำตอบของ Haskell แสดงขึ้นมันจะลดความท้าทายลงไปสู่สิ่งที่ไม่สำคัญ ฉันคิดว่าการแก้ปัญหาเรื่องไม่สำคัญมากเกินไปจะไม่เป็นที่นิยม
Carcigenicate




3

Bash + coreutils, 14

  • บันทึก 4 ไบต์ด้วย @DavidFoerster
paste -d "" $@

อินพุตได้รับเป็นสองชื่อไฟล์เป็นพารามิเตอร์บรรทัดคำสั่ง

ลองมันออนไลน์


คุณสามารถบันทึก 4 ไบต์:paste -d "" $@
David Foerster

@DavidFoerster ขอบคุณ! แปลก - ฉันลองก่อนหน้านี้แล้ว แต่ก็ไม่ทำงาน แก้ไข - ฉันเห็นแล้วตอนนี้ - แทนที่จะ-d ""ลองฉัน-d""ซึ่งแน่นอนว่าไม่ต่างกับ-d
Digital Trauma


2

APL (Dyalog Unicode) , 9 ไบต์SBCS

โปรแกรมเต็มรูปแบบ พรอมต์ (STDIN) สำหรับรายการความยาวของ\rสตริงที่ถูก จำกัด สตริงอาจมีการขาดและมีความกว้างต่างกันตราบใดที่มีจำนวนบรรทัดเท่ากัน พิมพ์ (STDOUT) ส่งผลให้ ASCII art

⊃,/⎕FMT¨⎕

ลองออนไลน์!

 พรอมต์สำหรับการป้อนข้อมูลที่ประเมิน

⎕FMT¨ รูปแบบ (ประเมินอักขระควบคุมทั้งหมดและเมทริกซ์อักขระคืน) แต่ละรายการ

,/ รวมเข้าด้วยกันในแนวนอน (ลดการรวมตัวกัน)

 เปิดเผย (เพราะการลดลดอันดับจาก 1 เป็น 0)


2

Java 8, 100 84 78 ไบต์

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

ออกจากการที่มีArrayIndexOutOfBoundsExceptionการ STDERR หลังจากที่มันได้พิมพ์ผลให้ STDOUT, ซึ่งได้รับอนุญาต

-6 ไบต์ขอบคุณที่@ OlivierGrégoire

คำอธิบาย:

ลองออนไลน์

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 ไบต์ ไม่มีการพูดถึงการไม่มีผลข้างเคียงใด ๆ เป็นพิเศษ ดังนั้นเราสามารถนับได้จนกว่าจะมีข้อยกเว้นเกิดขึ้น
Olivier Grégoire

@ OlivierGrégoireขอบคุณ! และการออกโดยมีข้อผิดพลาดไปยัง STDERR นั้นได้รับอนุญาตหลังจากพิมพ์ทุกอย่างไปยัง STDOUT
Kevin Cruijssen

2

ทับทิมขนาด 48 ไบต์

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

ลองออนไลน์!

แลมบ์ดารับสองสายและส่งคืนสตริง การตั้งค่าsplitตัวคั่นเริ่มต้นเป็นบรรทัดใหม่ด้วย$;=$/;ไม่บันทึกไบต์ใด ๆ แต่จะทำให้ส่วนที่เหลือดูดีขึ้นเล็กน้อย

Ruby , 49 ไบต์ (สตริงจำนวนมากโดยพล)

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

ลองออนไลน์!

แค่เล่น ๆ. ปรากฎว่าเราสามารถยอมรับอาร์เรย์ของสตริงได้โดยมีค่าใช้จ่ายเพิ่มเติมเพียง 1 ไบต์



2

สงสัย 21 ไบต์

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

ตัวอย่างการใช้งาน:

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

#nถูกใช้แทน\nเพื่อแสดงถึงการขึ้นบรรทัดใหม่

คำอธิบาย

เวอร์ชัน verbose:

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

แยกแต่ละสตริงในอาร์เรย์อินพุตตามบรรทัดใหม่, ซิปพร้อมสตริงเรียงต่อกันและส่งออกแต่ละรายการ







1

PowerShell , 51 49 ไบต์

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

ลองออนไลน์!

รับอินพุตเป็นสตริงตัวอักษรพร้อมบรรทัดใหม่ คุณสามารถใช้`n(ตัวคั่นบรรทัดใหม่ใน PowerShell ไม่ใช่\n) แทน

ก่อนอื่นเราสตริงซ้ายข้อมูลเกี่ยวกับการขึ้นบรรทัดใหม่ซึ่งจะสร้างอาร์เรย์และห่วงผ่าน-split |%{...}การวนซ้ำแต่ละครั้งเราสตริงเชื่อมต่อกับสตริงอินพุตที่เหมาะสมอีกครั้งแยกตามบรรทัดใหม่การจัดทำดัชนีและการเพิ่มขึ้น

สิ่งเหล่านั้นจะถูกทิ้งไว้บนไพพ์ไลน์และความWrite-Outputสมบูรณ์โดยนัยจะให้ผลลัพธ์เป็นอาเรย์ของสตริงซึ่งพิมพ์ด้วยการขึ้นบรรทัดใหม่ระหว่าง




1

Japt -R , 8 7 ไบต์

·íV· m¬

ลองมัน


คำอธิบาย

             :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

ทางเลือก

·Ë+V·gE

ลองมัน

             :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 ไบต์

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

ลองออนไลน์!

Ungolfed:

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

ตัวอย่าง:

$ 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

ฉันยังมีอันที่สั้นกว่า แต่ก็ล้มเหลวหากreadคำสั่งที่สองคืนค่าที่ไม่เป็นศูนย์

Bash , 55 ไบต์

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

หมายเหตุ: <&3ดูเหมือนจะใช้งานไม่ได้กับtio.run

อันนี้ใช้ file descriptors ( 1และ3) แทนการโต้เถียง:

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

1

ถ่าน 8 ไบต์

PθM⌕θ¶→η

ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด คำอธิบาย:

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

เพิ่ม 2 ไบต์เพื่อยอมรับอินพุตหลายรายการ:

FA«PιM⌕ι¶→

ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด คำอธิบาย:

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

เพิ่ม 4 ไบต์เพื่อยอมรับอินพุตที่ไม่เพิ่มขนาด:

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

ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด คำอธิบาย:

      θ         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 bytes

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

คำอธิบาย

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

ลองออนไลน์!

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.