เครื่องหมายกริดที่ง่ายมาก


29

เขียนโปรแกรมหรือฟังก์ชั่นที่ใช้เวลาในสามจำนวนเต็มบวก, W, H, และเอ็นพิมพ์หรือกลับ W × H ตารางของ.'s ที่ชับทุกปกติภาษาอังกฤษเพื่อการอ่านถูกแทนที่ด้วย.X

ตัวอย่างเช่นเมื่อกำหนด W = 7, H = 3, N = 3 กริดจะมีความกว้าง 7 ตัวอักษรและสูง 3 และทุก ๆ อักขระที่สามที่อ่านจากด้านบนซ้ายคือX:

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

หากอินพุตคือ W = 10, H = 4, N = 5 เอาต์พุตจะเป็น:

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

หมายเหตุ

  • "ลำดับการอ่านภาษาอังกฤษปกติ" หมายถึงการเลื่อนจากซ้ายไปขวาในแต่ละบรรทัดจากบรรทัดบนถึงล่าง
  • เมื่อ N คือ 1 แล้วทั้งหมด.'s จะกลายเป็นX' s
  • คุณอาจจะใช้ที่แตกต่างกันสองASCII พิมพ์ตัวอักษรในสถานที่และ .X
    • หากคุณใช้ช่องว่าง ( ) คุณไม่จำเป็นต้องใช้ช่องว่างต่อท้ายเมื่อผลลัพธ์จะเหมือนกัน (ยังต้องการบรรทัดว่างเปล่า)
    • คุณไม่สามารถใช้อย่างอื่นแทนการขึ้นบรรทัดใหม่ที่กำหนดตาราง
  • รูปแบบอินพุตที่แน่นอนและลำดับของ W, H และ N ไม่สำคัญมาก สิ่งที่ชอบ[H,W,N]หรือN\nW,Hไม่เป็นไร
  • ขึ้นบรรทัดใหม่ในผลลัพธ์นั้นไม่เป็นไร
  • รหัสที่สั้นที่สุดในหน่วยไบต์ชนะ!

ตัวอย่าง

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

1
ฉันถูกต้องหรือไม่ที่จะถือว่าข้อ จำกัด " คุณไม่สามารถใช้อย่างอื่นแทนการขึ้นบรรทัดใหม่ที่กำหนดเส้นตาราง " รวมถึง " คุณไม่สามารถส่งกลับอาร์เรย์["..X..X.", ".X..X..", "X..X..X"]เป็นตาราง " ได้
Peter Taylor

@PeterTaylor ถูกต้อง
งานอดิเรกของ Calvin

คำตอบ:


13

J, 9 5 ไบต์

$":&1

ใช้ช่องว่างและ1ของและคาดว่าอินพุตในแบบฟอร์มH W f N

คำอธิบาย:

$":&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 

การใช้งาน:

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

ลองออนไลน์ได้ที่นี่


มันตัดทอนอาร์เรย์ด้วยหรือไม่ถ้า W * H น้อยกว่า N
Martin Ender

@ MartinBüttnerใช่
randomra

หากการโต้แย้งนั้น($":&1)จะไม่นับเป็น 7 ไบต์?
Reto Koradi

1
ไม่()ไม่ได้เป็นส่วนหนึ่งของฟังก์ชั่น คุณสามารถเขียนแล้วf =. $":&1 3 7 f 3
ลินน์

11

Python 2, 60 ไบต์

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

พื้นที่นี้พิมพ์และ0ในสถานที่ของและ. Xการป้อนข้อมูลจะมาเป็น tuple w,h,nในรูปแบบของ


4
นั่นเป็นรูปแบบสตริงที่ฉลาด
xnor

7

J, 12 ไบต์

$'X'_1}#&'.'

นี่คือฟังก์ชัน dyadic ที่ใช้อาร์เรย์H Wเป็นอาร์กิวเมนต์ซ้ายและNเป็นอาร์กิวเมนต์ขวา การใช้งาน:

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

