Создание скрещенного квадрата


23

Создание скрещенного квадрата

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

Общая идея состоит в том, чтобы на выходе был полый квадрат с диагональным крестом:

Input: 7
Output:
*******
*#   #*
* # # *
*  #  *
* # # *
*#   #*
*******

В приведенном выше примере «*» представляют внешнее поле, а «#» - диагональный крест.

Обратите внимание, что в приведенном выше примере используются два разных символа, чтобы было легче увидеть, как выглядит вывод, ваша программа должна использовать только один символ.

вход

Целое число 1 или более, оно гарантированно будет нечетным.

Выход

Квадрат, составленный из персонажа по вашему выбору с крестом посередине.

  • Крест должен быть диагональным
  • Квадрат может быть выведен через функцию или записан для вывода
  • Конечные переводы в порядке
  • Можно вывести в виде графика, диаграммы или изображения, если вы тоже хотите

Примеры

Input: 1
Output:
*

Input: 3
Output:
***
***
***

Input: 5
Output:
*****
** **
* * *
** **
*****

Input: 7
Output:
*******
**   **
* * * *
*  *  *
* * * *
**   **
*******

Спекуляции

  • Функции или полные программы разрешены
  • Вы можете получить вход предпочитаемым способом
  • Стандартные лазейки запрещены
  • Программы должны работать без каких-либо дополнительных утверждений, т. usingЕ. C#Они должны быть включены в запись
  • Вы можете вывести из функции или распечатать результат

Это код гольф, поэтому выигрывает самое короткое решение.


1
Можем ли мы также индексировать эти результаты 0,1,2,3,...?
flawr

@flawr Я не на 100% уверен, что ты имеешь в виду
TheLethalCoder

@TheLethalCoder Он спрашивает, может ли он взять ввод nи напечатать квадрат размера 2n+1.
Мартин Эндер

@MartinEnder О, так в моих примерах ввод 1 дает, *но для него это будет ввод 0?
TheLethalCoder

1
@TheLethalCoder Да, и ввод 1даст ваш пример для 3.
Мартин Эндер

Ответы:


9

MATL , 20 19 17 байт

2-:XdtP!+~TTYa1YG

Вы можете попробовать это экспериментально в MATL онлайн . Возможно, вам придется обновить страницу, если она не работает.

Образец прогона:

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

Версия ASCII: 19 байт

2-:XdtP!+~TTYa~42*c

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


Но хотя бы убедитесь, что линии параллельны и прямоугольны. : D
flawr

@ Flawr Хм? Что вы имеете в виду?
Луис Мендо

По крайней мере, посередине выглядит так, будто стороны квадратов скошены, но это всего лишь иллюзии. Либо это? (Может быть и черная дыра за моим экраном, искажающая пространство-время.)
flawr

@flawr Или, может быть, пойти к окулисту :-P
Луис Мендо

Не работает над MATL online, версия 19.0.0. Хммм ...
Эрик Outgolfer

16

VBA Excel, 168 байт

Инструкция:

Я считаю, что Excel с помощью VBA является эффективным и достаточным инструментом для решения этой задачи. Установите лист Excel следующим образом

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

Да, мы используем маленькие, классические квадратные пиксели, как в старые времена, используя ячейки на листе в качестве пикселей. Ха-ха ...

Здесь я использую ячейку A1 в качестве ввода и меняю цвет шрифта на красный. Почему красный? Потому что красный цвет состоит из трех букв, поэтому он подходит для игры в гольф. Напишите и запустите следующий код в Immediate Window:

N=[A1]:Range("A1",Cells(N,N)).Interior.Color=vbRed:Range("B2",Cells(N-1,N-1)).Clear:For i=1To N:Cells(i,i).Interior.Color=vbRed:Cells(i,N+1-i).Interior.Color=vbRed:Next

Разрушил код:

Sub A()
    N = [A1]
    Range("A1", Cells(N, N)).Interior.Color = vbRed
    Range("B2", Cells(N - 1, N - 1)).Clear

    For i = 1 To N
        Cells(i, i).Interior.Color = vbRed
        Cells(i, N + 1 - i).Interior.Color = vbRed
    Next
End Sub

Пошаговое объяснение:

N = [A1]: Range("A1", Cells(N, N)).Interior.Color = vbRed

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

Range("B2", Cells(N - 1, N - 1)).Clear

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

