Bentuk ubin di cincin persegi panjang

8

Diberikan input tilesXdan tilesYmembuat metode yang akan membuat cincin persegi panjang dari ubin.

Fungsi harus memesan ubin dalam cincin seperti ini:

masukkan deskripsi gambar di sini

  • tilesXdan tilesYselalu nilai integer positif, tidak boleh 0
  • tilesXdan tilesYtidak selalu sama, mengharapkan nilai-nilai seperti: 2x5, 6x3dll
  • Memeriksa input yang tidak valid tidak perlu
  • Anda dapat menggunakan cara apa pun untuk menampilkan ubin, termasuk array 2d, seni ASCII, atau teks cetak.
  • Tidak ada cara ketat bagaimana input dilewatkan asalkan dua bilangan bulat.
  • Tidak dapat menjadi garis, menggambar ukuran persegi panjang tilesXdan tilesYpiksel tidak valid
  • Kode terpendek menang
Sihir Kreatif
sumber
1
Bisakah Anda memberikan contoh input / output?
FliiFe
2
Bisakah kita menggunakan program lengkap serta fungsi?
Biru
@FliiFe Input adalah dua bilangan bulat (tidak boleh negatif atau nol), output adalah gambar yang dicetak seperti pada gambar terlampir.
Creative Magic
Bisakah output menjadi array 2D?
Gagang Pintu
@muddyfish Saya lebih suka solusi matematika dan bukan bagian dari beberapa API.
Creative Magic

Jawaban:

6

Dyalog APL, 8 byte

×/¨1<⊂|⍳

Kereta fungsi monadik ini mengambil tinggi dan lebar sebagai argumen yang tepat dan mengembalikan array 2D 0 's (perbatasan) dan 1 's (interior). Uji di TryAPL .

Bagaimana itu bekerja

×/¨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.
Dennis
sumber
5

MATL , 10 byte