คำอธิบาย

$'X'_1}#&'.'
         '.'  The character '.'
       #&     repeated N times
    _1}       with the last character
 'X'          replaced by 'X'
$             reshaped into an HxW array

เครื่องมือที่เหมาะสมสำหรับงาน ?
Addison Crump

การใช้งานX.สั้นที่สุดจริง ๆ หรือไม่
lirtosiast

@ThomasKwa ฉันเชื่ออย่างนั้น ฉันพยายามใช้ตัวเลข 0 และ 1 แทน แต่จากนั้นฉันต้องล้อมรอบ_1ด้วยเครื่องหมายวงเล็บและจัดรูปแบบช่องว่างระหว่างคอลัมน์และท้ายที่สุดมันก็นานขึ้น
Zgarb

5

BBC Basic, 67 ASCII, โทเค็นขนาดไฟล์ 43 ไบต์

ดาวน์โหลดล่ามได้ที่http://www.bbcbasic.co.uk/bbcwin/download.html

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

บีบีซีขั้นพื้นฐานมีคำสั่งที่สะดวกสำหรับการ จำกัด ความกว้างของฟิลด์ เราใช้STRING$เพื่อทำw*hสำเนาของสตริงของn-1ช่วงเวลาตามด้วย X จากนั้นเราใช้ LEFT $ เพื่อตัดทอนให้เป็นw*hอักขระ


4

Minkolang 0.14 , 34 30 28 22 ไบต์

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

ตรวจสอบกรณีหนึ่งที่นี่และตรวจสอบทุกกรณีทดสอบที่นี่ N W Hการป้อนข้อมูลคาดว่าเหมือน

คำอธิบาย

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

ในขณะที่กล่องโค้ดของ Minkolang เป็นแบบ Toroidal สิ่งนี้จะถูกห่อหุ้มไปจนถึงจุดเริ่มต้น ในขณะที่ทุกคนnจะเข้ามาใน-1ที่สุดก็เกิดข้อผิดพลาดและไม่มีการส่งออกเพิ่มเติมซึ่งได้รับอนุญาต


ดังนั้นจึงเป็นเรื่องง่ายสำหรับคุณที่จะเปรียบเทียบ (โปรดทราบว่ามันไม่ใช่รหัสเดียวกันจริง ๆ )
El'endia Starman

ข้างหน้าของคุณ! : P :)
El'endia Starman

4

CJam (16 ไบต์)

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

จะเข้าในกองในการสั่งซื้อN W Hกลับสตริงโดยใช้ตัวอักษรและ0 การสาธิตออนไลน์1

การผ่า

{        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
}

; -; คุณเอาชนะฉัน -; แต่เป็นงานที่ดี! : D
anOKsquirrel

4

APL, 13 ไบต์

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

สิ่งนี้ใช้H Wเป็นอาร์กิวเมนต์ซ้ายและNอาร์กิวเมนต์ขวา

คำอธิบาย:

{⍪,/⍕¨⍺⍴⍵=⍳⍵}     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

ลองมันออนไลน์: กรณีการทดสอบครั้งแรก , กรณีทดสอบที่ผ่านมา โปรดทราบว่าแม้ว่าสิ่งนี้จะแสดงผลแบบกล่อง แต่สำเนาของ Dyalog ของฉันไม่ได้


ที่จริงแล้วเป็นเพียงแค่กล่องหรือแอพ SE ไม่แสดงอักขระอย่างถูกต้องหรือไม่
Carcigenicate

@Carcigenicate พวกมันไม่ใช่กล่อง อักขระควรแสดงในลิงค์ออนไลน์เนื่องจากมีแบบอักษรที่แตกต่างกัน
lirtosiast

อ่าใช่มั้ย ฉันคิดถึงสิ่งนั้น คุณมีแป้นพิมพ์พิเศษหรือคุณเป็นนักทำโทษตัวเอง?
Carcigenicate