Цикл по диагонали ячеек диапазона: Cells(i, i).Interior.Color = vbRed

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

Последний шаг и вывод: Cells(i, N + 1 - i).Interior.Color = vbRed

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


Cells.RowHeight=48:set r=[A1]:r.Resize(r,r).Interior.Color=0:[B2].Resize(r-2,r-2).Clear:For i=1To[A1]:set r=Union(r,Cells(i,i),Cells(i,r-i+1)):Next:r.Interior.Color=0
Тейлор Скотт

8

JavaScript (ES6), 96 байт

f=
n=>[...Array(n--)].map((_,i,a)=>a.map((_,j)=>i&&j&&n-i&&n-j&&i-j&&n-i-j?' ':'*').join``).join`
`
;
<input type=number min=1 step=2 oninput=  o.textContent=f(this.value)><pre id=o>


7

Python 2, 65 байт

i=n=2**input()/2
while i:print bin((n>i>1or~-n)|n|i|n/i)[2:];i/=2

Использует идею Джонатана Аллана о выводе двоичных чисел, таких как:

11111
11011
10101
11011
11111

Строки создаются с использованием битовой арифметики и отображаются в двоичном виде. Каждая часть это или введены в остальные. Части произведены степенями 2 n(фиксированными) и i(падающими) через

  1. Левая сторона 1
  2. Правая сторона n
  3. Диагонали iиn/i
  4. Сверху и снизу, n-1когда i==1или i==n.

Фактически, (1) и (4) объединяются, производя, 1когда 1<i<nи n-1иначе.


7

Python, 114 110 96 90 байт

Полностью изменилось:

lambda n:[bin(sum(2**p for p in[range(n),{0,n-1,r,n-1-r}][0<r<n-1]))[2:]for r in range(n)]

Возвращает список строк, символов с использованием 1и 0.
-6 байт благодаря TheBikingViking

Проверьте это на Ideone


Предыдущий Python 2 @ 110

def f(n):g=range(n);n-=1;print'\n'.join(''.join((c in(r,n-r,0,n)or r in(0,n))and'#'or' 'for c in g)for r in g)

Проверьте это на Ideone


Сохранить 6 байт путем преобразования в лямбда и реструктуризации и или выражение: lambda n:[bin(sum(2**p for p in[range(n),{0,n-1,r,n-1-r}][0<r<n-1]))[2:]for r in range(n)].
TheBikingViking

@TheBikingViking Ах, вы правы - я действительно должен был сыграть в гольф до мелочей (мое первоначальное намерение), прежде чем выдвинуть идею и заснуть: с.
Джонатан Аллан

7

Java 7, 131 130 128 125 124 122 байта

String c(int n){String r="";for(int i=n,j;n-->0;r+="\n")for(j=0;j<n;r+=i*j<1|n-i<2|n-j<2|i==j|i==n-++j?"*":" ");return r;}

3 байта сохранены благодаря @LeakyNun ;
1 байт сохранен благодаря @ OliverGrégoire в моем ответе на Рисование пустого квадрата # с заданным значением ширины ;
2 байта сохранены благодаря @cliffroot .

Ungolfed & тестовый код:

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

class M{
  static String c(int n){
    String r = "";
    for(int i = n, j; n-- > 0; r += "\n"){
      for(j = 0; j < n;
            r += i < 1      // Responsible for the first horizontal line
               | j < 1      // Responsible for the first vertical line
               | n-i < 2    // Responsible for the last horizontal line
               | n-j < 2    // Responsible for the last vertical line
               | i == j     // Responsible for the top-left to bottom-right diagonal line
               | i == n-++j // Responsible for the top-right to bottom-left diagonal line (and increasing j)
             ? "*"
             : " ");
    }
    return r;
  }

  public static void main(String[] a){
    System.out.println(c(1));
    System.out.println(c(3));
    System.out.println(c(5));
    System.out.println(c(7));
  }
}

Выход:

*

***
***
***

*****
** **
* * *
** **
*****

*******
**   **
* * * *
*  *  *
* * * *
**   **
*******

1
String c(int n){String r="";for(int i=-1,j;++i<n;r+="\n")for(j=0;j<n;r+=i<1|j<1|n-i<2|n-j<2|i==j|i==n-++j?"*":" ")return r;}Сохранено 4 байта
Утренняя монахиня

