ボックスを生成します!


19

あなたの仕事は、与えられた入力に関して任意の1つのASCII文字を使用してボックスを生成することです。

テストケース

1 1   --> =====
          =   =
          =====

1 2   --> =========
          =   =   =
          =========

2 1   --> =====
          =   =
          =====
          =   =
          =====

2 2   --> =========
          =   =   =
          =========
          =   =   =
          =========

2 5   --> =====================
          =   =   =   =   =   =
          =====================
          =   =   =   =   =   =
          =====================

入力

  • 入力は次のいずれかから取得できます。

    • stdin
    • コマンドライン引数
    • 関数の引数(2つの引数、各番号に1つ)
  • 入力は、stdinまたはコマンドライン引数から取得した場合、スペースで区切られた2つの正の整数を含みます。

  • 2つの数字は、各列と行のボックスの数を示します

出力

  • ボックスはstdout(またはそれに最も近いもの)に出力する必要があります
  • 各ボックスには3つの水平スペースが必要です

ルール

  • 両方の数値は0より大きくなりますが、1000を超えることはありません
  • ボックスの出力には、目に見える文字を使用できます。(目が厳しすぎない限り!)
  • 完全なプログラムまたは関数を作成することが許可されています。
  • オプションの末尾の改行文字以外の不要な文字はありません。

得点

これはであるため、最短の送信(バイト単位)が優先されます。

回答:



10

網膜、57バイト

1(?=.* (1*))
$1#$1#


