Marcas de grade muito simples


29

Escreva um programa ou função que consiga três números inteiros positivos, W, H e N. Imprima ou retorne uma grade W × H .onde todos os enésimos .na ordem normal de leitura em inglês são substituídos por um X.

Por exemplo, dado W = 7, H = 3, N = 3, a grade possui 7 caracteres de largura e 3 de altura, e cada terceiro caractere lido no canto superior esquerdo é X:

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

Da mesma forma, se a entrada for W = 10, H = 4, N = 5, a saída seria:

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

Notas

  • "Ordem de leitura em inglês normal" significa ir da esquerda para a direita em cada linha, da linha superior à inferior.
  • Quando N é 1, todos os .itens se tornarão X.
  • Você pode usar dois caracteres ASCII imprimíveis distintos no lugar de .e X.
    • Se você usar space ( ), os espaços à direita não serão necessários quando o resultado for visualmente o mesmo. (Linhas vazias ainda são necessárias.)
    • Você não pode usar outra coisa no lugar das novas linhas que moldam a grade.
  • O formato exato de entrada e a ordem de W, H e N não são super importantes. Coisas como [H,W,N]ouN\nW,H estão bem.
  • Uma nova linha à direita na saída é boa.
  • O código mais curto em bytes vence!

Exemplos

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

11
Estou correto ao supor que a restrição " Você não pode usar outra coisa no lugar das novas linhas que moldam a grade " inclui " Você não pode retornar uma matriz ["..X..X.", ".X..X..", "X..X..X"]como a grade "?
Peter Taylor

@PeterTaylor Correct
Calvin's Hobbies

Respostas:


13

J, 9 5 bytes

$":&1

Usa espaços e 1's e espera entrada no formulárioH W f N

Explicação:

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

Uso:

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

Experimente online aqui.


Também truncará a matriz se W * H for menor que N?
Martin Ender

@ MartinBüttner Sim.
Random #

Se o argumento for ($":&1), isso não conta como 7 bytes?
Reto Koradi

11
Não, o ()não faz parte da função; você poderia escrever f =. $":&1e então 3 7 f 3.
Lynn

11

Python 2, 60 bytes

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

Isso imprime o espaço e 0no lugar de .e X. A entrada é tomada como uma tupla na forma de w,h,n.


4
Esse é um formato de string inteligente.
Xnor

7

J, 12 bytes

$'X'_1}#&'.'

Essa é uma função diádica que toma a matriz H Wcomo argumento à esquerda e Ncomo argumento à direita. Uso:

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

Explicação

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

Ferramenta certa para o trabalho ?
Addison Crump

O uso de é X.realmente o mais curto?
lirtosiast

@ThomasKwa Eu acredito que sim. Tentei usar os números 0 e 1, mas tive que cercar o próximo _1com parênteses e formatar os espaços entre as colunas, e acabou sendo mais longo.
Zgarb

5

BBC Basic, 67 caracteres ASCII, tamanho de arquivo tokenizado 43 bytes

Faça o download do intérprete em http://www.bbcbasic.co.uk/bbcwin/download.html

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

O BBC basic possui um comando útil para limitar a largura do campo. Nós usamos STRING$para fazerw*h cópias da sequência de n-1períodos seguida de um X. Em seguida, usamos LEFT $ para truncar isso para w*hcaracteres.


4

Minkolang 0.14 , 34 30 28 22 bytes

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

Verifique um caso aqui e verifique todos os casos de teste aqui. Espera entrada como N W H.

Explicação

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

Como o codebox de Minkolang é toroidal, isso será concluído desde o início. Como nagora todo mundo vai entender -1, isso eventualmente trava com um erro e nenhuma saída adicional, o que é permitido.


Portanto, é fácil para você comparar. (Note que não é exatamente o mesmo código exato.)
El'endia Starman

À sua frente! : P :)
El'endia Starman

4

CJam (16 bytes)

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

Pega entrada na pilha na ordem N W H, retorna string usando caracteres 0e 1. Demonstração online

Dissecação

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

; -; você me venceu; -; mas bom trabalho! : D
anOKsquirrel

4

APL, 13 bytes

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

Isso toma H Wcomo argumento da esquerda e Ncomo argumento da direita.

Explicação:

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

Experimente on-line: primeiros casos de teste , último caso de teste . Observe que, embora isso mostre a saída em caixa, minha cópia do Dyalog não.


Na verdade, essas são apenas caixas ou o aplicativo SE não está exibindo os caracteres corretamente?
Carcigenicate

@Carcigenicate Não são caixas. Os caracteres devem ser exibidos corretamente no link online, porque ele possui uma fonte diferente.
lirtosiast

Ahh, certo. Eu senti falta disso. Você tem um teclado especial ou é masoquista?
Carcigenicate

