Encadrez ce joli ASCII-Art

30

introduction

Je pense que tout le monde convient que les belles photos doivent avoir un joli cadre. Mais la plupart des défis sur ce site concernant ASCII-Art veulent juste l'image brute et ne se soucient pas de sa conservation.
Ne serait-ce pas bien si nous avions un programme qui prend de l'ASCII-Art et l'entoure d'un joli cadre?

Le défi

Écrivez un programme qui prend de l'ASCII-Art en entrée et le sort entouré d'un joli cadre.

Exemple:

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

devient

╔═══════╗
║ ***** ║
║ *** ║
║ * ║
║ *** ║
║ ***** ║
╚═══════╝
  • Vous devez utiliser exactement les mêmes caractères pour le cadre que dans l'exemple: ═ ║ ╔ ╗ ╚ ╝
  • Le haut et le bas du cadre sont insérés avant la première et après la dernière ligne de l'entrée.
  • Les parties gauche et droite du cadre doivent avoir exactement un espace de remplissage sur la ligne la plus large de l'entrée.
  • Il ne doit pas y avoir d'espaces blancs de début ou de fin dans la sortie. Seule une nouvelle ligne de fin est autorisée.
  • Vous pouvez supposer que l'entrée n'a pas d'espaces blancs de début inutiles.
  • Vous pouvez supposer que l'entrée n'a aucun espace de fin sur aucune ligne.
  • Vous n'avez pas besoin de gérer une entrée vide.
  • L'entrée ne contiendra que des caractères ASCII imprimables et des retours à la ligne.

Règles

Codage heureux!

En utilisant un grand ASCII-Art, qui a été produit dans n'importe quel défi sur ce site, comme entrée dans votre programme et le montrer avec un joli cadre est fortement encouragé!

