가로로 정렬 된 ASCII 아트


20

당신의 임무는 두 개의 "ASCII Art"를 입력으로 받아들이고 각 예술 작품을 서로 수평으로 정렬하는 것입니다.

예를 들어, 두 개의 문자열을 가지고 말을 "abc\ndef"하고 "123\n456". 문자열 "abc123\ndef456" 을 생성하려면 가로로 정렬해야합니다 . 인쇄 할 때 입력이 다음과 같이 표시되기 때문에 이것을"수평 정렬 "이라고합니다.

abc
def

과:

123
456

출력시 출력은 다음과 같습니다.

abc123
def456

한 입력이 다른 입력 옆에 배치되는 방법에 유의하십시오.


입력

  • 입력은 문자열이며 두 개의 개별 인수 또는 문자열 시퀀스 일 수 있습니다.
  • 예술 분야의 문자는 32-126 (포함) 범위의 10 진수 코드를 갖습니다.
  • 2 개 대신 정렬 할 수있는 임의의 수의 예술을 지원하는 것이 좋습니다 (그러나 반드시 2 개 이상을 지원해야합니다).
  • 각 아트의 치수가 같고 적어도 하나의 선을 포함한다고 가정 할 수 있습니다.
  • 최소 100x100 캐릭터 아트를 지원할 수 있어야합니다.

  • 사이트의 규칙에 맞추기 위해 인수 순서는 중요하지 않습니다. 어떤 예술이 왼쪽이나 오른쪽에 있는지는 중요하지 않습니다.


산출

  • 출력은 위에서 언급 한대로 정렬 된 예술이되며 stdout으로 반환되거나 출력됩니다.

  • 선택적인 후행 공백.

  • 정렬 된 아트 사이에 시각적 구분 기호가 없어야합니다.


입력 및 출력 아트는 문자열 \n이거나 \r구분 된 문자열 이어야합니다 . 2D 배열을 허용하는 것은 지나치게 사소한 일입니다.

제출물은 기능 또는 전체 프로그램 일 수 있습니다.

테스트 사례 :

"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

@ Adám Sure. 문구를 업데이트하겠습니다.
Carcigenicate

선행 공백은 괜찮습니까?
Adám

답변:


20

6
원인 하지 않습니다 단지 이것에 대한 내장이? : P
caird coinheringaahing

5
그것은 공평하지도 않습니다. ;-;
완전히 인간적인

3
@KevinCruijssen PPCG에서는 일반적으로 원하는 순서대로 입력을 할 수 있으며 스택 기반 언어의 경우 현재 순서가 역순보다 더 의미가 있습니다.
dzaima

5
@KevinCruijssen 비록 내가 역 추가를위한 내장 기능이 있다는 것을 기억했지만 게시물을 업데이트하고 있습니다 : p
dzaima

2
Canvas에는 두 가지 내장 기능이 있습니까? 그래, 왜 안 되겠 어?
caird coinheringaahing


6

파이썬 2 , 59 바이트

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

온라인으로 사용해보십시오!


공간을 제거하여 단축 할 수도 있습니다. : P
완전히 인간적인

이전과 같이 줄 목록을 입력하고 출력하려면 30으로 줄이십시오. 온라인으로 시도하십시오!

나는 그것을 허용 해야하는지 결정하려고 5 분 동안 거기에 앉아있었습니다. Haskell의 답변에서 알 수 있듯이 도전은 훨씬 사소한 것으로 줄어 듭니다. 지나치게 사소한 솔루션은 그렇게 인기가 없을 것이라고 생각합니다.
Carcigenicate




3

배쉬 + 코어 유틸리티, 14

  • @DavidFoerster 덕분에 4 바이트가 절약되었습니다.
paste -d "" $@

입력은 명령 행 매개 변수로 두 개의 파일 이름으로 제공됩니다.

온라인으로 사용해보십시오 .


4 바이트를 절약 할 수 있습니다.paste -d "" $@
David Foerster

@DavidFoerster 감사합니다! 이상한-나는 그것을 일찍 시도했지만 작동하지 않았다. 편집 – 나는 지금-대신에 -d ""시도 -d""했다-d
Digital Trauma


2

APL (Dyalog Unicode) , 9 바이트 SBCS

전체 프로그램. \r구분 된 문자열의 길이 목록에 대한 프롬프트 (STDIN) . 줄이 같은 줄이 있으면 줄이 울퉁불퉁하고 폭이 다를 수 있습니다. ASCII 아트를 결과로 인쇄합니다 (STDOUT).

⊃,/⎕FMT¨⎕

온라인으로 사용해보십시오!

 평가 입력을위한 프롬프트

⎕FMT¨ 각각의 형식 (모든 제어 문자를 평가하고 문자 매트릭스를 리턴)

,/ 수평으로 결합 (카테고리 축소)

 공개 (감소로 인해 순위가 1에서 0으로 감소했기 때문에)


2

자바 8, 100 84 78 바이트

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

와 이탈은 ArrayIndexOutOfBoundsException그것이 STDOUT에 결과 인쇄되면 stderr에 허용된다 .

@ OlivierGrégoire 덕분에 -6 바이트 .

설명:

온라인으로 사용해보십시오.

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에 인쇄 된 후에 허용됩니다.
케빈 크루이 센

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

자바 스크립트 (ES6), 51 바이트

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


2

Wonder , 21 바이트

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

사용 예 :

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

#n\n개행을 나타내는 대신에 사용됩니다 .

설명

자세한 버전 :

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

입력 배열의 각 문자열을 개행을 따라 분할하고 문자열을 연결하여 압축하고 각 항목을 출력하십시오.







1

PowerShell , 51 49 바이트

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

온라인으로 사용해보십시오!

줄 바꿈이있는 리터럴 문자열로 입력을받습니다. 대신 ( `nPowerShell이 ​​아닌 개행 구분 기호)를 사용할 수도 있습니다 \n.

먼저 -split개행에서 왼쪽 입력 문자열을 사용하여 배열을 만들고 반복합니다.|%{...} . 반복 할 때마다 문자열을 올바른 입력 문자열과 연결하여 줄 바꿈으로 다시 분할하고 인덱싱하고 증가시킵니다.

그것들은 파이프 라인에 남아 Write-Output있으며 완료시 암시 적 으로 줄 배열로 출력되는 문자열 배열로 출력합니다.




1

apt -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

배쉬 , 92 바이트

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

온라인으로 사용해보십시오!

언 골프 드 :

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문이 0이 아닌 값을 반환 하면 실패 합니다.

배쉬 , 55 바이트

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

참고 : tio.run<&3 에서 작동하지 않는 것 같습니다.

이것은 인수 대신 파일 디스크립터 ( 13)를 사용합니다 .

$ 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

스위프트 4 , 119 바이트

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.