Горизонтально вирівняні ASCII ст


20

Ваше завдання полягає в тому, щоб прийняти як вхід два "ASCII Art", і вирівняти кожен витвір мистецтва поруч один з одним по горизонталі.

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

abc
def

і:

123
456

При друкуванні результат буде виглядати приблизно так:

abc123
def456

Зверніть увагу, як один вхід розміщений поруч з іншим.


Вхідні дані

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

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


Вихідні дані

  • Виходом буде узгоджене мистецтво, як згадувалося вище, або повернене, або вихідне в 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 Sure. Я оновлю формулювання.
Carcigenicate

Чи провідні пробіли добре?
Адам

Відповіді:


20

6
Тому що хто не просто вбудований для цього? : P
caird coinheringaahing

5
Це навіть не чесно. ; -;
повністюлюдський

3
@KevinCruijssen На PPCG зазвичай дозволяється приймати введення в будь-якому порядку, а для мови, що базується на стеці, поточне замовлення має більше сенсу, ніж зворотне.
dzaima

5
@KevinCruijssen, хоча я просто пам’ятав, що у мене є вбудований зворотній додаток, тому я
оновлюю

2
Так у Canvas є два вбудовані для цього? Гаразд, чому б і ні?
caird coinheringaahing


6

Python 2 , 59 байт

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

Спробуйте в Інтернеті!


Також його можна скоротити, видаливши простір. : P
абсолютнолюдський

Якщо ви хочете вводити та виводити списки рядків, як це було раніше, ви можете зменшити їх до 30: Спробуйте в Інтернеті!

Я просидів там приблизно 5 хвилин, намагаючись вирішити, чи варто мені це дозволити. Як показує відповідь Haskell, це зменшило б завдання до чогось більш тривіального. Я думаю, хоча надто банальні рішення просто не були б такими популярними.
Carcigenicate




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++]);}

Виходить із ArrayIndexOutOfBoundsExceptionсимволом STDERR після того, як він надрукував результат у 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[@]}"

Спробуйте в Інтернеті!

Безголівки:

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

Швидкий 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.