Çerçevelet bu güzel ASCII-Art


30

Giriş

Bence herkes güzel resimlerin güzel bir çerçeveye sahip olması gerektiğini kabul ediyor. Ancak bu sitede ASCII-Art ile ilgili çoğu zorluk sadece ham resmin olmasını istiyor ve korunmasını önemsemiyor.
Biraz ASCII-Art alan ve güzel bir çerçeveyle çevreleyen bir programımız olsaydı iyi olmaz mıydı?

Meydan okuma

Bazı ASCII-Art'ı girdi olarak alan ve güzel bir çerçeve ile çevrelediği bir program yaz.

Örnek:

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

olur

╔═══════╗
║ ***** ║
║ *** ║
║ * ║
║ *** ║
║ ***** ║
╚═══════╝
  • Örnekte olduğu gibi kare için aynı karakterleri kullanmanız gerekir: ═ ║ ╔ ╗ ╚ ╝
  • Çerçevenin üst ve alt kısmı, girişin ilk satırından ve son satırından önce yerleştirilir.
  • Çerçevenin sol ve hak kısımları, girişin en geniş hattına tam olarak bir boşluk bırakmalıdır.
  • Çıktıda öncü veya iz bırakan boşluk yok olabilir. Sadece takip eden bir yeni satıra izin verilir.
  • Girişin gereksiz bir öncü beyaz boşluk olmadığını varsayalım.
  • Girişin herhangi bir satırda sonda boşluk bulunmadığını varsayabilirsiniz.
  • Boş girişi ele almak zorunda değilsiniz.
  • Girdi yalnızca yazdırılabilir ASCII karakterleri ve yeni satırları içerecektir.

kurallar

Mutlu Kodlama!

Bu sitedeki herhangi bir zorlukla üretilen bazı ASCII-Art programlarını kullanarak, programınıza giriş yapın ve güzel bir çerçeve ile gösterilmesi şiddetle tavsiye edilir!


29
ASCII sanatı için ASCII olmayan bir çerçeve? Sapkınlık!
Dennis,

5
Çok yakından alakalı. Aynı zorluk, ancak çerçeve için sadece tek bir (ASCII) karakter kullanarak.
Martin Ender

