#python #math #numbers
#python #математика #числа
Вопрос:
Прошу прощения за название этого вопроса, я, честно говоря, понятия не имею, как называется этот тип математики. Я обновлю его, как только узнаю.
В головоломке всегда будет список чисел, длина может быть четной или нечетной. В этом случае у меня есть:
puzzle = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
Желаемый результат представляет собой список кортежей, каждый кортеж имеет правильное соединение. РЕДАКТИРОВАТЬ: я приложил скриншот того, как я могу определить, какое соединение правильное, а какое нет.
answer = [(0, 8), (1, 15), (2, 14), (3, 13), (4, 12), (5, 11), (6, 10), (7, 9), (1, 7), (2, 6), (3, 5), (9, 15), (10, 14), (11, 13)]
Мне удалось написать что-то, что работает для половины соединений, которые вы можете увидеть здесь:
from __future__ import division
puzzle = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
temp_connections = list()
x_connections = list()
middle_value = None
for dot in puzzle:
source = puzzle.index(dot)
destination = puzzle[-source]
if source != 0 and source != destination and source not in temp_connections:
# Connect the x adjacent dots.
puzzle_connection = (source, destination)
temp_connections.append(destination)
x_connections.append(puzzle_connection)
if source == 0:
# Connect the most opposite at this angle.
middle_value = int((len(puzzle)/2))
x_connections.append((source, middle_value))
print(x_connections)
# [(0, 8), (1, 15), (2, 14), (3, 13), (4, 12), (5, 11), (6, 10), (7, 9)]
К сожалению, мне все еще не хватает остальных 6 возможных подключений. Теперь мне удалось получить 3 из недостающих 6, но я чувствую, что двигаюсь в неправильном направлении.
from __future__ import division
puzzle = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
temp_connections = list()
x_connections = list()
y_connections = list()
middle_value = None
for dot in puzzle:
source = puzzle.index(dot)
destination = puzzle[-source]
if source != 0 and source != destination and source not in temp_connections:
# Connect the x adjacent dots.
puzzle_connection = (source, destination)
temp_connections.append(destination)
x_connections.append(puzzle_connection)
# Connect the y adjacent dots.
if source < middle_value and middle_value-source != source:
# This gets the first 3
y_connections.append((source, middle_value-source))
elif source > middle_value:
# This would get the last 3 but I don't think it's correct at all. Must be a better way...
pass
if source == 0:
# Connect the most opposite at this angle.
middle_value = int((len(puzzle)/2))
x_connections.append((source, middle_value))
print x_connections
print y_connections
# [(0, 8), (1, 15), (2, 14), (3, 13), (4, 12), (5, 11), (6, 10), (7, 9)]
# [(1, 7), (2, 6), (3, 5), (5, 3), (6, 2), (7, 1)]
Любая помощь по этому вопросу была бы признательна, даже намек на тип математики, который мне нужно изучить, был бы потрясающим. Заранее спасибо!
Комментарии:
1. Я не вижу, как вы строите «желаемый результат — список кортежей» — вы не даете никаких правил, как прийти к «правильному соединению» кортежей.
2.
int((len(puzzle)/2))
==len(puzzle)//2
,for dot in puzzle: source = puzzle.index(dot)
==for source,dot in enumerate(puzzle)
(если у вас нет дубликатов в нем) и другие вещи, которые можно было бы сделать лучше3. Не могли бы вы подробнее объяснить, как работает эта головоломка? Мне трудно это понять.
4. Я добавил скриншот, чтобы проиллюстрировать соединения, которые я вижу. Надеюсь, это поможет!
5. Список «головоломка» — это список вершин вокруг стороны объекта с одной гранью. Список всегда находится в порядке количества вершин. Цель состоит в том, чтобы соединить вершины друг с другом, чтобы грань была разделена на квадратики, как на скриншоте. Если есть нечетное число, может остаться треугольник.
Ответ №1:
Кажется, существует 4 типа соединений:
- горизонтальные связи между
i
иN-i
- вертикальные соединения «слева» между
i
иN//2-i
- вертикальные соединения «справа» зеркально отражают соединения «слева».
- дополнительное соединение при нечетном количестве точек
Вот расчет и визуализация этих ответов для 4 возможных типов конфигурации:
import numpy as np
import matplotlib.pyplot as plt
fig, axes = plt.subplots(nrows=2, ncols=4, figsize=(14, 9))
for N, ax in zip((4, 5, 6, 7, 16, 17, 18, 19), axes.ravel()):
ax.axis('off')
ax.set_aspect('equal')
ax.set_title(f'N = {N}', size=16)
ang = np.linspace(-np.pi, np.pi, N, endpoint=False)
x = np.sin(ang)
y = np.cos(ang)
for i, (xi, yi) in enumerate(zip(x, y)):
ax.text(xi * 1.1, yi * 1.1, i, ha='center', va='center')
ans1 = [(i, N - i) for i in np.arange(1, N / 2)]
ans2 = [(i, N // 2 - i) for i in np.arange(0, N / 4)]
ans3 = [(N - i, N - (N // 2 - i)) for i in np.arange(1, N / 4)]
ans4 = [(0, N - N // 2)] if N % 2 == 1 else []
answer = np.array(ans1 ans2 ans3 ans4, dtype=int)
for ans in answer:
ax.plot(x[ans], y[ans], 'b-', alpha=0.7)
plt.tight_layout()
plt.show()
Комментарии:
1. Ницца ( 1). Я думаю, что вы поняли, что пытался сделать OP, хотя я не совсем уверен в нечетном случае (который на самом деле не был прописан).
2. Сначала я реализовал кейс 16. Затем запустил и адаптировал его для 18 (есть 2 дополнительные вертикальные линии). Затем попробовал тот же код с 17, где, по-видимому, явно отсутствовала одна строка. Добавление этой строки также сработало для 19. Это также было хорошо для небольших чисел, за исключением N = 2. Может быть, я упускаю что-то очевидное?