この素敵なアスキーアートのフレーム


30

前書き

素敵な写真には素敵なフレームが必要だということは誰もが認めていると思います。しかし、このサイトでのASCII-Artに関するほとんどの課題は、生の画像が必要なだけで、保存については気にしません。
ASCIIアートをいくつか取り、それを素敵なフレームで囲む​​プログラムがあったらいいと思いませんか?

チャレンジ

入力としてASCIIアートを受け取り、素敵なフレームに囲まれて出力するプログラムを作成します。

例:

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

になる

╔=======╗
║*****║
║***║
║*║
║***║
║*****║
╚=======╝
  • フレームには、例とまったく同じ文字を使用する必要があります。 ═ ║ ╔ ╗ ╚ ╝
  • フレームの上部と下部は、入力の最初の行の前と最後の行の後に挿入されます。
  • フレームの左部分と権利部分には、入力の最も広い行に正確に1スペースのパディングが必要です。
  • 出力に先頭または末尾の空白がない場合があります。末尾の改行のみが許可されます。
  • 入力に不要な先頭の空白がないと仮定できます。
  • 入力のどの行にも末尾の空白がないと仮定できます。
  • 空の入力を処理する必要はありません。
  • 入力には、印刷可能なASCII文字と改行のみが含まれます。

ルール

  • 機能または完全なプログラムが許可されます。
  • 入出力のデフォルト規則
  • 標準の抜け穴が適用されます。
  • これはなので、バイト数が最も少なくなります。Tiebreakerは以前の提出です。

ハッピーコーディング!

このサイトでのチャレンジで作成されたすばらしいASCII-Artを使用して、プログラムへの入力として、素敵なフレームで表示することを強くお勧めします!


29
ASCIIアート用の非ASCIIフレーム?異端!
デニス

5
非常に密接に関連しています。同じ課題ですが、フレームに単一の(ASCII)文字のみを使用します。
マーティンエンダー

13
(私はそれがだましだとは思わないことを明確にする必要があります。6つの異なるキャラクターを使用することはこれを非常#にトリッキーにします。 、最悪の場合は実行できません。)
マーティンエンダー

6
@IsmaelMiguel前回のコンテストで優勝しましたが、古い回答をどのように適応させることができるかわかりません。
マーティンエンダー

2
DenkerAffeはCP437またはフレームの文字も1バイトであるものを想定していると思われます。
ジョシュア

回答:


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バイトではありません。
ママファンロール

@ӍѲꝆΛҐӍΛПҒЦꝆCP437をサポートするものは見つかりませんでしたが、Firefoxは現在、これらのボックス描画文字を含むIBM866をサポートしているため、回答を更新しました。
ニール

さて、クール。賛成票を投じてください!
ママファンロール

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
あなたの例では、下のフレームと無効な入力の間に空の行があります。上下のフレームは、入力の前後に直接挿入する必要があります(以前のバージョンは問題ありませんでした)。
デンカー

1
ナイス!、しかし、あなたがあれば約5文字を救うことができる...?${#2}+2:n))代わりに+1、そして2つのスペースドロップprintf -v z %${n}s;の代わりにprintf -v z " %*.s" $n
F.ハウリ

@Sukminder OK、すでにそれを仮定していましたが、表示する入力に空の行が含まれていないことを確認したかったのです。空行の先頭または末尾の入力をクリアすることを要求しなかったため、プログラムは完全に問題ありません。
デンカー

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

次に$n、フレーム文字の間に挟まれたwidthのフィールドで左揃えにフォーマットされた各行を印刷します。

結果:

╔═══════════╗
║   |\_/|   ║
║  / @ @ \  ║
║ ( > * < ) ║
║  `>>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を使用した場合にのみ機能します。これは、ポルトガル語のDOSバージョンで使用される拡張ASCIIスーパーセットです。私はポルトガル人であり(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

コードは209バイト/文字です。22+58+11+5+11+24+66+12=209最後の12は改行であり、DOSであるためCRLF、つまり改行ごとに2バイトです。charactercountonlineのサイトでは、改行はカウントされません。OEM 860では、非ASCIIグリフはそれぞれ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 
   !   
╚═══════╝

Progamming Puzzles&Code Golfへようこそ!素敵な最初の答え!(チャレンジで明示的に禁止されている場合を除き)完全なプログラムの代わりにいつでも関数を記述できます。これにより、入力を引数として使用してバイトを節約できます。また、Python 2を使用することもできます。そのため、を使用して2バイトを節約できますprint"╔"+h+"╗\n"+"".join(o)+"╚"+h+"╝"
デンカー

ありがとう。Python2でハイバイトを動作させる方法を理解できませんでした(おそらくコーデック環境変数を設定すると動作しますが、それがゴルフのバイトカウントにどのように影響するかはわかりません)。関数アプローチはpython2 / 3の違いを排除しますが、私の最良のアプローチでは1バイトを追加します。
-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

投稿を新しいバージョンと新しいスコアで更新します(古いスコアをで消します<s>...</s>)。<!-- language-all: lang-python -->コードブロックの前に追加して、構文の強調表示をコードに追加することもできます。
デンカー

入力が長方形でない場合、これは機能しませんが、質問では、行の末尾に空白文字は含まれないということです。
デニス

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マーク署名」を含める必要はないと思います。
電卓

@CatsAreFluffy Python2を使用していますか?Python3では、すべての文字列はユニコードですが、Python2では扱いにくいです。
ジェニーミラー

パイプを2バイトとしてカウントしましたが、実際のバイトカウンターを使用した後でも、まだ111バイトしかありません。それらの5バイトがどこから来たのか教えてください。
電卓

UTF-8 BOMは3バイトです(en.wikipedia.org/wiki/Byte_order_mark)。テキストエディターが末尾の改行を追加していたため、カウントが1つ増えました。そのため、実際のソリューションはわずか115バイトです。Python3(すべての文字列をUnicodeとしてカウントする)を使用している場合は、先頭のBOMバイトを省略して112に減らすことができます。しかし、111バイトしか表示されていないことがわかりません。ところで、ここで私はBOMを追加した方法は次のとおりです。 sed -i '1s/^\(\xef\xbb\xbf\)\?/\xef\xbb\xbf/' codeGolf.py
ジェニー・ミラー

1

C、290バイト

ゴルフ機能B、依存関係; 入力をヌル終了文字として受け取ります*

#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ゴルフのヒントは大歓迎です!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.