Denker
la source
29
Un cadre non ASCII pour l'art ASCII? Hérésie!
Dennis
5
Très proche. Même défi, mais en n'utilisant qu'un seul caractère (ASCII) pour le cadre.
Martin Ender
13
(Je dois préciser que je ne pense pas que ce soit une dupe. Le fait d'utiliser 6 caractères différents rend la tâche beaucoup plus délicate. L'autre défi peut être résolu en faisant tourner la grille et en l'ajoutant #quatre fois. L'adaptation d'une telle approche ici sera au mieux délicate , et pas viable au pire.)
Martin Ender
6
@IsmaelMiguel J'ai gagné le concours précédent et je ne vois pas du tout comment adapter mon ancienne réponse.
Martin Ender
2
Je soupçonne que DenkerAffe suppose CP437 ou quelque chose où les caractères de trame sont également un octet.
Joshua

Réponses:

6

CJam, 45 caractères / 52 octets

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

Essayer d'éviter ces caractères coûteux de 3 octets était ... intéressant.

Essayez-le en ligne

Explication

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
la source
16

Haskell, 139 octets

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

Par exemple, j'encadre le bonhomme de neige "12333321" .

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

Comment ça marche:

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
la source
9

JavaScript (ES6), 138 octets

Il s'agit de 138 octets dans le codage IBM866, qui au moment de l'écriture est toujours pris en charge dans Firefox, mais 152 en 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
la source
1
Pouvez-vous réellement encoder Javascript à l'aide de CP437 et toujours l'exécuter? Sinon, ce n'est pas 138 octets.
Mama Fun Roll
@ ӍѲꝆΛҐӍΛПҒЦꝆ Bien que je n'aie rien trouvé prenant en charge CP437, Firefox prend actuellement en charge IBM866 qui a également ces caractères de dessin de boîte, j'ai donc mis à jour ma réponse.
Neil
D'accord, cool. Ayez un vote positif!
Mama Fun Roll
6

Bash, 173 171 150 148 147 octets, 157 136 134 133 caractères

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╝

Multiligne:

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╝

Exemple d'exécution:

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

Exemple d'exécution à partir du script:

$ cat bear2.txt 
     (()__(()
     /       \
    ( /    \  \
     \ o o    /
     (_()_)__/ \
    / _,==.____ \
   (   |--|      )
   /\_.|__|'-.__/\_
  / (        /     \
  \  \      (      /
   )  '._____)    /
(((____.--(((____/mrf
$ ./frame< bear2.txt 
╔═══════════════════════╗
║      (()__(()         ║
║      /       \        ║
║     ( /    \  \       ║
║      \ o o    /       ║
║      (_()_)__/ \      ║
║     / _,==.____ \     ║
║    (   |--|      )    ║
║    /\_.|__|'-.__/\_   ║
║   / (        /     \  ║
║   \  \      (      /  ║
║    )  '._____)    /   ║
║ (((____.--(((____/mrf ║
╚═══════════════════════╝
Runium
la source
1
Votre exemple a une ligne vide entre le cadre inférieur et l'entrée qui n'est pas valide. Les cadres supérieur et inférieur doivent être insérés directement avant et après l'entrée (votre version précédente était très bien entre les deux).
Denker
1
Nice !, Mais vous pourriez économiser environ 5 caractères si ...?${#2}+2:n))au lieu de +1, déposez 2 espaces et printf -v z %${n}s;au lieu de printf -v z " %*.s" $n.
F.Hauri
@Sukminder Ok, a déjà assumé cela, mais je voulais m'assurer que l'entrée que vous montrez ne contient pas de ligne vide. Je n'ai pas exigé que vous effaciez l'entrée des lignes vides de début ou de fin, donc votre programme est parfaitement bien.
Denker
5

AWK, 159 octets

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

Apparemment, awkpeut imprimer Unicode si vous pouvez trouver comment l'obtenir dans le code.

Robert Benson
la source
J'ai tellement d'idées pour des pipes géniales maintenant ...
Sebb
@Sebb Cela semble amusant. :)
Robert Benson
5

Perl, 111 caractères

(le score inclut +5 pour les drapeaux d'interprète)

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

Tout d'abord, nous trouvons la longueur de ligne la plus longue $n, en triant numériquement les longueurs de toutes les lignes.

Nous définissons $lla barre d'en-tête / pied de page comme des $nrépétitions du caractère de cadre horizontal.

Ensuite, nous imprimons chaque ligne formatée pour être alignée à gauche dans un champ de largeur $n, prise en sandwich entre les caractères du cadre.

Résultat:

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

Pyth, 44 caractères (58 octets)

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

Explication

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

Essayez-le ici.

Bleu
la source
4

PHP 5.3, 209 octets

Cela ne fonctionne qu'avec le codage OEM 860 . Il s'agit d'un sur-ensemble ASCII étendu, utilisé dans les versions DOS portugaises. Comme je suis portugais (et j'aimais faire ces "frames" en Pascal) et que c'est un encodage standard, j'ai continué avec ceci:

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

Voici le base64:

PD9mb3JlYWNoKCRXPWV4cGxvZGUoJwonLCRhcmd2WzFdKWFzJHYpJE09bWF4KCRNLHN0cmxlbigkdikrMik7cHJpbnRmKCLilZQlJ+KVkHskTX1z4pWXCuKVkSUxXCR7JE19c+KVkQolMlwkcwrilZElMVwkeyRNfXPilZEK4pWaJTFcJCfilZB7JE19c+KVnSIsJycsam9pbignCicsYXJyYXlfbWFwKGZ1bmN0aW9uKCR2KXVzZSgkTSl7cmV0dXJuIHN0cl9wYWQoIiAkdiAiLCRNKTt9LCRXKSkpOw==

Cette réponse était basée sur ma réponse sur: https://codegolf.stackexchange.com/a/57883/14732 (le gros du travail a été fait là-bas, juste eu à tordre un peu).

Ismael Miguel
la source
Impressionnant pour le moins :)
MonkeyZeus
Les codes sont de 209 octets / caractères. 22+58+11+5+11+24+66+12=209Les 12 derniers sont des sauts de ligne et comme c'est DOS qui signifie CRLF, ou deux octets par saut de ligne. Le site charactercountonline ne compte pas les sauts de ligne. Chacun des glyphes non ASCII fait 1 octet dans l'OEM 860.
Runium
@Sukminder N'oubliez pas que (au moins) Windows se convertit \nen \r\n, lors de l'ouverture du fichier en mode ASCII / texte.
Ismael Miguel
2

Python 3, 119 octets

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 octets

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

Contribution:

hello
there
  !  

Sortie:

╔═══════╗
 hello 
 there 
   !   
╚═══════╝
SumnerHayes
la source
Bienvenue sur Progamming Puzzles & Code Golf! Belle première réponse! Vous pouvez toujours écrire des fonctions au lieu de programmes complets (sauf interdiction explicite dans le défi), ce qui pourrait vous permettre d'économiser quelques octets en prenant l'entrée comme argument. Vous pouvez également utiliser Python 2, vous pouvez donc économiser 2 octets en allant avec print"╔"+h+"╗\n"+"".join(o)+"╚"+h+"╝".
Denker
Merci. Je ne pouvais pas comprendre comment faire fonctionner les octets élevés en Python2 (la définition de la variable d'environnement du codec fonctionnerait probablement, mais je ne sais pas comment cela joue dans le nombre d'octets de golf). L'approche fonction élimine les différences python2 / 3 mais ajoute un octet dans ma meilleure approche.
SumnerHayes
D'accord, je l'ai réduit à 119 caractères en fonction; prend l'entrée comme une chaîne. Ma mini-démarque n'est évidemment pas à la hauteur; La ligne 1 est la déf., Le reste (après les deux points) est la ligne 2, avec un espace de tête. 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
Mettez à jour votre message avec la nouvelle version et le nouveau score (supprimez l'ancien score avec <s>...</s>). Vous pouvez également ajouter <!-- language-all: lang-python -->avant votre bloc de code pour ajouter une coloration syntaxique à votre code.
Denker
Cela ne fonctionne pas si l'entrée n'est pas rectangulaire, tandis que la question indique qu'aucune ligne n'aura d'espace blanc de fin.
Dennis
2

Python 2, 115 octets

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

Semble plus court que 115 ici, mais le fichier de travail comprend une signature de marque de nomenclature UTF-8 de 3 octets, augmentant ainsi jusqu'à 115 octets. Si vous l'exécutiez en Python 3, vous n'auriez pas besoin de la nomenclature et elle descendrait à 112 octets.

Jenny Miller
la source
Bienvenue sur Programmation Puzzles & Code Golf! Malheureusement, votre code semble supposer que l'entrée est rectangulaire, tandis que la question indique qu'aucune ligne n'aura d'espace blanc de fin.
Dennis
Je compte 107 octets. Je ne pense pas que vous ayez besoin d'inclure la "signature de la marque de nomenclature UTF-8".
CalculatorFeline
@CatsAreFluffy Utilisez-vous Python2? En Python3, toutes les chaînes sont en unicode, mais c'est plus délicat avec Python2.
Jenny Miller
Oups, j'ai compté les tuyaux comme 2 octets, mais même après avoir utilisé un compteur d'octets réel, toujours seulement 111 octets. Dites-moi d'où viennent ces 5 octets.
CalculatorFeline
La nomenclature UTF-8 est de 3 octets ( en.wikipedia.org/wiki/Byte_order_mark ). Mon nombre était élevé car mon éditeur de texte ajoutait un retour à la ligne, donc ma solution n'est vraiment que de 115 octets. Vous pouvez laisser les octets de nomenclature de tête et les ramener à 112 si vous utilisez Python3 (qui compte toutes les chaînes comme unicode). Mais je ne sais pas comment vous voyez seulement 111 octets. btw, voici comment j'ai ajouté la nomenclature: sed -i '1s/^\(\xef\xbb\xbf\)\?/\xef\xbb\xbf/' codeGolf.py
Jenny Miller
1

C, 290 octets

Fonction golf B, avec dépendances; prend l'entrée en tant que caractère terminé par un caractère nul *

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

Fonction assez peu jouée dans le programme complet

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

contribution

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

sortie

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

Conseils de golf C appréciés!

tucuxi
la source