Bardzo proste znaki siatki


29

Napisz program lub funkcję, która przyjmuje trzy dodatnie liczby całkowite, W, H i N. Wydrukuj lub zwróć siatkę W × H, w .której co N-ta .w normalnej angielskiej kolejności czytania jest zastąpiona przez X.

Na przykład, biorąc pod uwagę W = 7, H = 3, N = 3, siatka ma 7 znaków szerokości i 3 wysokości, a co trzeci znak odczytywany z lewego górnego rogu to X:

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

Podobnie, jeśli dane wejściowe to W = 10, H = 4, N = 5, wynik będzie:

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

Notatki

  • „Normalna kolejność czytania w języku angielskim” oznacza przejście od lewej do prawej w każdym wierszu, od górnego do dolnego.
  • Gdy N wynosi 1, wówczas wszystkie .stają się X.
  • Możesz użyć dowolnych dwóch różnych drukowalnych znaków ASCII zamiast .i X.
    • Jeśli użyjesz spacji ( ), spacje końcowe nie są wymagane, gdy wynik będzie wizualnie taki sam. (Puste linie są nadal wymagane.)
    • Możesz nie używać czegoś innego zamiast nowych linii, które kształtują siatkę.
  • Dokładny format wejściowy i kolejność W, H i N nie jest bardzo ważny. Rzeczy takie jak [H,W,N]lub N\nW,Hsą w porządku.
  • Końcowy znak nowej linii w wyjściu jest w porządku.
  • Najkrótszy kod w bajtach wygrywa!

Przykłady

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
Czy słusznie zakładam, że ograniczenie „ Nie możesz używać czegoś innego zamiast nowych linii, które kształtują siatkę ” obejmuje „ Nie możesz zwrócić tablicy ["..X..X.", ".X..X..", "X..X..X"]jako siatki ”?
Peter Taylor

@PeterTaylor Correct
Calvin's Hobbies

Odpowiedzi:


13

J, 9 5 bajtów

$":&1

Wykorzystuje spacje i 1oczekuje danych wejściowych w formularzuH W f N

Wyjaśnienie:

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

Stosowanie:

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

Wypróbuj online tutaj.


Czy obcina również tablicę, jeśli W * H jest mniejsze niż N?
Martin Ender

@ MartinBüttner Tak.
randomra

Jeśli argumentem jest ($":&1), czy nie liczy się to jako 7 bajtów?
Reto Koradi

1
Nie, ()nie są częścią funkcji; można napisać f =. $":&1i potem 3 7 f 3.
Lynn

11

Python 2, 60 bajtów

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

To drukuje przestrzeń, a 0zamiast .i X. Dane wejściowe są traktowane jako krotka w postaci w,h,n.


4
To sprytny format napisów.
xnor

7

J, 12 bajtów

$'X'_1}#&'.'

Jest to funkcja dynamiczna, która przyjmuje tablicę H Wjako lewy argument i Nprawy argument. Stosowanie:

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

Wyjaśnienie

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

Odpowiednie narzędzie do pracy ?
Addison Crump

Czy użycie jest X.naprawdę najkrótsze?
lirtosiast

@ThomasKwa Uważam, że tak. Próbowałem zamiast tego użyć liczb 0 i 1, ale potem musiałem otoczyć ten obok _1nawiasami i sformatować spacje między kolumnami, a ostatecznie było dłuższe.
Zgarb

5

BBC Basic, 67 znaków ASCII, tokenizowane rozmiary plików 43 bajty

Pobierz tłumacza na http://www.bbcbasic.co.uk/bbcwin/download.html

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

BBC basic posiada przydatne polecenie ograniczające szerokość pola. Używamy STRING$do tworzenia w*hkopii ciągów n-1kropek, po których następuje X. Następnie używamy LEWEGO $, aby skrócić to do w*hznaków.


4

Minkolang 0,14 , 34 30 28 22 bajtów

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

Sprawdź jeden przypadek tutaj i sprawdź wszystkie przypadki testowe tutaj. Oczekuje danych wejściowych takich jak N W H.

Wyjaśnienie

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

Ponieważ codbox Minkolanga jest toroidalny, nastąpi to od samego początku. Jak wszyscy nsię teraz zaakceptują -1, to ostatecznie zawiesza się z błędem i bez dalszych wyników, co jest dozwolone.


Łatwo jest więc porównać. (Pamiętaj, że nie jest to dokładnie ten sam kod.)
El'endia Starman

Przed wami! : P :)
El'endia Starman

4

CJam (16 bajtów)

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

Pobiera dane wejściowe na stosie w kolejności N W H, zwraca ciąg znaków za pomocą znaków 0i 1. Demo online

Sekcja

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

; -; pokonałeś mnie ;-; ale dobra robota! : D
anOKsquirrel

4

APL, 13 bajtów

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

Jest to H Wlewy argument i Nprawy argument.

Wyjaśnienie:

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

Wypróbuj online: pierwsze przypadki testowe , ostatnie przypadki testowe . Zauważ, że chociaż pokazuje to wyjście w pudełku, moja kopia Dyaloga nie.


Czy to właściwie tylko pudełka, czy też aplikacja SE nie wyświetla poprawnie znaków?
Carcigenicate

@Carcigenicate Nie są to pudełka. Znaki powinny wyświetlać się poprawnie w linku online, ponieważ ma inną czcionkę.
lirtosiast

Ach, racja. Tęsknie za tym. Czy masz specjalną klawiaturę czy jesteś masochistą?
Carcigenicate

