Enquadre esta bela arte ASCII

30

Introdução

Acho que todo mundo concorda que fotos legais precisam ter uma moldura legal. Mas a maioria dos desafios neste site sobre o ASCII-Art só quer a imagem em bruto e não se preocupa com a preservação.
Não seria legal se tivéssemos um programa que pegasse um pouco de arte ASCII e o envolvesse com uma bela moldura?

O desafio

Escreva um programa que pegue um pouco de ASCII-Art como entrada e o faça rodeado por um quadro bonito.

Exemplo:

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

torna-se

╔═══════╗
║ ***** ║
║ *** ║
║ * ║
║ *** ║
║ ***** ║
╚═══════╝
  • Você precisa usar exatamente os mesmos caracteres para o quadro, como no exemplo: ═ ║ ╔ ╗ ╚ ╝
  • A parte superior e inferior do quadro são inseridas antes da primeira e após a última linha da entrada.
  • As partes esquerda e direita do quadro precisam ter um espaço de preenchimento exato na linha mais larga da entrada.
  • Pode não haver espaços em branco à esquerda ou à direita na saída. Apenas uma nova linha à direita é permitida.
  • Você pode assumir que a entrada não possui espaços em branco desnecessários.
  • Você pode assumir que a entrada não possui espaços em branco à direita em nenhuma linha.
  • Você não precisa lidar com entradas vazias.
  • A entrada conterá apenas caracteres ASCII imprimíveis e novas linhas.

Regras

  • Função ou programa completo permitido.
  • Regras padrão para entrada / saída.
  • Aplicam-se brechas padrão .
  • Isso é , portanto, a menor contagem de bytes vence. O desempate é uma submissão anterior.

Feliz codificação!

É altamente recomendável usar algumas ótimas artes ASCII, que foram produzidas em qualquer desafio deste site, como entrada para o seu programa e mostrá-lo com uma bela moldura!

