Scacchiera


18

Input: un numero positivo, inferiore a 80, da stdin o come argomento da riga di comando.

Output: un modello quadrato a scacchiera, la dimensione del numero di input. I campi scuri sono rappresentati dalla lettera 'X', i campi bianchi da uno spazio. Il campo in alto a sinistra dovrebbe essere 'X'.

È richiesto un programma completo.


Esempi:

Ingresso : 1

Uscita :

X

Ingresso : 8

Uscita :

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
Stavo cercando un tag come 'leggero' per questo.
steenslag,

1
Programma completo e completo, suppongo?
JB

@JB: Sì. Come lo formula? Aggiungi 'to stdout' all'output richiesto?
steenslag,

1
Di 'solo che vuoi un programma completo. È inoltre possibile specificare argomenti della riga di comando per evitare confusione con gli argomenti della funzione.
JB

Quando dici in alto a destra, intendi in alto a sinistra? In caso contrario, correggere l'output di esempio per l'ingresso 8.
Peter Taylor

Risposte:


5

Pyth, 13 caratteri

Nota: Pyth è troppo nuovo per essere idoneo a vincere. Tuttavia, è stato un golf divertente e ho pensato di condividerlo.

VQ<*QX*d2N\XQ

Provalo qui.

Come funziona:

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

Fondamentalmente, questo utilizza Xper generare "X "o " X"alternativamente, quindi ripete i Qtempi di quella stringa e prende i suoi primi Qcaratteri. Questo è ripetuto Qvolte.

Come funziona la funzione X(assegnazione a)? Prende la stringa originale, " "in questo caso, una posizione di assegnazione, Nin questo caso, e un carattere sostitutivo, "X"in questo caso. Poiché le assegnazioni di Pyth sono modulari, questo sostituisce lo spazio nella posizione N%2con un Xe restituisce la stringa risultante, che è quindi "X "sulla prima, terza, ecc. E " X"sugli altri.


... ma APL no. Grazie per esserti imbattuto. Mi chiedo se l'OP accetterà di nuovo ...
Adám,

"Pyth è troppo nuovo per essere idoneo a vincere" Non lo capisco e lo riconosco.
steenslag,

1
@steenslag Per spiegare, esiste una scappatoia standard secondo cui le lingue più recenti della domanda non sono ammissibili. Questo per impedire che lingue specificamente progettate per andare bene in una sfida specifica. Sei libero di fare quello che vuoi con la tua sfida, ovviamente.
isaacg,

11

Golfscript - 17 caratteri

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

Analisi

~converte l'input in un int
:Nstore nella variabile N
,{...}per ciascun valore di [0 ... N-1]
"X "N*ripeti "X" per dare una stringa di caratteri N * 2
>prendi la sottostringa a partire dall'indice del loop ...
N<... la fine di N caratteri in seguito
ninserisce una nuova riga alla fine di ogni stringa


5

Perl, 41 40

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

Perl 5.10 o successivo, esegui con perl -nE 'code'( nconteggiato nella dimensione del codice)

Uscita campione:

$ 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

Cosa fa la "x" in "x 40"?
steenslag

2
@steenslag: xè l'operatore di ripetizione stringa. 'a' x 3rese 'aaa'.
JB


3

Python, 76 caratteri

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 caratteri

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

Uso: scala filename Ndove n è il tuo input per il programma.


3

APL (16)

Supponendo ⎕IO=0(cioè array a zero, è un'impostazione)

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

Spiegazione:

  • ⍳2⍴⎕: legge un numero N e crea una matrice N × N contenente da (0,0) a (N-1, N-1).
  • 2⊤¨: ottiene il bit meno significativo di ciascun numero nella matrice. (Quindi ora abbiamo (0,0), (0,1), (0,0) ... (1,0), (1,1), (1,0) ...)
  • =/¨: per ogni coppia, vedere se i due numeri sono uguali. (Ora abbiamo 1 0 1 0 1 0 ...)
  • ' X'[... ]: inserisci uno spazio per ogni 0 e una X per ogni 1.

3

Ruby 45 42

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

Demo: http://ideone.com/Mw25e


(x=gets.to_i).timessalva tre caratteri. Perché l'improvviso rinnovato interesse per questo vecchio?
steenslag,

@steenslag Grazie! Ho applicato il tuo consiglio. Ho appena visto questa domanda in cima all'elenco e ho pensato di pubblicare una risposta per rispolverare le mie abilità di Ruby. Apparentemente non li ho rispolverati abbastanza. :)
Cristian Lupascu,

2

Pitone

48 caratteri

EDIT: Kinda Wrong ... C'è uno spazio extra alla fine ... ma non è visibile. Se si modifica lo spazio su "O" (o qualsiasi carattere non bianco), modificare [i%2:n]in [i%2:n+i%2]. per la versione corretta.

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

2

C ++ - 253 caratteri offuscati

#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
Adoro tutti i numeri magici.
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));

Sono abbastanza sicuro che puoi convertire in numeri come +'1'invece di parseInt('1'). Non ti darò un numero intero, ma non credo che avere un numero intero sia importante qui, vero?
Qualcuno il

2

k (26 caratteri)

26 Per la funzione bare:

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

O altri 7 per ricevere input da stdin

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

2

Bash: 60 caratteri

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

