Создайте этот красивый ASCII-Art


30

Введение

Я думаю, что все согласны с тем, что красивые картинки должны иметь красивую рамку. Но большинство задач на этом сайте об ASCII-Art просто хотят получить необработанную картинку и не заботятся о ее сохранности.
Разве не было бы неплохо, если бы у нас была программа, которая использует ASCII-Art и окружает ее красивой рамкой?

Соревнование

Напишите программу, которая принимает ASCII-Art в качестве входных данных и выводит их в красивой рамке.

Пример:

*****
 ***
  *
 ***
*****

становится

╔═══════╗
║ ***** ║
║ *** ║
║ * ║
║ *** ║
║ ***** ║
╚═══════╝
  • Вы должны использовать те же символы для кадра, что и в примере: ═ ║ ╔ ╗ ╚ ╝
  • Верх и низ кадра вставляются перед первой и после последней строки ввода.
  • Левая и правая части кадра должны иметь ровно один пробел к самой широкой строке ввода.
  • В выводе могут отсутствовать начальные или конечные пробелы. Разрешается только завершающий перевод строки.
  • Вы можете предположить, что у ввода нет лишних начальных пробелов.
  • Вы можете предположить, что входные данные не имеют конечных пробелов ни в одной строке.
  • Вам не нужно обрабатывать пустой ввод.
  • Входные данные будут содержать только печатные символы ASCII и символы новой строки.

правила

Удачного кодирования!

Использование какого-то замечательного ASCII-Art, созданного в любой задаче на этом сайте, очень приветствуется как вклад в вашу программу и ее демонстрацию в красивой рамке!


29
Рамка без ASCII для искусства ASCII? Ересь!
Деннис

5
Очень тесно связаны. Та же проблема, но только с использованием одного (ASCII) символа для кадра.
Мартин Эндер

13
(Я должен уточнить, я не думаю, что это обман. Необходимость использования 6 различных символов делает это намного сложнее. Другая проблема может быть решена вращением сетки и добавлением #четырех раз. Адаптировать такой подход здесь будет в лучшем случае сложно. и не жизнеспособна в худшем случае.)
Мартин Эндер

6
@IsmaelMiguel Я выиграл предыдущий конкурс и не понимаю, как вообще можно адаптировать свой старый ответ.
Мартин Эндер

2
Я подозреваю, что DenkerAffe предполагает CP437 или что-то, где символы кадра также составляют один байт.
Джошуа

Ответы:


6

CJam, 45 символов / 52 байта

qN/_z,)[_)'═*N]2*C,3%'╔f+.\4/@@f{Se]'║S@2$N}*

Попытка избежать тех дорогих 3-байтовых символов была ... интересной.

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

объяснение

qN/                   Split input by newline
_z,                   Zip and get length L, i.e. length of longest line
)                     Increment -> L+1
[_)'═*N]              Make two-element array of "═"*(L+2) and newline
2*                    Double the array, giving ["═"*(L+2) "\n" "═"*(L+2) "\n"]

C,                    range(12), i.e. [0 1 2 ... 11]
3%                    Every third element, i.e. [0 3 6 9]
'╔f+                  Add "╔" to each, giving "╔╗╚╝"
.\                    Vectorised swap with the previous array, giving
                      ["╔" "═"*(L+2) "╗" "\n" "╚" "═"*(L+2) "╝" "\n"]
4/                    Split into chunks of length 4

@@                    Move split input and L+1 to top
f{...}                Map with L+1 as extra parameter...
  Se]                   Pad line to length L+1, with spaces
  '║S                   Put "║" and space before it
  2$N                   Put "║" and newline after it

*                     Join, putting the formatted lines between the top and bottom rows

16

Haskell, 139 байт

q=length
g x|l<-lines x,m<-maximum$q<$>l,s<-[-1..m]>>"═"='╔':s++"╗\n"++(l>>= \z->"║ "++z++([q z..m]>>" ")++"║\n")++'╚':s++"╝"

В качестве примера я подставляю снеговика "12333321" .

*Main> putStrLn $ g " _===_\n (O.O)\n/(] [)\\\n ( : )"
╔═════════╗
║  _===_  ║
║  (O.O)  ║
║ /(] [)\ ║
║  ( : )  ║
╚═════════╝

Как это работает:

bind
  l: input split into lines
  m: maximum line length
  s: m+2 times ═

build top line
prepend left frame to each line, pad with spaces, append right frame
build bottom line.

9

JavaScript (ES6), 138 байт

Это 138 байт в кодировке IBM866, которая на момент написания все еще поддерживается в Firefox, но 152 в UTF-8.

s=>`╔${t='═'.repeat(w=2+Math.max(...(a=s.split`
`).map(s=>s.length)))}╗
${a.map(s=>('║ '+s+' '.repeat(w)).slice(0,w+1)).join`║
`}║
╚${t}╝`

