构架这种精美的ASCII艺术


30

介绍

我认为每个人都同意,精美的图片必须具有良好的框架。但是,本网站上有关ASCII艺术的大多数挑战只是想要原始图片,而不关心它的保存。
如果我们有一个程序采用一些ASCII-Art并将其周围环绕一个漂亮的框架,那岂不是很好吗?

挑战

编写一个程序,将某些ASCII艺术作为输入,然后将其输出,并用漂亮的框架包围。

例:

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

变成

╔═══════╗
║*****║
║***║
║*║
║***║
║*****║
╚═══════╝
  • 您必须为框架使用与示例中完全相同的字符: ═ ║ ╔ ╗ ╚ ╝
  • 框架的顶部和底部将插入到输入的第一行和最后一行之前。
  • 框架的左部分和右部分必须在输入的最宽行上具有精确的一个空格填充。
  • 输出中可能没有前导或尾随空格。只允许尾随换行符。
  • 您可以假定输入没有不必要的前导空格。
  • 您可以假定输入在任何行上都没有尾随空格。
  • 您不必处理空输入。
  • 输入将仅包含可打印的ASCII字符和换行符。

规则

编码愉快!

强烈建议使用本网站在任何挑战中产生的出色ASCII艺术,作为程序的输入并以漂亮的框架进行显示!


29
用于ASCII艺术的非ASCII框架?异端!
丹尼斯

5
息息相关。同样的挑战,但仅对帧使用单个(ASCII)字符。
Martin Ender

13
(我应该澄清一下,我不认为这是一个骗子。必须使用6个不同的字符,这使技巧变得更加棘手。另一个挑战可以通过旋转网格并追加#四次来解决。在这里采用这种方法充其量是棘手的。 ,并且在最坏的情况下不可行。)
马丁·恩德

6
@IsmaelMiguel我已经赢得了上届比赛,根本不知道如何适应以前的答案。
Martin Ender

2
我怀疑DenkerAffe正在使用CP437或某些帧字符也是一个字节的东西。
约书亚

Answers:


6

CJam,45个字符/ 52个字节

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

试图避免那些昂贵的3字节字符很有趣。

在线尝试

说明

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个字节

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

例如,我正在构筑雪人“ 12333321”

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

怎么运行的:

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个字节

这是IBM866编码中的138个字节,在撰写本文时,Firefox仍支持该字节,而在UTF-8中为152个字节。

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
您实际上可以使用CP437编码Javascript并继续运行它吗?如果不是,则实际上不是138个字节。
Mama Fun Roll

@ӍѲꝆΛҐӍΛПҒЦꝆ尽管我找不到支持CP437的任何东西,但Firefox当前支持IBM866,它也具有这些框形图字符,因此我更新了答案。
尼尔

好的,很酷。有一个赞!
Mama Fun Roll

6

击,173个 171 150 148 147字节,157个 136 134 133字符

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╝

多行:

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╝

执行示例:

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

从脚本运行示例:

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

1
您的示例在底部框架和输入之间有一条空行,这是无效的。必须在输入之前和之后直接插入顶部和底部框架(顺便说一句,您的先前版本还不错)。
Denker

1
如果不错!不过你可以节省约5字符...?${#2}+2:n))代替+1,下降2位和printf -v z %${n}s;代替printf -v z " %*.s" $n
F. Hauri

@Sukminder好的,已经假设了这一点,但是由于您显示的输入不包含空行,因此想确保这一点。我并不需要您清除前导或待处理的空行的输入,因此您的程序非常好。
Denker

5

AWK,159个字节

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

awk如果可以弄清楚如何在代码中获取它,显然可以打印Unicode。


我现在对超赞的烟斗有很多想法……
Sebb

@Sebb看起来确实很有趣。:)
罗伯特·本森

5

Perl,111个字符

(分数包括+5的解释器标志)

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

首先,$n通过对所有线的长度进行数字排序,找到最长的线长度。

我们设置$l为页眉/页脚栏,以$n重复水平框架字符。

然后,我们将每行格式化为左对齐的行打印在width字段中$n,并夹在框架字符之间。

结果:

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

4

Pyth,44个字符(58个字节)

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

说明

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

在这里尝试。


4

PHP 5.3,209字节

这仅适用于编码OEM 860。它是扩展的ASCII超集,用于葡萄牙语DOS版本。由于我是葡萄牙语(而且我曾经喜欢在Pascal中做这些“框架”),并且这是一种标准编码,因此我继续这样做:

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

这是base64:

PD9mb3JlYWNoKCRXPWV4cGxvZGUoJwonLCRhcmd2WzFdKWFzJHYpJE09bWF4KCRNLHN0cmxlbigkdikrMik7cHJpbnRmKCLilZQlJ+KVkHskTX1z4pWXCuKVkSUxXCR7JE19c+KVkQolMlwkcwrilZElMVwkeyRNfXPilZEK4pWaJTFcJCfilZB7JE19c+KVnSIsJycsam9pbignCicsYXJyYXlfbWFwKGZ1bmN0aW9uKCR2KXVzZSgkTSl7cmV0dXJuIHN0cl9wYWQoIiAkdiAiLCRNKTt9LCRXKSkpOw==

这个答案基于我对以下内容的回答:https : //codegolf.stackexchange.com/a/57883/14732(繁重的工作都在那儿完成,只需要抽动一下即可)。


至少可以说是令人印象深刻的:)
MonkeyZeus '16

