Wykadruj ten ładny ASCII-Art

30

Wprowadzenie

Myślę, że wszyscy zgadzają się, że ładne zdjęcia muszą mieć ładną ramkę. Ale większość wyzwań na tej stronie dotyczących ASCII-Art chce tylko surowego obrazu i nie dba o jego zachowanie.
Czy nie byłoby miło, gdybyśmy mieli program, który pobiera trochę ASCII-Art i otacza go ładną ramką?

Wyzwanie

Napisz program, który pobiera trochę ASCII-Art jako dane wejściowe i generuje go w ładnej ramce.

Przykład:

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

staje się

╔═══════╗
║ ***** ║
║ *** ║
║ * ║
║ *** ║
║ ***** ║
╚═══════╝
  • Musisz użyć dokładnie takich samych znaków dla ramki jak w przykładzie: ═ ║ ╔ ╗ ╚ ╝
  • Góra i dół ramki są wstawiane przed pierwszym i po ostatnim wierszu danych wejściowych.
  • Lewa i prawa część ramki muszą mieć dokładnie jedną dopełnienie spacji do najszerszej linii wejścia.
  • Na wydruku mogą nie znajdować się początkowe ani końcowe białe spacje. Dozwolony jest tylko końcowy znak nowej linii.
  • Możesz założyć, że dane wejściowe nie zawierają niepotrzebnych początkowych białych znaków.
  • Możesz założyć, że wejście nie ma końcowych białych znaków w żadnym wierszu.
  • Nie musisz obsługiwać pustych danych wejściowych.
  • Dane wejściowe będą zawierać tylko drukowalne znaki ASCII i znaki nowej linii.

Zasady

Happy Coding!

Korzystając ze wspaniałej grafiki ASCII, która została stworzona w dowolnym wyzwaniu na tej stronie, zachęca się do wprowadzania danych do programu i wyświetlania go w ładnej ramce!

