Existen muchas respuestas diferentes, y nadie parece tener una prueba de que está en lo correcto. Así que abordé este problema metódicamente, cubriendo todos los casos. Resulta que otras respuestas habían cubierto los números más altos de [matemática] 2 ^ {nd} [/ matemática], [matemática] 3 ^ {rd} [/ matemática] y [matemática] 4 ^ {th} [/ matemática], Pero no es el número más alto.
Suposiciones
Se nos da una representación de [math] n \ in \ mathbb {N} \ cup \ {0 \} [/ math] en base [math] b \ in \ mathbb {N} [/ math]. Esta representación se define por una determinada configuración de barras para cada dígito. Queremos obtener el número máximo (en base [math] b [/ math]) que se puede obtener moviendo los palos [math] m \ in \ mathbb {N} \ cup \ {0 \} [/ math] de los dados representación. Cada movimiento de la palanca debe ser desde una posición en la representación original a una posición que no estaba en la representación original. Estamos trabajando con las siguientes configuraciones de barras para cada dígito, respectivamente.
- ¿Cuáles son los rompecabezas o enigmas más difíciles de resolver en todo el mundo?
- ¿Cómo es beneficioso para el cerebro resolver acertijos lógicos basados en cuadrículas?
- Mary tiene 16 años. Ella es 4 veces más vieja que su hermano. ¿Qué edad tendrá Mary cuando tenga el doble de edad que su hermano?
- ¿Cuál es el cubo IQ más difícil (como el cubo de Rubik) del mundo?
- ¿Cuál es el mejor cubo de Rubik para comprar?
Responder:
Para nuestra pregunta específica, se nos da [matemáticas] n = 4853 [/ matemáticas], [matemáticas] b = 10 [/ matemáticas] y [matemáticas] m = 2 [/ matemáticas]. El mayor número que se puede formar moviendo [math] 2 [/ math] palos desde la representación de [math] 4853 [/ math] es [math] \ boxed {49531} [/ math] (moviendo el [math] 8 [/ math] ‘s dos palos izquierdos inferiores para crear [math] 1 [/ math]). Los siguientes números [math] 65 [/ math] son todos los que se pueden crear moviendo los palos [math] 2 [/ math] de [math] 4853 [/ math]: [math] [1858, 1883, 3053, 3653, 4003, 4050, 4056, 4062, 4065, 4069, 4258, 4283, 4358, 4383, 4558, 4583, 4603, 4650, 4656, 4662, 4665, 4669, 4823, 4832, 4835, 4839, 4864, 4887, 4892, 4895, 4899, 4958, 4983, 5053, 5653, 7863, 9033, 9052, 9055, 9059, 9093, 9263, 9363, 9563, 9633, 9652, 9655, 9659, 9693, 9843, 9854, 9867, 9963, 11853, 14253, 14353, 14553, 14857, 14953, 18531, 42531, 43531, 45531, 48571, 49531] [/ matemáticas]. En caso de que alguien tenga curiosidad, obtenemos [matemática] 9 [/ matemática] números posibles (que van desde [matemática] 4063 [/ matemática] a [matemática] 9653 [/ matemática]) cuando se cambia [matemática] m [/ matemática] a [matemática] 1 [/ matemática], y obtenemos [matemática] 274 [/ matemática] números posibles (que van desde [matemática] 253 [/ matemática] (representada por [matemática] 0253 [/ matemática]) a [matemática] 98511 [/ math]) cuando [math] m [/ math] se cambia a [math] 3 [/ math].
Código:
El siguiente script de Python encuentra todos los números que se pueden crear a partir de un [math] n \ in \ mathbb {N} \ cup \ {0 \} [/ math] inicial, permitiendo exactamente [math] m \ in \ mathbb {N} \ cup \ {0 \} [/ math] movimientos de palanca. Codifica cada dígito como una lista booleana (Verdadero si una posición tiene un palo). Utiliza un algoritmo de retroceso al tiempo que garantiza que cada movimiento del stick sea desde una posición original que estaba en la representación del número original a una posición que no contenía un stick en la representación del número original.
MAX_DIGIT_STICKS = 7
def main ():
número = 4853
numMoves = 2
numberBase = 10
# A continuación debe especificar la configuración del stick para cada dígito para la base.
digitToSticks = dict ()
digitToSticks [-1] = [Falso] * MAX_DIGIT_STICKS
digitToSticks [0] = [Verdadero, Verdadero, Verdadero, Falso, Verdadero, Verdadero, Verdadero]
digitToSticks [1] = [Falso, Falso, Verdadero, Falso, Falso, Verdadero, Falso]
digitToSticks [2] = [Verdadero, Falso, Verdadero, Verdadero, Verdadero, Falso, Verdadero]
digitToSticks [3] = [Verdadero, Falso, Verdadero, Verdadero, Falso, Verdadero, Verdadero]
digitToSticks [4] = [Falso, Verdadero, Verdadero, Verdadero, Falso, Verdadero, Falso]
digitToSticks [5] = [Verdadero, Verdadero, Falso, Verdadero, Falso, Verdadero, Verdadero]
digitToSticks [6] = [Verdadero, Verdadero, Falso, Verdadero, Verdadero, Verdadero]
digitToSticks [7] = [Verdadero, Falso, Verdadero, Falso, Falso, Verdadero, Falso]
digitToSticks [8] = [True] * MAX_DIGIT_STICKS
digitToSticks [9] = [Verdadero, Verdadero, Verdadero, Verdadero, Falso, Verdadero, Falso]
respuestas = lista (getAllNumbers (número,
numMoves,
digitToSticks,
numberBase))
respuestas.sort ()
print str (respuestas)
# #
# Obtenga todos los números que se pueden crear moviendo los palos “numMoves” de
# los palos que representan “número”.
# Use el mapa “digitToSticks” y asuma que la base es “numberBase”.
# #
def getAllNumbers (número,
numMoves,
digitToSticks,
numberBase):
sticksToDigit = dict ()
para dígito en digitToSticks:
sticksToDigit [tuple (digitToSticks [digit])] = dígito
return helpGetAllNumbers (numMoves,
convertNumberToSticks (número,
digitToSticks,
numberBase),
convertNumberToSticks (número,
digitToSticks,
numberBase),
0,
conjunto(),
sticksToDigit,
numberBase)
# #
# Obtenga todos los números que se pueden crear moviendo las barras “numMoves” del
# se pega en “currentStickNumber”, usando el mapa “sticksToDigit” y
# asumiendo que la base es “numberBase”. Además, use el hecho de que el original
# sticks eran “originalStickNumber”, y el “currentStickNumber” es
# desplazamiento del original por “currentNumberOffset”.
# Agregar y devolver el conjunto de “respuestas”.
# #
def helpGetAllNumbers (numMoves,
originalStickNumber,
currentStickNumber,
currentNumberOffset,
respuestas
sticksToDigit,
numberBase):
si numMoves == 0:
# Caso base: agregue el número de palo actual a las respuestas si es válido.
currentNumber = convertSticksToNumber (currentStickNumber,
sticksToDigit,
numberBase)
if currentNumber! = Ninguno:
answers.add (número actual)
devolver respuestas
para sourceDigitIndex en rango (len (originalStickNumber)):
sourceStickDigit = originalStickNumber [sourceDigitIndex]
# Elija un cierto dígito del cual quitar un palo.
para sourceStickIndex en rango (len (sourceStickDigit)):
si no sourceStickDigit [sourceStickIndex]:
Seguir
currentDigitIndex = sourceDigitIndex + currentNumberOffset
si no currentStickNumber [currentDigitIndex] [sourceStickIndex]:
Seguir
# Elija un cierto palo para eliminar de este dígito.
currentStickNumber [currentDigitIndex] [sourceStickIndex] = False
addStickToValidSpot (numMoves – 1,
originalStickNumber,
currentStickNumber,
currentNumberOffset,
respuestas
sticksToDigit,
numberBase)
currentStickNumber [currentDigitIndex] [sourceStickIndex] = True
devolver respuestas
# #
# Dado un “currentDigitIndex” y “currentStickIndex” en el dígito,
# devolver si este palo en particular existió o no en este lugar en el
# “originalStickNumber”. Utilice “currentNumberOffset” en caso de que el actual
# el número de palo se ha desplazado del “originalStickNumber”.
# #
def fromOriginalStickNumber (currentDigitIndex,
currentStickIndex,
originalStickNumber,
currentNumberOffset):
origDigitIndex = currentDigitIndex – currentNumberOffset
if origDigitIndex> = 0 y origDigitIndex <len (originalStickNumber):
return originalStickNumber [origDigitIndex] [currentStickIndex]
falso retorno
# #
# Agregue un palo a un lugar válido dado el “currentStickNumber”.
# Devuelve las “respuestas” una vez hecho esto, sabiendo que hay “numMoves”
# el palo se mueve hacia la izquierda. Use el mapa “sticksToDigit” y asuma
# la base es “numberBase”. Además, use el hecho de que el original
# sticks eran “originalStickNumber”, y el “currentStickNumber” es
# desplazamiento del original por “currentNumberOffset”.
# #
def addStickToValidSpot (numMoves,
originalStickNumber,
currentStickNumber,
currentNumberOffset,
respuestas
sticksToDigit,
numberBase):
addStickToExistingDigit (numMoves,
originalStickNumber,
currentStickNumber,
currentNumberOffset,
respuestas
sticksToDigit,
numberBase)
addMostSignificantDigit (numMoves,
originalStickNumber,
currentStickNumber,
currentNumberOffset,
respuestas
sticksToDigit,
numberBase)
addLeastSignificantDigit (numMoves,
originalStickNumber,
currentStickNumber,
currentNumberOffset,
respuestas
sticksToDigit,
numberBase)
devolver respuestas
# #
# Agregue un palo a un dígito existente en el “currentStickNumber”.
# Devuelve las “respuestas” una vez hecho esto, sabiendo que hay “numMoves”
# el palo se mueve hacia la izquierda. Use el mapa “sticksToDigit” y asuma
# la base es “numberBase”. Además, use el hecho de que el original
# sticks eran “originalStickNumber”, y el “currentStickNumber” es
# desplazamiento del original por “currentNumberOffset”.
# #
def addStickToExistingDigit (numMoves,
originalStickNumber,
currentStickNumber,
currentNumberOffset,
respuestas
sticksToDigit,
numberBase):
para newDigitIndex en el rango (len (currentStickNumber)):
newStickDigit = currentStickNumber [newDigitIndex]
# Elija un dígito existente al que agregar este palo.
para newStickPosition en rango (len (newStickDigit)):
si no es newStickDigit [newStickPosition]:
si no es de OriginalStickNumber (newDigitIndex,
newStickPosition,
originalStickNumber,
currentNumberOffset):
# Elija una nueva posición de dígitos que aún no haya tomado.
newStickDigit [newStickPosition] = True
helpGetAllNumbers (numMoves,
originalStickNumber,
currentStickNumber,
currentNumberOffset,
respuestas
sticksToDigit,
numberBase)
newStickDigit [newStickPosition] = False
devolver respuestas
# #
# Agregue un dígito más significativo al “currentStickNumber”.
# Devuelve las “respuestas” una vez hecho esto, sabiendo que hay “numMoves”
# el palo se mueve hacia la izquierda. Use el mapa “sticksToDigit” y asuma
# la base es “numberBase”. Además, use el hecho de que el original
# sticks eran “originalStickNumber”, y el “currentStickNumber” es
# desplazamiento del original por “currentNumberOffset”.
# #
def addMostSignificantDigit (numMoves,
originalStickNumber,
currentStickNumber,
currentNumberOffset,
respuestas
sticksToDigit,
numberBase):
newDigit = [False] * MAX_DIGIT_STICKS
currentStickNumber.append (newDigit)
para newStickPosition en rango (len (newDigit)):
newDigit [newStickPosition] = True
helpGetAllNumbers (numMoves,
originalStickNumber,
currentStickNumber,
currentNumberOffset,
respuestas
sticksToDigit,
numberBase)
newDigit [newStickPosition] = False
currentStickNumber.pop ()
devolver respuestas
# #
# Agregue un dígito menos significativo al “currentStickNumber”.
# Devuelve las “respuestas” una vez hecho esto, sabiendo que hay “numMoves”
# el palo se mueve hacia la izquierda. Use el mapa “sticksToDigit” y asuma
# la base es “numberBase”. Además, use el hecho de que el original
# sticks eran “originalStickNumber”, y el “currentStickNumber” es
# desplazamiento del original por “currentNumberOffset”.
# #
def addLeastSignificantDigit (numMoves,
originalStickNumber,
currentStickNumber,
currentNumberOffset,
respuestas
sticksToDigit,
numberBase):
newDigit = [False] * MAX_DIGIT_STICKS
currentStickNumber.insert (0, newDigit)
para newStickPosition en rango (len (newDigit)):
newDigit [newStickPosition] = True
helpGetAllNumbers (numMoves,
originalStickNumber,
currentStickNumber,
currentNumberOffset + 1,
respuestas
sticksToDigit,
numberBase)
newDigit [newStickPosition] = False
currentStickNumber.pop (0)
devolver respuestas
# #
# Dado un “número”, devuelve la lista de listas de palos que lo representan.
# Use el mapa “digitToSticks” y suponga que la base es “numberBase”.
# #
def convertNumberToSticks (número,
digitToSticks,
numberBase):
toReturn = list ()
si número == 0:
toReturn.append (list (digitToSticks [0]))
volver a Regresar
mientras que el número> 0:
currentDigit = número% numberBase
si currentDigit no está en digitToSticks:
raise Exception (“Digit:” + str (currentDigit) + “no en nuestro mapa”)
toReturn.append (list (digitToSticks [currentDigit]))
número / = númeroBase
volver a Regresar
# #
# Dado un “número de memoria”, devuelve el número que representan.
# Use el mapa “sticksToDigit” y suponga que la base es “numberBase”.
# #
def convertSticksToNumber (stickNumber,
sticksToDigit,
numberBase):
toReturn = 0
currentPower = 0
para stickDigit en stickNumber:
tupleStickDigit = tupla (stickDigit)
si tupleStickDigit no está en sticksToDigit:
regresar Ninguno
currentDigit = sticksToDigit [tupleStickDigit]
if currentDigit! = -1:
toReturn + = (numberBase ** currentPower) * currentDigit
currentPower + = 1
return None if currentPower == 0 else toReturn
if __name__ == ‘__main__’:
principal()