代码是209个字节/字符。22+58+11+5+11+24+66+12=209最后12个是换行符,因为DOS表示CRLF,即每个换行符两个字节。该charactercountonline网站不指望换行。每个非ASCII字形在OEM 860中均为1个字节
。– Runium

@Sukminder 在以ASCII /文本模式打开文件时,请不要忘记Windows至少会转换\n\r\n
伊斯梅尔·米格尔

2

Python 3,119字节

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字节

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

输入:

hello
there
  !  

输出:

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

欢迎来到益智拼图和代码高尔夫!不错的第一答案!您始终可以编写函数而不是完整程序(除非在挑战中明确禁止),这可以允许您通过将输入作为参数来节省一些字节。另外,您可能想使用Python 2,因此可以使用节省2个字节print"╔"+h+"╗\n"+"".join(o)+"╚"+h+"╝"
Denker

谢谢。我无法弄清楚如何在Python2中使用高字节(可能设置编解码器环境变量会起作用,但我不确定这如何影响高尔夫球字节数)。函数方法消除了python2 / 3的差异,但在我最好的方法中增加了一个字节。
SumnerHayes

好的,我把它的功能降到了119个字符。将输入作为字符串。我的迷你降价活动显然还不够。第1行是def,其余的(在冒号之后)是第2行,前导空格。 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 '16

只需使用新版本和新分数更新您的信息(用删除旧分数<s>...</s>)。您也可以<!-- language-all: lang-python -->在代码块之前添加,以在代码中添加语法突出显示。
Denker

如果输入为非矩形,则此方法不起作用,而问题是没有行尾有空格。
丹尼斯

2

Python 2,115字节

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

在这里看起来比115短,但是工作文件包含3字节的UTF-8 BOM标记签名,最多可以增加到115字节。如果要在Python 3中运行它,则不需要BOM,它会减少到112个字节。


欢迎来到编程难题和代码高尔夫球!不幸的是,您的代码似乎假设输入为矩形,而问题是没有行尾有空格。
丹尼斯

我数了107个字节。我认为您不需要包括“ UTF-8 BOM标记签名”。
CalculatorFeline

@CatsAreFluffy您正在使用Python2吗?在Python3中,所有字符串都是unicode,但使用Python2则比较棘手。
珍妮·米勒

糟糕,我将管道算作2个字节,但是即使使用了实际的字节计数器,仍然只有111个字节。告诉我这5个字节是从哪里来的。
CalculatorFeline

UTF-8 BOM为3个字节(en.wikipedia.org/wiki/Byte_order_mark)。我的数量很高,因为我的文本编辑器添加了结尾的换行符,所以我的解决方案实际上只有115个字节。如果您使用的是Python3(可以将所有字符串均视为unicode),则可以忽略前导BOM字节并将其降至112。但是我不知道你怎么只看到111个字节。顺便说一句,这就是我添加BOM的方法: sed -i '1s/^\(\xef\xbb\xbf\)\?/\xef\xbb\xbf/' codeGolf.py
Jenny Miller

1

C,290字节

高尔夫功能B,具有依赖关系;将输入作为以null终止的char *

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

完全取消程序功能

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

输入

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

输出

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

C打高尔夫球的技巧表示赞赏!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.