1
Можете ли вы на самом деле кодировать Javascript с помощью CP437 и по-прежнему запускать его? Если нет, то это на самом деле не 138 байтов.
Мама Ролл

@ ӍѲꝆΛҐӍΛПҒЦꝆ Хотя я не смог найти ничего поддерживающего CP437, Firefox в настоящее время поддерживает IBM866, который также имеет эти символы рисования прямоугольников, поэтому я обновил свой ответ.
Нил

ОК, круто. Имейте upvote!
Mama Fun Roll

6

Bash, 173 171 150 148 147 байт, 157 136 134 133 символов

q(){((n=${#2}>n?${#2}:n));};mapfile -tc1 -C q v;for((p=++n+1;p;--p));do z+=═;done;echo ╔$z╗;printf "║ %-${n}s║\n" "${v[@]}";echo ╚$z╝

Multiline:

q() {
    (( n = ${#2} > n ? ${#2} : n))
}
mapfile -tc1 -C q v

for((p=++n+1;p;--p))
do 
    z+=═
done

echo ╔$z╗
printf "║ %-${n}s║\n" "${v[@]}"
echo ╚$z╝

Пример выполнения:

bash -c 'q(){((n=${#2}>n?${#2}:n));};mapfile -tc1 -C q v;for((p=++n+1;p;--p));do z+=═;done;echo ╔$z╗;printf "║ %-${n}s║\n" "${v[@]}";echo ╚$z╝'< bear.txt

Пример запуска из скрипта:

$ cat bear2.txt 
     (()__(()
     /       \
    ( /    \  \
     \ o o    /
     (_()_)__/ \
    / _,==.____ \
   (   |--|      )
   /\_.|__|'-.__/\_
  / (        /     \
  \  \      (      /
   )  '._____)    /
(((____.--(((____/mrf
$ ./frame< bear2.txt 
╔═══════════════════════╗
║      (()__(()         ║
║      /       \        ║
║     ( /    \  \       ║
║      \ o o    /       ║
║      (_()_)__/ \      ║
║     / _,==.____ \     ║
║    (   |--|      )    ║
║    /\_.|__|'-.__/\_   ║
║   / (        /     \  ║
║   \  \      (      /  ║
║    )  '._____)    /   ║
║ (((____.--(((____/mrf ║
╚═══════════════════════╝

1
В вашем примере есть строка emtpy между нижним фреймом и вводом, который недопустим. Верхняя и нижняя рамки должны быть вставлены непосредственно до и после ввода (кстати, ваша предыдущая версия была в порядке).
Денкер

1
Хорошо !, но вы могли бы сэкономить около 5 символов, если ...?${#2}+2:n))вместо этого +1пропустить 2 пробела и printf -v z %${n}s;вместо printf -v z " %*.s" $n.
Ф. Хаури

@Sukminder Хорошо, это уже предполагалось, но я хотел убедиться в этом, так как показанный вами ввод не содержит пустой строки. Я не требовал, чтобы вы очищали ввод от начальных или промежуточных пустых строк, поэтому ваша программа работает отлично.
Денкер

5

AWK, 159 байт

{a[NR]=$0
x=length($0)
m=m<x?x:m
a[NR,1]=x}
END{for(;i<m+2;i++)t=t"═"
print"╔"t"╗"
for(j=1;j<NR;j++){f="║ %-"m"s ║\n"
printf f,a[j]}print"╚"t"╝"}

Очевидно, awkможно распечатать Unicode, если вы можете выяснить, как получить его в коде.


У меня сейчас так много идей для потрясающих трубок ...
Sebb

@Sebb Это похоже на веселье. :)
Роберт Бенсон

5

Perl, 111 символов

(оценка включает +5 для флагов переводчика)

#!/usr/bin/perl -n0 -aF\n
$n=(sort{$b<=>$a}map length,@F)[0];$l="═"x$n;
print"╔═$l═╗\n",(map{sprintf"║ %-${n}s ║\n",$_}@F),"╚═$l═╝";

Во-первых, мы находим наибольшую длину строки $n, численно сортируя длины всех линий.

Мы устанавливаем $lв качестве заголовка / нижнего колонтитула $nповторения символа горизонтальной рамки.

Затем мы печатаем каждую строку, отформатированную для выравнивания по левому краю, в поле ширины $n, расположенном между символами рамки.

Результат:

╔═══════════╗
║   |\_/|   ║
║  / @ @ \  ║
║ ( > * < ) ║
║  `>>x<<'  ║
║  /  O  \  ║
╚═══════════╝

4

Pyth, 44 символа (58 байт)

++\╔K*JhheSlR.z\═\╗jbm+\║+.[+;d;J\║.z++\╚K\╝

объяснение

++\╔K*JhheSlR.z\═\╗                          - print out the first line
           lR.z                              -        map(len, all_input())
          S                                  -       sorted(^)
         e                                   -      ^[-1]
       hh                                    -     ^+2
      J                                      -    autoassign J = ^
     *         \═                            -   ^*"═"
    K                                        -  autoassign K = ^
++\╔             \╗                          - imp_print("╔"+^+"╗")

                   jbm+\║+.[+;d;J\║.z        - print out the middle
                   jb                        - "\n".join(V)
                     m             .z        -  [V for d in all_input()]
                      +\║+       \║          -   "║"+V+"║"
                          .[   ;J            -    pad(V, " ", J)
                            +;d              -     " "+d

                                     ++\╚K\╝ - print out the end
                                     ++\╚K\╝ - imp_print("╚"+K+"╝")

Попробуй это здесь.


4

PHP 5.3, 209 байт

Это работает только с использованием кодировки OEM 860 . Это расширенный набор ASCII, используемый в португальских версиях DOS. Так как я португалец (и я любил делать эти «кадры» в Паскале), и это стандартная кодировка, я продолжил:

<?foreach($W=explode('
',$argv[1])as$v)$M=max($M,strlen($v)+2);printf("É%'Í{$M}s»
º%1\${$M}sº
%2\$s
º%1\${$M}sº
È%1\$'Í{$M}s¼",'',join('
',array_map(function($v)use($M){return str_pad(" $v ",$M);},$W)));

Вот base64:

PD9mb3JlYWNoKCRXPWV4cGxvZGUoJwonLCRhcmd2WzFdKWFzJHYpJE09bWF4KCRNLHN0cmxlbigkdikrMik7cHJpbnRmKCLilZQlJ+KVkHskTX1z4pWXCuKVkSUxXCR7JE19c+KVkQolMlwkcwrilZElMVwkeyRNfXPilZEK4pWaJTFcJCfilZB7JE19c+KVnSIsJycsam9pbignCicsYXJyYXlfbWFwKGZ1bmN0aW9uKCR2KXVzZSgkTSl7cmV0dXJuIHN0cl9wYWQoIiAkdiAiLCRNKTt9LCRXKSkpOw==

Этот ответ был основан на моем ответе по адресу : https://codegolf.stackexchange.com/a/57883/14732 (там был сделан тяжелый подъем, просто пришлось немного дергаться).


Впечатляет, мягко говоря :)
мягко

Коды 209 байтов / символов. 22+58+11+5+11+24+66+12=209Последние 12 - это новые строки и, как и DOS, означают CRLF, или два байта на новую строку. Сайт персонажа не учитывает новые строки. Каждый из не-ASCII глифов составляет 1 байт в OEM 860.
Runium

@Sukminder Не забывайте, что (по крайней мере) Windows превращается \nв\r\n , при открытии файла в ASCII / текстовом режиме.
Исмаэль Мигель

2

Python 3, 119 байт

def f(x): 
 n='\n';s="║ ";e=" ║";h=(x.find(n)+2)*"═";return"╔"+h+"╗"+n+s+x.replace(n,e+n+s)+e+n+"╚"+h+"╝"

126 байт

import sys
o=["║ %s ║\n"%j[:-1] for j in sys.stdin]
h="═"*(len(o[0])-3)
print("╔"+h+"╗\n"+"".join(o)+"╚"+h+"╝")

Входные данные:

hello
there
  !  

Выход:

╔═══════╗
 hello 
 there 
   !   
╚═══════╝

Добро пожаловать в Progamming Puzzles & Code Golf! Хороший первый ответ! Вы всегда можете написать функции вместо полных программ (если это явно не запрещено в тесте), которые могут позволить вам сохранить несколько байтов, принимая входные данные в качестве аргумента. Также вы можете использовать Python 2, чтобы сэкономить 2 байта, перейдя с print"╔"+h+"╗\n"+"".join(o)+"╚"+h+"╝".
Денкер

Спасибо. Я не мог понять, как заставить старшие байты работать в Python2 (возможно, сработала бы установка переменной среды кодека, но я не уверен, как это влияет на количество байтов в гольфе). Функциональный подход устраняет различия Python2 / 3, но добавляет байт в моем лучшем подходе.
SumnerHayes

Хорошо, я получил его до 119 символов как функцию; принимает входные данные в виде строки. Моя мини-уценка явно не подходит для того, чтобы нюхать; Строка 1 - это определение, остальное (после двоеточия) - это строка 2 с начальным пробелом. def f(x): n='\n';s="║ ";e=" ║";h=(x.find(n)+2)*"═";return"╔"+h+"╗"+n+s+x.replace(n,e+n+s)+e+n+"╚"+h+"╝"
SumnerHayes

Просто обновите ваш пост новой версией и новым счетом (вычеркните старый счет с помощью <s>...</s>). Также вы можете добавить <!-- language-all: lang-python -->перед вашим блоком кода, чтобы добавить подсветку синтаксиса в ваш код.
Денкер

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

2

Python 2, 115 байт

def f(i):w='═'*(i.find('\n')+2);return'╔%s╗\n║ %s ║\n╚%s╝'%(w,' ║\n║ '.join(i.split('\n')),w)

Здесь он выглядит короче 115, но рабочий файл содержит 3-байтовую подпись метки спецификации UTF-8, увеличивая ее до 115 байт. Если бы вы запустили его в Python 3, вам бы не понадобилась спецификация, и она сократилась бы до 112 байт.


Добро пожаловать в Программирование Пазлов и Code Golf! К сожалению, ваш код, по-видимому, предполагает, что ввод является прямоугольным, в то время как в вопросе говорится, что ни одна строка не будет иметь пробела в конце.
Деннис

Я считаю 107 байтов. Я не думаю, что вам нужно включать «подпись марки UTF-8».
КалькуляторFeline

@CatsAreFluffy Вы используете Python2? В Python3 все строки в юникоде, но с Python2 сложнее.
Дженни Миллер

К сожалению, я посчитал каналы как 2 байта, но даже после использования фактического байтового счетчика, все еще только 111 байтов. Скажите, откуда взялись эти 5 байтов.
КалькуляторFeline

Размер спецификации UTF-8 составляет 3 байта ( en.wikipedia.org/wiki/Byte_order_mark ). Мой счет был один высокий, потому что мой текстовый редактор добавлял завершающий символ новой строки, поэтому мое решение на самом деле составляет всего 115 байтов. Вы можете оставить ведущие байты спецификации и уменьшить его до 112, если вы использовали Python3 (который считает все строки в юникоде). Но я не знаю, как вы видите только 111 байтов. Кстати, вот как я добавил спецификацию: sed -i '1s/^\(\xef\xbb\xbf\)\?/\xef\xbb\xbf/' codeGolf.py
Дженни Миллер

1

C, 290 байтов

Гольф-функция B, с зависимостями; принимает ввод как символ с нулевым символом в конце *

#define l(s) strlen(s)
p(char*s,int n){while(n--)printf(s);}
B(char*s){char*t=strtok(s,"\n");int x=l(t),z=1;while(t=strtok(0,"\n"))z++,x=l(t)>x?l(t):x;p("╔",1);p("=",x+2);p("╗\n",1);while(z--)printf("║ %s", s),p(" ",x-l(s)),p(" ║\n",1),s+=l(s)+1;p("╚",1);p("=",x+2);p("╝\n",1);}

Несколько незакрытая функция в полной программе

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 1024

// GOLF-BEGIN =>
#define l(s) strlen(s)
// since multibyte chars don't fit in char: use char* instead
void p (char*s,int n){ while(n--)printf(s); } 
void B (char *s){
    char *t = strtok(s,"\n");
    int x=l(t), z=1;
    while(t=strtok(0,"\n"))z++,x=l(t)>x?l(t):x;  
    // x is l(longest line), z is #lines
    p("╔",1);p("=",x+2);p("╗\n",1);
    while(z--)printf("║ %s", s),p(" ",x-l(s)),p(" ║\n",1),s+=l(s)+1;
    p("╚",1);p("=",x+2);p("╝\n",1);       
}
// <= GOLF-END

int main(int argc, char **argv) {
    char buffer[MAX];
    memset(buffer, 0, MAX);
    FILE *f = fopen(argv[1], "rb");
    fread(buffer, 1, MAX, f); 
    B(buffer);
    return 0;
}

вход

     _.,----,._
   .:'        `:.
 .'              `.
.'                `.
:                  :
`    .'`':'`'`/    '
 `.   \  |   /   ,'
   \   \ |  /   /
    `\_..,,.._/'
     {`'-,_`'-}
     {`'-,_`'-}
     {`'-,_`'-}
      `YXXXXY'
        ~^^~

выход

╔======================╗
║      _.,----,._      ║
║    .:'        `:.    ║
║  .'              `.  ║
║ .'                `. ║
║ :                  : ║
║ `    .'`':'`'`/    ' ║
║  `.   \  |   /   ,'  ║
║    \   \ |  /   /    ║
║     `\_..,,.._/'     ║
║      {`'-,_`'-}      ║
║      {`'-,_`'-}      ║
║      {`'-,_`'-}      ║
║       `YXXXXY'       ║
║         ~^^~         ║
╚======================╝

C советы по игре в гольф приветствуются!

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