1(?=(1*#1*#)*$)
=   
1
====
#
=#

末尾の改行で単項で入力を取ります。

各行は独自のファイルに移動#し、ファイル内の改行に変更する必要があります。これは実用的ではありませんが、-sフラグを付けたまま1つのファイルとしてコードを実行し、#マーカーを保持することができます(そして#入力の末尾の改行も変更します)。#読みやすくするために、出力内のを改行に戻すことができます。例えば:

> echo -n 11 111#|retina -s boxes|tr # '\n'
=============
=   =   =   =
=============
=   =   =   =
=============

方法:5つの単一置換ステップ。最初の2行(最初の4行)は1の2*N+1by Mグリッドを作成し、次の3ステップ(6行)はそれを目的の出力にフォーマットします。

中間文字列(-'で区切られる):

11 111
------------------
111
111
111
111
 111
------------------
111
111
111
111
111
------------------
111
=   =   =   
111
=   =   =   
111
------------------
============
=   =   =   
============
=   =   =   
============
------------------
=============
=   =   =   =
=============
=   =   =   =
=============

1行につき1つのファイルは、常に非常に奇妙なデザイン選択のようです。
curiousdannii

1
@curiousdanniiこの方法で作成されたため、改行文字はエスケープせずに正規表現で使用できますが、より合理的な1ファイル形式に変更する予定です。
randomra

8

JavaScript(ES6)、83

パラメーターの行と列を持つ関数。テンプレート文字列を使用すると、重要でカウントされる2つの埋め込み改行があります。

alert(ポップアップ)を介した出力。alert使用プロポーショナルフォント、我々は宇宙に似た代わりの幅の文字を使用して、より良い結果を得ます=

コンソールを使用してFirefoxでテストし、実際のalert出力を取得するか、以下のスニペットを実行します。

f=(r,c)=>{for(x=y="|";c--;)x+="||||",y+="   |";for(o=x;r--;)o+=`
${y}
`+x;alert(o)}

// TEST

// redefine alert to avoid that annoying popup during test
alert=x=>O.innerHTML=x

test=_=>([a,b]=I.value.match(/\d+/g),f(a,b))

test()
<input id=I value='2 3'><button onclick="test()">-></button>
<pre id=O></pre>


コードスニペットを実行しても機能しません。「2 3」が入ったボックスと、クリックして結果を得る必要があることを示唆する矢印が表示されます。全ページボタンを使用したり、別のブラウザを試したりしても、何も変わりません。
デニスジャエルディン

@DennisJaheruddin、クロムを使用する場合も同じことが起こります(ES6をサポートしていません)。Firefoxをお試しください。
Spikatrix

1
@DennisJaheruddinTest in Firefox
edc65

7

JavaScript(ES6)、75 73

多数のrepeat呼び出しを使用して、を繰り返し|、次に|末尾のスペースで繰り返し、これらの繰り返しを繰り返して行を作成します。

f=(y,x)=>alert(((s="|"[r="repeat"](x*4)+`|
`)+"|   "[r](x)+`|
`)[r](y)+s)

(テンプレート文字列を使用するというedc65の提案に従って、改行は重要です。)

スニペット:

<input id="x" type="range" max="10" min="1" step="1" value="3"><input id="y" type="range" max="10" min="1" step="1" value="2"><pre id="o"></pre><script>function f(y,x){return ((s="|"[r="repeat"](x*4)+"|\n")+"|   "[r](x)+"|\n")[r](y)+s};function redraw(){document.getElementById("o").innerHTML=f(document.getElementById("y").value,document.getElementById("x").value)};document.getElementById("x").onchange=redraw;document.getElementById("y").onchange=redraw;document.getElementById("x").oninput=redraw;document.getElementById("y").oninput=redraw;redraw();</script>

テンプレート文字列なし、メソッド名の再利用なし、空白の追加あり:

f=(y,x)=>alert(
    (
      (s="|".repeat(x*4)+"|\n") + 
      "|   ".repeat(x)+"|\n"
    ).repeat(y)+s
)

(視覚的な間隔を広げる|ためにedc65の推奨事項を使用します。)


7

ピップ、29 24 = 23 + 1バイト

-nフラグが必要です。コマンドライン引数として高さと幅を取り、1sのボックスを作成します。

([1X4m]XbRLa+1)@<v.1R0s

説明:

                         a,b are cmdline args; m is 1000; v is -1; s is " " (implicit)
 [1X4m]                  List containing 1111 and 1000
       Xb                String repetition of each element b times
         RLa+1           Repeat the list a+1 times
(             )@<v       Now we have one row too many at the end, so take everything
                         but the last item (equiv to Python x[:-1])
                  .1     Concatenate a 1 to the end of each row
                    R0s  Replace 0 with space
                         Print, joining list on newlines (implicit, -n flag)

このプログラムは、文字列が数字であり、数字がPipの文字列であるという事実を大きく利用しています。(そして、これらのボックスの3つのスペースは、たまたま組み込みm変数を利用するのにちょうどいいです!)

入力を使用してリストを作成する方法は2 3次のとおりです。

[1111;1000]
[111111111111;100010001000]
[111111111111;100010001000;111111111111;100010001000;111111111111;100010001000]
[111111111111;100010001000;111111111111;100010001000;111111111111]
[1111111111111;1000100010001;1111111111111;1000100010001;1111111111111]
[1111111111111;"1   1   1   1";1111111111111;"1   1   1   1";1111111111111]

そして最終的な出力:

C:\> pip.py 2 3 -ne "([1X4m]XbRLa+1)@<v.1R0s"
1111111111111
1   1   1   1
1111111111111
1   1   1   1
1111111111111

ピップの詳細


6

Perl、72 63 52 50バイト

私の最も短いバージョンでは$/、改行文字をよりコンパクトに取得するためにまだ使用しています:

$ perl -e 'print((($,="="."   ="x pop.$/)=~s/./=/gr)x(1+pop))' 2 5
=====================
=   =   =   =   =   =
=====================
=   =   =   =   =   =
=====================

前回の更新では、出力レコードセパレーター$,にほとんど空の行が挿入され、連続する行のリストが出力されます。

$ perl -e 'print((($,="="."   ="x pop."\n")=~s/./=/gr)x(1+pop))' 2 5

カジュアルな読者にとっては、前のバージョンの方が少しわかりやすいかもしれません。

$ perl -E 'say($y=($x="="."   ="x pop)=~s/./=/gr);for(1..pop){say$x;say$y}' 2 5

@ARGV代わりに使用される最初のバージョンpop

$ perl -E 'say($y=($x="="."   ="x$ARGV[1])=~s/./=/gr);for(1..$ARGV[0]){say$x;say$y}' 2 5


5

GNU sed -r、160

ため息、これはもっと小さいだろうと思ったが、とにかくここにある。残念ながら、sedの正規表現にはルックアラウンド機能がありません。

:
s/(.*)1$/   =\1/;t
s/([= ]+)/\1\n\1/
:b
s/   (.*\n)/===\1/;tb
s/(1*)1 $/\n\1/
:c
s/([^\n]*\n[^\n]*\n)(1*)1$/\1\1\2/;tc
s/(=+)(.*)/\1\2\1/
s/(^|\n)(.)/\1=\2/g

STDINから単項として入力を取得する:

$ sed -rf boxes.sed <<< "11 111"
=============
=   =   =   =
=============
=   =   =   =
=============
$

4

CJam、25バイト

q~)S3*'=5*+4/f*3f>\)*1>N*

CJamインタープリターでオンラインで試してください。

使い方

q~                        e# Read H and W from STDIN.
   S3*'=5*+               e# Push "   =====".
           4/             e# Chop into ["   =" "===="].
  )          f*           e# Repeat each string W+1 times.
               3f>        e# Cut off the first three characters.
                  \)*     e# Repeat the resulting array H+1 times.
                     1>   e# Remove the first string.
                       N* e# Join the lines.