13
(Dupe olduğunu sanmıyorum açıklığa kavuşturmalıyım. 6 farklı karakter kullanmak zorunda kalmak bunu çok daha zorlaştırıyor. Diğer bir zorluk ızgarayı döndürerek ve #dört kez ekleyerek çözülebilir . ve en kötüsü için geçerli değil.)
Martin Ender

6
@IsmaelMiguel Önceki yarışmayı kazandım ve eski cevabımı nasıl uyarlayabileceğimi anlamıyorum.
Martin Ender

2
DenkerAffe'nin CP437 veya çerçeve karakterlerinin de bir bayt olduğu varsayıyor olduğundan şüpheleniyorum.
Joshua,

Yanıtlar:


6

CJam, 45 karakter / 52 bayt

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

Bu pahalı 3 baytlık karakterlerden kaçınmaya çalışmak ... ilginçti.

Çevrimiçi deneyin

açıklama

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 bayt

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

Örnek olarak kardan adam "12333321" yi çerçeveliyorum .

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

Nasıl çalışır:

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 bayt

Bu, IBM866 kodlamada 138 bayttır, bu sırada yazma sırasında hala Firefox'ta, ancak 152 UTF-8'de desteklenir.

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’i CP437 kullanarak kodlayabilir ve hala çalıştırabilir misiniz? Değilse, o zaman bu aslında 138 byte değil.
Mama Fun Roll

@ ӍѲꝆΛҐӍΛПҒЦꝆ CP437'yi destekleyen bir şey bulamamama rağmen, Firefox şu anda bu kutu çizim karakterlerine sahip olan IBM866'yı desteklemektedir, bu yüzden cevabımı güncelledim.
Neil,

Peki tamam. Olumlu oy ver!
Mama Fun Roll

6

Bash, 173 171 150 148 147 bayt, 157 136 134 133 karakter

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╝

Çok satırlı:

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╝

Örnek uygulama:

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

Örnek komut dosyasından çalıştırma:

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

1
Örnekte, alt çerçeve ile geçersiz olan girdi arasında boş bir çizgi var. Üst ve alt çerçevelerin, girişin hemen öncesinde ve sonrasında yerleştirilmesi gerekir (önceki sürümünüz btw idi).
Denker

1
Güzel !, Ama eğer yaklaşık 5 kömürü kurtarabilecek ...?${#2}+2:n))yerine +1ve 2 boşluk bırakın printf -v z %${n}s;yerine printf -v z " %*.s" $n.
F. Hauri,

@Sukminder Tamam, zaten bir eşzamanlıydı ama gösterdiğiniz giriş boş bir satır içermediğinden emin olmak istedi. Önde gelen ya da traliing boş satırların girişini temizlemenizi istemedim, bu yüzden programınızı mükemmel şekilde tamamlıyorsunuz.
Denker

5

AWK, 159 bayt

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

Görünüşe göre awkkodunu nasıl alacağınızı bulabilirseniz Unicode yazdırabilirsiniz.


Şimdi harika borular için pek çok fikrim var ...
Sebb

@Sebb Bu eğlenceli görünüyor. :)
Robert Benson

5

Perl, 111 karakter

(puanlayıcı tercüman bayrakları için +5'i içerir)

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

İlk olarak, $ntüm satırların uzunluklarını sayısal olarak sıralayarak en uzun satır uzunluğunu buluruz .

Yatay çerçeve karakterinin tekrarı olarak $lüstbilgi / altbilgi çubuğu olarak ayarladık $n.

Ardından, sola hizalanmış her satırı, genişlik alanına $n, kare karakterleri arasına sıkıştırılmış olarak basarız.

Sonuç:

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

4

Pyth, 44 karakter (58 bayt)

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

açıklama

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

Burada dene.


4

PHP 5.3, 209 bayt

Bu sadece OEM 860 kodlamasını kullanarak çalışır . Portekizce DOS sürümlerinde kullanılan bir genişletilmiş ASCII üst kümesidir. Portekizli olduğumdan (ve bu "kareleri" Pascal'da yapmayı çok severdim) ve bu standart bir kodlama.

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

İşte base64:

PD9mb3JlYWNoKCRXPWV4cGxvZGUoJwonLCRhcmd2WzFdKWFzJHYpJE09bWF4KCRNLHN0cmxlbigkdikrMik7cHJpbnRmKCLilZQlJ+KVkHskTX1z4pWXCuKVkSUxXCR7JE19c+KVkQolMlwkcwrilZElMVwkeyRNfXPilZEK4pWaJTFcJCfilZB7JE19c+KVnSIsJycsam9pbignCicsYXJyYXlfbWFwKGZ1bmN0aW9uKCR2KXVzZSgkTSl7cmV0dXJuIHN0cl9wYWQoIiAkdiAiLCRNKTt9LCRXKSkpOw==

Bu cevap benim cevabımı temel alıyordu: https://codegolf.stackexchange.com/a/57883/14732 (ağır kaldırma tamamen orada yapıldı, sadece biraz titremek zorunda kaldı).


Az söylemek etkileyici :)
MonkeyZeus

Kodlar 209 bayt / karakterdir. 22+58+11+5+11+24+66+12=209Son 12, yeni satırlardır ve DOS olduğu gibi, CRLF anlamına gelir ya da yeni satır başına iki bayt. Charactercountonline sitesi yeni satır sayılmaz. ASCII olmayan gliflerin her biri, OEM
860'ta

@Sukminder Do ki (en azından), Windows dönüştürür unutmamak \niçine \r\n, ASCII dosyası açılırken / metin modunda.
Ismael Miguel,

2

Python 3, 119 Bayt

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 bayt

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

Giriş:

hello
there
  !  

Çıktı:

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

Progamming Puzzles & Code Golf'a Hoşgeldiniz! Güzel ilk cevap! Girdiyi argüman olarak alarak bazı baytları kaydetmenize izin verebilecek, tam programlar yerine (meydan okumada açıkça yasaklanmadıkça) her zaman işlevler yazabilirsiniz. Ayrıca Python 2'yi kullanmak isteyebilirsiniz, böylece devam ederek 2 byte tasarruf edebilirsiniz print"╔"+h+"╗\n"+"".join(o)+"╚"+h+"╝".
Denker

Teşekkürler. Python2'de çalışan yüksek baytları nasıl alacağımı bulamadım (muhtemelen codec ortam değişkenini ayarlamak işe yarayacaktı ama bunun golf bayt saymalarına nasıl oynadığından emin değilim). İşlev yaklaşımı python2 / 3 farklarını ortadan kaldırır, ancak en iyi yaklaşımıma bir bayt ekler.
SumnerHayes

Tamam, işlev olarak 119 karaktere indirdim; bir dize olarak girdi alır. Mini markdown açıkçası enfiye değil; Satır 1 def, geri kalan (kolondan sonra) satır 2'dir ve başlarında boşluk vardır. 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

Yayınınızı yeni sürümle ve yeni puanla güncelleyin (eski notla çarptı <s>...</s>). Ayrıca <!-- language-all: lang-python -->, kodunuza vurgulayarak sözdizimi eklemek için kod bloğunuzdan önce ekleyebilirsiniz.
Denker

Girdi dikdörtgen değilse, bu sorun işe yaramazken, soruda hiçbir satırın boşluk bırakmayacağı belirtiliyor.
Dennis,

2

Python 2, 115 Bayt

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

Burada 115'ten daha kısa görünüyor, ancak çalışan dosyada 3 bayt UTF-8 BOM işareti imzası var ve bu dosya 115 bayta kadar çıkıyor. Python 3'te çalıştırıyor olsaydınız, Malzeme Listesine ihtiyacınız olmazdı ve 112 bayta indi.


Programlama Bulmacaları ve Kod Golf'üne Hoşgeldiniz! Maalesef, kodunuz girişin dikdörtgen olduğunu varsayıyor, soru ise hiçbir satırın boşluk bırakmayacağını söylüyor.
Dennis,

107 bayt sayıyorum. "UTF-8 BOM işareti imzasını" eklemeniz gerektiğini düşünmüyorum.
CalculatorFeline

@CatsAreFluffy Python2 kullanıyor musunuz? Python3'te tüm dizeler unicode'dur, ancak Python2 ile daha zordur.
Jenny Miller

Hata! Boruları 2 bayt olarak saydım, ancak gerçek bir bayt sayacı kullandıktan sonra bile, hala sadece 111 bayt. Bana bu 5 baytın nereden geldiğini söyle.
Hesap MakinesiFeline

UTF-8 Malzeme Listesi 3 bayttır ( en.wikipedia.org/wiki/Byte_order_mark ). Sayım yüksek oldu çünkü metin editörüm takip eden bir yeni satır ekliyordu, bu yüzden çözümüm gerçekten sadece 115 bayt. Python3 kullanıyorsanız (tüm dizeleri unicode olarak sayar), önde gelen BOM baytlarını bırakıp 112'ye alabilirsiniz. Ama sadece 111 bayt nasıl gördüğünü bilmiyorum. btw, İşte Malzeme Listesini nasıl ekledim: sed -i '1s/^\(\xef\xbb\xbf\)\?/\xef\xbb\xbf/' codeGolf.py
Jenny Miller

1

C, 290 bayt

BBağımlılıklarla Golf fonksiyonu ; girişi boş sonlandırılmış char * olarak alır

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

Tam programda biraz ungolfed işlevi

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

giriş

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

çıktı

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

C golf ipuçları takdir!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.