Кадр цього приємного 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 байт.
Mama Fun Roll

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

Гаразд, круто. Майте нагороду!
Mama Fun Roll

6

Баш, 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╝

Багаторядковий:

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
У вашому прикладі є порожня лінія між нижньою рамкою та вводом, який недійсний. Верхній і нижній кадри повинні бути вставлені безпосередньо до та після введення (попередня версія була точна до цього року).
Денкер

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 Це здається веселим. :)
Роберт Бенсон

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)));

Ось база64:

PD9mb3JlYWNoKCRXPWV4cGxvZGUoJwonLCRhcmd2WzFdKWFzJHYpJE09bWF4KCRNLHN0cmxlbigkdikrMik7cHJpbnRmKCLilZQlJ+KVkHskTX1z4pWXCuKVkSUxXCR7JE19c+KVkQolMlwkcwrilZElMVwkeyRNfXPilZEK4pWaJTFcJCfilZB7JE19c+KVnSIsJycsam9pbignCicsYXJyYXlfbWFwKGZ1bmN0aW9uKCR2KXVzZSgkTSl7cmV0dXJuIHN0cl9wYWQoIiAkdiAiLCRNKTt9LCRXKSkpOw==

Ця відповідь була заснована на моїй відповіді на: https://codegolf.stackexchange.com/a/57883/14732 (важкий підйом був зроблений там, просто треба було трохи посмикнутися).


Вражаюче сказати найменше :)
MonkeyZeus

Коди - 209 байт / символів. 22+58+11+5+11+24+66+12=209Останні 12 - це нові рядки, і як DOS означає CRLF, або два байти на новий рядок. Charactercountonline сайт не рахується нового рядка. Кожен з гліфів, що не належать до ASCII, має 1 байт в OEM 860.
Руніум

@Sukminder Не забувайте, що (принаймні) Windows перетворюється \nна \r\n, відкриваючи файл у ASCII / текстовому режимі.
Ісмаїл Мігель

2

Пітон 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 
   !   
╚═══════╝

Ласкаво просимо в головоломки Прогмінг & Код Гольф! Приємна перша відповідь! Ви завжди можете записати функції замість повних програм (якщо явно заборонено в виклику), які можуть дозволити вам зберегти деякі байти, взявши введення як аргумент. Також ви можете використовувати 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

Пітон 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 BOM, стикаючи його до 115 байт. Якби ви запустили його в Python 3, BOM не знадобився, і він знизився до 112 байт.


Ласкаво просимо до головоломки програмування та коду для гольфу! На жаль, ваш код передбачає, що введення прямокутне, тоді як у запитанні вказано, що жодна рядок не матиме пробілу пробілу.
Денніс

Я рахую 107 байт. Я не думаю, що вам потрібно включати підпис марки «UTF-8 BOM».
CalculatorFeline

@CatsAreFluffy Ви використовуєте Python2? У Python3 всі рядки є unicode, але це складніше з Python2.
Дженні Міллер

На жаль, я порахував труби як 2 байти, але навіть після використання фактичного байтаку, все ще лише 111 байт. Скажіть, звідки взялися ці 5 байт.
CalculatorFeline

BOM UTF-8 - 3 байти ( en.wikipedia.org/wiki/Byte_order_mark ). Моя кількість була однією великою, тому що мій текстовий редактор додав останній новий рядок, тому моє рішення насправді складає лише 115 байт. Ви можете залишити провідні байти BOM і зменшити його до 112, якщо ви використовували Python3 (який рахує всі рядки як unicode). Але я не знаю, як ви бачите лише 111 байт. btw, ось як я додав BOM: sed -i '1s/^\(\xef\xbb\xbf\)\?/\xef\xbb\xbf/' codeGolf.py
Jenny Miller

1

C, 290 байт

Гольф функція B, із залежностями; приймає дані як нульове завершення char *

#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.