Sehr einfache Rastermarken


29

Schreiben Sie ein Programm oder eine Funktion, die drei positive ganze Zahlen (W, H und N) enthält. Drucken Sie ein W × H-Raster aus oder geben Sie es zurück ., wobei jedes N-te .in der normalen englischen Lesereihenfolge durch ein ersetzt wird X.

Beispiel: Bei W = 7, H = 3, N = 3 ist das Raster 7 Zeichen breit und 3 Zeichen hoch, und jedes dritte von links oben abgelesene Zeichen ist ein X:

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

In ähnlicher Weise wäre die Ausgabe, wenn die Eingabe W = 10, H = 4, N = 5 ist:

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

Anmerkungen

  • "Normale Lesereihenfolge" bedeutet, in jeder Zeile von links nach rechts zu gehen, von der obersten bis zur untersten Zeile.
  • Wenn N 1 ist, werden alle .'s zu X' s.
  • Sie können anstelle von und zwei beliebige druckbare ASCII- Zeichen verwenden . .X
    • Wenn Sie space ( ) verwenden, sind keine nachgestellten Leerzeichen erforderlich, wenn das Ergebnis visuell identisch wäre. (Leerzeilen sind noch erforderlich.)
    • Möglicherweise verwenden Sie anstelle der Zeilenumbrüche, die das Raster formen, kein anderes Element.
  • Das genaue Eingabeformat und die Reihenfolge von W, H und N sind nicht besonders wichtig. Dinge wie [H,W,N]oder N\nW,Hsind in Ordnung.
  • Eine nachgestellte Zeile in der Ausgabe ist in Ordnung.
  • Der kürzeste Code in Bytes gewinnt!

Beispiele

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
Bin ich davon ausgehen , zu korrigieren , dass die Beschränkung „ Sie können nicht mit etwas anderes anstelle der Zeilenumbrüche, die das Gitter formen “ umfasst „ Sie können nicht ein Array zurück , ["..X..X.", ".X..X..", "X..X..X"]wie das Netz “?
Peter Taylor

@PeterTaylor Correct
Calvins Hobbys

Antworten:


13

J, 9 5 Bytes

$":&1

Verwendet Leerzeichen und 1erwartet Eingaben im FormularH W f N

Erläuterung:

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

Verwendung:

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

Probieren Sie es hier online aus.


Wird das Array auch abgeschnitten, wenn W * H kleiner als N ist?
Martin Ender

@ MartinBüttner Ja.
Randomra

Wenn das Argument ist ($":&1), würde das nicht als 7 Bytes zählen?
Reto Koradi

1
Nein, sie ()sind nicht Teil der Funktion. du könntest schreiben f =. $":&1und dann 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

Dies druckt Platz und 0anstelle von .und X. Die Eingabe erfolgt als Tupel in Form von w,h,n.


4
Das ist ein cleveres String-Format.
29.

7

J, 12 Bytes

$'X'_1}#&'.'

Dies ist eine dyadische Funktion, die das Array H Wals linkes und Nals rechtes Argument verwendet. Verwendung:

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

Erläuterung

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

Richtiges Werkzeug für den Job ?
Addison Crump

Ist der Einsatz X.wirklich am kürzesten?
Lirtosiast

@ ThomasKwa Ich glaube schon. Ich habe versucht, stattdessen die Zahlen 0 und 1 zu verwenden, aber dann musste ich die Zahl neben der Zahl in _1Klammern setzen und die Zwischenräume zwischen den Spalten formatieren, und es wurde länger.
Zgarb

5

BBC Basic, 67 ASCII-Zeichen, tokenisierte Dateigröße 43 Byte

Laden Sie den Interpreter unter http://www.bbcbasic.co.uk/bbcwin/download.html herunter

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

BBC basic verfügt über einen praktischen Befehl zum Begrenzen der Feldbreite. Wir verwenden STRING$, um w*hKopien der Zeichenfolge von n-1Punkten zu erstellen, denen ein X folgt. Dann verwenden wir LEFT $, um dies auf w*hZeichen zu kürzen.


4

Minkolang 0,14 , 34, 30, 28, 22 Bytes

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

Aktivieren Sie hier einen Fall und aktivieren Sie hier alle Testfälle. Erwartet Eingaben wie N W H.

Erläuterung

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

Da Minkolangs Codebox torusförmig ist, wird dies am Anfang herumlaufen. Wie njetzt jeder annehmen wird -1, stürzt dies schließlich mit einem Fehler und keiner weiteren Ausgabe ab, was erlaubt ist.


So ist es für Sie einfach zu vergleichen. (Beachten Sie, dass es nicht ganz derselbe Code ist.)
El'endia Starman

Vor dir! : P :)
El'endia Starman

4

CJam (16 Bytes)

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

Übernimmt die Eingabe auf dem Stapel in der Reihenfolge N W H , gibt die Zeichenfolge mit 0und zurück 1. Online-Demo

Präparation

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

; -; Sie schlugen mich ;-; aber gute Arbeit! : D
anOKsquirrel

4

APL, 13 Bytes

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

Das dauert H W als linkes Argument und Nals rechtes Argument.

Erläuterung:

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

Probieren Sie es online aus: erste Testfälle , letzter Testfall . Beachten Sie, dass meine Kopie von Dyalog keine Boxed-Ausgabe anzeigt.


Sind das eigentlich nur Kästchen oder zeigt die SE-App die Zeichen nicht richtig an?
Carcigenicate

@Carcigenicate Das sind keine Kisten. Die Zeichen sollten in der Online-Verknüpfung gut angezeigt werden, da sie eine andere Schriftart haben.
Lirtosiast

Ahh, richtig. Das habe ich vermisst. Hast du eine spezielle Tastatur oder bist du ein Masochist?
Carcigenicate

