長方形のリングにタイルを形成する


8

入力を受け取り、タイルから長方形のリングtilesXtilesY作成するメソッドを作成します。

関数は、次のようにリング内のタイルを並べ替える必要があります。

ここに画像の説明を入力してください

  • tilesXそしてtilesY、常に正の整数値であり、することはできません0
  • tilesXそして、tilesY:常に等しくない、などの値が期待する2x56x3など
  • 無効な入力を確認する必要はありません
  • 2D配列、ASCIIアート、印刷されたテキストなど、どのような方法でもタイルを表示できます。
  • 2つの整数である限り、入力が渡される厳密な方法はありません。
  • 線にできません。長方形のサイズtilesXtilesYピクセルの描画は無効です
  • 最短のコードが勝ちます

1
入力/出力の例を挙げていただけますか?
FliiFe

2
完全なプログラムと関数を使用できますか?
ブルー

@FliiFe入力は2つの整数(負またはnullにすることはできません)で、出力は添付された画像のように印刷された画像です。
Creative Magic

出力を2D配列にすることはできますか?
ドアノブ

@muddyfish私は、ソリューションが数学であり、一部のAPIの一部ではないことを強く望んでいます。
Creative Magic

回答:


6

Dyalog APL、8バイト

×/¨1<⊂|⍳

このモナド関数トレインは、高さおよび幅を正しい引数として取り、0(境界)および1(内部)の2D配列を返します。TryAPLでテストします

使い方

×/¨1<⊂|⍳  Right argument: h w

       ⍳  Generate all index pairs (1-based) of a h×w array.
     ⊂    Enclose (h w), so it depth matches the one of the index array.
      |   For each pair (i j) compute the remainders of the division by (h w).
   1<     Compare all remainders with 1.
×/¨       Reduce each pair of Booleans by multiplication.

5

MATL、10バイト

