Шахматная доска

18

Ввод: положительное число, меньшее 80, из стандартного ввода или в качестве аргумента командной строки.

Выход: квадратная шахматная фигура, размер входного числа. Темные поля представлены буквой «X», белые поля - пробелом. Верхнее левое поле должно быть 'X'.

Полная программа не требуется.


Примеры:

Вход : 1

Выход :

X

Вход : 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
steenslag
источник
1
Я искал тег типа «легкий» для этого.
Steenslag
1
Целая и полная программа, я полагаю?
JB
@JB: Да. Как мне это сформулировать? Добавить 'к stdout' к требуемому выводу?
Steenslag
1
Просто скажи, что хочешь законченную программу. Вы также можете указать аргументы командной строки , чтобы избежать путаницы с аргументами функции.
JB
Когда вы говорите сверху-справа, вы имеете в виду сверху слева? Если нет, исправьте пример выходных данных для ввода 8.
Питер Тейлор

Ответы:

5

Пиф, 13 символов

Примечание: Pyth слишком нов, чтобы иметь право на победу. Тем не менее, это был веселый гольф, и я решил поделиться им.

VQ<*QX*d2N\XQ

Попробуй это здесь.

Как это устроено:

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

В основном, это используется Xдля генерации "X "или " X"поочередно, затем повторяет это Qвремя строки и принимает его первые Qсимволы. Это повторяется Qраз.

Как работает Xфункция (назначить в)? Он принимает исходную строку, " "в данном случае, место назначения, Nв этом случае, и символ замены, "X"в этом случае. Поскольку присваивания Pyth являются модульными, это заменяет пространство в местоположении N%2на Xи возвращает результирующую строку, которая, следовательно, находится "X "в первой, третьей и т. Д. Строках, а также " X"в других.

isaacg
источник
... но APL нет. Спасибо, что натолкнулся. Интересно, будет ли OP повторно принимать ...
Adám
«Пиф слишком нов, чтобы иметь право на победу». Я не понимаю этого и не принимаю это снова.
Steenslag
1
@steenslag Чтобы объяснить, есть стандартная лазейка, что языки, более новые, чем вопрос, не подходят. Это сделано для предотвращения использования языков, специально предназначенных для решения конкретных задач. Конечно, вы можете делать то, что хотите, с вашей задачей.
Исаак
11

Golfscript - 17 символов

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

Анализ

~преобразовать ввод в
:Nхранилище int в переменной N
,{...}для каждого значения [0 ... N-1],
"X "N*повторить «X», чтобы получить строку из N * 2 символов,
>взять подстроку, начиная с индекса цикла ...
N<... окончание N символов позже
nпоставить новую строку в конце каждой строки

gnibbler
источник
5

Perl, 41 40

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

Perl 5.10 или более поздней версии, запускается с perl -nE 'code'( nсчитается в размере кода)

Образец вывода:

$ 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
JB
источник
Что делает «х» в «х 40» делать?
Steenslag
2
@steenslag: xэто оператор повторения строк. 'a' x 3доходность 'aaa'.
JB
4

Python, 48 символов

x,i=input(),0
exec'print(x*"X ")[i:i+x];i^=1;'*x
Нолен Роял
источник
3

Python, 76 символов

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 символов

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

Использование: scala filename Nгде n - ваш вклад в программу.

Gareth
источник
3

APL (16)

Если предположить, ⎕IO=0 (то есть массивы с нулевым индексом, это настройка)

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

Объяснение:

  • ⍳2⍴⎕: прочитайте число N и создайте матрицу N × N, содержащую (0,0) - (N-1, N-1).
  • 2⊤¨: получить младший значащий бит каждого числа в матрице. (Так что теперь у нас есть (0,0), (0,1), (0,0) ... (1,0), (1,1), (1,0) ...)
  • =/¨: для каждой пары посмотрите, равны ли два числа. (Теперь у нас есть 1 0 1 0 1 0 ...)
  • ' X'[... ]: ставьте пробел для каждого 0 и X для каждого 1.
Мэринус
источник
3

Руби 45 42

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

Демо: http://ideone.com/Mw25e

Кристиан Лупаску
источник
(x=gets.to_i).timesсохраняет три символа. Почему внезапно возобновился интерес к этому старику?
Steenslag
@steenslag Спасибо! Я применил твой совет. Я только что увидел этот вопрос в верхней части списка и решил опубликовать ответ, чтобы отряхнуть свои навыки в Ruby. Видимо, я их не достаточно вычистил. :)
Кристиан Лупаску
2

питон

48 символов

РЕДАКТИРОВАТЬ: Kinda Wrong ... В конце есть дополнительное место ... но это не видно. Если вы измените пробел на «O» (или любой непробельный символ), то измените [i%2:n]на [i%2:n+i%2]. для правильной версии.

n=input()
i=0;
while i<n:print('X '*n)[i%2:n];i+=1
st0le
источник
2

C ++ - 253 запутанных персонажа

#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);
}
Skizz
источник
1
Я люблю все магические числа.
Джои Адамс
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));
zzzzBov
источник
Я уверен, что вы можете преобразовать в число, как +'1'вместо parseInt('1'). Не даст вам целое число, но я не думаю, что важно, чтобы оно было целым, не так ли?
Какой-то парень
2

к (26 символов)

26 Для голой функции:

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

Или еще 7, чтобы принять вход от стандартного ввода

