Как я могу поменяться между умножением и делением на 2 разных числа?

Мне даны целые числа X, Y и Z. На каждом шаге я могу либо умножить, либо разделить на 2 или 3. Мне нужно преобразовать X в Z точно за Y шагов... или определить, что это невозможно.

Например:

X is 9,
Y is 8,
Z is 4.

9 может стать 4: 9/3/3x2x2x2x2/2/2 = 4 Как вы можете видеть, я сделал 8 операций.

Как это можно сделать в Python?

2 ответа

Прежде всего используйте описательные имена переменных, такие как start, target и steps.

Нет, не существует простого способа сделать это, но есть простые способы.

Во-первых, вам нужно найти необходимые изменения. Разбейте начало и цель на факторы 2, факторы 3 и все остальное. Если это "что-нибудь еще" не совпадает, тогда вы не сможете решить проблему вообще.

Например, посмотрите на вашу заданную проблему: переходите от 9 к 4. Разбивая каждое число:

9 = 3*3    # no 2's, no other stuff
4 = 2*2    # no 3's, no other stuff

Поскольку "другие" вещи совпадают (то есть 1), вы можете сделать переход. Вам нужно удалить 2 фактора из 3 и добавить 2 фактора из 2. Это 4 шага. Оттуда все, что вам нужно сделать, это добавить пары *3/3 или *2/2, пока у вас не будет 8 шагов.

Давайте попробуем изменить 56 на 126:

 56 = 2*2*2*7   # no 3's, other = 7
126 = 2*3*3*7   # other = 7

Чтобы сделать переход, вам нужно удалить два 2 и добавить два 3. Это четыре шага; Вы настраиваете на желаемый номер, как и раньше.

Вот твоя атака; ты можешь это кодировать?

Просто для удовольствия, вот грубый метод, который масштабируется ужасно - O(у ^4),

def bruteforce(x, y, z, acc="", accv=None):
    if accv == z and len(acc) == y*2:
        return acc
    if accv is None:
        accv = x
    if len(acc) == y*2:
        return
    m2 = bruteforce(x, y, z, acc+'*2', accv*2)
    m3 = bruteforce(x, y, z, acc+'*3', accv*3)
    d2 = bruteforce(x, y, z, acc+'/2', accv/2)
    d3 = bruteforce(x, y, z, acc+'/3', accv/3)
    return m2 or m3 or d2 or d3

В бою:

In [49]: exp = bruteforce(9, 8, 4)

In [50]: exp
Out[50]: '*2*2*2*2/2/2/3/3'

In [51]: eval('9'+exp)
Out[51]: 4.0

In [52]: exp = bruteforce(13, 8, 4)

In [53]: exp

In [54]: exp = bruteforce(9, 7, 2)

In [55]: exp
Out[55]: '*2*2*2/2/2/3/3'

In [56]: eval('9'+exp)
Out[56]: 2.0

Будет глючить из-за неточности с плавающей точкой...

Другие вопросы по тегам