Poziomo wyrównany ASCII art

20

Twoim zadaniem jest przyjęcie jako danych wejściowych dwóch „ASCII Art” i wyrównanie każdego dzieła obok siebie w poziomie.

Załóżmy na przykład, że masz dwa ciągi "abc\ndef"i "123\n456". Musisz wyrównać je w poziomie, aby utworzyć ciąg znaków "abc123\ndef456. Nazywam to „wyrównywaniem w poziomie”, ponieważ podczas gdy dane wejściowe, po wydrukowaniu, wyglądają tak:

abc
def

i:

123
456

Wydruk po wydrukowaniu będzie wyglądał następująco:

abc123
def456

Zwróć uwagę, jak jedno wejście jest umieszczane obok drugiego.


Wejście

  • Dane wejściowe będą ciągami znaków i mogą być dwoma oddzielnymi argumentami lub sekwencją ciągów znaków.
  • Znaki w sztuce będą miały kody dziesiętne w zakresie 32-126 (włącznie).
  • Wspieranie dowolnej sztuki może być wyrównane zamiast tylko dwóch (ale oczywiście musisz wesprzeć co najmniej dwie).
  • Możesz założyć, że każda sztuka będzie miała takie same wymiary i będzie zawierać co najmniej jedną linię.
  • Musisz mieć możliwość obsługi co najmniej 100 x 100 sztuk postaci.

  • Aby dostosować się do konwencji w witrynie, kolejność argumentów nie ma znaczenia. Nie ma znaczenia, która sztuka znajduje się po lewej lub prawej stronie.


Wynik

  • Wyjście będzie zgodne ze sztukami, jak wspomniano powyżej, albo zwrócone, albo wyjście na standardowe wyjście.

  • Dowolne końcowe białe spacje są opcjonalne.

  • Pomiędzy dopasowanymi sztukami nie może istnieć żaden wizualny separator.


Sztuki wejściowe i wyjściowe muszą być \nlub \rogranicznikami. Byłoby zbyt trywialne zezwolenie na tablice 2D.

Zgłoszenia mogą być funkcjami lub pełnymi programami.

Przypadki testowe:

"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"
Carcigenicate
źródło
1
Czy możemy użyć niestandardowego separatora zamiast znaku nowej linii? tj. "|"czy " "?
Rɪᴋᴇʀ
10
Powiem, że nikt nie zepsułby żadnej sztuki.
Carcigenicate
Czy możemy użyć \rzamiast \n?
Adám
@ Adám Sure. Zaktualizuję sformułowanie.
Carcigenicate
Czy wiodące białe znaki są w porządku?
Adám

Odpowiedzi:

20

Płótno , 1 bajt

×

Wypróbuj tutaj!

dzaima
źródło
6
Bo kto nie ma do tego wbudowanego? : P
caird coinheringaahing
5
To nawet niesprawiedliwe. ; -;
całkowicieludzki
3
@KevinCruijssen Na PPCG zwykle dozwolone jest przyjmowanie danych wejściowych w dowolnej kolejności, a dla języka opartego na stosie bieżąca kolejność jest bardziej sensowna niż odwrotna.
dzaima
5
@KevinCruijssen, chociaż właśnie przypomniałem sobie, że mam wbudowane odwrotne dodawanie, więc aktualizuję post: p
dzaima
2
Czyli Canvas ma do tego dwa wbudowane funkcje? Ok, czemu nie?
caird coinheringaahing
7

Haskell , 37 bajtów

(unlines.).(.lines).zipWith(++).lines

Wypróbuj online!

IO jako listy linii byłyby po prostu zipWith(++). : P

całkowicie ludzki
źródło
6

Python 2 , 59 bajtów

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

Wypróbuj online!

