Горизонтально выровненный ASCII Art


20

Ваша задача - принять в качестве входных данных два «ASCII Art» и расположить каждое произведение искусства рядом друг с другом по горизонтали.

Например, скажем, у вас есть две строки, "abc\ndef"и "123\n456". Вам нужно выровнять их по горизонтали, чтобы получить строку "abc123\ndef456". Я называю это" выравниванием по горизонтали ", потому что в то время как вводимые данные выглядят так:

abc
def

и:

123
456

Вывод при печати будет выглядеть так:

abc123
def456

Обратите внимание, как один вход расположен рядом с другим.


вход

  • Входные данные будут строками и могут быть как два отдельных аргумента или как последовательность строк.
  • Символы в искусстве будут иметь десятичные коды в диапазоне 32-126 (включительно).
  • Хорошо поддерживать произвольное число искусств для выравнивания вместо двух (но, очевидно, вы должны поддерживать как минимум два).
  • Можно предположить, что каждое искусство будет иметь одинаковые размеры, и что они будут содержать хотя бы одну строку.
  • Вы должны быть в состоянии поддерживать как минимум 100x100 персонажей.

  • Для согласования с соглашениями на сайте порядок аргументов не имеет значения. Неважно, какое искусство слева или справа.


Выход

  • Выходными данными будут выровненные изображения, как указано выше, либо возвращенные, либо выходные данные на стандартный вывод.

  • Любой конечный пробел в необязательном порядке.

  • Не должно быть визуального разделителя между выровненными изображениями.


Искусство ввода и вывода должно быть \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
Можем ли мы использовать пользовательский разделитель вместо новых строк? то есть "|"или " "?
августа

10
Я скажу нет, учитывая, что это может испортить любое искусство.
Carcigenicate

Можем ли мы использовать \rвместо \n?
Адам

@ Адам Конечно. Я обновлю формулировку.
Carcigenicate

Лидирующие пробелы в порядке?
Адам

Ответы:


20

6
Потому что, кто не только имеет встроенную команду для этого? : P
Caird Coneheringaahing

5
Это даже не справедливо. ; -;
полностью человек

3
@KevinCruijssen В PPCG обычно разрешено принимать входные данные в любом порядке, который вы хотите, и для языка на основе стека текущий порядок имеет больше смысла, чем обратный.
Дзайма

5
@KevinCruijssen, хотя я только что вспомнил, что у меня есть встроенное средство для обратного добавления, поэтому я обновляю сообщение: p
dzaima

2
Так у Canvas есть два встроенных элемента для этого? Хорошо Почему бы и нет?
Кэррида


6

Python 2 , 59 байт

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

Попробуйте онлайн!


Это может также быть сокращено, удаляя место. : P
полностью человек

Если вы хотите вводить и выводить списки строк, как это было раньше, вы можете получить его до 30: попробуйте онлайн!

Я сидел там около 5 минут, пытаясь решить, должен ли я это позволить. Как показывает ответ на Haskell, это уменьшило бы проблему до чего-то гораздо более тривиального. Я полагаю, однако, что слишком тривиальные решения просто не будут такими популярными.
Carcigenicate



3

Perl 5 -0F , 28 байт

Включает +2в качестве \nаргумента для -F(это «код», поэтому он должен рассчитывать)

Дайте входные данные непосредственно друг за другом на STDIN.

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

Попробуйте онлайн!


3

Bash + coreutils, 14

  • 4 байта сохранены благодаря @DavidFoerster.
paste -d "" $@

Входные данные задаются в виде двух имен файлов в качестве параметров командной строки.

Попробуйте онлайн .


Вы можете сохранить 4 байта:paste -d "" $@
Дэвид Фёрстер

@DavidFoerster Спасибо! Странно - я пробовал это раньше, и это не сработало. Редактировать - теперь я вижу - вместо того -d "", чтобы попробовать -d"", что, конечно, ничем не отличается от-d
Digital Trauma


2

APL (Dyalog Unicode) , 9 байтов SBCS

Полная программа. Запросы (STDIN) для любого списка \rдлин строк Струны могут быть неровными и различной ширины, если они имеют одинаковое количество строк. Отпечатки (STDOUT) в результате ASCII ст.

⊃,/⎕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++]);}

Выход с параметром ArrayIndexOutOfBoundsExceptionSTDERR после того, как он напечатал результат в 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 байтов. Ничего не сказано о лишнем побочном эффекте. Таким образом, мы могли бы просто считать, пока не произойдет исключение.
Оливье Грегуар

@ 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

Чудо , 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++]}

Попробуйте онлайн!

Принимает ввод как буквенные строки с символами новой строки. Вы также можете использовать`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

Баш , 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оператор возвращает ненулевое значение.

Баш , 55 байт

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

Примечание: <&3похоже, не работает на tio.run

Этот использует файловые дескрипторы ( 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()
}

Попробуйте онлайн!

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.