Denker
fonte
29
Um quadro não ASCII para arte ASCII? Heresia!
Dennis
5
Muito intimamente relacionado. Mesmo desafio, mas apenas usando um único caractere (ASCII) para o quadro.
Martin Ender
13
(Devo esclarecer que não acho que seja uma bobagem. Ter que usar 6 caracteres diferentes torna isso muito mais complicado. O outro desafio pode ser resolvido girando a grade e anexando #quatro vezes. A adaptação dessa abordagem aqui será, na melhor das hipóteses, complicada. , e não é viável, na pior das hipóteses.) #
287 Martin Ender
6
@IsmaelMiguel Ganhei o concurso anterior e não vejo como adaptar minha antiga resposta.
Martin Ender
2
Suspeito que o DenkerAffe esteja assumindo o CP437 ou algo em que os caracteres do quadro também sejam de um byte.
Joshua

Respostas:

6

CJam, 45 caracteres / 52 bytes

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

Tentar evitar aqueles caros caracteres de 3 bytes foi ... interessante.

Experimente online

Explicação

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
fonte
16

Haskell, 139 bytes

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

Como exemplo, estou enquadrando o boneco de neve "12333321" .

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

Como funciona:

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
fonte
9

JavaScript (ES6), 138 bytes

São 138 bytes na codificação IBM866, que no momento da gravação ainda são suportados no Firefox, mas 152 no 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
fonte
1
Você pode realmente codificar Javascript usando o CP437 e ainda executá-lo? Caso contrário, isso não é realmente 138 bytes.
Mama Fun Roll
@ Apesar de não encontrar nada que suporte CP437, o Firefox atualmente suporta IBM866, que também possui esses caracteres de desenho de caixa, então atualizei minha resposta.
Neil
OK fixe. Tenha um voto positivo!
Mama Fun Roll
6

Bash, 173 171 150 148 147 bytes, 157 136 134 133 caracteres

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╝

Multilinha:

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╝

Exemplo de execução:

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

Exemplo de execução a partir do script:

$ cat bear2.txt 
     (()__(()
     /       \
    ( /    \  \
     \ o o    /
     (_()_)__/ \
    / _,==.____ \
   (   |--|      )
   /\_.|__|'-.__/\_
  / (        /     \
  \  \      (      /
   )  '._____)    /
(((____.--(((____/mrf
$ ./frame< bear2.txt 
╔═══════════════════════╗
║      (()__(()         ║
║      /       \        ║
║     ( /    \  \       ║
║      \ o o    /       ║
║      (_()_)__/ \      ║
║     / _,==.____ \     ║
║    (   |--|      )    ║
║    /\_.|__|'-.__/\_   ║
║   / (        /     \  ║
║   \  \      (      /  ║
║    )  '._____)    /   ║
║ (((____.--(((____/mrf ║
╚═══════════════════════╝
Runium
fonte
1
Seu exemplo tem uma linha vazia entre o quadro inferior e a entrada inválida. Os quadros superior e inferior devem ser inseridos diretamente antes e depois da entrada (sua versão anterior era boa).
Denker 17/02
1
Bom !, Mas você pode economizar aproximadamente 5 caracteres se, em ...?${#2}+2:n))vez de +1, soltar 2 espaços e em printf -v z %${n}s;vez de printf -v z " %*.s" $n.
F. Hauri
@Sukminder Ok, já foi solicitado isso, mas queria ter certeza disso, já que a entrada que você mostra não contém uma linha vazia. Não exigi que você limpe a entrada de linhas vazias à esquerda ou à esquerda, para que você programe perfeitamente.
Denker
5

AWK, 159 bytes

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

Aparentemente, awkpode imprimir Unicode se você descobrir como obtê-lo no código.

Robert Benson
fonte
Eu estou tendo tantas idéias para tubos impressionantes agora ...
Sebb
@ Sebb Isso parece divertido. :)
Robert Benson
5

Perl, 111 caracteres

(a pontuação inclui +5 para os sinalizadores de intérprete)

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

Primeiro, encontramos o maior comprimento de linha $n, classificando numericamente os comprimentos de todas as linhas.

Definimos $lcomo a barra de cabeçalho / rodapé para $nrepetições do caractere de quadro horizontal.

Em seguida, imprimimos cada linha formatada para alinhar à esquerda em um campo de largura $n, imprensado entre os caracteres do quadro.

Resultado:

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

Pitão, 44 ​​caracteres (58 bytes)

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

Explicação

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

Experimente aqui.

Azul
fonte
4

PHP 5.3, 209 bytes

Isso funciona apenas com o OEM 860 de codificação . É um superconjunto ASCII estendido, usado nas versões do DOS em português. Como sou português (e eu adorava fazer esses "quadros" em Pascal) e essa é uma codificação padrão, continuei com isso:

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

Aqui está a base64:

PD9mb3JlYWNoKCRXPWV4cGxvZGUoJwonLCRhcmd2WzFdKWFzJHYpJE09bWF4KCRNLHN0cmxlbigkdikrMik7cHJpbnRmKCLilZQlJ+KVkHskTX1z4pWXCuKVkSUxXCR7JE19c+KVkQolMlwkcwrilZElMVwkeyRNfXPilZEK4pWaJTFcJCfilZB7JE19c+KVnSIsJycsam9pbignCicsYXJyYXlfbWFwKGZ1bmN0aW9uKCR2KXVzZSgkTSl7cmV0dXJuIHN0cl9wYWQoIiAkdiAiLCRNKTt9LCRXKSkpOw==

Esta resposta foi baseada na minha resposta em: https://codegolf.stackexchange.com/a/57883/14732 (o trabalho pesado foi todo feito lá, só foi preciso se mexer um pouco).

Ismael Miguel
fonte
Impressionante para dizer o mínimo :)
MonkeyZeus
Os códigos são 209 bytes / caracteres. 22+58+11+5+11+24+66+12=209Os últimos 12 são novas linhas e, como é o DOS, significa CRLF, ou dois bytes por nova linha. O site charactercountonline não conta novas linhas. Cada um dos caracteres não ASCII são um byte em OEM 860.
Runium
@Sukminder Não esqueça que (pelo menos) o Windows se converte \nem \r\n, ao abrir o arquivo no modo ASCII / texto.
Ismael Miguel
2

Python 3, 119 bytes

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 bytes

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

Entrada:

hello
there
  !  

Saída:

╔═══════╗
 hello 
 there 
   !   
╚═══════╝
SumnerHayes
fonte
Bem-vindo ao Progamming Puzzles & Code Golf! Ótima primeira resposta! Você sempre pode escrever funções em vez de programas completos (a menos que seja explicitamente proibido no desafio), o que pode permitir que você salve alguns bytes usando a entrada como argumento. Além disso, você pode querer usar o Python 2, para economizar 2 bytes usando print"╔"+h+"╗\n"+"".join(o)+"╚"+h+"╝".
Denker
Obrigado. Eu não conseguia descobrir como obter os bytes altos funcionando no Python2 (provavelmente definir a variável de ambiente codec funcionaria, mas não tenho certeza de como isso afeta a contagem de bytes de golfe). A abordagem de função elimina as diferenças do python2 / 3, mas adiciona um byte na minha melhor abordagem.
SumnerHayes
Ok, reduzi para 119 caracteres como uma função; recebe entrada como uma string. Minha mini-remarcação obviamente não está à altura do rapé; A linha 1 é o def, o restante (após os dois pontos) é a linha 2, com um espaço à esquerda. 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
Atualize seu post com a nova versão e a nova pontuação (com a pontuação antiga <s>...</s>). Além disso, você pode adicionar <!-- language-all: lang-python -->antes do seu bloco de código para adicionar destaque de sintaxe ao seu código.
Denker
Isso não funciona se a entrada não for retangular, enquanto a pergunta diz que nenhuma linha terá espaço em branco à direita.
Dennis
2

Python 2, 115 bytes

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

Parece menor que 115 aqui, mas o arquivo de trabalho inclui assinatura de marca UTF-8 BOM de 3 bytes, aumentando até 115 bytes. Se você o executasse no Python 3, não precisaria da BOM e ela chegaria a 112 bytes.

Jenny Miller
fonte
Bem-vindo à programação de quebra-cabeças e código de golfe! Infelizmente, seu código parece assumir que a entrada é retangular, enquanto a pergunta diz que nenhuma linha terá espaços em branco à direita.
Dennis
Eu conto 107 bytes. Não acho que você precise incluir a "assinatura da marca UTF-8 BOM".
CalculatorFeline
@CatsAreFluffy Você está usando Python2? No Python3, todas as strings são unicode, mas é mais complicado com o Python2.
21716 Jenny Miller
Ops, contei pipes como 2 bytes, mas mesmo depois de usar um bytecounter real, apenas 111 bytes. Diga-me de onde vieram esses 5 bytes.
CalculatorFeline
A lista técnica da UTF-8 tem 3 bytes ( en.wikipedia.org/wiki/Byte_order_mark ). Minha contagem foi alta porque meu editor de texto estava adicionando uma nova linha à direita, então minha solução é realmente de apenas 115 bytes. Você pode deixar de fora os principais bytes da BOM e reduzi-lo para 112 se estiver usando Python3 (que conta todas as strings como unicode). Mas não sei como você está vendo apenas 111 bytes. btw, aqui está como eu adicionei a lista técnica: sed -i '1s/^\(\xef\xbb\xbf\)\?/\xef\xbb\xbf/' codeGolf.py
Jenny Miller
1

C, 290 bytes

Função de golfe B, com dependências; recebe entrada como caractere terminado por nulo *

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

Função um pouco não-destruída no programa completo

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

entrada

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

saída

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

C dicas de golfe apreciado!

tucuxi
fonte