Marques de grille très simples


29

Écrivez un programme ou une fonction qui prend trois entiers positifs, W, H et N. Imprimez ou renvoyez une grille de W × H .où chaque Nième .dans l'ordre de lecture anglais normal est remplacé par un X.

Par exemple, étant donné W = 7, H = 3, N = 3, la grille a 7 caractères de large et 3 de haut, et une lecture sur trois en haut à gauche est un X:

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

De même, si l'entrée est W = 10, H = 4, N = 5, la sortie serait:

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

Remarques

  • «Ordre de lecture anglais normal» signifie aller de gauche à droite sur chaque ligne, de la ligne du haut vers le bas.
  • Lorsque N est égal à 1, tous les .«deviendront X».
  • Vous pouvez utiliser deux caractères ASCII imprimables distincts à la place de .et X.
    • Si vous utilisez space ( ), les espaces de fin ne sont pas requis lorsque le résultat est visuellement le même. (Des lignes vides sont toujours nécessaires.)
    • Vous ne pouvez pas utiliser autre chose à la place des nouvelles lignes qui façonnent la grille.
  • Le format d'entrée exact et l'ordre de W, H et N ne sont pas super importants. Des choses comme [H,W,N]ou N\nW,Hvont bien.
  • Une nouvelle ligne de fin dans la sortie est très bien.
  • Le code le plus court en octets gagne!

Exemples

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
Ai-je raison de supposer que la restriction " Vous ne pouvez pas utiliser autre chose à la place des sauts de ligne qui façonnent la grille " inclut " Vous ne pouvez pas renvoyer un tableau ["..X..X.", ".X..X..", "X..X..X"]comme grille "?
Peter Taylor

@PeterTaylor Correct
Calvin's Hobbies

Réponses:


13

J, 9 5 octets

$":&1

Utilise les espaces et 1les et attend l'entrée dans le formulaireH W f N

Explication:

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

Usage:

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

Essayez-le en ligne ici.


Tronque-t-il également le tableau si W * H est inférieur à N?
Martin Ender

@ MartinBüttner Oui.
randomra

Si l'argument est ($":&1), cela ne compterait-il pas comme 7 octets?
Reto Koradi

1
Non, ()ils ne font pas partie de la fonction; vous pourriez écrire f =. $":&1et ensuite 3 7 f 3.
Lynn

11

Python 2, 60 octets

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

Cela imprime l'espace et 0à la place de .et X. L'entrée est considérée comme un tuple sous la forme de w,h,n.


4
C'est un format de chaîne intelligent.
2015 à 4h03

7

J, 12 octets

$'X'_1}#&'.'

Il s'agit d'une fonction dyadique qui prend le tableau H Wcomme argument de gauche et argument Nde droite. Usage:

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

Explication

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

Le bon outil pour le travail ?
Addison Crump

L'utilisation est-elle X.vraiment la plus courte?
lirtosiast

@ThomasKwa Je le crois. J'ai essayé d'utiliser les chiffres 0 et 1 à la place, mais j'ai ensuite dû entourer celui à côté de _1parenthèses et formater les espaces entre les colonnes, et cela a fini par être plus long.
Zgarb

5

BBC Basic, 67 caractères ASCII, taille de fichier à jeton 43 octets

Téléchargez l'interprète sur http://www.bbcbasic.co.uk/bbcwin/download.html

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

BBC basic dispose d'une commande pratique pour limiter la largeur du champ. Nous utilisons STRING$pour faire des w*hcopies de la chaîne de n-1points suivie d'un X. Ensuite, nous utilisons LEFT $ pour le tronquer en w*hcaractères.


4

Minkolang 0,14 , 34 30 28 22 octets

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

Vérifiez un cas ici et vérifiez tous les cas de test ici. Attend une entrée comme N W H.

Explication

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

Comme la boîte à codes de Minkolang est toroïdale, cela se terminera au début. Comme tout le monde nva maintenant en prendre -1, cela se bloque finalement avec une erreur et aucune sortie supplémentaire, ce qui est autorisé.


Il est donc facile pour vous de comparer. (Notez que ce n'est pas tout à fait le même code.)
El'endia Starman

En face de toi! : P :)
El'endia Starman

4

CJam (16 octets)

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

Prend l'entrée sur la pile dans l'ordre N W H, retourne la chaîne en utilisant les caractères 0et 1. Démo en ligne

Dissection

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

; -; tu me bats ;-; mais bon travail! : D
anOKsquirrel

4

APL, 13 octets

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

Cela prend H Wcomme argument de gauche et Ncomme argument de droite.

Explication:

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

Essayez-le en ligne: premiers cas de test , dernier cas de test . Notez que bien que cela montre une sortie encadrée, ma copie de Dyalog ne le fait pas.


S'agit-il en fait de simples boîtes ou l'application SE n'affiche-t-elle pas correctement les caractères?
Carcigenicate

@Carcigenicate Ce ne sont pas des boîtes. Les caractères doivent s'afficher correctement sur le lien en ligne, car il a une police différente.
lirtosiast

Ahh, c'est vrai. J'ai manqué ça. Avez-vous un clavier spécial ou êtes-vous masochiste?
Carcigenicate

