Tanda Grid Sangat Sederhana

29

Tulis sebuah program atau fungsi yang mengambil dalam tiga bilangan bulat positif, W, H, dan N. Cetak atau kembalikan kotak W × H .di mana setiap Nth .dalam urutan pembacaan bahasa Inggris yang normal diganti denganX .

Misalnya, mengingat W = 7, H = 3, N = 3, kisi adalah 7 karakter lebar dan 3 tinggi, dan setiap pembacaan karakter ketiga dari kiri atas adalah X:

..X..X.
.X..X..
X..X..X

Demikian pula, jika inputnya adalah W = 10, H = 4, N = 5, hasilnya adalah:

....X....X
....X....X
....X....X
....X....X

Catatan

  • "Urutan pembacaan Bahasa Inggris Normal" berarti belok kiri ke kanan pada setiap baris, dari baris atas ke bawah.
  • Ketika N adalah 1 maka semua .akan menjadi X.
  • Anda dapat menggunakan dua karakter ASCII yang dapat dicetak untuk menggantikan .dan X.
    • Jika Anda menggunakan spasi ( ) maka spasi tambahan tidak diperlukan saat hasilnya akan sama secara visual. (Baris kosong masih diperlukan.)
    • Anda mungkin tidak menggunakan sesuatu yang lain sebagai pengganti baris baru yang membentuk kisi.
  • Format input dan urutan W, H, dan N yang tepat tidak super penting. Hal-hal seperti [H,W,N]atauN\nW,H baik-baik saja.
  • Baris baru yang tertinggal dalam output baik-baik saja.
  • Kode terpendek dalam byte menang!

Contohnya

W = 5, H = 3, N = 1
XXXXX
XXXXX
XXXXX

W = 5, H = 3, N = 2
.X.X.
X.X.X
.X.X.

W = 5, H = 3, N = 3
..X..
X..X.
.X..X

W = 5, H = 3, N = 4
...X.
..X..
.X...

W = 5, H = 3, N = 5
....X
....X
....X

W = 5, H = 3, N = 6
.....
X....
.X...

W = 5, H = 3, N = 7
.....
.X...
...X.

W = 5, H = 3, N = 15
.....
.....
....X

W = 5, H = 3, N = 16 (or more)
.....
.....
.....

W = 1, H = 1, N = 1
X

W = 1, H = 1, N = 2 (or more)
.

W = 8, H = 6, N = 2
.X.X.X.X
.X.X.X.X
.X.X.X.X
.X.X.X.X
.X.X.X.X
.X.X.X.X

W = 8, H = 6, N = 3
..X..X..
X..X..X.
.X..X..X
..X..X..
X..X..X.
.X..X..X

W = 8, H = 6, N = 4
...X...X
...X...X
...X...X
...X...X
...X...X
...X...X

W = 8, H = 6, N = 7
......X.
.....X..
....X...
...X....
..X.....
.X......

W = 8, H = 6, N = 16
........
.......X
........
.......X
........
.......X

W = 37, H = 1, N = 4
...X...X...X...X...X...X...X...X...X.

W = 1, H = 10, N = 8
.
.
.
.
.
.
.
X
.
.
Hobi Calvin
sumber
1
Apakah saya benar menganggap bahwa batasan " Anda tidak boleh menggunakan sesuatu yang lain sebagai pengganti baris baru yang membentuk kisi " termasuk " Anda tidak boleh mengembalikan array ["..X..X.", ".X..X..", "X..X..X"]sebagai kisi "?
Peter Taylor
@PeterTaylor Benar
Hobi Calvin

Jawaban:

13

J, 9 5 byte

$":&1

Menggunakan spasi dan 1dan mengharapkan input dalam formulirH W f N

Penjelasan:

$":&1
   &1 bonds the fixed right argument 1 to ":
 ":   formats the right argument number (1) to take up left argument (N) number of cells
      padding with spaces, resulting  in "  1"
$     reshape to H-by-W with repeating the string if necessary 

