回答編集履歴

11

ライフゲーム風のコードを追加

2020/11/20 04:58

投稿

kazuma-s
kazuma-s

スコア8224

test CHANGED
@@ -53,3 +53,47 @@
53
53
  **追記2**
54
54
 
55
55
  上記のコードは n が偶数の場合正しくなかったので修正しました。
56
+
57
+
58
+
59
+ **追記3**
60
+
61
+ fanaさんのライフゲーム風のコードをこんな風に書いてみました。
62
+
63
+ ```C
64
+
65
+ #include <stdio.h> // scanf, printf
66
+
67
+ #include <stdlib.h> // malloc. free
68
+
69
+ #include <string.h> // memset
70
+
71
+
72
+
73
+ #define transform(k, op) \
74
+
75
+ for (int i = k; i < n; i++) { \
76
+
77
+ printf("%.*s\n", w, a); \
78
+
79
+ for (int j = 0; ++j < w-1; ) b[j] = " *"[a[j-1]=='*' op a[j+1]=='*']; \
80
+
81
+ t = a, a = b, b = t; \
82
+
83
+ }
84
+
85
+
86
+
87
+ int main(void) {
88
+
89
+ int n, w = (scanf("%d", &n), n*2+1);
90
+
91
+ char *s = malloc(w*2), *a = memset(s, ' ', w*2), *b = (a[n] = '*', s+w), *t;
92
+
93
+ transform(1, |) transform(0, &) free(s);
94
+
95
+ }
96
+
97
+ ```
98
+
99
+ for文の (;;) を除いて、「;」が 1行に 1つという制約で短縮しています。

10

コード修正

2020/11/20 04:58

投稿

kazuma-s
kazuma-s

スコア8224

test CHANGED
@@ -42,7 +42,7 @@
42
42
 
43
43
  for (int j = -n; j <= n; j++)
44
44
 
45
- putchar(" *"[(i+j & 1)^(n & 1) && abs(i)+abs(j) < n]);
45
+ putchar(" *"[(i+j ^ n) & 1 && abs(i)+abs(j) < n]);
46
46
 
47
47
  }
48
48
 

9

コード修正

2020/11/20 00:53

投稿

kazuma-s
kazuma-s

スコア8224

test CHANGED
@@ -42,7 +42,7 @@
42
42
 
43
43
  for (int j = -n; j <= n; j++)
44
44
 
45
- putchar("* "[(i+j & 1) == (n & 1) || abs(i)+abs(j) > n]);
45
+ putchar(" *"[(i+j & 1)^(n & 1) && abs(i)+abs(j) < n]);
46
46
 
47
47
  }
48
48
 

8

n が偶数の場合の問題を修正

2020/11/20 00:50

投稿

kazuma-s
kazuma-s

スコア8224

test CHANGED
@@ -42,8 +42,14 @@
42
42
 
43
43
  for (int j = -n; j <= n; j++)
44
44
 
45
- putchar("* "[i+j & 1 || abs(i)+abs(j) >= n]);
45
+ putchar("* "[(i+j & 1) == (n & 1) || abs(i)+abs(j) > n]);
46
46
 
47
47
  }
48
48
 
49
49
  ```
50
+
51
+
52
+
53
+ **追記2**
54
+
55
+ 上記のコードは n が偶数の場合正しくなかったので修正しました。

7

コードの修正

2020/11/20 00:45

投稿

kazuma-s
kazuma-s

スコア8224

test CHANGED
@@ -44,8 +44,6 @@
44
44
 
45
45
  putchar("* "[i+j & 1 || abs(i)+abs(j) >= n]);
46
46
 
47
- }}
47
+ }
48
-
49
-
50
48
 
51
49
  ```

6

コメントの修正

2020/11/20 00:24

投稿

kazuma-s
kazuma-s

スコア8224

test CHANGED
@@ -28,7 +28,7 @@
28
28
 