4

マーベラス、168バイト

Marbelous言語の制限により、この回答は1000x1000ではなく、255x255までしか機能しません。私は32ビットのライブラリに取り組んでいますが、すぐには準備ができません。

入力は、メインボードへの2つのコマンドラインパラメーターまたは関数パラメーターとして提供されます。

@2@3}1@0
SLEL//>0\/
@3@1}0--
}1&0@0/\&0
@1/\@2}1\/
:SL
..}0@0
&0/\>0&0
EN..--\/
{0@0/\ES
:EL
..@0
..>0EN
}0--\/
@0/\EX
:EX
}0
\/3D3D3D3D
:ES
}0
\/3D202020
:EN
}0
{03D0A

擬似コード:

MB(H,W):
    EL(W)
    for 1..H:
        SL(W)
        EL(W)
EL(W):
    for 1..W:
        EX()
    EN()
SL(W):
    for 1..W:
        ES()
    EN()
EX():
    print "===="
ES():
    print "=   "
EN():
    print "=\n"


3

c関数、81

x,y;f(h,w){for(;y<=h*2;y++)for(x=0;x<w*4+2;x++)putchar(x>w*4?10:x&3&&y&1?32:61);}

テストプログラム:

x,y;f(h,w){for(;y<=h*2;y++)for(x=0;x<w*4+2;x++)putchar(x>w*4?10:x&3&&y&1?32:61);}

int main (int argc, char **argv)
{
  f(2, 3);
}

:私は、単一の代わりに、二重のためのラインとしてそれを治療するためのいくつかの文字を落としたx;f(h,w){for(w=w*4+2;x<=w*h*2+w;x++)putchar(x%w?x/w%2?x%w%4!=1?32:61:61:10);}78 -

1
最初に他の回答を見ていたはずです= /、私のコメントはReto Koradiの回答の長いバージョンです。

はい、私はこれを単一の(より短い)ループに入れるためにかなり懸命に(そして失敗しました)
Digital Trauma

3

PHP4.1、76の 71 69バイト

これは私が得ることができる限りゴルフです。

$R=str_repeat;echo$R(($T=$R('-',4*$H+1))."
|{$R('   |',$H)}
",$V),$T;

これは、キーHが行数と行Vごとのボックス数を持っていることを期待しています。

私が使用-|ているのは、箱が実際に箱のように見えるようにするためです。必要に応じて、に変更できます=。使用される文字は関係ありません。
立ち去って-|また起こっている混乱を理解するのを助けます。


古いメソッド、76バイト:

for($R=str_repeat;$H--;)echo$T=$R('-',($V*4)+1),"
|{$R('   |',$V)}
";echo$T;

出力の例:

http://localhost/file.php?H=2&V=3

-------------
|   |   |   |
-------------
|   |   |   |
-------------

3

ジュリア、59バイト

(n,m)->(l="="^(4m+1)*"\n";print(l*("="*"   ="^m*"\n"*l)^n))

これにより、2つの整数を入力として受け入れ、結果をSTDOUTに出力する名前のない関数が作成されます。呼び出すには、名前を付けf=(n,m)->...ます。

Ungolfed +説明:

function f(n, m)
    # Store the solid row
    l = "="^(4m + 1) * "\n"

    # Print all rows by repeating a pattern n times
    print(l * ("=" * "   ="^m * "\n" * l)^n)
end

例:

julia> f(2, 3)
=============
=   =   =   =
=============
=   =   =   =
=============

julia> f(1, 5)
=====================
=   =   =   =   =   =
=====================

どんな提案でも大歓迎です。


3

bash + coreutils、57

dc -e"2do$2 4*1+^1-pd8*F/1+$1si[fli1-dsi0<c]dscx"|tr 0 \ 

これは、ボックスの端にsを、スペースにsをdcもつ2進数を印刷するために使用します。10

  • すべて1の数値X2 ^ (width * 4 + 1) - 1、によって計算され、プッシュおよび印刷されます
  • 10001...0001数によって計算され、次いで、プッシュX* 8 / 15 + 1
  • その後、スタックはダンプされheightます

trその後、変換0スペース文字に秒。

出力

$ ./boxes.sh 2 4
11111111111111111
1   1   1   1   1
11111111111111111
1   1   1   1   1
11111111111111111
$ 

3

R、83 81

hおよびwをパラメーターとして取る名前のない関数として。1行目と2行目を各行のベクトルに構築し、h時間を複製します。一番下の行にベクトルを追加し、行の長さを制限するためにcat使用fillするベクトルを出力します。目に見える文字ルールを利用できるようになりました。

function(h,w)cat(rep(c(A<-rep(1,w*4+2),rep('   1',w)),h),A[-1],fill=w*4+1,sep='')

試運転

> f=function(h,w)cat(rep(c(A<-rep(1,w*4+2),rep('   1',w)),h),A[-1],fill=w*4+1,sep='')
> f(4,2)
111111111
1   1   1
111111111
1   1   1
111111111
1   1   1
111111111
1   1   1
111111111
> 

3

Pythonの3 2、160の 87 85 79バイト

私は、これはgolfedすることができます知っている多く、これがゴルフでの私の最初の試みであると私はいくつかの提案をしたいと思い、もっと。

def d(x,y):
    for i in[1]*x:print'='*(4*y+1)+'\n'+'=   '*(y+1)
    print'='*(4*y+1)

@CoolガイへとSP3000のヒント@おかげで、私はちょうどにサイズダウンを狭め上記の半分以下。

例:d(3,3)

=============
=   =   =   =   
=============
=   =   =   =   
=============
=   =   =   =   
=============

ここで試してみてください

末尾の空白を失います。


1
インデントレベルを減らすことができます。
Spikatrix

3
リストを作成してから参加する必要はありません。文字'='*(4*y+1)
列を

1
設定するとw=4*y+13バイト節約されます。
DLosc

@Cool Guy 4つのスペースではなくタブを使用しています。
nsane

わかった 気づかなかった。
Spikatrix

2

KDB(Q)、37バイト

{(3+2*x-1)#(5+4*y-1)#'(4#"=";"=   ")}

説明

                      (4#"=";"=   ")     / box shape
           (5+4*y-1)#'                   / extend y axis
 (3+2*x-1)#                              / extend x axis
{                                   }    / lambda

テスト

q){(3+2*x-1)#(5+4*y-1)#'(4#"=";"=   ")}[2;5]
"====================="
"=   =   =   =   =   ="
"====================="
"=   =   =   =   =   ="
"====================="

2

JavaScript、92 85バイト

私はこれが他のJSの回答(いつものようにうまくいく、edc65)よりも短くなることを望んでいましたが、まあまあです。ここでの数学はさらにゴルフができると感じています。

f=(r,c)=>(x=>{for(i=s='';(y=i++/x)<r-~r;)s+=i%x?' *'[-~y%2|!(-~i%4)]:'\n'})(4*c+2)||s

申し訳ありませんが、数学を手伝うことはできません-私の頭は回っています...しかし、ここにいくつかのマイクロ操作があります:f=(r,c)=>(x=>{for(i=s='';(y=i++/x)<r-~r;)s+=i%x?' *'[-~y%2|!(-~i%4)]:'\n'})(4*c+2)||s-> 85
edc65

@ edc65それは素晴らしい、ありがとう!2*r+1=>のようなr-~rものは、数学をゴルフすることによって私が意味したものであり、その特定の1つは天才です。:)
vvye

2

オクターブ、 69 65 64

y=ones([2,4].*input()+1);y(1:2:end,:)=y(:,1:4:end)=4;char(y+31)

-1につながった問題を指摘してくれたDLoscに感謝

入力を次のよう[1 1]に出力します。

#####
##
#####

「1」を入力して1x1を取得することもできます。入力が本当に必要な場合、1 1サイズは88 8584

y=ones([2,4].*eval(['[',input(0,'s'),']'])+1);y(1:2:end,:)=y(:,1:4:end)=4;char(y+31)

注:MatlabはOctaveのチェーンまたは入力(整数)を許可しませんが、Matlabバージョン(67)は次のとおりです。

y=ones([2,4].*input('')+1);y(1:2:end,:)=4;y(:,1:4:end)=4;char(y+31)

2

C、76バイト

w,n;f(r,c){for(w=c*4+2,n=w*r*2+w;n--;)putchar(n%w?n/w%2&&n%w%4-1?32:61:10);}

引数として行と列の数を持つ関数として呼び出されます。例えば:

f(5, 2)

2

CJam、30 29バイト

+最後に冗長性が削除された新しいバージョン(ありがとう、デニス):

l~_4*)'=*N+:F\'=S3*+*'=+N++*F

デニスは、これを何マイルも超えるCJamソリューションをすでに投稿していることを知っています。しかし、これはCJamでの私の最初の試みであるため、まったく機能することは奇跡です。:)

かなりブルートフォース。4 * H + 1 =記号から最初の行を作成し、=繰り返しH時間から2番目の行を作成し、別の行を=追加します。次に、2行を連結し、全体を繰り返しV、最初の行の別のコピーを追加します。

私はあまりにも多くのスタック操作を持っているように感じ、さらに他の方法でスタック上のものをシャッフルしなければならなかったので、変数の最初の行を格納することさえしました。

全体的に非常にエレガントではありませんが、どこかから始めなければなりません...そして、私は最初に簡単な問題を試してみたかったです。


+最後に必要はありません。CJamはスタック全体を印刷します。
デニス

2

CJam、23

q~[F8]f{2b*1+' f+N}*_0=

オンラインで試す

説明:

q~        read and evaluate the input (height width)
[F8]      make an array [15 8] - 1111 and 1000 in base 2
f{…}      for width and each of [15 8]
  2b      convert the number to base 2
  *       repeat the digits "width" times
  1+      append a 1 to the array of digits (right edge)
  ' f+    add the space character to each digit (0->' ', 1->'!')
  N       push a newline
*         repeat the resulting array "height" times
_0=       copy the first line (bottom edge)


1

Java、181

私は

完全なプログラムまたは関数を作成することが許可されています。

関数のバイト数をカウントするルールに準拠しています。この場合は181です。

import static java.lang.System.*;
public class Boxes
{
    public static void main(String[] args)
    {
        Boxes b=new Boxes();
        System.out.println("1,1:");
        b.b(1,1);
        System.out.println("1,2:");
        b.b(1,2);
        System.out.println("2,1:");
        b.b(2,1);
        System.out.println("2,2:");
        b.b(2,2);
        System.out.println("2,5:");
        b.b(2,5);
    }

    void b(int R, int C){String s="",e=s,x,y,z=s,a="====",n="=\n";int r,c;for(r=R;r-->0;){x=y=e;for(c=C;c-->0;){x+=a;y+="=   ";}s+=x+n+y+n;}for(c=C;c-->0;){z+=a;}s+=z+n;out.println(s);}
}

出力が間違っています。出力番号2を参照してください:「各ボックスには3つの水平スペースが必要です」。コードは3
つで

@CoolGuyはこれを誤って数えました-現在は2バイト多くなっていますが、それほど変わりません
...-Marco13

1
OK。+1。for(r=R;r-->0;){x=y=e;for(c=C;c-->0;){x+=a;y+="= ";}s+=x+n+y+n;}for(r=R;r-->0;s+=x+n+y+n){x=y=e;for(c=C;c-->0;y+="= "){x+=a;}}
-Spikatrix

1

C#、153 151 150

これは本当に競争することはできませんが、ここではただの楽しみのためです:

(h,w)=>{string s="=",e="\n",a="====",b="   =",m=a,o;int i=0,j;for(;i++<=h*2;){o=s;for(j=0;j++<w+1;o=m)System.Console.Write(o);m=m==a?b:a;s=e+s;e="";}}

実行方法:

public class Program
{
    public static void Main()
    {
        new System.Action<int, int>((h,w)=>{string s="=",e="\n",a="====",b="   =",m=a,o;int i=0,j;for(;i++<=h*2;){o=s;for(j=0;j++<w+1;o=m)System.Console.Write(o);m=m==a?b:a;s=e+s;e="";}})(3, 4);
    }
}

改善のために開きます。


文字列を変数に置き換えます。
-CSharpie

残念ながら許可されていません。これを参照してください
-pmudra

1
intループ外でそれらを宣言すると、バイトを節約できます。
Spikatrix

1

Python 2.7、66バイト。

Pythonにはすでにより良いソリューションがあることは知っていますが、それが私が思いついた最高のものです。

def f(x,y):a,b,c="="*4,"   =","\n=";print "="+a*y+(c+b*y+c+a*y)*x

例:

f(3,4)

=================
=   =   =   =   =
=================
=   =   =   =   =
=================
=   =   =   =   =
=================

申し訳ありませんが、テストケース2、3、および5に対して誤った出力が生成されます。列と行を混ぜて、逆の方法で取得しました。
Spikatrix

1

ルビー、 57 48 45

f=->h,w{l=?=*w*4+?=;(l+$/+'=   '*w+"=
")*h+l}

使用法:

print f[2,5]

3バイトを節約してくれたmanatworkに感謝します。


2つの小さな改善の可能性:'='?=および"<LF>"$/
マナトワーク

別の小さなもの:?=*(w*4+1)?=+?=*w*4
マナトワーク

1

Java、123 119バイト

void p(int h,int w){String b="=",d="\n=";for(;w-->0;d+="   =")b+="====";for(d+="\n"+b;h-->0;b+=d);System.out.print(b);}

入力パラメーターをカウンターとして乱用することは、コードサイズの削減に大いに役立ちました。

構文の乱用を提案してくれたCool Guyに感謝します。


forループの代わりにループを使用して、もっとゴルフをしてwhileください。
Spikatrix

残念なことにため(; W - > 0;)( - > 0 w)の一方と同じ長さである
ECS

1
while(w-->0){d+=" =";b+="====";}-> for(;w-->0;b+="====")d+=" =";これは3バイトを節約することを意味しました–
Spikatrix

あなたが正しいです。あなたの提案のおかげで、私は実際にこれから4バイトを絞ることができました。
ECS

1

SAS、117 119

macro a array a[0:1]$4('#   ' '####');do x=1 to 2+2*&x-1;t=repeat(a[mod(x,2)],&y-1);put t $char%%eval(&y*3). '#';end;%

例:

%let x=4;
%let y=4;
data;a;run;

結果:

#############
#   #   #   #
#############
#   #   #   #
#############
#   #   #   #
#############
#   #   #   #
#############

これをテストできるオンラインコンパイラはありますか?ところで、結果によると、プログラムは間違った出力を生成します。
output2を

@CoolGuy、あなたは正しいです、私はそれをキャッチしませんでした、私の投稿を更新しました。あなたは試すことができSASオンデマンドを独自の設定せずにオンラインコンパイラにアクセスするための最も面倒な方法だろう、AWSインスタンスを
目玉焼き

最初のリンクは機能しません。ChromeができますDNS_PROBE_FINISHED_NXDOMAIN
Spikatrix

これを試してください。ただし、最初のリンクはSAS On Demandで正常に機能しますが、このページのリンクから「コントロールセンター」に移動します
Fried Egg

理由はわかりませんが、コントロールセンターに行くと、以前のコメントで述べたのと同じエラーが発生します:/
Spikatrix
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.