Schachbrettmuster


18

Eingabe: eine positive Zahl, kleiner als 80, von stdin oder als Befehlszeilenargument.

Ausgabe: Ein quadratisches Schachbrettmuster, die Größe der eingegebenen Zahl. Die dunklen Felder werden durch den Buchstaben 'X' dargestellt, die weißen Felder durch ein Leerzeichen. Das Feld oben links sollte "X" sein.

Ein vollständiges Programm ist erforderlich.


Beispiele:

Eingabe : 1

Ausgabe :

X

Eingabe : 8

Ausgabe :

X X X X 
 X X X X
X X X X 
 X X X X
X X X X 
 X X X X
X X X X 
 X X X X

1
Ich war auf der Suche nach einem Tag wie "Lightweight".
Steenslag

1
Ganzes und vollständiges Programm, nehme ich an?
JB

@JB: Ja. Wie formuliere ich das? 'To stdout' zur gewünschten Ausgabe hinzufügen?
Steenslag

1
Sagen Sie einfach, Sie möchten ein vollständiges Programm. Möglicherweise möchten Sie auch Befehlszeilenargumente angeben , um Verwechslungen mit Funktionsargumenten zu vermeiden.
JB

Wenn Sie oben rechts sagen, meinen Sie damit oben links? Wenn nicht, korrigieren Sie bitte die Beispielausgabe für Eingabe 8.
Peter Taylor

Antworten:


5

Pyth, 13 Zeichen

Hinweis: Pyth ist viel zu neu, um gewinnen zu können. Es war jedoch ein Spaßgolf und ich dachte, ich würde es teilen.

VQ<*QX*d2N\XQ

Probieren Sie es hier aus.

Wie es funktioniert:

                       Q = eval(input())
VQ                     for N in range(Q):
  <         Q                                                        [:Q]
   *Q                                    (Q*                        )
     X*d2N\X                                assign_at(" "*2, N, "X")

Grundsätzlich wird dies verwendet X, um zu generieren "X "oder " X"abwechselnd, dann wiederholt diese Zeichenfolge QZeiten und nimmt die ersten QZeichen. Dies wird mehrfach wiederholt Q.

Wie funktioniert die Funktion X(zuweisen bei)? " "In diesem Fall wird die ursprüngliche Zeichenfolge verwendet, in diesem Fall ein Zuweisungsort und Nin diesem Fall ein Ersetzungszeichen "X". Da Pyths Zuweisungen modular sind, ersetzt dies das Leerzeichen an der Position N%2durch ein Xund gibt die resultierende Zeichenfolge zurück, die sich daher "X "in der ersten, dritten usw. Zeile und " X"in den anderen Zeilen befindet .


... aber APL nicht. Danke fürs Anstoßen.
Adám

"Pyth ist viel zu neu, um für einen Sieg in Frage zu kommen" Ich verstehe das nicht und akzeptiere dieses.
Steenslag

1
@steenslag Um dies zu erklären, gibt es eine Standardlücke, in der Sprachen, die neuer sind als die Frage, nicht berücksichtigt werden können. Dies soll verhindern, dass Sprachen, die speziell für eine bestimmte Herausforderung entwickelt wurden, gut abschneiden. Natürlich können Sie mit Ihrer Herausforderung tun, was Sie wollen.
Isaacg

11

Golfscript - 17 Zeichen

~:N,{"X "N*>N<n}%

Analyse

~Konvertieren Sie die Eingabe in einen int-
:NSpeicher in der Variablen N
,{...}für jeden Wert von [0 ... N-1].
"X "N*Wiederholen Sie "X", um eine Zeichenfolge mit N * 2 Zeichen zu erhalten.
>Nehmen Sie die Teilzeichenfolge ab dem Schleifenindex ...
N<... Ende N Zeichen
nsetzen später eine neue Zeile am Ende jeder Zeichenfolge


5

Perl, 41 40

for$i(1..$_){say substr" X"x$_,$i%2,$_}

Perl 5.10 oder höher, ausgeführt mit perl -nE 'code'( nin Codegröße gezählt)

Beispielausgabe:

$ perl -nE'for$i(1..$_){say substr" X"x 40,$i%2,$_}' <<<5
X X X
 X X
X X X
 X X
X X X
$ perl -nE'for$i(1..$_){say substr" X"x 40,$i%2,$_}' <<<8
X X X X
 X X X X
X X X X
 X X X X
X X X X
 X X X X