Rɪᴋᴇʀ
źródło
Można go również skrócić, usuwając przestrzeń. : P
totalnie ludzki,
Jeśli chcesz wprowadzać i wyprowadzać listy linii, tak jak wcześniej, możesz obniżyć do 30: Wypróbuj online!
Siedziałem tam przez około 5 minut, próbując zdecydować, czy mam na to pozwolić. Jak pokazuje odpowiedź Haskella, zredukowałoby to wyzwanie do czegoś znacznie bardziej trywialnego. Podejrzewam jednak, że zbyt trywialne rozwiązania po prostu nie byłyby tak popularne.
Carcigenicate
4

05AB1E , 6 bajtów

|¶¡øJ»

Wypróbuj online!

Wyjaśnienie

|        # push all input into a list
 ¶¡      # split on newlines
   ø     # zip
    J    # join the rows to single strings
     »   # merge on newlines
Emigna
źródło
Szkoda, że ​​spacja między dwoma wejściami nie była dozwolona :(.
Magic Octopus Urn
3

Perl 5 -0F , 28 bajtów

Obejmuje +2dla \nargumentu -F(to „Kod”, więc należy go liczyć)

Podaj dane wejściowe bezpośrednio po sobie na STDIN.

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

Wypróbuj online!

Ton Hospel
źródło
3

Bash + coreutils, 14

  • 4 bajty zapisane dzięki @DavidFoerster.
paste -d "" $@

Dane wejściowe podano jako dwie nazwy plików jako parametry wiersza polecenia.

Wypróbuj online .

Cyfrowa trauma
źródło
Możesz zapisać 4 bajty:paste -d "" $@
David Foerster
@DavidFoerster Thanks! Dziwne - próbowałem tego wcześniej i to nie działało. Edytuj - Widzę teraz - zamiast -d "", próbowałem -d"", co oczywiście nie różni się od-d
Cyfrowa trauma
3

Perl 6 , 27 bajtów

{join "\n",[Z~] $_>>.lines}

Wypróbuj online!

Współpracuje z dowolną liczbą sztuk. IO jako lista list byłaby sprawiedliwa &[Z~].

nwellnhof
źródło
2

APL (Dyalog Unicode) , 9 bajtów SBCS

Pełny program Monity (STDIN) dla dowolnej długości listy \r-delimitowanych ciągów. Sznurki mogą być nierówne i o różnych szerokościach, o ile mają taką samą liczbę linii. Wydruki (STDOUT) wynikające z art ASCII.

⊃,/⎕FMT¨⎕

Wypróbuj online!

 monit o podanie danych wejściowych

⎕FMT¨ formatuj (oceniaj wszystkie znaki kontrolne i zwracaj macierz znaków) każdy

,/ łącz je poziomo (redukcja catenation)

 ujawnij (ponieważ redukcja zmniejszyła rangę z 1 do 0)

Adám
źródło
2

Java 8, 100 84 78 bajtów

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

Wychodzi z ArrayIndexOutOfBoundsExceptionSTDERR po wydrukowaniu wyniku do STDOUT, co jest dozwolone .

-6 bajtów dzięki @ OlivierGrégoire .

Wyjaśnienie:

Wypróbuj online.

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
Kevin Cruijssen
źródło
1
a->b->{for(int i=0;;)System.out.println(a.split("\n")[i]+b.split("\n")[i++]);}78 bajtów. Nic nie mówi się o tym, że nie ma żadnego dodatkowego efektu ubocznego. Możemy więc po prostu liczyć, aż wystąpi wyjątek.
Olivier Grégoire,
@ OlivierGrégoire Thanks! Wyjście z błędem do STDERR jest rzeczywiście dozwolone po wydrukowaniu wszystkiego do STDOUT.
Kevin Cruijssen
2

Rubinowy , 48 bajtów

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

Wypróbuj online!

Lambda bierze dwa łańcuchy i zwraca łańcuch. Ustawienie domyślnesplit separatora na nowy wiersz za pomocą $;=$/;nie zapisuje żadnych bajtów, ale sprawia, że ​​reszta wygląda nieco ładniej.

Ruby , 49 bajtów (dowolnie wiele ciągów)

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

Wypróbuj online!

Dla żartu. Okazuje się, że możemy zaakceptować tablicę ciągów za dodatkową opłatą wynoszącą tylko 1 bajt.

benj2240
źródło
2

JavaScript (ES6), 51 bajtów

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

Neil
źródło
2

Cud , 21 bajtów

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

Przykład użycia:

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

#n jest używany zamiast \n do oznaczenia nowego wiersza.

Wyjaśnienie

Pełna wersja:

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

Podziel każdy ciąg znaków w tablicy wejściowej wzdłuż znaków nowej linii, skompresuj zip za pomocą konkatenacji łańcucha i wyślij każdy element.

Mama Fun Roll
źródło
2

Kotlin , 73 bajty

a,b->a.split("\n").mapIndexed{i,s->s+b.split("\n")[i]}.joinToString("\n")

Wypróbuj online!

Makotosan
źródło
1

C, 96 bajtów

#define L(s)for(;*s++>10;)putchar(s[-1]);
i;f(s,t)char*s,*t;{for(;i=!!s[-i];puts("")){L(s)L(t)}}

Wypróbuj online!

Steadybox
źródło
1

JavaScript (ES6), 52 bajty

Pobiera dane wejściowe w składni curry (a)(b).

a=>b=>a.split`
`.map((s,i)=>s+b.split`
`[i]).join`
`

Wypróbuj online!

Arnauld
źródło
1

PowerShell , 51 49 bajtów

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

Wypróbuj online!

Pobiera dane wejściowe jako ciągi literalne z znakami nowej linii. Możesz także użyć `n(separatora nowego wiersza w programie PowerShell, a nie \n).

Najpierw -splitlewy ciąg wejściowy na znakach nowej linii, który tworzy tablicę, i przechodzimy przez niego |%{...}. W każdej iteracji łączymy ciąg znaków z właściwym ciągiem wejściowym ponownie dzielonym na znaki nowej linii, indeksowanym i zwiększanym.

Są one pozostawione w potoku, a domniemane Write-Outputpo zakończeniu daje nam wynik jako tablicę ciągów, które są drukowane z nowymi liniami między nimi.

AdmBorkBork
źródło
1

Japt -R , 8 7 bajtów

·íV· m¬

Spróbuj


Wyjaśnienie

             :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

Alternatywny

·Ë+V·gE

Spróbuj

             :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
Kudłaty
źródło
1

Bash , 92 bajty

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

Wypróbuj online!

Nie golfowany:

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

Przykłady:

$ 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

Mam też krótszy, ale kończy się niepowodzeniem, jeśli druga readinstrukcja zwraca wartość niezerową.

Bash , 55 bajtów

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

Uwaga: <&3nie działa na tio.run

Ten używa deskryptorów plików ( 1i 3) zamiast argumentów:

$ foo <<< $'qwertyuiop\n asdfghjkl' 3<<< $'Some other\nTextFiller'
qwertyuiopSome other
 asdfghjklTextFiller
nxnev
źródło
1

Węgiel drzewny , 8 bajtów

PθM⌕θ¶→η

Wypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:

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

Dodaj 2 bajty, aby zaakceptować wiele danych wejściowych:

FA«PιM⌕ι¶→

Wypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:

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

Dodaj 4 bajty, aby zaakceptować niepakowane dane wejściowe:

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

Wypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:

      θ         First input
       ¶        Literal newline
     ⪪          Split
    E           Map over each string
         ι      Current string
        L       Length
   ⌈            Maximum
  M       →     Move that many squares right
Neil
źródło
1

JavaScript (Node.js) , 79 bajtów

a=>(b=a.map(x=>x.split`
`))[i=0].map(y=>b.map(z=>c+=z[i],c="")&&++i&&c).join`
`

Wypróbuj online!

Obsługuje dowolną liczbę sztuk ASCII łączących się ze sobą, a nie tylko 2 (jak w 2 poprzednich odpowiedziach JS).

Shieru Asakoto
źródło
1

Swift 4 , 119 bajtów

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

Wyjaśnienie

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

Wypróbuj online!

Tamás Sengel
źródło