2$lO6Lt4$(

これは、0と1を含む配列を出力します。

オンラインでお試しください!

2$l    % Implicit inputs M, N. Generate M×N array of ones
O      % Push number 0
6Lt    % Push [2 -1] twice, corresponding to index "2:end-1"
4$(    % Fill the center of the array with value 0. Implicit display

グラフィカル出力の場合1YGは、最後に追加して、配列をイメージとして表示します13バイト)。

2$Ol6Lt4$(1YG

MATL Online試しください例えば、

>> matl 2$Ol6Lt4$(1YG
> 5
> 7

作り出す

ここに画像の説明を入力してください


@ Sp3000そうです...私は抵抗できませんでした:-)とにかく、OPは、任意の文字を含む配列またはASCIIアートが有効な出力であることを明らかにしました
Luis Mendo

@LuisMendoは素晴らしい仕事ですが、メソッドに2つの値を渡す必要があります
Creative Magic

@CreativeMagicすみません。今すぐ修正。チャレンジを言い換えればいいのでは?「スクエアリング」は紛らわしいかもしれません
Luis Mendo

@LuisMendoは言い訳をしようとはしていませんが、英語は私の第一言語ではありません。
Creative Magic

1
@ニールOPは、行になれませんと言っています。「適当な太さがなければ一枚のタイルに相当するラインにはならない」と受け止めました。質問します
Luis Mendo

4

HTML / JS / CSS、198 194バイト

グラフィカル出力バージョン。バイト数には、デモ目的でのみ使用されるf=3つの<input>要素も含まれていません。@IsmaelMiguelのおかげで3バイト節約されました。

f=(n,m)=>{with(d.style)width=n*25+'px',height=m*25+'px'}
<input id=w placeholder=width><input id=h placeholder=height><input type=button value=Go! onclick=f(w.value,h.value)>
<div id=d style="border-image:radial-gradient(#fff 0,#fff 0)0 fill/25px;background:radial-gradient(#000 0,#000 8px,#fff 9px)0 0/25px 25px">


f=(n,m)=>{d.style.width=n*25+'px';d.style.height=m*25+'px';}に簡略化できませんf=(n,m)=>with(d.style)width=n*25+'px',height=m*25+'px';か?
Ismael Miguel

@IsmaelMiguel withは3バイト節約しますが、それでも{}s が必要です。一方、;は不要なので削除しました。
Neilは

4

MATL、10バイト

2$l3XyZ+3=

入力引数は、整数としての高さと幅です。出力はサイズの行列ですheight x width、境界タイルが0で内部値が1。

オンラインでお試しください!

説明

バイト数が少ない他の回答と同じロジックです。

        % Grab two input parameters implicitly
2$l     % Create a matrix of ones that has the dimensions specified as inputs
3       % Number literal 3
Xy      % Create a 3x3 identity matrix
Z+      % Perform 2D convolution (preserving size)
3=      % Create a logical matrix where values == 3 are 1 and 0 otherwise (boundary)
        % Implicitly display output.

4

MATLAB、32 31バイト

@(x)conv2(ones(x),eye(3),'s')>2

これによりans([4 5])、ワークスペース内で実行できる無名関数が作成されます。

入力[height, width]と出力は、中央が1で境界が0の行列です。

これが機能する方法は、入力のサイズが作成される1の行列です。次に、対角に1をもつ3 x 3の識別行列と畳み込みます。same入力をconv2's'ここまでに短縮)を使用して、結果を入力と同じサイズに保ちます。

次に、出力を境界の周りが0、内側が1のバイナリ値に変換します。私たちは不平等を使います>2すべてのエッジピクセルの結果は3未満であり、すべての非境界要素の結果は3であるためます。

グラフィカル出力の場合:

@(x)imagesc(conv2(ones(x),eye(3),'s')>8)
ans([6,9])

ここに画像の説明を入力してください


3

ゼリー、10 バイト

p%€,>1P€G

0(境界)と1(内部)のグリッドを返します。オンラインでお試しください!

使い方

p%€,>1P€sG  Main link. Arguments: h (height), w (width)

p           Cartesian product; return all pairs in [1, ..., h] × [1, ..., w].
   ,        Yield the pair [h, w].
 %€         For each pair [i, j] in the product, compute [i % h, j % w].
    >1      Compare all resulting moduli with 1.
      P€    Compute the product of each pair of Booleans.
        s   Split the resulting flat list into rows of length w.
         G  Display the results in a 2D grid.

この答えは素晴らしいですが、視覚的には長方形のリングでなければなりません。配列や文字列などを使用するのは問題ありませんが、実行すると画面上でリングのように見える必要があります。
Creative Magic

OK。2D配列が許可されていることを読んだとき、それらの視覚的表現が重要であるとは思っていませんでした。回答を編集しました。
デニス

@Dennis "実行すると、画面上のリングのように見える必要はありません"。つまり、スペースを使用する必要がありますか?
Erik the Outgolfer 2016

3

ジュリア、46 34バイト

f(n,m)=[n>i>1<j<m for i=1:n,j=1:m]

これは、2つの整数を受け入れ、2次元のブール配列を返す関数です。

二重ループの配列内包表記を使用して、n × m行列を作成しforます。1からnおよび1からmまでの各インデックス、つまり行列の各要素について、n > i > 1および1 < j < mのtrue場合に値を設定します。これは、境界以外のすべての場所に当てはまるため、結果の配列には中央にsがあり、境界の周りにsがあります。truefalse

例:

julia> f(n,m)=[n>i>1<j<m for i=1:n,j=1:m]
f (generic function with 1 method)

julia> f(4,4)
4x4 Array{Bool,2}:
 false  false  false  false
 false   true   true  false
 false   true   true  false
 false  false  false  false

julia> f(1,1)
1x1 Array{Bool,2}:
 false

julia> f(2,5)
2x5 Array{Bool,2}:
 false  false  false  false  false
 false  false  false  false  false

デニスのおかげで12バイト節約されました!


2

CJam、20バイト

l~S*a*{3a.f|W%z}4*N*

入力はの形式である必要がありますheight width。出力は、中心と#境界にスペースを使用するASCIIグリッドです。

ここでテストしてください。

説明

l~       e# Read and evaluate input, dumping h and w on the stack.
S*       e# Create a string of w spaces.
a*       e# Create an array of h copies of that string.
{        e# Repeat this block 4 times...
  3a.f|  e#   For each character in the first row, take its bitwise OR with 3, turning
         e#   spaces into # and leaving # unchanged.
  W%z    e#   Reverse and transpose the grid, rotating it by 90 degrees.
}4*
N*       e# Join the lines of the result with linefeeds.

2

Pyke、16 15バイト

jQ]Uajt%!RQt%!|

ここでお試しください!

説明:

                - Q = eval_input()
j               - j = eval_input()
jQ]             - [Q,j]
   U            - create a 3d array sized Q by j with coords
    a           - for each coord (2d for)
     jt%!       -   not (coord_1 % j-1)
              | -  ^ or V
          Qt%!  -   not (coord_2 % Q-1)

きれいな出力には、このコードを使用します

または、エッジをゼロにしたマスクをゼロにした13バイト(中央の文字がゼロ以外)

jQ]Uajt%RQt%&

ここでお試しください!


2

JavaScript(ES6)、80 82 85

保存された3バイトを編集 thx @Neil
編集 2バイトを使用して編集reduce一度して

複数行の文字列を返す無名関数

(w,h)=>[...Array(h)].reduce(o=>o+(w>1?'O'+' O'[!--h|!o].repeat(w-2):'')+`O
`,'')

テスト

f=(w,h)=>[...Array(h)].reduce(o=>o+(w>1?'O'+' O'[!--h|!o].repeat(w-2):'')+`O
`,'')

function test(){
  var [w,h] = I.value.match(/\d+/g)
  w=+w,h=+h // convert to numeric
  O.textContent=f(w,h)
}  

test()
<input value='5 4' id=I><button onclick='test()'>Test</button><pre id=O></pre>


確か!--h|!oにすでに整数ですか?それ以外の場合、の使用が好きです!o
Neilは

2

Ruby、63バイト

無名関数、STDOUTに出力します。ボーダーです#