@ LeakyNun 3 на самом деле. Вам все еще понадобится ;внутренний цикл.
Кевин Круйссен

1
во-первых, я считаю, что это должно быть, i-->0а не n-->0вы можете использовать i*j<1вместо i<1|j<1 2 байтов
Cliffroot

@cliffroot Конечно, ты должен был что-то найти. Хехе, JK, спасибо! ;) Я помню, что я делал что-то подобное раньше в другом ответе, так что довольно плохо, я забыл сделать это здесь ..: S
Кевин Круйссен

6

Matlab, 68 66 64 58 байт

Поскольку графический вывод также разрешен:

k=input('');[x,y]=ndgrid(abs(-k:k));spy(~(max(x,y)<k&x-y))

Какие выходы например

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

Версии ascii only будут:

Это использует индексацию 0,1,2,3,...

k=input('');[x,y]=ndgrid(abs(-k:k));[(max(x,y)==k|~(x-y))*42,'']

Альтернативно с индексацией 1,3,7,...:

n=input('');k=1:n;m=eye(n);m([k,end-k+1])=1;[(m|flip(m'))*42,'']

Приятно, что графический вывод не только выглядит лучше, но и круто, что он короче в байтах. Обычно создание чего-то более графического вместо простого ASCII только увеличит количество байтов (обычно на много).
Кевин Круйссен

6

C #, 112 101 байт

Спасибо TheLethalCoder за напоминание о том, что эти анонимные лямбда-выражения-выражения-выражения разрешены в C #.

n=>{var r="";for(int y=n--,x;y-->0;r+="*\n")for(x=0;x<n;r+=y%n*x<1|y==x|y==n-x++?"*":" ");return r;};

Кто сказал, что C # не веселый язык для игры в гольф?



5

Логотип, 155 байт

Графическое решение, реализованное как функция

Я переписал свой ответ на Алфавитный треугольник и немного изменил углы вокруг. Как и прежде, rрисует линию символов. На этот раз bфункция рисует прямоугольник, рисуя один прямой край и одну диагональ, вращая и повторяя четыре раза. Это приводит к тому, что диагонали рисуются дважды (друг над другом), но кода было меньше, чем обрабатывать отдельно. Этот ответ также правильно обрабатывает четные числа. Мне пришлось добавить специальную обработку для ввода, 1чтобы предотвратить его дальнейшее развитие.

Я реализовал это как функцию, bкоторая принимает размер в качестве аргумента:

pu
to r:n:b:l repeat:n[rt:b label "A lt:b if repcount>1[fd:l]] end
to b:s
repeat 4[rt 90
r:s 90-heading 20 rt 135
r:s 90-heading 20*sqrt 2 rt 45]
end

Попробуйте это на интерпретаторе логотипа Calormen.com . Чтобы позвонить, добавьте строку и позвоните bв следующем формате:

b 7

Образец размера 7

... или попробуйте блюдо для сэмплера, которое рисует четыре образца размером 5, 7, 9 и 11, поворачиваясь на 90 градусов между ними:

repeat 4[
  b repcount*2+3
  rt 90
]

Образец нескольких размеров


4

R, 102 байта

    n=scan();for(i in 1:n){for(j in 1:n){z=" ";if(i%in%c(1,n,n-j+1)|j%in%c(1,i,n))z="*";cat(z)};cat("\n")}

Обратите внимание, что более эффективно выразить условие с использованием% в%, чем i == 1 | j == 1 | ...


Можно пропустить одного персонажа, если гарантировано, что ввод будет более одного: n=scan();for(i in n:1){for(j in n:2){z=" ";if(i%in%c(1,n,n-j+1)|j%in%c(i,n))z="*";cat(z)};cat("*\n")}
JDL


4

Haskell, 102 100 96 91 87 байт

c s=unlines.f$f.(#)where f=(<$>[1..s]);x#y|elem y[1,s,x]||elem x[1,s,s-y+1]='*'|1>0=' '
  • Сохранено 2 байта, благодаря flawr .
  • Сохранено еще 4 байта с использованием списочных представлений.
  • 5 байтов сохранены, объединяя улучшение flawr сany
  • 4 байта сохранены путем замены anyнаelem

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

cross :: Int -> String
cross s = unlines $ map line [1..s]
    where line y = map (pos y) [1..s]
          pos y x | x == y = '*'
                  | x == s - y + 1 = '*'
                  | y `elem` [1, s] = '*'
                  | x `elem` [1, s] = '*'
                  | otherwise = ' '

Я уверен, что это все еще можно улучшить, но это то, что я придумал на данный момент.

Старая версия:

c s=unlines.f$f.(#)where f=(<$>[1..s]);x#y|any(==y)[1,s,x]||any(==x)[1,s,s-y+1]='*'|1>0=' '

2
Вы используете [1..s]дважды, я думаю, вы могли бы определить это в where.
flawr

Это также привело бы к 102 байтам, поскольку нам пришлось бы добавить дополнительный пробел перед ключевым словом where. c s=unlines$(\m->(m#)<$>z)<$>z where z=[1..s];m#n|or((==)<$>[n,m]<*>[1,s])||n==m||n==s-m+1='*'|1>0=' '
sudee

1
Ах да, но вы можете упаковать <$>[1..s]в функцию, верно? Нравитсяc s=unlines$f(\m->f(m#))where m#n|or((==)<$>[n,m]<*>[1,s])||n==m||n==s-m+1='*'|1>0=' ';f=(<$>[1..s])
flawr

Хорошая мысль, это действительно работает. :)
sudee

1
PS:c s=unlines$f$f.(#)where f=(<$>[1..s]);m#n|or((==)<$>[n,m]<*>[1,s])||n==m||n==s-m+1='*'|1>0=' '
flawr

3

Java, 130 байт

s->{for(int i=0;i<s;i++)for(int j=0;j<s;j++)System.out.print((s-1-i==j||i==j||i==0||j==0||i==s-1||j==s-1)?j==s-1?"*\n":"*":" ");};

Тестовая программа

Consumer<Integer> consumer = s -> {
        for (int i = 0; i < s; i++) {
            for (int j = 0; j < s; j++) {
                System.out.print((s - 1 - i == j || i == j || i == 0 || j == 0 || i == s - 1 || j == s - 1) ? j == s - 1 ? "*\n" : "*" : " ");
            }
        }
    };

    consumer.accept(20);

+1! Я бы уточнил, что это Java 8, кстати. Кроме того, вы можете немного поиграть в гольф, удалив int предыдущий jи использовать int i=0,j;вместо этого. Вы также можете заменить все ||на |и удалить круглые скобки в троичной проверке. Кроме того, вы используете s-1четыре раза, поэтому я бы поместил это в переменную. Кроме того , вы можете изменить ==0к <1. Таким образом, в итоге он становится s->{for(int i=0,j,x=s-1;i<s;i++)for(j=0;j<s;j++)System.out.print(x-i==j|i==j|i<1|j<1|i==x|j==x?j==x?"*\n":"*":" ");}( 116 байт ) немного короче, чем мой ответ на Java 7 , так что хороший подход!
Кевин Круйссен

1
@KevinCruijssen Я всегда получаю более короткий ответ, но у меня больше возможностей для совершенствования, чем у вас в LMAO. Хорошо играл в гольф мой друг.
Шон Уайлд

Хехе. xD Не стесняйтесь использовать 116-байтовую версию, кстати. Это твой код, просто еще немного. ;) В моем ответе на Java 7 (который, к сожалению, длиннее) используется немного другой подход. Если бы я отредактировал его в 116-байтовую версию, я бы в основном украл ваш ответ, чего я не хочу.
Кевин Круйссен

Нет смысла просто копировать и вставлять ваши гольфы, я обычно выкладываю быстрый макет, а потом возвращаюсь к нему, чтобы посмотреть, пропустил ли я что-нибудь, что можно было бы сыграть в гольф. Но ты испортил это для меня :( ха-ха, JK
Shaun Wild

Ах, прости. Большинство советов, которые я дал, на самом деле присутствуют в Совете по игре в гольф на Яве . Я думаю, я просто 2quick4u. ;)
Кевин Круйссен

3

C 140 121 114 байтов

19 байтов благодаря Квентину.

7 байтов сохраняются при переключении из цикла с двойным вложением в один цикл.

main(a){scanf("%d",&a);for(int i=0;i<a*a;i++,i%a||puts(""))putchar(i/a&&i/a^a-1&&i%a&&-~i%a&&i%-~a&&i%~-a?32:42);}

Предложения по игре в гольф приветствуются.


Я никогда не программирую на C, но нельзя ли поместить int в первый цикл for, как в Java? Т.е. int i,j;for(i=0;кfor(int i=0,j;
Kevin Cruijssen

1
В прошлый раз, когда я использовал C, вы не могли даже поставить int i,j;после scanf!
Нил

Попробуйте n+~i-jи т. Д.
Нил

GCC в порядке с удалением #includeполностью.
Квентин

@Neil Что ты имеешь в виду под тем, что не можешь поставить это после этого?
Утренняя монахиня

3

PowerShell (133)

filter s($x){1..$x|%{$o="";$r=$_;1..$x|%{if($_-eq1-or$r-eq1-or$_-eq$x-or$r-eq$x-or$r-eq$_-or$r-1-eq$x-$_){$o+="*"}else{$o+="_"}};$o}}

Неуклюжий, но это работает достаточно хорошо.

s(11)
***********
**_______**
*_*_____*_*
*__*___*__*
*___*_*___*
*____*____*
*___*_*___*
*__*___*__*
*_*_____*_*
**_______**
***********

Предложения по игре в гольф, безусловно, приветствуются, прошло слишком много времени с тех пор, как я использовал PowerShell.


3

СИЛОС , 212 байт

readIO 
a = i
lbla
a - 1
t = a
t + 1
t % i
t * a
b = i
lblb
b - 1
u = b
u + 1
u % i
u * b
u * t
v = a
v - b
u * v
v = a
v + b
v + 1
v % i
u * v
u |
if u c
print #
GOTO d
lblc
print .
lbld
if b b
printLine 
if a a

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


:) спасибо за то, что вы привлекли больше внимания к этому языку
Рохан Джхунджхунвала

1
@RohanJhunjhunwala Мне понравилось программирование, спасибо за создание такого блестящего языка.
Утренняя монахиня

3

GNU sed, 117 114 + 1 (флаг r) = 115 байт

p;/^0$/Q;/^000$/{p;q}
h;s/./ /3g;s/  $/00/
:f;/ 00 /!{G;h;s/\n.*//p;t;:}
s/^(0 *)0  ?( *)0/\1 0\20 /
tf;s/00/0/p;g

Так как sed не имеет встроенной поддержки чисел, ввод дается в унарном формате на основе этого консенсуса . Вторая половина квадрата - это первая половина, которая была сохранена в обратном порядке в трюме.

Бег:

sed -rf crossed_square.sed <<< "00000"

Выход:

00000
00 00
0 0 0
00 00
00000

3

Python, 89 байт

Это был возврат! Я использовал модуль черепахи Python.

from turtle import*
n=input()
for i in[(n,n),(n,0),(0,n),(0,0),(n,0),(0,n),(n,n)]:goto(i)

Вот результат, когда n = 200:

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


1
+1 за творчество
mbx

2

Scala, 141 137 байт

val s=args(0).toInt-1;val t=0 to s;print(t.map{x=>t.map{y=>if(x==0||x==s||y==0||y==s||x==y||x==s-y)"*" else " "}.mkString+"\n"}.mkString)

Бег:

$ scala cross.scala 10

Технически я мог бы удалить материал для печати и перейти к чему-то вроде

def c(n:Int)={val (s,t)=(n-1,0 to n-1);t.map{x=>t.map{y=>if(x==0||x==s||y==0||y==s||x==y||x==s-y)"*" else " "}.mkString+"\n"}.mkString}

Это будет 135 или 121 байт в зависимости от того, считаете ли вы синтаксис функции.

Читаемая версия:

def cross(n: Int) = {
   // Declares both s and t as variables with tuple expansion
   // s is the zero-based size and t is a range from 0 to s
   val (s,t) = (n-1, 0 to n-1)

   // Maps all rows by mapping the columns to a star or a space
   t.map { x =>
      t.map { y =>
        if (x == 0 || x == s || y == 0 || y == s || x == y || x == s-y) "*" 
        else " "
      }.mkString+"\n" // Concatenate the stars and spaces and add a newline
   }.mkString         // Concatenate the created strings
 }


2

Python 2, 83 байта

i=n=input()
while i:l=['* '[1<i<n]]*n;i-=1;l[0]=l[~0]=l[i]=l[~i]='*';print`l`[2::5]

Изменяет список символов строки, чтобы поместить *в первое, последнее, i и i до последнего места. Первый и последний ряд начинаются как все *, а остальные как все пробелы. Работает и на вечер. lambdaВыражение, вероятно , короче , чем модификации, но мне нравится этот метод.



2

Mathematica, 81 байт

""<>#&/@Table[If[i^2==j^2||i^2==#^2||j^2==#^2,"*"," "],{i,-#,#},{j,-#,#}]&[(#-1)/2]&

Создает систему координат с началом координат в центре и вычисляет, куда *должны идти s. Выводит массив строк, по одной на строку.


2

Javascript ( 289 270 байт)

function s(a){b=[];for(i=0;i<a;i++)if(b.push([]),0==i||i==a-1)for(j=0;j<a;j++)b[i].push("*");else for(j=0;j<a;j++)0==j||j==a-1?b[i].push("*"):j==i||a-1-j==i?b[i].push("*"):b[i].push(" ");c="";for(i=0;i<b.length;i++){for(j=0;j<b[i].length;j++)c+=b[i][j];c+="\n"}return c}

Ungolfed:

function square(size){
str=[];

for(i=0;i<size;i++){
    str.push([]);
    if(i==0||i==size-1){
        for(j=0;j<size;j++){
            str[i].push("*");
        }
    }else{
        for(j=0;j<size;j++){
            if(j==0||j==size-1){
                str[i].push("*");
            }else if(j==i||size-1-j==i){
                str[i].push("*");
            }else{
                str[i].push(" ");
            }
        }
    }
}

out="";
for(i=0;i<str.length;i++){
    for(j=0;j<str[i].length;j++){
        out+=str[i][j];
    }
    out+="\n";
}
return out;
}

РЕДАКТИРОВАТЬ: Сохранено 19 байтов благодаря Филипп Фленкер.


С трейлингом новой строки все в порядке, я думаю, вам не нужен чекsize==1
Филипп Фленкер

1
@PhilippFlenker Правильно.
Пол Шмитц

1

Perl 83 +1 = 84 байта

Беги с -nфлагом.

$\="*
*";print$c="*"x($_+1);for$b(1..$_){@a=($")x$_;@a[$b-1,-$b]=(a,a);print@a}say$c

Буквальный перевод строки сохраняет на 1 байт больше \nили $/.

Удобочитаемый:

$\="*\n*";
print$c="*"x($_+1);
for$b(1..$_){
    @a=($")x$_;
    @a[$b-1,-$b]=(a,a);
    print@a
}
say$c

Код печатает верхнюю строку и сохраняет ее $c, затем печатает группу пробелов с соответствующими слотами, замененными на as, затем снова печатает верхнюю строку.

Присвоение $\переменной указывает интерпретатору печатать содержимое (звездочку, символ новой строки и другую звездочку) после каждого print, но это НЕ происходит после a say.


1

SmileBASIC, 46 байтов

INPUT I
GBOX I,I,1,1GLINE 1,I,I,1GLINE 1,1,I,I

(Нет, SB НЕ использует 1-индексированную графику ...)


1

Древесный уголь, 8 байт (неконкурентоспособен; вызов языковых постдатов)

GH+↘↑↙N*

Попробуйте онлайн! Ссылка на подробную версию кода. Объяснение: При использовании в качестве параметра PolygonHollowкоманды +рисует прямоугольник, а стрелки затем создают диагонали. Существуют и другие символы быстрого доступа, но их необходимо переопределить, чтобы они были полезны, например Y, эквивалентно, ↖↗↓но если бы оно было эквивалентным, ↗↓↖то этого Y+было бы достаточно.


1

ОБОЛОЧКА ( 135 байт ):

 C(){ j=$(($1-1));for i in $(seq 0 $j);do dc<<<2o10i`echo $((1|2**$i|2**($j-$i)|2**$j|(($i==0||$i==$j))*(2**$j-1)))`p;done|tr 01 ' X';}

Тесты:

 C 1
 X

 C 3
 XXX
 XXX
 XXX

 C 5
 XXXXX
 XX XX
 X X X
 XX XX
 XXXXX

 C 7
 XXXXXXX
 XX   XX
 X X X X
 X  X  X
 X X X X
 XX   XX
 XXXXXXX

 C 9
 XXXXXXXXX
 XX     XX
 X X   X X
 X  X X  X
 X   X   X
 X  X X  X
 X X   X X
 XX     XX
 XXXXXXXXX

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.