非常にシンプルなグリッドマーク


29

3つの正の整数W、H、およびNを取り込むプログラムまたは関数を作成します。通常の英語の読み取り順序の.N番目ごと.がに置き換えられたのW×Hグリッドを印刷または返しXます。

たとえば、W = 7、H = 3、N = 3の場合、グリッドの幅は7文字、高さは3文字で、左上から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の場合、すべて.のがになりXます。
  • およびの代わりに、任意の2つの異なる印刷可能な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"]を返してはならない」という制限があると仮定するのは正しいですか?
ピーターテイラー

@PeterTaylor Correct
カルビンの趣味

回答:


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より小さい場合、配列も切り捨てられますか?
マーティンエンダー

@MartinBüttnerはい。
-randomra

引数がの場合、($":&1)それは7バイトとしてカウントされませんか?
レトコラディ

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。入力は、次の形式のタプルとして取得されます。w,h,nます。


4
それは賢い文字列形式です。
xnor

7

J、12バイト

$'X'_1}#&'.'

これは、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

仕事に適したツールですか?
アディソンクランプ

使用はX.本当に最短ですか?
リトシアスト

@ThomasKwa私はそう信じています。代わりに数字の0と1を使用しようとしましたが、隣の_1数字を括弧で囲み、列間のスペースをフォーマットしなければならなかったため、結果的に長くなりました。
ズガルブ

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)

BBCベーシックには、フィールド幅を制限するための便利なコマンドがあります。Xが続くピリオドの文字列のコピーSTRING$を作成するために使用します。次に、LEFT $を使用してこれを文字に切り捨てます。w*hn-1w*h


4

Minkolang 0.1434の 30 28 22バイト

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

ここ1つのケースチェックし、すべてのテストケースをここでチェックします。のような入力を期待します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のコードボックスはトロイダルなので、これは最初に戻ります。すべてnがを取り込むようになると-1、これは最終的にエラーでクラッシュし、それ以上の出力は許可されません。


したがって、比較するのは簡単です。(まったく同じコードではないことに注意してください。)
El'endia Starman

あなたの前に!:P :)
エルエンディアスターマン

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
}

;-; あなたは私をbeatりました;-; いい仕事だ!: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 tryapl(およびDyalog学生版)では、バックティックを使用してAPL文字を入力できます。たとえば、 `aはintoになります。
リルトシアスト

2

CJam、20バイト

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

入力をHW Nとして受け取ります。


おっと、無効
anOKsquirrel

修正:D:D:D:D
anOKsquirrel

まだ他の言語のソリューションのいくつかよりもはるかに長いですが、CJam:q~_@*,@(S*'X+f=/N*で18バイトになりました。入力はNH Wの順です。
RetoKoradi

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つで競争力があると思ったが、私はどれほど間違っていた!

この関数は、正しい次元の1の配列を作成し、n番目の要素ごとに0に設定します(MATLABは、インデックスを2Dにラップすることを暗黙的に処理します)。次に、この数値に45( '-')を追加し、返されるchar配列に変換します。

質問では、任意の異なる2つのASCII文字をグリッドに使用できます。いくつかのバイトを節約するために、「x」の代わりに「-」を使用しています。入力形式も固定されていないため[w h],n、幅と高さの配列として、次に2番目のパラメーターとしてnを指定する必要があります。


これはOctaveでも動作し、こちらからオンライン試すことができます。この関数はリンクされたワークスペースに既に設定されているため、たとえば次のように簡単に呼び出すことができます。

g([4,5],3)

どの出力:

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

1バイト保存します。c=[b'+45,''];
Stewie Griffin

@StewieGriffinありがとう:)。なんらかの理由で、バイトを節約できるとは思わないことを試してみたときに、間違って数えたに違いありません!
トムカーペンター

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の代わりにProcessingを使用した理由はSystem.out、ローカル変数に直接アクセスできるため、ポインターをチップでアクセスする必要がないためです。これで11バイト稼いだ。この関数は結果を返しませんが、出力します。


2
増分を移動することにより(などi++%a...)に別の値を保存できます}。また、不要な最後にスペアを残したように見えます。
ジオビット

2

Japt33 32 27 25バイト

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

形式で入力を取りますW H N およびの"代わりに.およびXをそれぞれ使用します。オンラインでお試しください!

非ゴルフと説明

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

Vitsy25 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

R、66バイト

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

これは、3つの整数を受け入れ、文字値の行列を返す関数です。呼び出すには、変数に割り当てます。

ゴルフをしていない:

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を使用してループし、returnステートメントを保存します。

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

ジュリア、50バイト

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

これにより関数が作成されます f 3つの整数を受け入れ、文字列の2次元配列を返すがます。

ゴルフをしていない:

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

ルビー、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}}

ゴルフをしていない:

-> 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バイト

注:トムカーペンターが使用したアプローチとは非常に異なるアプローチです。

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

として入力を受け付ける匿名関数を定義し[W,H],Nます。配列1:W * Hにnot-the-modulo-of- Nを使用してこの問題に取り組み、次にソリューションを2次元配列に再形成し、それを文字配列に変換しました。

の出力例[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バイト

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