Denker
źródło
29
Ramka inna niż ASCII dla sztuki ASCII? Herezja!
Dennis
5
Bardzo blisko spokrewniony. To samo wyzwanie, ale przy użyciu tylko jednego znaku (ASCII) dla ramki.
Martin Ender
13
(Powinienem wyjaśnić, że nie uważam, że to oszustwo. Konieczność użycia 6 różnych postaci sprawia, że ​​jest to znacznie trudniejsze. Drugie wyzwanie można rozwiązać, obracając siatkę i dołączając #cztery razy. Dostosowanie takiego podejścia tutaj będzie co najwyżej trudne , aw najgorszym przypadku nie.)
Martin Ender
6
@ IsmaelMiguel Wygrałem poprzedni konkurs i nie widzę, jak mógłbym w ogóle dostosować moją starą odpowiedź.
Martin Ender
2
Podejrzewam, że DenkerAffe zakłada CP437 lub coś, w którym znaki ramki są również jednym bajtem.
Joshua

Odpowiedzi:

6

CJam, 45 znaków / 52 bajty

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

Próba uniknięcia tych drogich 3-bajtowych znaków była ... interesująca.

Wypróbuj online

Wyjaśnienie

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
Sp3000
źródło
16

Haskell, 139 bajtów

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

Jako przykład wrabiam bałwana „12333321” .

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

Jak to działa:

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.
nimi
źródło
9

JavaScript (ES6), 138 bajtów

Jest to 138 bajtów w kodowaniu IBM866, które w chwili pisania jest nadal obsługiwane w Firefox, ale 152 w 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}╝`
Neil
źródło
1
Czy rzeczywiście możesz zakodować JavaScript za pomocą CP437 i nadal go uruchamiać? Jeśli nie, to nie jest tak naprawdę 138 bajtów.
Mama Fun Roll
@ ҒЦꝆПҒЦꝆ Chociaż nie mogłem znaleźć niczego, co wspiera CP437, Firefox obecnie obsługuje IBM866, który ma również te znaki do rysowania pól, więc zaktualizowałem swoją odpowiedź.
Neil,
Ok spoko. Zyskaj głos!
Mama Fun Roll
6

Bash, 173 171 150 148 147 bajtów, 157 136 134 133 znaków

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╝

Przykładowe wykonanie:

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

Przykład uruchomienia ze skryptu:

$ cat bear2.txt 
     (()__(()
     /       \
    ( /    \  \
     \ o o    /
     (_()_)__/ \
    / _,==.____ \
   (   |--|      )
   /\_.|__|'-.__/\_
  / (        /     \
  \  \      (      /
   )  '._____)    /
(((____.--(((____/mrf
$ ./frame< bear2.txt 
╔═══════════════════════╗
║      (()__(()         ║
║      /       \        ║
║     ( /    \  \       ║
║      \ o o    /       ║
║      (_()_)__/ \      ║
║     / _,==.____ \     ║
║    (   |--|      )    ║
║    /\_.|__|'-.__/\_   ║
║   / (        /     \  ║
║   \  \      (      /  ║
║    )  '._____)    /   ║
║ (((____.--(((____/mrf ║
╚═══════════════════════╝
Runium
źródło
1
Twój przykład ma pustą linię między dolną ramką a niepoprawnym wejściem. Górne i dolne ramki należy wstawić bezpośrednio przed i po wprowadzeniu danych (poprzednia wersja była w porządku).
Denker
1
Fajnie !, Ale możesz zaoszczędzić około 5 znaków, jeśli ...?${#2}+2:n))zamiast tego +1upuścisz 2 spacje i printf -v z %${n}s;zamiast printf -v z " %*.s" $n.
F. Hauri
@Sukminder Ok, już to sprawdziłem, ale chciałem się upewnić, ponieważ pokazane wejście nie zawiera pustej linii. Nie wymagałem, abyś wyczyścił wejście wiodących lub sprawdzających puste linie, więc program jest w porządku.
Denker,
5

AWK, 159 bajtów

{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"╝"}

Najwyraźniej awkmoże wydrukować Unicode, jeśli możesz dowiedzieć się, jak go wprowadzić do kodu.

Robert Benson
źródło
Mam teraz tyle pomysłów na niesamowite fajki ...
Sebb
@Sebb To wydaje się zabawne. :)
Robert Benson
5

Perl, 111 znaków

(wynik obejmuje +5 za flagi tłumacza)

#!/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═╝";

Najpierw znajdujemy najdłuższą długość linii $n, sortując numerycznie długości wszystkich linii.

Ustawiamy $lsię jako pasek nagłówka / stopki, który będzie $npowtórzeniem znaku poziomej ramki.

Następnie drukujemy każdą linię sformatowaną do wyrównania do lewej w polu szerokości $n, umieszczonym pomiędzy znakami ramki.

Wynik:

╔═══════════╗
║   |\_/|   ║
║  / @ @ \  ║
║ ( > * < ) ║
║  `>>x<<'  ║
║  /  O  \  ║
╚═══════════╝
Toby Speight
źródło
4

Pyth, 44 znaki (58 bajtów)

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

Wyjaśnienie

++\╔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+"╝")

Wypróbuj tutaj.

niebieski
źródło
4

PHP 5.3, 209 bajtów

Działa to tylko przy użyciu kodowania OEM 860 . Jest to rozszerzony nadzbiór ASCII, używany w portugalskich wersjach DOS. Ponieważ jestem Portugalczykiem (i lubiłem robić te „ramki” w Pascalu), a to jest standardowe kodowanie, zacząłem z tym:

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

Oto base64:

PD9mb3JlYWNoKCRXPWV4cGxvZGUoJwonLCRhcmd2WzFdKWFzJHYpJE09bWF4KCRNLHN0cmxlbigkdikrMik7cHJpbnRmKCLilZQlJ+KVkHskTX1z4pWXCuKVkSUxXCR7JE19c+KVkQolMlwkcwrilZElMVwkeyRNfXPilZEK4pWaJTFcJCfilZB7JE19c+KVnSIsJycsam9pbignCicsYXJyYXlfbWFwKGZ1bmN0aW9uKCR2KXVzZSgkTSl7cmV0dXJuIHN0cl9wYWQoIiAkdiAiLCRNKTt9LCRXKSkpOw==

Ta odpowiedź była oparta na mojej odpowiedzi na: https://codegolf.stackexchange.com/a/57883/14732 (ciężkie podnoszenie zostało tam wykonane, wystarczyło trochę drgnąć).

