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.