SCEGLI questa bella ASCII-Art


30

introduzione

Penso che tutti siano d'accordo sul fatto che le belle foto debbano avere una bella cornice. Ma la maggior parte delle sfide su questo sito su ASCII-Art vogliono solo il quadro grezzo e non si preoccupano della sua conservazione.
Non sarebbe bello se avessimo un programma che prende un po 'di ASCII-Art e lo circonda con una bella cornice?

La sfida

Scrivi un programma che accetta alcune ASCII-Art come input e le emette circondato da un bel frame.

Esempio:

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

diventa

╔═══════╗
║ ***** ║
║ *** ║
║ * ║
║ *** ║
║ ***** ║
╚═══════╝
  • Devi usare gli stessi caratteri esatti per la cornice come nell'esempio: ═ ║ ╔ ╗ ╚ ╝
  • La parte superiore e inferiore della cornice vengono inserite prima della prima e dopo l'ultima riga dell'input.
  • Le parti sinistra e diritti del fotogramma devono avere esattamente un'imbottitura spaziale sulla linea più ampia dell'input.
  • Potrebbero non esserci spazi bianchi iniziali o finali nell'output. È consentita solo una nuova riga finale.
  • Si può presumere che l'input non abbia spazi bianchi iniziali non necessari.
  • Si può presumere che l'input non abbia spazi bianchi finali su nessuna riga.
  • Non è necessario gestire input vuoti.
  • L'input conterrà solo caratteri ASCII e newline stampabili.

Regole

Buona programmazione!

Usando alcune fantastiche ASCII-Art, che sono state prodotte in qualsiasi sfida su questo sito, come input per il tuo programma e mostrarlo con una bella cornice è fortemente incoraggiato!


29
Una cornice non ASCII per l'arte ASCII? Eresia!
Dennis,

5
Molto strettamente correlati. Stessa sfida, ma usando solo un singolo carattere (ASCII) per il frame.
Martin Ender,