{-1',/x#',x#'("X ";" X");}"I"$0:0
skeevey
источник
2

Баш: 60 символов

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

Размер таблицы передается в качестве параметра командной строки, например bash chesstable.sh 8.

manatwork
источник
2

Java 10, лямбда-функция, 92 87 84 байта

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

Попробуйте это онлайн здесь .

Благодаря потолку catcat для игры в гольф 4 байта и Кевину Cruijssen для игры в гольф еще 3.

Безголовая версия:

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, полная программа, 155 139 байт

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

Попробуйте это онлайн здесь .

Безголовая версия:

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
        }
    }
}
OOBalance
источник
@ceilingcat Спасибо! Мне удалось сбрить еще один байт и применить твой подход ко всей моей программе. 16 байтов сохранено там.
OOBalance
Выполнение двух s+=на 2 байта короче скобок: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;}
Кевин Круйссен,
Или еще один байт от (84 в общей сложности ), печатая непосредственно (с скобкой снова XD): n->{for(int i=0;i<n*n;)System.out.print(((i%n+i/n)%2<1?"X":" ")+(++i%n<1?"\n":""));}. Попробуйте онлайн.
Кевин Круйссен
Предложите "X ".charAt(i%n+i/n&1)вместо((i%n+i/n)%2<1?"X":" ")
floorcat
2

APL (Dyalog Extended) , 12 байтов SBCS

Функция анонимного молчаливого префикса. Требуется ⎕IO←0(индексация с нуля).

'X '⊇⍨2|⍳+⍀⍳

Попробуйте онлайн!

ɩ ndices 0 ... п-1

+⍀ плюс таблица с этим по горизонтали и вертикали:

ɩ ndices 0 ... п-1

2| остаток деления при делении на два

'X '⊇⍨ использовать эту матрицу для индексации в строке

Адам
источник
2

Brainfuck, 140 байт

-[+[+<]>>+]>++++[<++++++++>-]<<<<<<,[->+>+>+<<<]>>[->[->.<[->>.>]<<<]<[<<<]>>>>>[-<+>]>[-<+>]<<[->>+<<]<<[-<+>]<[->+>>+<<<]++++++++++.[-]>>]
Уарса
источник
2

Javascript, 67 байт

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

Попробуйте онлайн

C 83 байта

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

Попробуйте онлайн

Базовый C64, 89 байт

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

введите описание изображения здесь

Йохан дю Туа
источник
Вы можете использовать on...go toкоманду условно, например, ON-(I+JAND1)GOTO3:?"X";:там , где она равна нулю, она будет переходить к следующему оператору, в этом случае, если (I + J AND 1) === 0тогда она напечатает X. Это позволяет вам упаковать больше операторов на строку и сохранить байты.
Шон Бебберс
1
C 81 байт
floorcat
2

Скала, 40 и 54

Количество символов составляет 40 для функции, 54 для полной программы.

Решение, дающее только тело функции:

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

Попробуйте онлайн

 

Решение, дающее полную программу:

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

Вы можете запустить его с помощью следующей командной строки.

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

где 8 - вход.

jseteny
источник
1
Добро пожаловать в PP & CG и хороший первый ответ. Есть хороший сайт под названием Try It Online, который позволяет вам легко подсчитывать байты и обмениваться данными. Проверьте другой ответ Scala, чтобы увидеть пример этого . Это не обязательно, просто приятно иметь.
Веска
Спасибо @Veskah за предложение.
jseteny
Хорошее решение, изменив это на функцию и используя карту, вы получите 34 символа:("X "*n)sliding n take n map println
pme
@pme Спасибо за предложение, но я не получу вывод, если я заменю foreach на map. Однако я изменил его на функцию, как вы предложили.
jseteny
Вы правы - извините, кажется, карта ленивая; (.
Pme
1

Python - 127 символов

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

С - 92 86

i,j;main(n){for(scanf("%d",&n);i<n;puts(""),i++)for(j=0;j<n;j++)putchar("X "[i+j&1]);}
Джои Адамс
источник
83 байта
Йохан дю Туа
1

Q, 33

{$[1=x mod 2;x;x-1]cut(x*x)#"X "}
tmartin
источник
{(x;x-1-x mod 2)#"X "}для 22 ... ах нет, имеет такую же ошибку , как ваша - оленья кожа имеет 4 иксы на нечетных строк для ввода 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 символов (без пробелов)

Позволяет вводить функции x и y.

Также поддерживает нечетные входы сейчас.

Если вы стилизуете вывод, чтобы иметь высоту строки 0,65 мкм, и измените ▒█ и █░ на □ ■ и ■ □, то он получится похожим на настоящую (квадратную) шахматную доску.

Код:

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

Выход:

░█░█░█░█░█░█░█
█░█░█░█░█░█░█░
░█░█░█░█░█░█░█
█░█░█░█░█░█░█░
░█░█░█░█░█░█░█
█░█░█░█░█░█░█░
░█░█░█░█░█░█░█
Горизонт событий
источник
Работает ли это на досках с нечетным числом квадратов на сторону?
Гарет
@ Гарет Теперь это так
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 байт

Я, вероятно, мог бы просто перенести ответ GolfScript, но здесь другой подход. (И CJam не имеет права на победу в любом случае.)

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

Проверьте это здесь.

Идея заключается в том , чтобы перебрать 2D - сетку с й и у индексов в стеке, используя в f{f{...}}трик . Учитывая x и y, мы можем просто определить черно-белое как (x+y)%2и использовать это, чтобы выбрать между символомX и строкой, содержащей пробел.

Мартин Эндер
источник
1

J, 21 символ

J тоже не хватало.

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

Предыдущая, 22 символа:

Char коды из шаблона mod2 row #+ column #:

   ([:u:88-56*2&|@+/~@i.) 5
randomra
источник
-2 байта:([:{&' X'=/~@$&1 0)
Bolce Bussiere
16 байт $"1[:|.&'X '"+i. Попробуйте онлайн!
Иона
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 байт

for(;@$i++<$k=$argv[1];){for($j=0;$j++<$k;)echo($i+$j)%2?' ':'X';echo"\n";}
Боян Иванов
источник