Yatay Hizalı ASCII Sanatı


20

Göreviniz girdi iki "ASCII Art" olarak kabul etmek ve her bir sanat eserini yatay olarak yan yana hizalamaktır.

Örneğin, iki dizeyi var demek "abc\ndef"ve "123\n456". "abc123\ndef456"Dizeyi üretmek için bunları yatay olarak hizalamanız gerekir . Bunu" yatay hizalama "olarak adlandırıyorum çünkü girdiler yazdırılırken şöyle görünür:

abc
def

ve:

123
456

Çıktı yazdırıldığında şu şekilde görünecektir:

abc123
def456

Bir girişin yan yana nasıl yerleştirildiğine dikkat edin.


Giriş

  • Girdi, dizeler olacaktır ve iki ayrı bağımsız değişken olarak ya da dizelerden oluşan bir dizi olabilir.
  • Sanattaki karakterlerin 32-126 (dahil) aralığında ondalık kodları olacaktır.
  • Sıradan sayıda sanatın sadece iki yerine hizalanması için desteklenmesi iyidir (ancak en azından iki tanesini desteklemelisiniz).
  • Her sanatın aynı boyutlara sahip olacağını ve en az bir satır içereceğini varsayabilirsiniz.
  • En az 100x100 karakter sanatını destekleyebilmelisiniz.

  • Sitedeki kurallara uymak için argüman sırası önemli değildir. Hangi sanatın solda veya sağda olduğu önemli değil.


Çıktı

  • Çıktı, yukarıda belirtilen veya stdout'a çıktı olarak belirtilen hizalanmış sanatlar olacaktır.

  • İsteğe bağlı herhangi bir sondaki boşluk.

  • Hizalı sanatlar arasında görsel bir ayırıcı olmamalıdır.


Girdi ve çıktı sanatları dizgiler \nveya \rsınırlandırılmış olmalıdır . 2D dizilere izin vermek aşırı derecede önemsiz olacaktır.

Başvurular fonksiyonlar veya tam programlar olabilir.

Test Durumları:

"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
Yeni satırlar yerine özel bir sınırlayıcı kullanabilir miyiz? yani "|"veya " "?
Rɪᴋᴇʀ

10
Herhangi bir sanatı mahvedecek hiçbir hayır diyeceğim.
Mart'ta Carcigenicate

\rBunun yerine kullanabilir miyiz \n?
Adám

@ Adám Sure. İfadeyi güncelleyeceğim.
Mart'ta Carcigenicate

Öncü boşluk uygun mu?
Adám

Yanıtlar:


20

6
Çünkü kim sadece bunun için bir yerleşik değildir ? : P
caird coinheringaahing

5
Bu hiç adil değil. , -;
totallyhuman

3
@KevinCruijssen PPCG'de genellikle istediğiniz sırada girdi almanıza izin verilir ve yığın tabanlı bir dil için geçerli sipariş tersine göre daha mantıklıdır.
dzaima

5
@KevinCruijssen rağmen ben sadece ters eklemek için yerleşik olduğunu hatırladım, bu yüzden yazı güncelliyorum: p
dzaima

2
Yani Tuval vardır iki Bunun yerleşiklerini? Tamam neden olmasın?
Mart'ta


6

Python 2 , 59 bayt

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

Çevrimiçi deneyin!


Alanı kaldırarak da kısaltılabilir. : P
totallyhuman

Daha önce olduğu gibi satır listelerini girmek ve çıkarmak istiyorsanız, 30'a kadar indirebilirsiniz: Çevrimiçi deneyin!

Orada 5 dakika boyunca buna izin verip vermemeye karar verdim. Haskell'in cevabının gösterdiği gibi, bu meydan okumayı çok daha önemsiz bir şeye indirecektir. Yine de aşırı önemsiz çözümlerin bu kadar popüler olmayacağını düşünüyorum.
Ocak'ta Carcigenicate



3

Perl 5 -0F , 28 bayt

+2İçin \nargüman içerir -F(bu "kod" yani saymak gerekir)

STDIN'de girişleri birbiri ardına doğrudan verin.

#!/usr/bin/perl -0F\n
say@F[$%++,$_]for@F/2..$#F

Çevrimiçi deneyin!


3

Bash + coreutils, 14

  • @DavidFoerster sayesinde 4 bayt tasarruf edildi.
paste -d "" $@

Giriş, komut satırı parametreleri olarak iki dosya adı olarak verilir.

Çevrimiçi deneyin .


4 bayt kaydedebilirsiniz:paste -d "" $@
David Foerster