@Carcigenicate Auf tryapl (und Dyalog Student Edition) können Sie APL-Zeichen mit Backticks eingeben. `a wird zum Beispiel zu ⍺.
Lirtosiast

2

CJam, 20 Bytes

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

Übernimmt die Eingabe als HW N.


whoops, invalid
anOKsquirrel

behoben: D: D: D: D
anOKsquirrel

Noch viel länger als einige Lösungen in anderen Sprachen, aber ich habe es mit CJam: auf 18 Bytes gebracht q~_@*,@(S*'X+f=/N*, mit Eingabe in der Reihenfolge NH W.
Reto Koradi

1
Nehmen Sie ein anderes aus @RetoKoradi durch Ersetzen 'Xmit 0, und das wird sein 17
SP3000

2

MATLAB, 61 55 54 Bytes

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

Wow, ich dachte, MATLAB wäre in dieser Hinsicht wettbewerbsfähig, aber wie falsch lag ich!

Die Funktion erstellt ein Array von Einsen mit den richtigen Dimensionen und setzt dann jedes n-te Element auf 0 (MATLAB behandelt implizit das Umbrechen der Indizes in 2D). Wir addieren dann 45 ('-') zu dieser Zahl und konvertieren sie in ein Zeichen-Array, das zurückgegeben werden soll.

In den Fragen können zwei beliebige ASCII-Zeichen für das Raster verwendet werden. Ich verwende '-' anstelle von 'x', um einige Bytes zu speichern. Das Eingabeformat ist ebenfalls nicht festgelegt, daher sollte es als [w h],n- dh als Array mit Breite und Höhe und dann als zweiter Parameter als n angegeben werden.


Dies funktioniert auch mit Octave und kann hier online ausprobiert werden . Die Funktion ist bereits im verknüpften Arbeitsbereich eingerichtet, sodass Sie einfach Folgendes aufrufen können:

g([4,5],3)

Welche Ausgänge:

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

Speichern Sie ein Byte:c=[b'+45,''];
Stewie Griffin

@ StewieGriffin Danke :). Aus irgendeinem Grund, als ich versucht hatte, zu glauben, dass es keine Bytes spart, muss ich falsch gezählt haben!
Tom Carpenter

2

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

Der Grund, warum ich Processing anstelle von Java verwendet habe, ist, dass Sie nicht auf den Zeiger durch Tippen zugreifen müssen, System.outda auf eine lokale Variable direkt zugegriffen werden kann. Damit habe ich 11 Bytes verdient. Die Funktion gibt das Ergebnis nicht zurück, sondern druckt es aus.


2
Sie können einen anderen speichern, indem Sie das Inkrement (wie i++%a...) verschieben. Es sieht so aus, als hätten Sie }am Ende einen Ersatz übrig, den Sie auch nicht benötigen.
Geobits

2

Japt , 33 32 27 25 Bytes

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

Übernimmt die Eingabe im Format W H N. Verwendet  und "anstelle von .und Xverbunden. Probieren Sie es online!

Ungolfed und Erklärung

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

Vorschläge willkommen!


2

Vitsy , 25 23 22 21 19 Bytes

Vielen Dank an @ Sp3000 für den Hinweis, dass ich kein Duplikat benötige und mir 2 Bytes spare!

Übernimmt die Eingabe als N W H. Probieren Sie es 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

Argumentiert wie folgt (H W;N):

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

In Aktion:

  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 Bytes

Ich hoffe, es mehr Golf. Übernimmt die Eingabe als N\n[W, H].

jc.[k+*dtvzN*FQhQ

Test Suite .


1

R, 66 Bytes

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

Dies ist eine Funktion, die drei Ganzzahlen akzeptiert und eine Matrix von Zeichenwerten zurückgibt. Um es aufzurufen, weisen Sie es einer Variablen zu.

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 Byte

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

Erläuterung

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

Prüfung


1

Mathematica, 85 Bytes

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

Wie bei vielen anderen Lösungen wird hierdurch eine einzelne Zeile erstellt und anschließend partitioniert.


1

JavaScript (ES6), 55 Byte

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

Verwendet das IIFE f Schleife, um eine return-Anweisung zu speichern.

Ausgabe für 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();}}}

Für eine besser lesbare Lektüre:

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

Verwendung:

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

Dies schafft eine Funktion f , die drei Ganzzahlen akzeptiert und ein zweidimensionales Array von Zeichenfolgen zurückgibt.

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

Drucken eines Arrays, da es akzeptiert wird.

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

Verwendung:

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

Hinweis: Sehr anderer Ansatz als der von Tom Carpenter.

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

Definiert eine anonyme Funktion, die Eingaben als akzeptiert [W,H],N. Ich näherte mich diesem Problem mit not-the-modulo-of- N für ein Array 1: W * H und formte die Lösung dann einfach in ein zweidimensionales Array um, das dann in ein Zeichenarray konvertiert wird.

Beispielausgabe für [5,3],7:

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

0

Common Lisp, SBCL, 94 Bytes

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

Erläuterung

~:[.~;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) sieht ziemlich albern aus (weil es so ähnlich ist, aber ich weiß nicht, ob es gelöst werden kann, indem Bytes gespart werden)

Ich benutze (1+ i)statt iweil dotimesab i=0und ich möchte ab starten 1. Es ist auch hilfreich, weil ich (* a b)anstelle von verwenden kann(1+(* a b))


-1

Java, 185 183 Bytes

Danke Thomas Kwa, dass du mir 2 Bytes gespart hast!

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

Verwendung:

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

Vielleicht gewinnt Java eines Tages: P


Ich denke, Sie können >0anstelle von !=0und <1anstelle von verwenden ==0.
Lirtosiast
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.