¿Cuál es el número más alto de 4853 moviendo 2 fósforos?

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.


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()

Dos cosas a considerar:

La adición de un dígito es más valiosa que aumentar cualquier número individual.

El segundo movimiento más valioso es aumentar el número a la posición más a la izquierda.

Si existe alguna limitación de que el número de dígitos debe permanecer igual, la mejor opción es eliminar dos de 8 para que sea 7 y agregarlos a 4 para que sea 9. es decir, 9353.

El número mínimo de elementos para crear un nuevo dígito es de 2 elementos para crear el número 1. El único dígito en nuestro conjunto que puede convertir a otro número con 2 o menos eliminaciones es 8. Entonces, eliminar 2 de 8 para convertirlo en 3 y agregar un nuevo dígito al final hace 43531 . (Gracias a Parthiban Bala por señalar el error tipográfico)

Mi solución es similar a la respuesta de Parthiban Bala y Milo Schuman, con una excepción. Las pantallas de la calculadora muestran 7 con 4 elementos (una vertical a la izquierda), por lo que no será posible cambiar un 3 a 7 eliminando 2 elementos.

La misma técnica dada por Milo Schuman.

Lo único es que eliminaré los fósforos de 3 para que sea 7, y lo pondré al final del número en lugar de al frente.

Eso dará, 48571

(Editar)

Gracias a la respuesta de Abhilash Kizhakke Puliyakote. Me perdí que el número 7 tiene una línea vertical, en la esquina superior izquierda.

Nuevamente, voy a basar mi respuesta en la respuesta de alguien. Esta vez es de Abhilash Kizhakke Puliyakote. En lugar de eliminar dos líneas verticales en el extremo izquierdo de 8, para que sea 3, eliminaría la línea vertical inferior izquierda y la línea vertical superior derecha de 8, para que sea 5. Luego coloque los dos palos como uno en el fin.

Eso dará, 45531 🙂

14857 es mi suposición.

El mayor valor que pueden agregar dos fósforos a cualquier número se logra agregando uno al frente del número. Ahora, para minimizar la pérdida cuando se eliminan esas coincidencias por primera vez, queremos eliminarlas de los dígitos menos significativos posibles. Experimentando, encontrará que 3 puede transformarse en 7 al eliminar dos fósforos.

EDITAR: Argh, debería haber sabido que mi primera respuesta de Quora fallaría espléndidamente. Me remito a la mejor respuesta de Parthiban Bala.

Hasta ahora nadie mencionó el uso de los dos palos para hacer un símbolo “^”.

Por ejemplo, podría quitar dos palos de fósforo del 8, dejando un cinco atrás y luego insertar el ^ entre el 4 y el 5 para obtener 4 ^ 553.

Pero aún mejor es hacer coincidir los palos de los 3 que están detrás de un 7 y obtener un exponente aún mayor:

4 ^ 857

Editar: después de ver la respuesta de Apoorv Khandelwal, veo que extrañé que quitar dos palos de 8 para hacer 9 es una solución aún mejor. Mi nueva respuesta es así

4 ^ 953