@DavidFoerster Teşekkürler! Tuhaf - Bunu daha önce denedim ve işe yaramadı. Düzenleme - Şimdi görüyorum - yerine -d ""denedim -d"", hangisi farklı değil-d
Digital Trauma


2

APL (Dyalog Unicode) , 9 bayt SBCS

Tam program. \r-Delimited dizelerin herhangi bir uzunluk listesi için bilgi istemleri (STDIN) . Dizeler aynı sayıda çizgiye sahip oldukları sürece düzensiz ve farklı genişliklerde olabilir. ASCII sanatını sonuçlandıran (STDOUT) baskılar.

⊃,/⎕FMT¨⎕

Çevrimiçi deneyin!

 değerlendirilmiş girdi istemi

⎕FMT¨ (tüm kontrol karakterlerini değerlendirin ve karakter matrisini döndürün)

,/ yatay olarak birleştirin (katenasyon azalması)

 ifşa et (çünkü azalma rütbeyi 1'den 0'a düşürdüğü için)


2

Java 8, 100 84 78 bayt

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

ArrayIndexOutOfBoundsExceptionSonucu , izin verilen STDOUT öğesine yazdırdıktan sonra STDERR öğesine ile çıkar .

@ OlivierGrégoire sayesinde -6 bayt .

Açıklama:

Çevrimiçi deneyin.

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 bayt. Herhangi bir ekstra yan etkiye sahip olmadığı hakkında hiçbir şey söylenmez. Böylece bir istisna oluşana kadar sayabiliriz.
Olivier Grégoire

@ OlivierGrégoire Teşekkürler! Ve her şeyi STDOUT'a yazdırdıktan sonra STDERR'a bir hata ile çıkmaya gerçekten izin verilir.
Kevin Cruijssen

2

Ruby , 48 bayt

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

Çevrimiçi deneyin!

İki telli ve bir telli dönen bir lambda. Varsayılan splitsınırlayıcının yeni satıra ayarlanması $;=$/;bayt kaydetmez, ancak geri kalanını biraz daha güzel gösterir.

Ruby , 49 bayt (keyfi olarak birçok dize)

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

Çevrimiçi deneyin!

Sadece eğlence için. Sadece 1 baytlık ek bir maliyetle bir dizi diziyi kabul edebileceğimiz ortaya çıkıyor.


2

JavaScript (ES6), 51 bayt

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


2

Harika , 21 bayt

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

Kullanım örneği:

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

#n\nyeni satırları belirtmek yerine kullanılır .

açıklama

Ayrıntılı sürüm:

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

Giriş dizisindeki her dizeyi yeni satırlar boyunca bölün, dizeyi birleştirerek zip yapın ve her öğeyi çıktılayın.







1

PowerShell , 51 49 bayt

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

Çevrimiçi deneyin!

Girdileri yeni satırlarla gerçek dize olarak alır. Bunun yerine `n(PowerShell'deki yeni satır sınırlayıcısını kullanamazsınız) da kullanabilirsiniz \n.

İlk olarak -split, bir dizi oluşturan yeni satırlardaki sol giriş dizesini kullanırız ve bunu döngüleriz |%{...}. Her yinelemede, dizgiler yeniden sağ satırlara yeniden birleştirilir, yeniden satırlara bölünür, dizinlenir ve artırılır.

Bunlar boru hattında bırakılır ve Write-Outputtamamlanma sırasında örtük olan, bize yeni satırlarla yazdırılan bir dizeler dizisi olarak çıktı verir.




1

Japt -R , 8 7 bayt

·íV· m¬

Dene


açıklama

             :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

Alternatif

·Ë+V·gE

Dene

             :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 bayt

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

Çevrimiçi deneyin!

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

Örnekler:

$ 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

Ayrıca daha kısa bir tane var ama ikinci readifade sıfırdan farklı bir değer döndürürse başarısız olur .

Bash , 55 bayt

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

Not: tio.run'da<&3 çalışmıyor gibi görünüyor

Bu , argümanlar yerine dosya tanımlayıcıları ( 1ve 3) kullanır:

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

1

Kömür , 8 bayt

PθM⌕θ¶→η

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı versiyonudur. Açıklama:

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

Birden çok girişi kabul etmek için 2 bayt ekleyin:

FA«PιM⌕ι¶→

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı versiyonudur. Açıklama:

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

Unpadded girişi kabul etmek için 4 bayt ekleyin:

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

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı versiyonudur. Açıklama:

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

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

açıklama

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

Çevrimiçi deneyin!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.