回答編集履歴

1

テキスト追加

2020/03/17 04:33

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -39,3 +39,111 @@
39
39
  ```
40
40
 
41
41
  - **動作確認用Repl.it:** [https://repl.it/@jun68ykt/Q247619](https://repl.it/@jun68ykt/Q247619)
42
+
43
+
44
+
45
+
46
+
47
+ ### 追記
48
+
49
+
50
+
51
+ もう一案、numpy を使ってみました。
52
+
53
+
54
+
55
+ ```python3
56
+
57
+ import numpy as np
58
+
59
+
60
+
61
+ LEFT_RIGHT = [
62
+
63
+ ['左', np.array([0, -1])],
64
+
65
+ ['右', np.array([0, 1])]
66
+
67
+ ]
68
+
69
+
70
+
71
+ UP_DOWN = [
72
+
73
+ ['上', np.array([-1, 0])],
74
+
75
+ ['下', np.array([1, 0])]
76
+
77
+ ]
78
+
79
+
80
+
81
+ DIAGONALS = [
82
+
83
+ [f'{lr[0]}{ud[0]}', lr[1] + ud[1]]
84
+
85
+ for lr in LEFT_RIGHT
86
+
87
+ for ud in UP_DOWN
88
+
89
+ ]
90
+
91
+
92
+
93
+ DIRECTIONS = {e[0]: e[1] for e in [*LEFT_RIGHT, *UP_DOWN, *DIAGONALS]}
94
+
95
+
96
+
97
+
98
+
99
+ def num_direction(num, grid, direction):
100
+
101
+ delta = DIRECTIONS[direction]
102
+
103
+
104
+
105
+ if delta is None:
106
+
107
+ return None
108
+
109
+
110
+
111
+ pos = np.array(divmod(num, grid)) + delta
112
+
113
+
114
+
115
+ if(((pos >= 0) * (pos < grid)).sum() == 2):
116
+
117
+ return grid * pos[0] + pos[1]
118
+
119
+ else:
120
+
121
+ return None
122
+
123
+
124
+
125
+
126
+
127
+ print(num_direction(7, 4, '上')) # => 3
128
+
129
+ print(num_direction(2, 4, '上')) # => None
130
+
131
+
132
+
133
+ print(num_direction(15, 4, '上')) # => 11
134
+
135
+ print(num_direction(15, 4, '左')) # => 14
136
+
137
+ print(num_direction(15, 4, '左上')) # => 10
138
+
139
+ print(num_direction(15, 4, '右')) # => None
140
+
141
+ print(num_direction(15, 4, '下')) # => None
142
+
143
+ print(num_direction(15, 4, '右上')) # => None
144
+
145
+
146
+
147
+ ```
148
+
149
+ - **動作確認用Repl.it:** [https://repl.it/@jun68ykt/Q2476192](https://repl.it/@jun68ykt/Q2476192)