Padrão de tabuleiro de xadrez


18

Entrada: um número positivo, menor que 80, de stdin ou como um argumento da linha de comando.

Saída: um padrão de tabuleiro de xadrez quadrado, o tamanho do número de entrada. Os campos escuros são representados pela letra 'X', os campos brancos por um espaço. O campo superior esquerdo deve ser 'X'.

É necessário um programa completo.


Exemplos:

Entrada : 1

Saída :

X

Entrada : 8

Saída :

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
Eu estava procurando por uma tag como 'leve' para isso.
214116 phpBaixar

1
Programa completo e completo, suponho?
JB

@JB: Sim. Como faço para formular isso? Adicione 'to stdout' à saída necessária?
21711

1
Basta dizer que você quer um programa completo. Você também pode especificar argumentos de linha de comando, para evitar confusão com argumentos de função.
JB

Quando você diz superior direito, você quer dizer superior esquerdo? Se não, por favor corrigir o exemplo de saída para a entrada 8.
Peter Taylor

Respostas:


5

Pitão, 13 caracteres

Nota: Pyth é muito novo para ser elegível para ganhar. No entanto, era um golfe divertido e pensei em compartilhá-lo.

VQ<*QX*d2N\XQ

Experimente aqui.

Como funciona:

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

Basicamente, isso é usado Xpara gerar "X "ou " X"alternadamente, depois repete esse Qtempo de sequência e pega seus primeiros Qcaracteres. Isso é repetido Qvezes.

Como funciona a função X(assign at)? Leva a sequência original, " "nesse caso, um local de atribuição, Nnesse caso, e um caractere de substituição, "X"neste caso. Como as atribuições de Pyth são modulares, isso substitui o espaço no local N%2por um Xe retorna a sequência resultante, que está, portanto, "X "na primeira, terceira, etc. linhas e " X"nas outras.


... mas o APL não é. Obrigado por esbarrar.
Gostaria de saber

"Pyth é novo demais para ser elegível para vencer" Eu não entendo isso e aceito este.
18720

1
@steenslag Para explicar, existe uma brecha padrão em que os idiomas mais recentes que a questão não são elegíveis. Isso é para evitar idiomas projetados especificamente para se sair bem em um desafio específico. Você é livre para fazer o que quiser com o seu desafio, é claro.
Isaacg

11

Golfscript - 17 caracteres

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

Análise

~converter entrada para um
:Narmazenamento int na variável N
,{...}para cada valor de [0 ... N-1]
"X "N*repita "X" para fornecer uma sequência de caracteres N * 2,
>pegue a substring a partir do índice do loop ...
N<... N caracteres finais depois
ncolocam uma nova linha no final de cada string


5

Perl, 41 40

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

Perl 5.10 ou posterior, executado com perl -nE 'code'( ncontado no tamanho do código)

Saída de amostra:

$ 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

O que o 'x' em 'x 40' faz?
21311 rss:

2
@steenslag: xé o operador de repetição de string. 'a' x 3rendimentos 'aaa'.
JB


3

Python, 76 caracteres

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 caracteres

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 Nonde n é sua entrada no programa.


3

APL (16)

Supondo ⎕IO=0(ou seja, matrizes indexadas a zero, é uma configuração)

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

Explicação:

  • ⍳2⍴⎕: leia um número N e crie uma matriz N × N contendo (0,0) a (N-1, N-1).
  • 2⊤¨: obtém o bit menos significativo de cada número na matriz. (Agora, temos (0,0), (0,1), (0,0) ... (1,0), (1,1), (1,0) ...)
  • =/¨: para cada par, veja se os dois números são iguais. (Agora temos 1 0 1 0 1 0 ...)
  • ' X'[... ]: coloque um espaço para cada 0 e um X para cada 1.

3

Ruby 45 42

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

Demonstração: http://ideone.com/Mw25e


(x=gets.to_i).timessalva três caracteres. Por que o interesse repentino e renovado por esse velho?
steenslag

@steenslag Thanks! Eu apliquei sua dica. Acabei de ver essa pergunta no topo da lista e pensei em postar uma resposta para acabar com minhas habilidades em Ruby. Aparentemente, eu não os espanei o suficiente. :)
Cristian Lupascu

2

Pitão

48 Chars

EDIT: Kinda errado ... Há um espaço extra no final ... mas isso não é visível. Se você alterar o espaço para "O" (ou qualquer caractere que não seja de espaço em branco), modifique [i%2:n]para [i%2:n+i%2]. para a versão correta.

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

2

C ++ - 253 caracteres ofuscados

#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
Eu amo todos os números mágicos.
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));

Tenho certeza que você pode converter para número como em +'1'vez de parseInt('1'). Não lhe dará um número inteiro, mas não acho importante tê-lo como um número inteiro aqui, é?
Some Guy