@Carcigenicate บน tryapl (และรุ่นนักเรียน Dyalog) คุณสามารถพิมพ์อักขระ APL โดยใช้ backticks `กลายเป็น⍺เช่น
lirtosiast

2

CJam, 20 ไบต์

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

รับอินพุตเป็น HW N.



คงที่: D: D: D: D
anOKsquirrel

ยังคงนานกว่าโซลูชันบางอย่างในภาษาอื่น ๆ แต่ฉันได้มันถึง 18 ไบต์ด้วย CJam: q~_@*,@(S*'X+f=/N*พร้อมอินพุตในคำสั่ง NH W.
Reto Koradi

1
@RetoKoradi ถอดออกอีกครั้งหนึ่งโดยแทนที่'Xด้วย0และนั่นจะเป็น 17
Sp3000

2

MATLAB, 61 55 54 ไบต์

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

ว้าวฉันคิดว่า MATLAB จะสามารถแข่งขันในเกมนี้ได้ แต่ฉันผิดไปไหม!

ฟังก์ชั่นสร้างอาร์เรย์ที่มีขนาด 1 ของขนาดที่ถูกต้องจากนั้นตั้งค่าทุกองค์ประกอบที่ n เป็น 0 (MATLAB โดยปริยายจับการล้อมรอบดัชนีเป็น 2D) จากนั้นเราจะเพิ่มจำนวน 45 ('-') เป็นตัวเลขนี้และแปลงเป็นอาร์เรย์ถ่านที่จะส่งคืน

คำถามอนุญาตให้ใช้อักขระ ASCII สองตัวที่แตกต่างกันสำหรับกริดฉันใช้ '-' แทนที่ 'x' เพื่อบันทึกไบต์ รูปแบบอินพุตยังไม่คงที่ดังนั้นจึงควรกำหนดเป็น[w h],n- เช่นอาร์เรย์ของความกว้างและความสูงจากนั้น n เป็นพารามิเตอร์ที่สอง


นี้ยังทำงานร่วมกับคู่และสามารถพยายามออนไลน์ที่นี่ ฟังก์ชั่นได้รับการตั้งค่าในพื้นที่ทำงานที่เชื่อมโยงแล้วดังนั้นคุณสามารถเรียกตัวอย่าง:

g([4,5],3)

ผลลัพธ์ใด:

..-.
.-..
-..-
..-.
.-..

บันทึกหนึ่งไบต์:c=[b'+45,''];
สตีวีกริฟฟิ

@StewieGriffin ขอบคุณ :) ด้วยเหตุผลบางอย่างเมื่อฉันพยายามที่ฉันไม่คิดว่าจะได้รับการบันทึกไบต์ใด ๆ ฉันต้องผิดพลาด!
Tom Carpenter

2

กำลังดำเนินการ, 93 ไบต์ (Java, 104 ไบต์)

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":""));}}

เหตุผลที่ฉันใช้การประมวลผลแทน Java คือคุณไม่จำเป็นต้อง acces ตัวชี้ด้วยการให้ทิปSystem.outเพราะตัวแปรท้องถิ่นสามารถเข้าถึงได้โดยตรง ฉันได้รับ 11 ไบต์ด้วยสิ่งนี้ ฟังก์ชันไม่ส่งคืนผลลัพธ์ แต่พิมพ์ออกมา


2
คุณสามารถบันทึกอีกรายการโดยย้ายส่วนเพิ่ม (เช่นi++%a...) และดูเหมือนว่าคุณทิ้งอะไหล่ไว้}ในตอนท้ายที่คุณไม่ต้องการเช่นกัน
Geobits

2

Japt , 33 32 27 25 ไบต์

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

W H Nจะเข้าในรูปแบบ การใช้งาน และ"ในสถานที่ของ.และXตามลำดับ ลองออนไลน์!

Ungolfed และคำอธิบาย

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

ยินดีต้อนรับข้อเสนอแนะ!


2

Vitsy , 25 23 22 21 19 ไบต์

ขอบคุณ @ Sp3000 ที่ชี้ให้เห็นว่าฉันไม่ต้องการสำเนาที่ซ้ำกันและช่วยฉัน 2 ไบต์!

N W Hจะเข้าเป็น ลองออนไลน์!

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.

1

K, 21 19 18 14 ไบต์

รับอาร์กิวเมนต์เป็น(H W;N):

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

ในการดำเนินการ:

  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")
 ("....."
  "....."
  "....."))

1

Pyth - 19 18 17 ไบต์

หวังว่าจะเล่นกอล์ฟมันมากขึ้น ใช้อินพุตเป็นN\n[W, H]จะเข้าเป็น

jc.[k+*dtvzN*FQhQ

Test Suite


1

R, 66 ไบต์

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

นี่คือฟังก์ชันที่รับจำนวนเต็มสามจำนวนและส่งกลับเมทริกซ์ของค่าอักขระ หากต้องการเรียกใช้กำหนดค่าให้กับตัวแปร

Ungolfed:

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

1

JavaScript (ES6), 65 60 ไบต์

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

คำอธิบาย

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

ทดสอบ


1

Mathematica, 85 ไบต์

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

เช่นเดียวกับโซลูชันอื่น ๆ สิ่งนี้จะสร้างแถวเดียวจากนั้นแบ่งพาร์ติชันออก


1

JavaScript (ES6), 55 ไบต์

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

ใช้IIFE fเพื่อวนซ้ำเพื่อบันทึกคำสั่งการส่งคืน

เอาต์พุตสำหรับ w = 5, h = 3, n = 7:

00000
01000
00010

1

C #, 185 ไบต์

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();}}}

สำหรับการอ่านที่อ่านได้มากขึ้น:

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();
     }
  }
}

การใช้งาน:

new x().a(7, 3, 3);

0

Julia, 50 ไบต์

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

สิ่งนี้จะสร้างฟังก์ชั่นfที่รับจำนวนเต็มสามจำนวนและส่งกลับอาร์เรย์แบบสองมิติ

Ungolfed:

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

0

Ruby, 67 56 ไบต์

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

การพิมพ์อาร์เรย์ตั้งแต่ได้รับการยอมรับ

67 ไบต์

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

Ungolfed:

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

การใช้งาน:

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

0

MATLAB, 44 ไบต์

หมายเหตุ: วิธีการที่แตกต่างจากวิธีการที่ใช้โดย Tom Carpenter มาก

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

[W,H],Nกำหนดฟังก์ชั่นที่ไม่ระบุชื่อที่รับปัจจัยการผลิตเป็น ผมเข้าหาปัญหานี้ใช้ไม่ได้ที่โมดูโล -of- Nสำหรับอาร์เรย์ 1: W * H แล้วก็การปรับวิธีการแก้อาร์เรย์สองมิติซึ่งจะถูกแปลงไปแล้วแถวอักขระ

ตัวอย่างผลลัพธ์สำหรับ[5,3],7:

.....
./...
.../.

0

Common LISP, SBCL, 94 ไบต์

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

คำอธิบาย

~:[.~;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) ดูโง่มาก (เพราะมันคล้ายกันมาก แต่ฉันไม่รู้ว่าสามารถแก้ไขได้หรือไม่บันทึกไบต์

ผมใช้(1+ i)แทนiเพราะdotimesเริ่มต้นและผมต้องการที่จะเริ่มต้นจากi=0 1นอกจากนี้ยังมีประโยชน์เพราะฉันสามารถใช้(* a b)แทน(1+(* a b))


-1

Java, 185 183 ไบต์

ขอบคุณ Thomas Kwa ที่ช่วยฉัน 2 ไบต์!

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":""));}}

Ungolfed (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" : ""
      ));
  }
}

การใช้งาน:

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

บางที Java จะชนะหนึ่งวัน: P


ฉันคิดว่าคุณสามารถใช้>0แทน!=0และแทน<1 ==0
lirtosiast
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.