13
(Dovrei chiarire che non credo sia un ingannevole. Dover usare 6 personaggi diversi rende tutto questo molto più complicato. L'altra sfida può essere risolta ruotando la griglia e aggiungendola #quattro volte. Adattando un approccio del genere qui sarà al massimo complicato , e non praticabile nel peggiore dei casi.)
Martin Ender,

6
@IsmaelMiguel Ho vinto il concorso precedente e non vedo come avrei potuto adattare la mia vecchia risposta.
Martin Ender,

2
Sospetto che DenkerAffe stia assumendo CP437 o qualcosa in cui anche i caratteri del frame sono un byte.
Joshua,

Risposte:


6

CJam, 45 caratteri / 52 byte

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

Cercare di evitare quei costosi caratteri a 3 byte era ... interessante.

Provalo online

Spiegazione

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 byte

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

Ad esempio sto inquadrando il pupazzo di neve "12333321" .

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

Come funziona:

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 byte

Si tratta di 138 byte nella codifica IBM866, che al momento della scrittura è ancora supportata in Firefox, ma 152 in 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
Puoi effettivamente codificare Javascript usando CP437 ed eseguirlo ancora? In caso contrario, non si tratta in realtà di 138 byte.
Mama Fun Roll,

@ ӍѲꝆΛҐӍΛПҒЦꝆ Anche se non sono riuscito a trovare nulla che supporti CP437, Firefox attualmente supporta IBM866 che ha anche questi caratteri di disegno a riquadro, quindi ho aggiornato la mia risposta.
Neil,

Va bene, d'accordo. Avere un voto!
Mama Fun Roll,

6

Bash, 173 171 150 148 147 byte, 157 136 134 133 caratteri

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╝

multilinea:

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╝

Esempio di esecuzione:

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

Esempio di esecuzione dallo script:

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

1
Il tuo esempio ha una linea vuota tra il frame inferiore e l'input che non è valido. I frame superiore e inferiore devono essere inseriti direttamente prima e dopo l'input (la tua versione precedente andava bene tra l'altro).
Denker,

1
Bello !, Ma potresti risparmiare circa 5 caratteri se ...?${#2}+2:n))invece di +1, rilascia 2 spazi e printf -v z %${n}s;invece di printf -v z " %*.s" $n.
F. Hauri,

@Sukminder Ok, lo stavo già affermando, ma volevo accertarmene poiché l'input che mostri non contiene una riga vuota. Non ti ho chiesto di cancellare l'input delle linee vuote iniziali o trali, quindi il tuo programma va benissimo.
Denker,

5

AWK, 159 byte

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

Apparentemente awkpuoi stampare Unicode se riesci a capire come ottenerlo nel codice.


Sto avendo così tante idee per fantastiche pipe ora ...
Sebb,

@Sebb Sembra divertente. :)
Robert Benson,

5

Perl, 111 caratteri

(il punteggio include +5 per i flag dell'interprete)

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

Innanzitutto, troviamo la lunghezza della linea più lunga $n, ordinando numericamente le lunghezze di tutte le linee.

Abbiamo impostato $lcome barra dell'intestazione / piè di pagina le $nripetizioni del carattere del riquadro orizzontale.

Quindi stampiamo ogni riga formattata per allineare a sinistra in un campo di larghezza $n, inserito tra i caratteri della cornice.

Risultato:

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

4

Pyth, 44 caratteri (58 byte)

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

Spiegazione

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

Provalo qui.


4

PHP 5.3, 209 byte

Funziona solo con la codifica OEM 860 . È un superset ASCII esteso, utilizzato nelle versioni DOS portoghesi. Dato che sono portoghese (e adoravo fare questi "frame" in Pascal) e questa è una codifica standard, sono andato avanti con questo:

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

Ecco la base64:

PD9mb3JlYWNoKCRXPWV4cGxvZGUoJwonLCRhcmd2WzFdKWFzJHYpJE09bWF4KCRNLHN0cmxlbigkdikrMik7cHJpbnRmKCLilZQlJ+KVkHskTX1z4pWXCuKVkSUxXCR7JE19c+KVkQolMlwkcwrilZElMVwkeyRNfXPilZEK4pWaJTFcJCfilZB7JE19c+KVnSIsJycsam9pbignCicsYXJyYXlfbWFwKGZ1bmN0aW9uKCR2KXVzZSgkTSl7cmV0dXJuIHN0cl9wYWQoIiAkdiAiLCRNKTt9LCRXKSkpOw==

Questa risposta si basava sulla mia risposta su: https://codegolf.stackexchange.com/a/57883/14732 (il sollevamento pesante è stato effettuato lì, ha dovuto solo contrarsi un po ').


A dir poco impressionante :)
MonkeyZeus,

I codici sono 209 byte / caratteri. 22+58+11+5+11+24+66+12=209Gli ultimi 12 sono newline e poiché è DOS significa CRLF, o due byte per newline. Il sito charactercountonline non conta le nuove righe. Ognuno dei glifi non ASCII è 1 byte in OEM 860.
Runium

@Sukminder Non dimenticare che (almeno) di Windows convertiti \nin \r\n, quando si apre il file in formato ASCII / modalità testo.
Ismael Miguel,

2

Python 3, 119 byte

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 byte

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

Ingresso:

hello
there
  !  

Produzione:

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

Benvenuti in Progamming Puzzles & Code Golf! Bella prima risposta! È sempre possibile scrivere funzioni anziché programmi completi (a meno che non sia esplicitamente vietato nella sfida) che potrebbero consentire di salvare alcuni byte prendendo l'input come argomento. Inoltre potresti voler usare Python 2, quindi puoi salvare 2 byte andando con print"╔"+h+"╗\n"+"".join(o)+"╚"+h+"╝".
Denker,

Grazie. Non sono riuscito a capire come far funzionare gli byte alti in Python2 (probabilmente l'impostazione della variabile d'ambiente codec funzionerebbe, ma non sono sicuro di come funzioni nel conteggio dei byte di golf). L'approccio funzionale elimina le differenze di python2 / 3 ma aggiunge un byte nel mio approccio migliore.
SumnerHayes,

Ok, ho ottenuto fino a 119 caratteri in funzione; accetta input come stringa. Il mio mini-markdown non è ovviamente all'altezza; La linea 1 è la def, il resto (dopo i due punti) è la linea 2, con uno spazio iniziale. 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,

Basta aggiornare il tuo post con la nuova versione e il nuovo punteggio (colpito il vecchio punteggio con <s>...</s>). Inoltre puoi aggiungere <!-- language-all: lang-python -->prima del tuo blocco di codice per aggiungere l'evidenziazione della sintassi al tuo codice.
Denker,

Questo non funziona se l'input è non rettangolare, mentre la domanda dice che nessuna linea avrà spazi bianchi finali.
Dennis,

2

Python 2, 115 byte

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

Sembra più corto di 115 qui, ma il file di lavoro include la firma del segno della distinta base UTF-8 a 3 byte, aumentandola fino a 115 byte. Se lo avessi eseguito in Python 3 non avresti bisogno della DBA e sarebbe scesa a 112 byte.


Benvenuto in Programmazione di puzzle e codice golf! Sfortunatamente, il tuo codice sembra supporre che l'input sia rettangolare, mentre la domanda dice che nessuna riga avrà spazi bianchi finali.
Dennis,

Conto 107 byte. Non credo che sia necessario includere la "firma del marchio della distinta base UTF-8".
Calcolatrice

@CatsAreFluffy Stai usando Python2? In Python3 tutte le stringhe sono unicode, ma è più complicata con Python2.
Jenny Miller,

Oops, ho conteggiato le pipe come 2 byte, ma anche dopo aver utilizzato un contatore effettivo, ancora solo 111 byte. Dimmi da dove provengono quei 5 byte.
Calcolatrice

La distinta base UTF-8 è di 3 byte ( en.wikipedia.org/wiki/Byte_order_mark ). Il mio conteggio era alto perché il mio editor di testo stava aggiungendo una nuova riga finale, quindi la mia soluzione era in realtà solo 115 byte. Potresti lasciare i byte DBA principali e portarlo a 112 se stavi usando Python3 (che considera tutte le stringhe come unicode). Ma non so come stai vedendo solo 111 byte. a proposito, ecco come ho aggiunto la distinta base: sed -i '1s/^\(\xef\xbb\xbf\)\?/\xef\xbb\xbf/' codeGolf.py
Jenny Miller,

1

C, 290 byte

Funzione golfizzata B, con dipendenze; accetta input come carattere nullo *

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

Funzione un po 'ungolfed nel programma 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;
}

ingresso

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

produzione

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

C suggerimenti per il golf apprezzati!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.