2$lO6Lt4$(

Ini menghasilkan array yang berisi nol dan satu.

Cobalah online!

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

Untuk output grafis, tambahkan 1YGdi akhir untuk menampilkan array sebagai gambar ( 13 byte ):

2$Ol6Lt4$(1YG

Cobalah di MATL Online! Sebagai contoh,

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

menghasilkan

masukkan deskripsi gambar di sini

Luis Mendo
sumber
@ Sp3000 Anda benar ... Saya tidak bisa menahan :-) Pokoknya, OP telah mengklarifikasi bahwa array atau seni ASCII dengan karakter apa pun adalah output yang valid
Luis Mendo
@LuisMendo kerja hebat, tetapi harus memiliki dua nilai lolos ke metode
Creative Magic
@CreativeMagic Maaf. Diperbaiki sekarang. Mungkin ulangi tantangannya? " Lapangan cincin" mungkin membingungkan
Luis Mendo
@LuisMendo tidak mencoba membuat alasan, tetapi bahasa Inggris bukan bahasa pertama saya, jika Anda bisa memberi saya judul yang lebih baik, saya akan senang mendengarnya.
Creative Magic
1
@Neil OP mengatakan Tidak bisa menjadi garis . Saya menganggap itu sebagai "tidak mungkin garis tanpa ketebalan yang sesuai, sesuai dengan satu ubin". Saya akan bertanya kepada mereka
Luis Mendo
4

HTML / JS / CSS, 198 194 byte

Versi keluaran grafis. Hitungan byte tidak termasuk f=atau tiga <input>elemen yang digunakan untuk tujuan demonstrasi saja. Disimpan 3 byte berkat @IsmaelMiguel.

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">

Neil
sumber
Tidak f=(n,m)=>{d.style.width=n*25+'px';d.style.height=m*25+'px';}bisa disederhanakan f=(n,m)=>with(d.style)width=n*25+'px',height=m*25+'px';?
Ismael Miguel
@ IsmaelMiguel The withtidak menyelamatkan saya 3 byte tetapi saya masih perlu {}s. Di sisi lain ;itu tidak perlu jadi saya menghapusnya juga.
Neil
4

MATL , 10 byte

2$l3XyZ+3=

Argumen input adalah tinggi dan lebar sebagai bilangan bulat. Outputnya adalah matriks ukuran di height x widthmana petak batas 0 dan nilai dalam 1.

Cobalah secara Online!

Penjelasan

Logika yang sama dengan jawaban saya yang lain dengan byte lebih sedikit.

        % 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.
Suever
sumber
4

MATLAB, 32 31 byte

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

Ini menciptakan fungsi anonim yang kemudian dapat dijalankan seperti ans([4 5])di dalam ruang kerja.

Input is [height, width]dan output adalah matriks dengan 1 di pusat dan 0 untuk batas.

Cara kerjanya adalah matriks ukuran input yang dibuat. Kemudian dikonvolusi dengan matriks identifikasi 3 x 3 dengan matriks diagonal. Kami menggunakan sameinput to conv2(disingkat ke 's'sini) untuk menjaga hasil ukuran yang sama dengan input.

Kami kemudian ingin mengkonversi output ke nilai biner dengan 0 di sekitar batas dan 1 di dalam. Kami menggunakan ketidaksetaraan >2karena semua piksel tepi akan memiliki hasil <3 dan semua elemen non-batas akan memiliki hasil yang sama dengan 3.

Untuk keluaran grafis:

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

masukkan deskripsi gambar di sini

Suever
sumber
3

Jelly , 10 byte

p%€,>1P€G

Mengembalikan kisi 0 's (perbatasan) dan 1 's (interior). Cobalah online!

Bagaimana itu bekerja

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.
Dennis
sumber
Jawaban ini bagus, tetapi secara visual harus cincin persegi panjang. Meskipun tidak masalah menggunakan array, string dll., Itu harus terlihat seperti cincin di layar saat Anda menjalankannya.
Creative Magic
BAIK. Ketika saya membaca bahwa array 2D diizinkan, saya tidak mengharapkan representasi visual mereka menjadi masalah. Saya sudah mengedit jawaban saya.
Dennis
@ Dennis "[I] t harus terlihat seperti cincin di layar ketika Anda menjalankannya". Itu berarti spasi harus digunakan?
Erik the Outgolfer
3

Julia, 46 34 byte

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

Ini adalah fungsi yang menerima dua bilangan bulat dan mengembalikan boolean array 2 dimensi.

Kami membangun matriks n × m menggunakan pemahaman array dengan forloop ganda . Untuk setiap indeks dari 1 ke n dan 1 ke m , yaitu setiap elemen dari matriks, kami menetapkan nilainya ke truejika n > i > 1 dan 1 < j < m . Ini benar di mana-mana kecuali batas, sehingga array yang dihasilkan akan ada truedi tengah dan falsedi sekitar perbatasan.

Contoh:

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

Disimpan 12 byte berkat Dennis!

Alex A.
sumber
2

CJam, 20 byte

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

Input harus dalam bentuk height width, output adalah kisi ASCII menggunakan spasi untuk pusat dan #untuk batas.

Uji di sini.

Penjelasan

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.
Martin Ender
sumber
2

Pyke, 16 15 byte

jQ]Uajt%!RQt%!|

Coba di sini!

Penjelasan:

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

Untuk hasil yang lebih baik, gunakan kode ini .

Atau 13 byte dengan masker zeroed out di sekeliling tepi (karakter tengah bukan nol)

jQ]Uajt%RQt%&

Coba di sini!

Biru
sumber
2

JavaScript (ES6), 80 82 85

Edit 3 byte disimpan thx @Neil
Edit 2 byte disimpan menggunakanreduce untuk sekali

Fungsi anonim mengembalikan string multi baris

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

Uji

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>

edc65
sumber
Tentunya !--h|!osudah bilangan bulat? Kalau tidak, saya suka menggunakan !o.
Neil
2

Ruby, 63 byte

Fungsi anonim, mencetak ke STDOUT. Perbatasan adalah #.