@Carcigenicate W tryapl (i edycji studenckiej Dyalog) można wpisywać znaki APL za pomocą odwrotnych znaków. `a zmienia się na przykład w ⍺.
lirtosiast

2

CJam, 20 bajtów

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

Pobiera dane jako HW N.


ups, nieważne
anOKsquirrel

naprawiono: D: D: D: D
anOKsquirrel

Nadal znacznie dłużej niż niektóre z rozwiązań w innych językach, ale mam go do 18 bajtów z CJam: q~_@*,@(S*'X+f=/N*z wejściem w celu NH W.
Reto Koradi

1
@RetoKoradi Zdejmij kolejną, zastępując 'X0, a będzie 17
Sp3000,

2

MATLAB, 61 55 54 bajtów

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

Wow, myślałem, że MATLAB będzie konkurencyjny w tym, ale jak bardzo się myliłem!

Funkcja tworzy tablicę jedności o właściwych wymiarach, a następnie ustawia co n-ty element na 0 (MATLAB domyślnie obsługuje zawijanie indeksów do 2D). Następnie dodajemy 45 („-”) do tej liczby i przekształcamy w tablicę znaków, która ma zostać zwrócona.

Pytania pozwalają na użycie dowolnych dwóch odrębnych znaków ASCII dla siatki, używam „-” zamiast „x”, aby zapisać niektóre bajty. Format wejściowy również nie jest stały, dlatego należy go podać jako [w h],n- tj. Tablicę szerokości i wysokości, a następnie n jako drugi parametr.


Działa to również z Octave i można go wypróbować online tutaj . Funkcja jest już skonfigurowana w połączonym obszarze roboczym, więc możesz po prostu wywołać na przykład:

g([4,5],3)

Które wyjścia:

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

Zaoszczędź jeden bajt:c=[b'+45,''];
Stewie Griffin

@StewieGriffin Thanks :). Z jakiegoś powodu, kiedy próbowałem, że nie sądzę, by oszczędzało to bajty, musiałem przeliczyć!
Tom Carpenter

2

Przetwarzanie, 93 bajty (Java, 104 bajty)

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

Powodem, dla którego użyłem Przetwarzanie zamiast Javy jest to, że nie musisz uzyskiwać dostępu do wskaźnika przez przechylenie, System.outponieważ zmienna lokalna jest bezpośrednio dostępna. Zarobiłem na tym 11 bajtów. Funkcja nie zwraca wyniku, ale go drukuje.


2
Możesz uratować kolejny, przesuwając przyrost (jak i++%a...), i wygląda na to, że zostawiłeś zapas }na końcu, którego również nie potrzebujesz.
Geobits,

2

Japt , 33 32 27 25 bajtów

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

Pobiera dane wejściowe w formacie W H N. Zastosowania  oraz "w miejsce .i Xodpowiednio. Wypróbuj online!

Bez golfa i wyjaśnienia

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

Sugestie mile widziane!


2

Vitsy , 25 23 22 21 19 bajtów

Dzięki @ Sp3000 za zwrócenie uwagi, że nie potrzebuję duplikatu i zapisanie mi 2 bajtów!

Pobiera dane wejściowe jako N W H. Wypróbuj 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 bajtów

Przyjmuje argumenty jako (H W;N):

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

W akcji:

  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 bajtów

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

Jest to funkcja, która akceptuje trzy liczby całkowite i zwraca macierz wartości znaków. Aby go wywołać, przypisz go do zmiennej.

Nie golfowany:

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 bajtów

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

Wyjaśnienie

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

Test


1

Mathematica, 85 bajtów

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

Podobnie jak w przypadku wielu innych rozwiązań, tworzy to jeden wiersz, a następnie dzieli go na partycje.


1

JavaScript (ES6), 55 bajtów

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

Używa pętli IIFE f do zapisania instrukcji return.

Wyjście dla w = 5, h = 3, n = 7:

00000
01000
00010

1

C #, 185 bajtów

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

Dla bardziej czytelnego czytania:

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

Stosowanie:

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

0

Julia, 50 bajtów

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

To tworzy funkcję f która akceptuje trzy liczby całkowite i zwraca dwuwymiarową tablicę ciągów.

Nie golfowany:

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

Rubin, 67 56 bajtów

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

Drukowanie tablicy, ponieważ jest ona akceptowana.

67 bajtów

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

Nie golfowany:

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

Stosowanie:

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

Uwaga: Zupełnie inne podejście niż to stosowane przez Toma Carpentera.

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

Definiuje anonimową funkcję, która przyjmuje dane wejściowe jako [W,H],N. Podszedłem do tego problemu, używając non-the-modulo-of- N dla tablicy 1: W * H, a następnie po prostu przekształcając rozwiązanie w tablicę dwuwymiarową, która jest następnie konwertowana na tablicę znaków.

Przykładowe dane wyjściowe dla [5,3],7:

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

0

Common Lisp, SBCL, 94 bajty

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

Wyjaśnienie

~:[.~;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) wygląda dość głupio (ponieważ jest tak podobnie, ale nie wiem, czy można to rozwiązać, oszczędzając bajty

Używam (1+ i)zamiast, iponieważ dotimeszaczyna się od i=0i chcę zacząć od 1. Jest to również pomocne, ponieważ mogę użyć (* a b)zamiast(1+(* a b))


-1

Java, 185 183 bajtów

Dzięki Thomas Kwa, za uratowanie mnie 2 bajty!

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

Stosowanie:

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

Może pewnego dnia java wygra: P


Myślę, że możesz użyć >0zamiast !=0i <1zamiast ==0.
lirtosiast
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.