Pemakaian:

   3 7 ($":&1) 3
  1  1 
 1  1  
1  1  1

Cobalah online di sini.

randomra
sumber
Apakah itu juga memotong array jika W * H kurang dari N?
Martin Ender
@ MartinBüttner Ya.
randomra
Jika argumennya adalah ($":&1), bukankah itu akan dihitung sebagai 7 byte?
Reto Koradi
1
Tidak, ()itu bukan bagian dari fungsi; Anda bisa menulis f =. $":&1dan kemudian 3 7 f 3.
Lynn
11

Python 2, 60 byte

w,h,n=input()
s='%%%dd'%n%0*w*h
exec"print s[:w];s=s[w:];"*h

Ini mencetak ruang dan 0di tempat .dan X. Input diambil sebagai tuple dalam bentuk w,h,n.

xsot
sumber
4
Itu format string yang pintar.
xnor
7

J, 12 byte

$'X'_1}#&'.'

Ini adalah fungsi diadik yang menggunakan array H Wsebagai argumen kiri dan Nargumen kanannya. Pemakaian:

  f =: $'X'_1}#&'.'
  3 5 f 3
..X..
X..X.
.X..X

Penjelasan

$'X'_1}#&'.'
         '.'  The character '.'
       #&     repeated N times
    _1}       with the last character
 'X'          replaced by 'X'
$             reshaped into an HxW array
Zgarb
sumber
Alat yang tepat untuk pekerjaan itu ?
Addison Crump
Apakah penggunaan X.benar - benar terpendek?
lirtosiast
@ Thomas, saya yakin begitu. Saya mencoba menggunakan angka 0 dan 1 sebagai gantinya, tetapi kemudian saya harus mengelilingi yang berikutnya _1dengan tanda kurung, dan memformat spasi antar kolom, dan akhirnya menjadi lebih lama.
Zgarb
5

BBC Basic, 67 karakter ASCII, tosize file berukuran 43 byte

Unduh juru bahasa di http://www.bbcbasic.co.uk/bbcwin/download.html

INPUTw,h,n:WIDTHw:PRINTLEFT$(STRING$(w*h,STRING$(n-1,".")+"X"),w*h)

BBC basic memiliki perintah praktis untuk membatasi lebar bidang. Kami menggunakan STRING$untuk membuat w*hsalinan string n-1periode diikuti oleh X. Kemudian kami menggunakan LEFT $ untuk memotong ini ke w*hkarakter.

Level River St
sumber
4

Minkolang 0.14 , 34 30 28 22 byte

n2-D1n$zn[z[1Rd6ZO]lO]

Periksa satu kasing di sini dan periksa semua kasing di sini. Mengharapkan input seperti N W H.

Penjelasan

n                 Take number from input (N)
 2-               Subtract 2
   D              Duplicate the top of stack (which is 0 because it's empty) N-2 times
    1             Push a 1 onto the stack
n                 Take number from input (W)
 $z               Store W in the register (z)
n                 Take number from input (H)
 [                Open a for loop that repeats H times
  z[              Open a for loop that repeats W times
    1R            Rotate 1 step to the right
      d           Duplicate top of stack
       6Z         Convert number to string
         O        Output as character
          ]       Close for loop
           lO     Output a newline
             ]    Close for loop

Karena codebox Minkolang adalah toroidal, ini akan membungkus awal. Karena setiap nsekarang akan menerima -1, ini akhirnya crash dengan kesalahan dan tidak ada output lebih lanjut, yang diizinkan.

El'endia Starman
sumber
Jadi mudah bagi Anda untuk membandingkan. (Perhatikan bahwa ini bukan kode yang persis sama.)
El'endia Starman
Di depanmu! : P :)
El'endia Starman
4

CJam (16 byte)

{1$*,:)@f%:!/N*}

Mengambil input pada tumpukan dalam urutan N W H, mengembalikan string menggunakan karakter 0dan 1. Demo online

Pembedahan

{        e# Anonymous function. Stack: N W H
  1$*,   e# Stack: N W [0 1 ... W*H-1]
  :)     e# Stack: N W [1 2 ... W*H]
  @f%    e# Stack: W [1%N 2%N ... W*H%N]
  :!     e# Map Boolean not, taking 0 to 1 and anything else to 0
  /      e# Split into W-sized chunks (i.e. the lines of the grid)
  N*     e# Join the lines with newlines
}
Peter Taylor
sumber
; -; kamu mengalahkanku ;-; tapi kerja bagus! : D
anOKsquirrel
4

APL, 13 byte

{⍪,/⍕¨⍺⍴⍵=⍳⍵}

Ini diambil H Wsebagai argumen kiri dan Nsebagai argumen kanan.

Penjelasan:

{⍪,/⍕¨⍺⍴⍵=⍳⍵}     Dyadic function (args are ⍺ on left, ⍵ on right):
        ⍵=⍳⍵      ⍵ = (1 2 3...⍵); this is ⍵-1 0s followed by a 1
      ⍺⍴          Shape by the left argument; e.g. 5 3 gives a 5x3 array
    ⍕¨            Stringify each entry
  ,/              Join the strings in each row 
 ⍪                Make column vector of strings