->x,y{h=?#;puts t=h*x,y>1?[[h+(x<2?'':' '*(x-2)+h)]*(y-2),t]:p}
Nilai Tinta
sumber
Maaf, Anda harus mengeluarkan cincin, jadi tidak ada backticks yang diizinkan di dalam.
Erik the Outgolfer
Dan ada satu byte yang saya berharap untuk menyelamatkan dengan mengisi bagian dalam dengan karakter kecil yang kurang terlihat ...
Value Ink
Anda mendapatkan suara positif, Anda layak mendapatkannya.
Erik the Outgolfer
1

JavaScript (ES6), 97 byte

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

Membuat cincin 0s. Mungkin pendekatan yang mengerikan tetapi saya ingin menghindari kasus tepi.

Neil
sumber
1

JavaScript (ES6), 77 byte

h=>w=>[...Array(i=h)].map(_=>(a=Array(w).fill(h-i--&&i?0:1),a[0]=a[w-1]=1,a))
pengguna81655
sumber
Saya tidak suka output array array (bahkan jika diizinkan). Yang saya lihat di konsol adalah f(4)(4)->Array [ Array[4], Array[4], Array[4], Array[4] ]
edc65
1

Retina , 45 43 byte

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

Input harus dalam bentuk height width, output adalah kisi ASCII menggunakan 1untuk pusat dan #untuk batas.

Cobalah online!

Penjelasan

\d+
$*

Konversi setiap angka Nmenjadi string Nyang (mis. Konversi input ke unary).

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

Cocok satu sama 1di heightdan menggantinya dengan width, sementara juga cocok segala sesuatu yang lain dan menghapus. Kami melakukan ini dengan menyalahgunakan split stage. Ini menciptakan w x hkisi.

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

Akhirnya kami mengganti setiap 1dengan #yang ditemukan di baris pertama, baris terakhir atau di awal atau akhir baris.

Martin Ender
sumber
1

Sebenarnya , 23 byte

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

Cobalah online!

Pendekatan ini sangat mirip dengan pendekatan saya dalam tantangan terkait ini .

Penjelasan:

;'#*;))¬' *'#;)@+(+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
Mego
sumber
2
Jika Seriously v3 tidak disebut Tunggu, Benarkah? Saya akan sangat kecewa.
Alex A.
@AlexA. Apakah kamu serius ?
kucing
1

QBasic, 69 byte

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

Dimensi sebagai width,height. Nilai boolean dari tes is-it-on-the border hanya dicetak: -1for true dan 0for false. Contoh dijalankan seperti:

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

Bonus: Versi grafis, 88 byte

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

Saya percaya ini dianggap sebagai "bukan garis." Ketika MODekspresi salah (0), PSETplot sebuah piksel hitam; ketika itu benar (-1), PSETtampaknya memplot piksel putih. Ini 17,31, ditampilkan pada ukuran 2x:

Persegi panjang grafis

DLosc
sumber
1

TSQL, 107 105 97 byte

DECLARE @ INT=3,@y INT=5

PRINT REPLICATE(1,@)+ISNULL('
'+REPLICATE('1'+ISNULL(SPACE(@-2),'')+'1
',@y-2)+REPLICATE(1,@),'')
  1. menghasilkan baris pertama
  2. menambahkan garis kosong + garis putus
  3. menambahkan baris terakhir (bila perlu)
t-clausen.dk
sumber
0

Unicorn , 26 23 byte

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

Karena siapa yang tidak suka unicorn ?!

Penjelasan (keluaran "daftar program"):

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)

Output untuk tilesX= 3, tilesY= 5:

Catatan: Versi ini hanya berfungsi tilesXhingga 6 dantilesY hingga 5. Pertanyaannya tidak menyebutkan kisaran apa yang perlu kita dukung, jadi saya berasumsi ini OK. Kalau tidak, tambahan kecil untuk program menghasilkan alternatif ini, yang mendukung kisaran yang sedikit lebih besar:

Unicorn, 30 27 byte

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

Dengan menambahkan x0y9, yang memulai kotak di (0,9), program ini berfungsi tilesXhingga 9 dan tilesYhingga 9 (karena input hanya naik hingga 9).

Pohon salam
sumber
0

J, 16 byte

0(<2#<<0 _1)}$&1

Gunakan bentuk $untuk membuat persegi panjang semua yang ukuran input, dan kemudian gunakan bentuk Amend komplementer} untuk mengubah interior menjadi nol.

Cobalah online!

Jonah
sumber
0

Perl 5 , 76 + 1 ( -a) = 77 byte

print(1x($a=$F[0]),$/,((1,$"x($a-2),1 x($a>1),$/)x($F[1]-2),1x$a)x($F[1]>1))

Cobalah online!

Xcali
sumber
0

Perl 5, 45 + 1 ( -p) = 46 byte

$_=join$/,(1x$_)x<>;1while s/
.+\K1(?=.+
)/ /

mengikuti 45 byte tidak menangani tileY = 1

$_=1x<>.$/;say$_.s/(?!^.|.$)./ /gr x(<>-2).$_

Cobalah online

Nahuel Fouilleul
sumber