29
29
  ```C
30
30
 
31
- #include <stdio.h> // scanf, printf, putchar
31
+ #include <stdio.h> // scanf, putchar
32
32
 
33
33
  #include <stdlib.h> // abs
34
34
 

5

コードの修正

2020/11/20 00:21

投稿

kazuma-s
kazuma-s

スコア8224

test CHANGED
@@ -38,12 +38,14 @@
38
38
 
39
39
  {
40
40
 
41
- for (int n, i = (scanf("%d", &n), -n); ++i < n; printf(" \n"))
41
+ for (int n, i = (scanf("%d", &n), -n); ++i < n; putchar('\n'))
42
42
 
43
- for (int j = (putchar(' '), -n); ++j < n; )
43
+ for (int j = -n; j <= n; j++)
44
44
 
45
45
  putchar("* "[i+j & 1 || abs(i)+abs(j) >= n]);
46
46
 
47
- }
47
+ }}
48
+
49
+
48
50
 
49
51
  ```

4

追記のコードの修正

2020/11/20 00:18

投稿

kazuma-s
kazuma-s

スコア8224

test CHANGED
@@ -42,7 +42,7 @@
42
42
 
43
43
  for (int j = (putchar(' '), -n); ++j < n; )
44
44
 
45
- putchar(" *"[(i + j + 1) & 1 && abs(i) + abs(j) < n]);
45
+ putchar("* "[i+j & 1 || abs(i)+abs(j) >= n]);
46
46
 
47
47
  }
48
48
 

3

別解の追加

2020/11/19 08:23

投稿

kazuma-s
kazuma-s

スコア8224

test CHANGED
@@ -21,3 +21,29 @@
21
21
  }
22
22
 
23
23
  ```
24
+
25
+ **追記**
26
+
27
+ fanaさんのコードを参考にしたら、こんなのが書けました。
28
+
29
+ ```C
30
+
31
+ #include <stdio.h> // scanf, printf, putchar
32
+
33
+ #include <stdlib.h> // abs
34
+
35
+
36
+
37
+ int main(void)
38
+
39
+ {
40
+
41
+ for (int n, i = (scanf("%d", &n), -n); ++i < n; printf(" \n"))
42
+
43
+ for (int j = (putchar(' '), -n); ++j < n; )
44
+
45
+ putchar(" *"[(i + j + 1) & 1 && abs(i) + abs(j) < n]);
46
+
47
+ }
48
+
49
+ ```

2

宣言の順序を変更

2020/11/18 23:50

投稿

kazuma-s
kazuma-s

スコア8224

test CHANGED
@@ -10,7 +10,7 @@
10
10
 
11
11
  {
12
12
 
13
- for (int n = (scanf("%d", &n), n), i = 1, j = 1, k = n-1, s = 0; i; )
13
+ for (int s = 0, i = 1, j = 1, n, k = (scanf("%d", &n), n-1); i; )
14
14
 
15
15
  s==0 ? printf(" " ), !k-- && (k = i, s = 1) :
16
16
 

1

コード修正

2020/11/18 15:57

投稿

kazuma-s
kazuma-s

スコア8224

test CHANGED
@@ -10,13 +10,13 @@
10
10
 
11
11
  {
12
12
 
13
- for (int n = (scanf("%d", &n), n), i = 1, j = 1, k = 0, s = 0; i; )
13
+ for (int n = (scanf("%d", &n), n), i = 1, j = 1, k = n-1, s = 0; i; )
14
14
 
15
- if (!s) printf("%*s ", n-i, ""), k = i, s = 1;
15
+ s==0 ? printf(" " ), !k-- && (k = i, s = 1) :
16
16
 
17
- else if (s == 1) printf("* "), !--k && (s = 2);
17
+ s==1 ? printf("* "), !--k && (k = n-i, s = 2) :
18
18
 
19
- else printf("%*s\n", n-i, ""), i==n && (j = -1), i += j, s = 0;
19
+ !k-- ? printf("\n"), i==n && (j = -1), s = 0, i += j, k = n-i : printf(" ");
20
20
 
21
21
  }
22
22