2

k (26 caracteres)

26 Para a função nua:

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

Ou mais 7 para receber sugestões de stdin

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

2

Bash: 60 caracteres

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

O tamanho da tabela é passado como parâmetro de linha de comando, por exemplo bash chesstable.sh 8.


2

Java 10, função lambda, 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":""));}

Experimente online aqui .

Agradecimentos ao ceilingcat por jogar 4 bytes e a Kevin Cruijssen por jogar mais 3.

Versão não destruída:

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

Experimente online aqui .

Versão não destruída:

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 Thanks! Consegui reduzir mais um byte e apliquei sua abordagem ao meu programa completo também. 16 bytes salvos lá.
OOBalance

Fazendo duas s+=é de 2 bytes mais curto do que os parêntesis: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

Ou, mais uma fora de bytes (84 no total), imprimindo directamente (com o parêntesis volta novamente xD): n->{for(int i=0;i<n*n;)System.out.print(((i%n+i/n)%2<1?"X":" ")+(++i%n<1?"\n":""));}. Experimente online.
Kevin Cruijssen

Sugerir em "X ".charAt(i%n+i/n&1)vez de((i%n+i/n)%2<1?"X":" ")
ceilingcat 12/04


2

APL (Dyalog Extended) , SBCS de 12 bytes

Função de prefixo tácito anônimo. Requer ⎕IO←0(indexação baseada em zero).

'X '⊇⍨2|⍳+⍀⍳

Experimente online!

ɩ ndices 0 ... n-1

+⍀ além de tabela com isso horizontal e verticalmente:

ɩ ndices 0 ... n-1

2| restante divisão quando dividido por dois

'X '⊇⍨ use essa matriz para indexar na string


2

Scala, 68 bytes

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

ou

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

Experimente online!


2

Brainfuck, 140 bytes

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

2

Javascript, 67 bytes

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

Experimente online

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

Experimente online

C64 básico, 89 bytes

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

enter image description here


Você pode usar o on...go tocomando condicionalmente, como ON-(I+JAND1)GOTO3:?"X";:onde é zero, ele passará para a instrução a seguir, nesse caso, se (I + J AND 1) === 0for imprimir o X. Isso permite que você inclua mais instruções por linha e salve bytes.
Shaun Bebbers


2

Scala, 40 e 54

O número de caracteres é 40 para uma função, 54 para um programa completo.

A solução que fornece apenas um corpo de função é:

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

Experimente online

 

A solução que oferece um programa completo é:

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

Você pode executá-lo usando a seguinte linha de comando.

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

onde 8 é a entrada.


1
Bem-vindo ao PP&CG e boa primeira resposta. Existe um site legal chamado Try It Online que permite obter contagens de bytes fáceis e compartilhar execuções. Verifique a outra resposta Scala para ver um exemplo disso . Não é necessário ter em mente, é bom ter.
Veskah

Obrigado @Veskah pela sugestão.
jseteny 17/05

Solução agradável, alterando isso para uma função e usando o mapa, você obtém 34 caracteres:("X "*n)sliding n take n map println
pme

@ pme Obrigado pela sugestão, mas não há saída se eu substituir o foreach pelo mapa. No entanto, eu mudo para uma função, como você sugeriu.
jseteny

você está certo - desculpe parece mapa é preguiçoso; (.
pme

1

Python - 127 caracteres

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 "}para 22 ... ah não, tem o mesmo bug que o seu - não tem 4 X's nas linhas ímpares para a entrada 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 caracteres (sem espaço em branco)

Permite a entrada da função x e y.

Também suporta entradas ímpares agora.

Se você estilizar a saída com 0,65 em altura de linha e alterar ▒█ e █░ para □ ■ e ■ □, ela será parecida com um tabuleiro de xadrez real (quadrado).

Código:

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

Resultado:

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

Funciona para placas com um número ímpar de quadrados por lado?
Gareth

@Gareth Agora ele faz
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

Eu provavelmente poderia ter portado a resposta GolfScript, mas aqui está uma abordagem diferente. (E CJam não é elegível para ganhar de qualquer maneira.)

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

Teste aqui.

A idéia é iterar sobre a grade 2D com índices x e y na pilha, usando o f{f{...}}truque . Dado xey, podemos simplesmente determinar preto e branco (x+y)%2e usá-lo para escolher entre o caractere Xe uma string que contém um espaço.


1

J, 21 caracteres

J também estava desaparecido.

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

Anterior, 22 caracteres:

Códigos de caracteres do padrão mod2 de row # + column #:

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

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

16 bytes $"1[:|.&'X '"+i. Experimente online!
Jonah

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";}
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.