La dimensione della tabella viene passata come parametro della riga di comando, ad esempio bash chesstable.sh 8.


2

Java 10, funzione lambda, 92 87 84 byte

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

Provalo online qui .

Grazie a ceilingcat per giocare a golf 4 byte e Kevin Cruijssen per giocare a golf 3 in più.

Versione non golfata:

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, programma completo, 155 139 byte

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

Provalo online qui .

Versione non golfata:

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 Grazie! Sono riuscito a radere via un altro byte e ho applicato il tuo approccio anche al mio programma completo. 16 byte salvati lì.
OOBalance,

Fare due s+=è di 2 byte in meno rispetto a quelle tra parentesi: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,

O 1 byte più largo (84 in totale) stampando direttamente (con la parentesi di nuovo xD): n->{for(int i=0;i<n*n;)System.out.print(((i%n+i/n)%2<1?"X":" ")+(++i%n<1?"\n":""));}. Provalo online.
Kevin Cruijssen,

Suggerisci "X ".charAt(i%n+i/n&1)invece di((i%n+i/n)%2<1?"X":" ")
ceilingcat il


2

APL (Dyalog Extended) , 12 byte SBCS

Funzione prefisso tacito anonimo. Richiede ⎕IO←0(indicizzazione in base zero).

'X '⊇⍨2|⍳+⍀⍳

Provalo online!

ɩ ndices 0… n – 1

+⍀ più tabella con quella in orizzontale e in verticale:

ɩ ndices 0… n – 1

2| resto della divisione quando diviso per due

'X '⊇⍨ usa quella matrice per indicizzare nella stringa


2

Scala, 68 byte

  def^(n:Int)=for(a<-1 to n)println(("x_"*n).substring(n%2+1,n+n%2+1))

o

  def^(n:Int)=for(a<-1 to n)println(("x_"*n).substring(a%2+1).take(n))

Provalo online!


2

Brainfuck, 140 byte

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

2

Javascript, 67 byte

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

Provalo online

C, 83 byte

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

Provalo online

C64 di base, 89 byte

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

enter image description here


Puoi usare il on...go tocomando in modo condizionale, come ON-(I+JAND1)GOTO3:?"X";:dove è zero, passerà alla seguente istruzione, in questo caso, se (I + J AND 1) === 0poi stamperà la X. Ciò ti permetterà di comprimere più istruzioni per riga e salvare byte.
Shaun Bebbers,


2

Scala, 40 e 54

Il numero di caratteri è 40 per una funzione, 54 per un programma completo.

La soluzione che fornisce solo un corpo di funzione è:

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

Provalo online

 

La soluzione che fornisce un programma completo è:

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

È possibile eseguirlo utilizzando la seguente riga di comando.

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

dove 8 è l'ingresso.


1
Benvenuti in PP&CG e bella prima risposta. C'è un bel sito chiamato Try It Online che ti permette di ottenere conteggi di byte facili e condividere esecuzioni. Controlla l'altra risposta di Scala per vederne un esempio . Non è necessario badare a te, è bello avere.
Veskah,

Grazie @Veskah per il suggerimento.
jseteny,

Bella soluzione cambiando questo in una funzione e usando la mappa ottieni 34 caratteri:("X "*n)sliding n take n map println
pme

@pme Grazie per il suggerimento, ma non c'è output se sostituisco foreach con map. Comunque lo cambio in una funzione come mi hai suggerito.
jseteny,

hai ragione - scusa sembra che la mappa sia pigra; (.
pme

1

Python - 127 caratteri

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 "}per 22 ... ah no, ha lo stesso bug del tuo - non ha 4 X nelle righe dispari per l'input 8.
streetster

1

Ruby 58

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

1

PHP - 136 caratteri (senza spazi bianchi)

Consente l'immissione delle funzioni xey.

Supporta anche input dispari ora.

Se modifichi l'output in modo che abbia un'altezza di 0,65 em e cambi questo ▒█ e █░ in □ ■ e ■ □ allora viene fuori come una vera scacchiera (quadrata).

Codice:

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

Produzione:

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

Funziona con schede con un numero dispari di quadrati per lato?
Gareth,

@Gareth Adesso lo fa
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 byte

Probabilmente avrei potuto eseguire il porting della risposta GolfScript, ma ecco un approccio diverso. (E CJam non può comunque vincere.)

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

Provalo qui.

L'idea è di iterare sulla griglia 2D con gli indici xey in pila, usando il f{f{...}}trucco . Dato xey, possiamo semplicemente determinare come bianco e nero (x+y)%2e usarlo per scegliere tra il carattere Xe una stringa contenente uno spazio.


1

J, 21 caratteri

Anche J mancava.

   ([:u:32+56*=/~@$&1 0) 5
X X X
 X X 
X X X
 X X 
X X X

Precedente, 22 caratteri:

Codici di caratteri dal modello mod2 di row #+ column #:

   ([:u:88-56*2&|@+/~@i.) 5

-2 byte:([:{&' X'=/~@$&1 0)
Bolce Bussiere,

16 byte $"1[:|.&'X '"+i. Provalo online!
Giona,

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 byte

for(;@$i++<$k=$argv[1];){for($j=0;$j++<$k;)echo($i+$j)%2?' ':'X';echo"\n";}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.