@Carcigenicate Sur tryapl (et l'édition étudiante Dyalog), vous pouvez taper des caractères APL à l'aide de backticks. `un se transforme en ⍺, par exemple.
lirtosiast

2

CJam, 20 octets

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

Prend l'entrée comme HW N.


whoops, invalid
anOKsquirrel

fixe: D: D: D: D
anOKsquirrel

Encore beaucoup plus longtemps que certaines des solutions dans d'autres langues, mais je l'ai obtenu à 18 octets avec CJam:, q~_@*,@(S*'X+f=/N*avec entrée dans l'ordre NH W.
Reto Koradi

1
@RetoKoradi Enlever un autre en le remplaçant 'Xpar 0, et ce sera 17
Sp3000

2

MATLAB, 61 55 54 octets

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

Wow, je pensais que MATLAB serait compétitif dans celui-ci, mais comme je me trompais!

La fonction crée un tableau de 1 de dimensions correctes, puis définit chaque nième élément sur 0 (MATLAB gère implicitement le passage des index en 2D). Nous ajoutons ensuite 45 ('-') à ce nombre et convertis en un tableau de caractères à renvoyer.

Les questions permettent d'utiliser deux caractères ASCII distincts pour la grille, j'utilise '-' à la place de 'x' pour économiser quelques octets. Le format d'entrée n'est pas non plus fixe, il doit donc être fourni comme [w h],n- c'est-à-dire un tableau de largeur et de hauteur, puis n comme second paramètre.


Cela fonctionne également avec Octave et peut être essayé en ligne ici . La fonction est déjà configurée dans l'espace de travail lié, vous pouvez donc simplement appeler par exemple:

g([4,5],3)

Quelles sorties:

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

Économisez un octet:c=[b'+45,''];
Stewie Griffin

@StewieGriffin Merci :). Pour une raison quelconque, quand j'avais essayé de ne pas penser que cela économisait des octets, je devais avoir mal compté!
Tom Carpenter

2

Traitement, 93 octets (Java, 104 octets)

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

La raison pour laquelle j'ai utilisé le traitement au lieu de Java est que vous n'avez pas besoin d'accéder au pointeur en basculant System.outcar une variable locale est directement accessible. J'ai gagné 11 octets avec ça. La fonction ne renvoie pas le résultat mais l'imprime.


2
Vous pouvez en enregistrer un autre en déplaçant l'incrément (comme i++%a...), et il semble que vous ayez laissé une pièce }de rechange à la fin dont vous n'avez pas besoin, également.
Geobits

2

Japt , 33 32 27 25 octets

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

Prend l'entrée au format W H N. Utilise  et "à la place de .et X, respectivement. Essayez-le en ligne!

Non golfé et explication

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

Bienvenue suggestions!


2

Vitsy , 25 23 22 21 19 octets

Merci à @ Sp3000 d'avoir souligné que je n'ai pas besoin de doublon et de m'avoir sauvé 2 octets!

Prend l'entrée comme N W H. Essayez-le en ligne!

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 octets

Prend des arguments comme (H W;N):

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

En action:

  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 octets

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

Il s'agit d'une fonction qui accepte trois entiers et renvoie une matrice de valeurs de caractères. Pour l'appeler, affectez-le à une variable.

Non golfé:

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 octets

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

Explication

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

Tester


1

Mathematica, 85 octets

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

Comme avec de nombreuses autres solutions, cela crée une seule ligne, puis la partitionne.


1

JavaScript (ES6), 55 octets

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

Utilise l' IIFE f pour boucler pour enregistrer une instruction de retour.

Sortie pour w = 5, h = 3, n = 7:

00000
01000
00010

1

C #, 185 octets

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

Pour une lecture plus lisible:

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

Usage:

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

0

Julia, 50 octets

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

Cela crée une fonction f qui accepte trois entiers et renvoie un tableau de chaînes à deux dimensions.

Non golfé:

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

Rubis, 67 56 octets

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

Impression d'un tableau car il est accepté.

67 octets

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

Non golfé:

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

Usage:

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

Remarque: approche très différente de celle utilisée par Tom Carpenter.

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

Définit une fonction anonyme qui accepte les entrées en tant que [W,H],N. J'ai abordé ce problème en utilisant not-the-modulo-of- N pour un tableau 1: W * H, puis en remodelant simplement la solution en un tableau bidimensionnel, qui est ensuite converti en un tableau de caractères.

Exemple de sortie pour [5,3],7:

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

0

Lisp commun, SBCL, 94 octets

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

Explication

~:[.~;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) semble assez idiot (parce que c'est tellement similaire mais je ne sais pas si cela peut être résolu, économisant des octets

J'utilise (1+ i)au lieu de iparce que dotimescommence à partir de i=0et je veux partir de 1. C'est aussi utile parce que je peux utiliser (* a b)au lieu de(1+(* a b))


-1

Java, 185 183 octets

Merci Thomas Kwa de m'avoir sauvé 2 octets!

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

Non golfé (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" : ""
      ));
  }
}

Usage:

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

Peut-être que java gagnera un jour: P


Je pense que vous pouvez utiliser à la >0place de !=0et <1au lieu de ==0.
lirtosiast
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.