@Carcigenicate No tryapl (e na edição dos alunos da Dyalog), você pode digitar caracteres APL usando barras de ré. `a se transforma em ⍺, por exemplo.
lirtosiast

2

CJam, 20 bytes

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

Recebe entrada como HW N.


gritos, inválido
anOKsquirrel

fixo: D: D: D: D
anOKsquirrel

Ainda muito mais do que algumas das soluções em outros idiomas, mas eu tenho que 18 bytes com CJam: q~_@*,@(S*'X+f=/N*, com a entrada em ordem NH W.
Reto Koradi

11
@RetoKoradi Retire outro substituindo 'Xpor 0, e isso será 17
Sp3000 29/15

2

MATLAB, 61 55 54 bytes

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

Uau, eu pensei que o MATLAB seria competitivo neste, mas como eu estava errado!

A função cria uma matriz de 1 com as dimensões corretas e, em seguida, define cada n-ésimo elemento como 0 (o MATLAB lida implicitamente com a quebra dos índices em 2D). Em seguida, adicionamos 45 ('-') a esse número e convertemos em uma matriz de caracteres a ser retornada.

As perguntas permitem que dois caracteres ASCII distintos sejam usados ​​para a grade. Estou usando '-' no lugar de 'x' para salvar alguns bytes. O formato de entrada também não é fixo, portanto deve ser fornecido como [w h],n- ou seja, uma matriz de largura e altura, e depois n como um segundo parâmetro.


Isso também funciona com o Octave e pode ser experimentado online aqui . A função já está configurada na área de trabalho vinculada, portanto, você pode simplesmente chamar, por exemplo:

g([4,5],3)

Quais saídas:

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

Salvar um byte:c=[b'+45,''];
Stewie Griffin 29/11

@StewieGriffin Thanks :). Por alguma razão, quando tentei não achar que ele salvou bytes, devo ter contado errado!
Tom Carpenter

2

Processando, 93 bytes (Java, 104 bytes)

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

O motivo pelo qual eu usei Processing em vez de Java é que você não precisa acessar o ponteiro dando gorjeta, System.outporque uma variável local é diretamente acessível. Eu ganhei 11 bytes com isso. A função não retorna o resultado, mas o imprime.


2
Você pode salvar outro movendo o incremento (como i++%a...), e parece que você deixou um sobressalente }no final do qual também não precisa.
Geobits

2

Japt , 33 32 27 25 bytes

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

Recebe entrada no formato W H N. Usa  e "no lugar de .e X, respectivamente.Experimente online!

Ungolfed e explicação

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

Sugestões são bem-vindas!


2

Vitsy , 25 23 22 21 19 Bytes

Agradeço ao @ Sp3000 por apontar que não preciso de uma cópia e me salvar 2 bytes!

Toma entrada como N W H. Experimente 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.

1

K, 21 19 18 14 bytes

Toma argumentos como (H W;N):

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

Em ação:

  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 bytes

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

Esta é uma função que aceita três números inteiros e retorna uma matriz de valores de caracteres. Para chamá-lo, atribua-o a uma variável.

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 bytes

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

Explicação

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

Teste


1

Mathematica, 85 bytes

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

Como em muitas outras soluções, isso cria uma única linha e a particiona.


1

JavaScript (ES6), 55 bytes

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

Usa o IIFE f para fazer um loop para salvar uma declaração de retorno.

Saída para w = 5, h = 3, n = 7:

00000
01000
00010

1

C #, 185 bytes

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

Para uma leitura mais legível:

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

Uso:

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

0

Julia, 50 bytes

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

Isso cria uma função f que aceita três números inteiros e retorna uma matriz bidimensional de seqüências de caracteres.

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 bytes

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

Imprimir uma matriz, uma vez que é aceita.

67 bytes

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

Uso:

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

Nota: Abordagem muito diferente da usada por Tom Carpenter.

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

Define uma função anônima que aceita entradas como [W,H],N. Abordei esse problema usando não o módulo de N para uma matriz 1: W * H e, em seguida, simplesmente remodelando a solução para uma matriz bidimensional, que é então convertida em uma matriz de caracteres.

Exemplo de saída para [5,3],7:

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

0

Lisp comum, SBCL, 94 bytes

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

Explicação

~:[.~;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) parece bem bobo (porque é muito parecido, mas não sei se pode ser resolvido, economizando bytes

Eu uso em (1+ i)vez de iporque dotimescomeça i=0e quero começar 1. Também é útil porque eu posso usar em (* a b)vez de(1+(* a b))


-1

Java, 185 183 bytes

Obrigado Thomas Kwa, por me salvar 2 bytes!

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

Uso:

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

Talvez o java ganhe um dia: P


Eu acho que você pode usar em >0vez de !=0, e em <1vez de ==0.
lirtosiast
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.