水平に整列したASCIIアート


20

あなたの仕事は、入力として2つの「ASCIIアート」を受け入れ、各アートを水平方向に並べて配置することです。

たとえば、2つの文字列がある"abc\ndef"とし"123\n456"ます。"abc123\ndef456入力を印刷するとき、次のように見えるので、文字列「」を生成するためにそれらを水平に整列させる必要があります。

abc
def

そして:

123
456

出力は、印刷されると次のようになります。

abc123
def456

1つの入力が他の入力の隣にどのように配置されるかに注意してください。


入力

  • 入力は文字列であり、2つの個別の引数として、または文字列のシーケンスとして使用できます。
  • アート内の文字には、32〜126(両端を含む)の範囲の10進コードが含まれます。
  • 2つだけではなく、任意の数のアートを揃えることができます(ただし、少なくとも2つはサポートする必要があります)。
  • 各アートの寸法は同じであり、少なくとも1つの行が含まれていると想定できます。
  • 少なくとも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
芸術を台無しにするようなものは何も言いません。
発がん性

\r代わりに使用でき\nますか?
アダム

@Adámもちろん。文言を更新します。
発がん性

先頭の空白は大丈夫ですか?
アダム

回答:


20

6
がこれのためだけにビルトインしていないのですか?:P
ケアニアンコイリンガリング

5
それは公平ではありません。;-;
完全に人間

3
@KevinCruijssen PPCGでは、通常、任意の順序で入力を受け取ることができます。スタックベースの言語では、現在の順序は逆よりも意味があります。
dzaima

5
@KevinCruijssenリバースアド用のビルトインがあることを思い出したので、投稿を更新しています:p
dzaima

2
Canvasにはこのために2つのビルトインがありますか?じゃあ、どうして?
コイナーリンガーアーイング


6

Python 2、59バイト

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

オンラインでお試しください!


スペースを削除することで短縮することもできます。:P-
完全に人間

以前と同じように行のリストを入力および出力する場合は、30まで下げることができます:オンラインで試してみてください!

私はそれを許可すべきかどうかを決定しようとして、5分間ほどそこに座っていました。Haskellの答えが示すように、それは挑戦をもっと些細なものにまで減らすでしょう。私は、あまりにも些細な解決策はそれほど人気が​​ないと思います。
発がん性




3

Bash + coreutils、14

  • @DavidFoersterのおかげで4バイト節約されました。
paste -d "" $@

入力は、コマンドラインパラメーターとして2つのファイル名として指定されます。

オンラインでお試しください


:あなたは4バイトで保存することができますpaste -d "" $@
デビッド・フェルスター

@DavidFoersterありがとう!奇妙な-私は以前にそれを試してみましたが、うまくいきませんでした。編集-代わりに-私は今見る-d ""私が試した、-d""もちろんに違いはありませんこれは、-d
デジタルトラウマ


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バイト。余分な副作用がないことについては何も言われていません。したがって、例外が発生するまで単純にカウントできます。
オリビエグレゴワール

@OlivierGrégoireありがとう!そして、STDERRにすべてを出力した後、STDERRへのエラーで終了することが実際に許可されます。
ケビンクルーッセン

2

Ruby、48バイト

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

オンラインでお試しください!

2つの文字列を取り、文字列を返すラムダ。デフォルトのsplit区切り文字を改行に設定して$;=$/;も、バイトは保存されませんが、残りは少し見やすくなります。

Ruby、49バイト(任意の多くの文字列)

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

オンラインでお試しください!

ただ楽しみのために。わずか1バイトの追加コストで文字列の配列を受け入れることができます。


2

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

ワンダー、21バイト

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

使用例:

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

#n\n改行の代わりに使用されます。

説明

詳細バージョン:

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

入力配列の各文字列を改行に沿って分割し、文字列連結で圧縮し、各項目を出力します。







1

PowerShell51 49バイト

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

オンラインでお試しください!

入力を改行付きのリテラル文字列として受け取ります。代わり`nに(PowerShellの改行区切り文字であり、ではありません\n)を使用することもできます。

最初-splitに改行で左の入力文字列を作成し|%{...}ます。これにより、配列が作成され、その中をループします。反復ごとに、正しい入力文字列と文字列を連結し、再び改行で分割し、インデックスを作成して増分します。

これらはパイプライン上に残され、Write-Output完了時の暗黙の結果は、文字列の配列として出力され、間に改行が印刷されます。




1

Japt -R8 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[@]}"

オンラインでお試しください!

ゴルフをしていない:

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

短いものもありますが、2番目のreadステートメントがゼロ以外の値を返すと失敗します。

Bash、55バイト

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

注:tio.run<&3では動作しないようです

これは、引数の代わりにファイル記述子(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バイト

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.