Есть ли формула для поиска этого набора чисел?

#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. Может быть, я упускаю что-то очевидное?