->x,y{h=?#;puts t=h*x,y>1?[[h+(x<2?'':' '*(x-2)+h)]*(y-2),t]:p}

申し訳ありませんが、リングを出力する必要があるため、内部ではバックティックを使用できません。
Erik the Outgolfer 2016

そして、目立たない小さな文字で内部を埋めることによって節約したいと思っていた1バイトがあります...
Value Ink

あなたは賛成票を獲得し、それに値します。
Erik the Outgolfer

1

JavaScript(ES6)、97バイト

(n,m)=>Array(n).fill(' '.repeat(m).replace(/^ | $/g,0)).join`
`.replace(/^.+|.+$/g,'0'.repeat(m))

0sのリングを作成します。恐ろしいアプローチかもしれませんが、エッジケースを避けたかったのです。


1

JavaScript(ES6)、77バイト

h=>w=>[...Array(i=h)].map(_=>(a=Array(w).fill(h-i--&&i?0:1),a[0]=a[w-1]=1,a))

配列出力の配列が好きではありません(許可されている場合でも)。コンソールに表示されるのはf(4)(4)->Array [ Array[4], Array[4], Array[4], Array[4] ]
edc65

1

Retina45 43バイト

\d+
$*
S_`1(?=.* (1+))|.
T`1`#`^.+|.+$|.?¶.

入力はの形式にする必要がありますheight width。出力は1、中心と#境界に使用するASCIIグリッドです。

オンラインでお試しください!

説明

\d+
$*

各数値Nを1の文字列にN変換します(つまり、入力を単項に変換します)。

S_`1(?=.* (1+))|.

それぞれ1を一致させてにheight置き換えwidth、その他すべてを一致させて削除します。これを行うには、スプリットステージを悪用します。これによりw x hグリッドが作成されます。

T`1`#`^.+|.+$|.?¶.

最後に、すべて1#最初の行、最後の行、または行の最初か最後にあるa に置き換えます。


1

実際には、23バイト

;'#*;))¬' *'#;)@+(+nXX(

オンラインでお試しください!

このアプローチは、この関連する課題における私のアプローチと非常に似ています。ます。

説明:

;'#*;))¬' *'#;)@+(+nXX(
                         (implicit) push all input to stack
;'#*                     push a string containing X #s
    ;))                  dupe, and push both to bottom of stack
       ¬' *              push a string containing (X-2) spaces
           '#;)@+(+      add a # to the front and the back of the string
                   nXX   make (Y-2) copies
                      (  bring one of the "#"*X strings back to the top
                         (implicit) pop and print each stack item, separated by newlines

2
真剣にv3がWaitと呼ばれいない場合は、本当に?私はかなりがっかりするでしょう。
Alex A.

@AlexA。本気でしたか?

1

QBasic、69バイト

INPUT x,y
FOR i=1TO y
FOR j=1TO x
?i MOD y<2OR j MOD x<2;
NEXT
?
NEXT

として寸法を取りますwidth,height。is-it-on-the-borderテストのブール値は、-1trueと0false に対して単純に出力されます。サンプル実行は次のようになります。

? 5,3
-1 -1 -1 -1 -1 
-1  0  0  0 -1 
-1 -1 -1 -1 -1 

ボーナス:グラフィカルバージョン、88バイト

INPUT x,y
SCREEN 9
FOR i=1TO y
FOR j=1TO x
PSET(j*3,i*3),i MOD y<2OR j MOD x<2
NEXT
NEXT

これは「線ではない」と見なされます。場合MOD式が偽(0)であり、PSET黒画素をプロット。true(-1)の場合、PSET明らかに白いピクセルをプロットします。これは17,31、2倍のサイズで表示されます。

グラフィカルな長方形


1

TSQL、107 105 97バイト

DECLARE @ INT=3,@y INT=5

PRINT REPLICATE(1,@)+ISNULL('
'+REPLICATE('1'+ISNULL(SPACE(@-2),'')+'1
',@y-2)+REPLICATE(1,@),'')
  1. 最初の行を生成する
  2. 中空線と改行を追加する
  3. 最後の行を追加する(必要な場合)

0

ユニコーン26 23バイト

P3G$PG@PS@S$L2B$T1B@T1N

ユニコーンが嫌いだから?

説明(「リストプログラム」出力):

P3  Paint current square with 3
G$P Get: sets $ from input P
G@P Get: sets @ from input P
S@  Subtract 1 from @
S$  Subtract 1 from $
L2  ~Loop 2 times
B$  ~Brush $ more square
T1  ~Turn 1 right angle clockwise
B@  ~Brush @ more square
T1  ~Turn 1 right angle clockwise
N   ~Next (loop)

tilesX= 3、tilesY= 5の出力:

注:このバージョンは、tilesX最大6でのみ機能し、tilesY最大5でします。質問では、サポートする必要のある範囲については触れられていないため、これで問題ないと思います。それ以外の場合は、プログラムに少し追加するだけで、この代替案が生成されます。これは、少し広い範囲をサポートします。

ユニコーン、30 27バイト

x0y9P3G$PG@PS@S$L2B$T1B@T1N

x0y9(0,9)でボックスを開始するを追加することにより、プログラムはtilesX最大9とtilesY最大9まで機能します(入力は最大9になるため)。




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