Ismael Miguel
źródło
Imponujące co najmniej :)
MonkeyZeus
Kody to 209 bajtów / znaków. 22+58+11+5+11+24+66+12=209Ostatnie 12 to znaki nowego wiersza, a jako DOS oznacza CRLF, czyli dwa bajty na znak nowego wiersza. Witryna charactercountonline nie liczy nowych linii. Każdy z glifów spoza ASCII ma 1 bajt w OEM 860.
Runium
@Sukminder nie zapominaj, że (przynajmniej) zamienia Windows, \njęzyk \r\n, podczas otwierania pliku ASCII / trybie tekstowym.
Ismael Miguel
2

Python 3, 119 bajtów

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 bajtów

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

Wkład:

hello
there
  !  

Wydajność:

╔═══════╗
 hello 
 there 
   !   
╚═══════╝
SumnerHayes
źródło
Witamy w Progamming Puzzles & Code Golf! Ładna pierwsza odpowiedź! Zawsze możesz pisać funkcje zamiast pełnych programów (chyba że jest to wyraźnie zabronione w wyzwaniu), co może pozwolić ci zaoszczędzić niektóre bajty, przyjmując dane wejściowe jako argument. Możesz także użyć Pythona 2, aby zaoszczędzić 2 bajty print"╔"+h+"╗\n"+"".join(o)+"╚"+h+"╝".
Denker,
Dzięki. Nie mogłem wymyślić, jak sprawić, by wysokie bajty działały w Python2 (prawdopodobnie ustawienie zmiennej środowiskowej kodeka działałoby, ale nie jestem pewien, jak to wpływa na liczbę bajtów golfowych). Podejście funkcyjne eliminuje różnice w python2 / 3, ale dodaje mój bajt w moim najlepszym podejściu.
SumnerHayes,
Okej, mam funkcję do 119 znaków jako funkcję; pobiera dane wejściowe jako ciąg. Moje mini-przeceny oczywiście nie zależą od tabaki; Linia 1 to def, reszta (po dwukropku) to linia 2 z wiodącą spacją. 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
Po prostu zaktualizuj swój post, dodając nową wersję i nowy wynik (wybiłem stary wynik <s>...</s>). Możesz także dodać <!-- language-all: lang-python -->przed swoim blokiem kodu, aby dodać podświetlanie składni do swojego kodu.
Denker
To nie działa, jeśli dane wejściowe nie są prostokątne, a pytanie mówi, że żadna linia nie będzie miała spacji końcowych.
Dennis
2

Python 2, 115 bajtów

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

Wygląda tutaj na mniej niż 115, ale plik roboczy zawiera 3-bajtową sygnaturę BOM UTF-8, co powoduje wzrost do 115 bajtów. Jeśli miałbyś uruchomić go w Pythonie 3, nie potrzebowałbyś BOM i spadłby do 112 bajtów.

Jenny Miller
źródło
Witamy w Programowaniu Puzzle i Code Golf! Niestety wydaje się, że kod zakłada, że ​​dane wejściowe są prostokątne, podczas gdy pytanie mówi, że żadna linia nie będzie miała spacji końcowych.
Dennis
Liczę 107 bajtów. Nie sądzę, że musisz dołączyć „podpis znaku BOM UTF-8”.
CalculatorFeline
@CatsAreFluffy Czy używasz Python2? W Python3 wszystkie ciągi znaków są Unicode, ale jest trudniejsze z Python2.
Jenny Miller,
Ups, policzyłem potoki jako 2 bajty, ale nawet po użyciu rzeczywistego licznika bajtów, nadal tylko 111 bajtów. Powiedz mi, skąd pochodzi te 5 bajtów.
CalculatorFeline
LM UTF-8 ma 3 bajty ( en.wikipedia.org/wiki/Byte_order_mark ). Mój wynik był jeden wysoki, ponieważ mój edytor tekstu dodawał końcowy znak nowej linii, więc moje rozwiązanie ma naprawdę tylko 115 bajtów. Możesz pominąć wiodące bajty BOM i sprowadzić je do 112, jeśli używasz Python3 (który liczy wszystkie łańcuchy jako Unicode). Ale nie wiem, jak widzisz tylko 111 bajtów. btw, oto jak dodałem BOM: sed -i '1s/^\(\xef\xbb\xbf\)\?/\xef\xbb\xbf/' codeGolf.py
Jenny Miller
1

C, 290 bajtów

Funkcja gry w golfa B, z zależnościami; przyjmuje dane jako znak zakończony znakiem null *

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

Nieco niepoznana funkcja w pełnym programie

#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;
}

wkład

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

wydajność

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

Doceniamy wskazówki C do gry w golfa!

Tucuxi
źródło