Cobalah secara online: pertama uji kasus , kasus tes terakhir . Perhatikan bahwa meskipun ini menunjukkan keluaran kotak, salinan Dyalog saya tidak.

lirtosiast
sumber
Apakah itu hanya kotak, atau apakah aplikasi SE tidak menampilkan karakter dengan benar?
Carcigenicate
@Carcigenicate Mereka bukan kotak. Karakter harus ditampilkan dengan baik pada tautan online, karena memiliki font yang berbeda.
lirtosiast
Ahh benar Saya melewatkan itu. Apakah Anda memiliki keyboard khusus atau Anda seorang masokis?
Carcigenicate
@Carcigenicate On tryapl (dan Dyalog student edition) Anda dapat mengetikkan karakter APL menggunakan backtick. `a berubah menjadi ⍺, misalnya.
lirtosiast
2

CJam, 20 Bytes

q~:Z;_@*,:){Z%!}%/N*

Mengambil input sebagai HW N.

anOKsquirrel
sumber
whoops, invalid
anOKsquirrel
diperbaiki: D: D: D: D
anOKsquirrel
Masih jauh lebih lama daripada beberapa solusi dalam bahasa lain, tapi saya mendapatkannya menjadi 18 byte dengan CJam:, q~_@*,@(S*'X+f=/N*dengan input agar NH W.
Reto Koradi
1
@RetoKoradi Ambil satu sama lain off dengan mengganti 'Xdengan 0, dan itu akan menjadi 17
Sp3000
2

MATLAB, 61 55 54 byte

function c=g(d,n);b=ones(d);b(n:n:end)=0;c=[b'+45,''];

Wow, saya pikir MATLAB akan kompetitif dalam hal ini, tetapi betapa salahnya saya!

Fungsi ini menciptakan array 1 dari dimensi yang benar, dan kemudian menetapkan setiap elemen ke-0 menjadi 0 (MATLAB secara implisit menangani pembungkusan di sekitar indeks ke dalam 2D). Kami kemudian menambahkan 45 ('-') ke nomor ini dan dikonversi ke array arang untuk dikembalikan.

Pertanyaan memungkinkan dua karakter ASCII yang berbeda untuk digunakan untuk grid, saya menggunakan '-' sebagai pengganti 'x' untuk menyimpan beberapa byte. Format input juga tidak tetap, jadi harus disediakan sebagai [w h],n- yaitu array lebar dan tinggi, dan kemudian n sebagai parameter kedua.


Ini juga berfungsi dengan Oktaf dan dapat dicoba online di sini . Fungsi ini sudah diatur di ruang kerja yang ditautkan, jadi Anda bisa memanggil misalnya:

g([4,5],3)

Output yang mana:

..-.
.-..
-..-
..-.
.-..
Tom Carpenter
sumber
Simpan satu byte:c=[b'+45,''];
Stewie Griffin
@StewieGriffin Terima kasih :). Untuk beberapa alasan ketika saya mencoba bahwa saya pikir itu tidak menyelamatkan byte, saya pasti salah hitung!
Tom Carpenter
2

Memproses, 93 byte (Jawa, 104 byte)

void f(int a,int b,int c){for(int i=0;i<a*b;i++)print((i%c>c-2?"X":".")+(i%a>a-2?"\n":""));}}

Alasan saya menggunakan Processing daripada Java adalah bahwa Anda tidak perlu mengakses pointer dengan memberi tip System.outkarena variabel lokal dapat diakses secara langsung. Saya mendapatkan 11 byte dengan ini. Fungsi tidak mengembalikan hasilnya tetapi mencetaknya.

6infinity8
sumber
2
Anda dapat menyimpan yang lain dengan menggerakkan kenaikan (seperti i++%a...), dan sepertinya Anda meninggalkan cadangan }di akhir yang tidak Anda butuhkan.
Geobit
2

Japt , 33 32 27 25 byte

SpW-1 +Q p-~U*V/W f'.pU)·

Mengambil input dalam format W H N. Penggunaan  dan "di tempat .dan X, masing-masing. Cobalah online!

Tidak terseret dan penjelasan

SpW-1 +Q p-~U*V/W f'.pU)·qR
          // Implicit: U = width, V = height, W = interval
SpW-1 +Q  // Create a string of W - 1 spaces, plus a quotation mark.
p-~U*V/W  // Repeat this string ceil(U*V/W) times.
f'.pU)    // Split the resulting string into groups of U characters.
qR        // Join with newlines.
          // Implicit: output last expression

Saran diterima!

Produksi ETH
sumber
2

Vitsy , 25 23 22 21 19 Bytes

Terima kasih kepada @ Sp3000 untuk menunjukkan bahwa saya tidak perlu duplikat dan menyelamatkan saya 2 byte!

Mengambil input sebagai N W H. Cobalah online!

1}\0XrV\[V\[{DN]aO]
1                         Push 1 to the stack.
 }                        Push the backmost to the front and subtract 2.
  \0X                     Duplicate the 0 temp variable times.
     r                    Reverse the stack.
      V                   Save as final global variable.
       \[         ]       Repeat top item times.
         V\[   ]          Repeat global variable times.
            {DO           Duplicate, output, then shift over an item.
                aO        Output a newline.
Addison Crump
sumber
1

K, 21 19 18 14 byte

Membawa argumen sebagai (H W;N):

{".X"x#y=1+!y}

Beraksi:

  f:{".X"x#y=1+!y};

  f.'((3 5;1);(3 5;2);(3 7;3);(4 10;5);(3 5;16))
(("XXXXX"
  "XXXXX"
  "XXXXX")
 (".X.X."
  "X.X.X"
  ".X.X.")
 ("..X..X."
  ".X..X.."
  "X..X..X")
 ("....X....X"
  "....X....X"
  "....X....X"
  "....X....X")
 ("....."
  "....."
  "....."))
JohnE
sumber
1

Pyth - 19 18 17 bytes

Harapan untuk golf lebih banyak. Mengambil input sebagai N\n[W, H].

jc.[k+*dtvzN*FQhQ

Test Suite .

Maltysen
sumber
1

R, 66 byte

function(w,h,n){x=rep(".",a<-w*h);x[1:a%%n<1]="X";matrix(x,h,w,T)}

Ini adalah fungsi yang menerima tiga bilangan bulat dan mengembalikan matriks nilai karakter. Untuk menyebutnya, tetapkan ke variabel.

Tidak Terkumpul:

f <- function(w, h, n) {
    # Get the area of the square
    a <- w*h

    # Construct a vector of dots
    x <- rep(".", a)

    # Replace every nth entry with X
    x[1:a %% n == 0] <- "X"

    # Return a matrix constructed by row
    matrix(x, nrow = h, ncol = w, byrow = TRUE)
}
Alex A.
sumber
1

JavaScript (ES6), 65 60 byte

(w,h,n)=>eval('for(i=r=``;i++<w*h;i%w?0:r+=`\n`)r+=i%n?0:1')

Penjelasan

(w,h,n)=>eval('    // use eval to remove need for return keyword
  for(
    i=             // i = current grid index
      r=``;        // r = result
    i++<w*h;       // iterate for each index of the grid
    i%w?0:r+=`\n`  // if we are at the end of a line, print a newline character
                   // note: we need to escape the newline character inside the template
  )                //       string because this is already inside a string for the eval
    r+=i%n?0:1     // add a 0 for . or 1 for X to the result
                   // implicit: return r
')

Uji

pengguna81655
sumber
1

Mathematica, 85 byte

""<>(#<>"
"&/@ReplacePart["."~Table~{t=# #2},List/@Range[#3,t,#3]->"X"]~Partition~#)&

Seperti banyak solusi lain, ini menciptakan satu baris, lalu mem-partisi-nya.

LegionMammal978
sumber
1

JavaScript (ES6), 55 byte

(w,h,n)=>(f=i=>i++<w*h?+!(i%n)+(i%w?"":`
`)+f(i):"")(0)

Menggunakan IIFE f untuk mengulang untuk menyimpan pernyataan kembali.

Output untuk w = 5, h = 3, n = 7:

00000
01000
00010
intrepidcoder
sumber
1

C #, 185 byte

using System;class x{void a(int w,int h,int n){int c=1;for(int i=0;i<h;i++){for(int j=1;j<=w;j++){if(c%n==0){Console.Write("x");}else{Console.Write(".");}c++;}Console.WriteLine();}}}

Untuk Bacaan yang lebih mudah dibaca:

using System;
class x
{
  void a(int w, int h, int n)
  {
    int c = 1;
    for (int i = 0; i < h; i++)
    {
        for (int j = 1; j <= w; j++)
        {
            if (c % n == 0)
            {
                Console.Write("x");
            }
            else
            {
                Console.Write(".");
            }
            c++;
        }
        Console.WriteLine();
     }
  }
}

Pemakaian:

new x().a(7, 3, 3);
Júlio Murta
sumber
0

Julia, 50 byte

f(w,h,n)=reshape([i%n<1?"X":"." for i=1:w*h],w,h)'

Ini menciptakan fungsi f yang menerima tiga bilangan bulat dan mengembalikan deretan string 2 dimensi.

Tidak Terkumpul:

function f(w::Integer, h::Integer, n::Integer)
    # Construct an array of strings in reading order
    a = [i % n == 0 ? "X" : "." for i = 1:w*h]

    # Reshape this columnwise into a w×h array
    r = reshape(a, w, h)

    # Return the transpose
    return transpose(r)
end
Alex A.
sumber
0

Ruby, 67 56 byte

->w,h,n{(1..h).map{(1..w).map{o,$.=$.%n<1?1:0,$.+=1;o}}}

Mencetak array karena diterima.

67 byte

->w,h,n{i=1;puts (1..h).map{(1..w).map{o,i=i%n<1?1:0,i+=1;o}.join}}

Tidak Terkumpul:

-> w, h, n {
  (1..h).map {
    (1..w).map {
      o, $. = $.%n < 1 ? 1 : 0, $.+ = 1
      o
    }
  }
}

Pemakaian:

->w,h,n{(1..h).map{(1..w).map{o,$.=$.%n<1?1:0,$.+=1;o}}}[8,6,7]
=> [[0, 0, 0, 0, 0, 0, 1, 0], [0, 0, 0, 0, 0, 1, 0, 0], [0, 0, 0, 0, 1, 0, 0, 0], [0, 0, 0, 1, 0, 0, 0, 0], [0, 0, 1, 0, 0, 0, 0, 0], [0, 1, 0, 0, 0, 0, 0, 0]]
Vasu Adari
sumber
0

MATLAB, 44 byte

Catatan: Pendekatan yang sangat berbeda dari yang digunakan oleh Tom Carpenter.

@(x,y)char(reshape(~mod(1:prod(x),y),x)'+46)

Menentukan fungsi anonim yang menerima input sebagai [W,H],N. Saya mendekati masalah ini menggunakan bukan-modulo-of- N untuk array 1: W * H dan kemudian hanya membentuk kembali solusi untuk array dua dimensi, yang kemudian dikonversi ke array karakter.

Contoh output untuk [5,3],7:

.....
./...
.../.
slvrbld
sumber
0

Lisp umum, SBCL, 94 byte

(lambda(a b c)(dotimes(i(* a b))(format t"~:[.~;X~]~@[~%~]"(=(mod(1+ i)c)0)(=(mod(1+ i)a)0))))

Penjelasan

~:[.~;X~] <-- takes argument - if argument is true write ., if false write X
~@[~%~] <-- takes argument - if argument is true write newline, if not treat argument as if it was not used

(=(mod(1+ i)c)0)(=(mod(1+ i)a)0) terlihat sangat konyol (karena sangat mirip tapi saya tidak tahu apakah itu bisa diselesaikan, menghemat byte

Saya menggunakan (1+ i)bukan ikarena dotimesmulai dari i=0dan saya ingin memulai dari 1. Hal ini juga membantu karena saya dapat menggunakan (* a b)bukan(1+(* a b))


sumber
-1

Jawa, 185 183 byte

Terima kasih Thomas Kwa, karena telah menyelamatkan saya 2 byte!

interface B{static void main(String[] a){int w = Byte.parseByte(a[0]);for(int i=0;i++<w*Byte.parseByte(a[1]);)System.out.print((i%Byte.parseByte(a[2])>0?".":"X")+(i%w<1?"\n":""));}}

Tidak digabungkan (ish):

interface A {
  static void main(String[] a) {
    int w = Byte.parseByte(a[0]);
    for(
      int i = 0;
      i++ < w*Byte.parseByte(a[1]);
    )
      System.out.print((
        i%Byte.parseByte(a[2]) > 0 ? "." : "X"
        )+(
        i%w < 1 ? "\n" : ""
      ));
  }
}

Pemakaian:

$ java B 5 3 7
.....
.X...
...X.

Mungkin java akan menang suatu hari: P

Phinet
sumber
Saya pikir Anda bisa menggunakan, >0bukan !=0, dan <1bukannya ==0.
lirtosiast