X X X X
 X X X X

Was macht das 'x' in 'x 40'?
Steenslag

2
@steenslag: xist der Operator für die Zeichenfolgenwiederholung. 'a' x 3Ausbeuten 'aaa'.
JB


3

Python, 76 Zeichen

n=input()
p='X '*n
print n/2*(p[:n]+'\n'+p[1:n+1]+'\n'),
if n&1:print p[:n]

3

Scala - 141 95 Zeichen

var a=args(0).toInt
for(y<-1 to a;x<-1 to a)print((if((x+y)%2<1)"X"else" ")+("\n"*(x/a)take 1))

Verwendung: scala filename Nwobei n Ihre Eingabe für das Programm ist.


3

APL (16)

Angenommen ⎕IO=0(dh, mit Nullindex versehene Arrays sind eine Einstellung)

' X'[=/¨2⊤¨⍳2⍴⎕]

Erläuterung:

  • ⍳2⍴⎕: Lies eine Zahl N und erstelle eine N × N-Matrix mit (0,0) bis (N-1, N-1).
  • 2⊤¨: Ermittelt das niedrigstwertige Bit jeder Zahl in der Matrix. (Nun haben wir also (0,0), (0,1), (0,0) ... (1,0), (1,1), (1,0) ...)
  • =/¨: Prüfen Sie für jedes Paar, ob die beiden Zahlen gleich sind. (Jetzt haben wir 1 0 1 0 1 0 ...)
  • ' X'[... ]: Setzen Sie für jede 0 ein Leerzeichen und für jede 1 ein X.

3

Ruby 45 42

(x=gets.to_i).times{|i|puts ("X "*x)[i,x]}

Demo: http://ideone.com/Mw25e


(x=gets.to_i).timesSpart drei Zeichen. Warum das plötzliche erneute Interesse an diesem Oldie?
Steenslag

@steenslag Danke! Ich habe Ihren Tipp angewendet. Ich habe diese Frage ganz oben auf der Liste gesehen und dachte, ich schreibe eine Antwort, um meine Ruby-Fähigkeiten zu entstauben. Anscheinend habe ich sie nicht genug abgewischt. :)
Cristian Lupascu

2

Python

48 Zeichen

EDIT: Irgendwie falsch ... Es gibt ein zusätzliches Leerzeichen am Ende ... aber das ist nicht sichtbar. Wenn Sie das Leerzeichen in "O" (oder ein anderes Zeichen als Leerzeichen) ändern [i%2:n], ändern Sie es in [i%2:n+i%2]. für die richtige Version.

n=input()
i=0;
while i<n:print('X '*n)[i%2:n];i+=1

2

C ++ - 253 verschleierte Zeichen

#include <iostream.h>
int main(int i,char*c[]=0)
{
  char a=i,b=i>>8;i&32512?((i>>16&255)<a)?(cout<<b)?main((i^30720)+65536):0:(cout<<endl)?(((b=(i>>24)+1)<a)?main((i&2130706559)+((b&1)?16785408:16799744)):0):0:main((i>=2?atoi(1[c]):8)|22528);
}

1
Ich liebe alle magischen Zahlen.
Joey Adams

2

JavaScript, 169

function b(w){var i=w,j=w,r='';while(i--){while(j--){if((i+j)%2)r+=' ';else r+='X'}j=w;r+="\n"}return r}do{n=parseInt(prompt('Number'))}while(isNaN(n)||n<1);alert(b(n));

Ich bin mir ziemlich sicher , dass Sie Zahl wie umwandeln können +'1'statt parseInt('1'). Ich gebe Ihnen keine ganze Zahl, aber ich denke nicht, dass es hier wichtig ist, eine ganze Zahl zu haben, oder?
Ein

2

k (26 Zeichen)

26 Für nackte Funktion:

{-1',/x#',x#'("X ";" X");}

Oder weitere 7, um die Eingabe von stdin zu übernehmen

{-1',/x#',x#'("X ";" X");}"I"$0:0

2

Bash: 60 Zeichen

yes X|fmt -w80|paste -d '' <(yes '
 ') -|head -$1|cut -c1-$1

Die Tabellengröße wird beispielsweise als Befehlszeilenparameter übergeben bash chesstable.sh 8.


2

Java 10, Lambda-Funktion, 92 87 84 Bytes

n->{for(int i=0;i<n*n;)System.out.print(((i%n+i/n)%2<1?"X":" ")+(++i%n<1?"\n":""));}

Probieren Sie es hier online aus .

Dank an ceilingcat für das Golfen von 4 Bytes und an Kevin Cruijssen für das Golfen von 3 weiteren Bytes .

Ungolfed-Version:

n -> { // void lambda taking an int as argument
    for(int i = 0; i < n*n; ) // loop over the entire square
            System.out.print(((i%n + i/n) % 2 < 1 ? "X" : " ") // print an 'X' or a space depending on which line&column we're on
               + (++i % n < 1 ? "\n" : "")); // print a newline at the end of a line
}

Java 8, volles Programm, 155 139 Bytes

interface M{static void main(String[]a){int i=0,n=new Byte(a[0]);for(;i<n*n;)System.out.print(((i%n+i/n)%2<1?"X":" ")+(++i%n<1?"\n":""));}}

Probieren Sie es hier online aus .

Ungolfed-Version:

interface M {
    static void main(String[] a) {
        int i = 0, // iterator variable for the loop
            n = new Byte(a[0]); // take the argument and convert it to an int
        for(; i < n*n; ) // loop over the entire square
            System.out.print( ((i%n + i/n) % 2 < 1 ? "X" : " ") // print an 'X' or a space depending on which line&column we're on
                             +(++i % n < 1 ? "\n" : "") ); // print a newline at the end of a line
        }
    }
}

@ceilingcat Danke! Ich habe es geschafft, ein weiteres Byte zu entfernen und Ihren Ansatz auch auf mein gesamtes Programm anzuwenden. 16 Bytes dort gespeichert.
OOBalance

Zwei zu machen s+=ist 2 Bytes kürzer als diese Klammern:n->{var s="";for(int i=0;i<n*n;s+=++i%n<1?"\n":"")s+=(i%n+i/n)%2<1?"X":" ";return s;}
Kevin Cruijssen

1 oder mehr Byte - off (84 insgesamt) , durch direktes Drucken (mit der Klammer wieder xD): n->{for(int i=0;i<n*n;)System.out.print(((i%n+i/n)%2<1?"X":" ")+(++i%n<1?"\n":""));}. Probieren Sie es online aus.
Kevin Cruijssen

Schlagen Sie "X ".charAt(i%n+i/n&1)stattdessen vor((i%n+i/n)%2<1?"X":" ")
ceilingcat


2

APL (Dyalog Extended) , 12 Byte SBCS

Anonyme implizite Präfixfunktion. Benötigt ⎕IO←0( nullbasierte Indizierung).

'X '⊇⍨2|⍳+⍀⍳

Probieren Sie es online!

ɩndices 0… n – 1

+⍀ Plus-Tabelle mit dem horizontal und vertikal:

ɩndices 0… n – 1

2| Division Rest, wenn durch zwei geteilt

'X '⊇⍨ Verwenden Sie diese Matrix, um den String zu indizieren



2

Brainfuck, 140 Bytes

-[+[+<]>>+]>++++[<++++++++>-]<<<<<<,[->+>+>+<<<]>>[->[->.<[->>.>]<<<]<[<<<]>>>>>[-<+>]>[-<+>]<<[->>+<<]<<[-<+>]<[->+>>+<<<]++++++++++.[-]>>]

2

Javascript, 67 Bytes

for(j=n=readline()|0;j--;)console.log(' X'.repeat(n).substr(j%2,n))

Probieren Sie es online aus

C 83 Bytes

i,j;main(n){for(scanf("%d",&n);i++<n;puts(""))for(j=0;j<n;)putchar(i+j++&1?88:32);}

Probieren Sie es online aus

Basic C64, 89 Bytes

1 INPUTN:FORI=1TON;FORJ=1TON:IFI+JAND1THENPRINT" ";:GOTO3
2 PRINT"X";
3 NEXT:PRINT"":NEXT

Bildbeschreibung hier eingeben


Sie können den on...go toBefehl unter bestimmten Bedingungen verwenden, z. B. ON-(I+JAND1)GOTO3:?"X";:wenn er Null ist, wird die folgende Anweisung verwendet. In diesem Fall (I + J AND 1) === 0wird das X gedruckt. Auf diese Weise können Sie mehr Anweisungen pro Zeile packen und Bytes speichern.
Shaun Bebbers


2

Scala, 40 und 54

Die Anzahl der Zeichen beträgt 40 für eine Funktion, 54 für ein vollständiges Programm.

Die Lösung, die nur einen Funktionskörper ergibt, lautet:

("X "*n)sliding n take n foreach println

Probieren Sie es online aus

 

Die Lösung für ein vollständiges Programm lautet:

val n=readInt;("X "*n)sliding n take n foreach println

Sie können es über die folgende Befehlszeile ausführen.

scala -e 'val n=readInt;("X "*n)sliding n take n foreach println' <<< 8

Wobei 8 die Eingabe ist.


1
Willkommen bei PP & CG und schöne erste Antwort. Es gibt eine nette Seite namens Try It Online , mit der Sie einfache Byte-Zählungen erhalten und Läufe teilen können. Überprüfen Sie die andere Antwort von Scala, um ein Beispiel dafür zu sehen . Es ist wohlgemerkt nicht erforderlich, nur schön zu haben.
Veskah,

Danke @Veskah für den Vorschlag.
Jseteny

Schöne Lösung, wenn Sie dies in eine Funktion ("X "*n)sliding n take n map println
umwandeln

@pme Danke für den Vorschlag, aber es gibt keine Ausgabe, wenn ich foreach durch map ersetze. Ich ändere es jedoch in eine Funktion, wie Sie vorgeschlagen haben.
Jseteny

du hast recht - sorry scheint map ist faul; (.
pme

1

Python - 127 Zeichen

from sys import*
r=stdout.write
s=int(raw_input())
[[r((x+y+1)%2 and"x"or" ")for x in range(s)]and r("\n")for y in range(s)]


1

Q, 33

{$[1=x mod 2;x;x-1]cut(x*x)#"X "}

{(x;x-1-x mod 2)#"X "}für 22 ... ah nein, hat den gleichen Fehler wie Sie - hat nicht 4 X in den ungeraden Zeilen für die Eingabe 8.
Streetster

1

Rubin 58

i=ARGV[0].to_i
1.upto(i*i){|n|print n%i==0?"\n":' x'[n%2]}

1

PHP - 136 Zeichen (ohne Leerzeichen)

Ermöglicht die Eingabe von x- und y-Funktionen.

Unterstützt jetzt auch ungerade Eingänge.

Wenn Sie die Ausgabe so formatieren, dass sie eine Zeilenhöhe von 0,65 em hat, und diese ▒█ und █ ° in □ ■ und ■ □ ändern, sieht sie wie ein echtes (quadratisches) Schachbrett aus.

Code:

function gen_cb($x,$y)
{
$c=0;
$y*=2;
for($i=0;$i<$y;$i++){
for($j=0;$j<$x;$j++){
echo $c%2==0 ? "░█" : "█░";
}
echo "<br/>";
$c++;
}
}
gen_cb(7,7);

Ausgabe:

░█░█░█░█░█░█░█
█░█░█░█░█░█░█░
░█░█░█░█░█░█░█
█░█░█░█░█░█░█░
░█░█░█░█░█░█░█
█░█░█░█░█░█░█░
░█░█░█░█░█░█░█

Funktioniert es für Bretter mit einer ungeraden Anzahl von Quadraten pro Seite?
Gareth

@ Gareth Jetzt tut es
Event_Horizon

1

PHP, 87

for($x=0;$x<$m=$argv[1];$x++){echo"\n";for($y=0;$y<$m;$y++)echo($y^($x%2))%2?' ':'X';}

1

CJam, 18 Bytes

Ich hätte wahrscheinlich nur die GolfScript-Antwort portieren können, aber hier ist ein anderer Ansatz. (Und CJam ist sowieso nicht gewinnberechtigt.)

l~,_f{f{+2%S'X?}N}

Teste es hier.

Die Idee ist, mit dem f{f{...}}Trick über das 2D-Gitter mit den x- und y-Indizes auf dem Stapel zu iterieren . Mit x und y können wir einfach Schwarz und Weiß bestimmen und damit (x+y)%2zwischen dem Zeichen Xund einer Zeichenfolge mit einem Leerzeichen auswählen .



1

VB.net, 161

Module C
   Sub Main()
     Dim n As Integer
     If Integer.TryParse(Console.ReadLine,n) Then
     For x=1To n
        For y=1To n
          Console.Write("* "((x+y)Mod 2))
        Next
        Console.WriteLine()
      Next
     End If
    End Sub
End Module

1

PHP, 75 Bytes

for(;@$i++<$k=$argv[1];){for($j=0;$j++<$k;)echo($i+$j)%2?' ':'X';echo"\n";}
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.