理解するのは難しいと思うので、どうやって作ったかを説明します。
まずは、普通の解答。
コード:
/*
\x 111111111122222222
y\123456789012345678901234567
1 * * * * * *
2 * * * * * * *
3 * * * * * * * *
4 * * * * * * * * *
5 * * * * * * * * *
6 * * * * * * * * *
7 * * * * * * * * *
8 * * * * * * * * *
9 * * * * * * * * *
10 * * * * * * * *
11 * * * * * * *
12 * * * * * *
*/
#include <stdio.h>
int hantei(int x, int y)
{
if (x % 2 == 0) return 0; // x が偶数の時は打たない
if (x <= 5) return 1; // 左の縦線
if (x >= 23) return 1; // 右の縦線
if (x >= y*2-1 && x <= y*2 + 4) return 1; // 斜線
return 0;
}
int main(void)
{
for (int y = 1; y <= 12; y++) {
for (int x = 1; x <= 27; x++)
putchar(hantei(x, y) ? '*' : ' ');
putchar('\n');
}
}
これは、次のように書けます。
コード:
int hantei(int x, int y)
{
return x%2 != 0 && (x<=5 || x>=23 || x>=y*2-1 && x<=y*2+4);
}
これで解答としては十分ですが、数式を四則演算だけで
書いてみようという邪悪な道へ進むと。
a % b は、a - a/b*b と同じです。
a >= b を a/b != 0、または a/b と書けます。
コード:
return x-x/2*2 && (5/x || x/23 || x/(y*2-1) && (y*2+4)/x);
|| は +、&& は * にできます。
コード:
return (x-x/2*2) * (5/x + x/23 + x/(y*2-1) * ((y*2+4)/x));