Dado un valor x, encuentre el valor numérico más pequeño mayor que y que sea capaz de multiplicarse y dividirse por x manteniendo todos los dígitos originales.
- Los nuevos números no pierden dígitos.
- Los nuevos números no ganan dígitos.
Por ejemplo:
Entrada: x = 2, y = 250000
- Original: 285714
- División: 142857
- Multiplicación: 571428
Esto es cierto porque 285714 es mayor que y ; luego, cuando se divide por x da como resultado 142857 y cuando se multiplica por x da como resultado 571428 . En ambas pruebas, todos los dígitos originales de 285714 están presentes y no se han agregado dígitos adicionales.
Las normas
- X debe ser 2 o 3, ya que cualquier cosa más alta tarda demasiado en calcularse.
- Se requiere que Y sea un número entero mayor que cero .
- El código más corto gana.
Casos de prueba
Estos son mis casos de prueba más comunes, ya que son los más rápidos para detectar.
- x = 2, y = 250000 = 285714
- x = 2, y = 290000 = 2589714
- x = 2, y = 3000000 = 20978514
- x = 3, y = 31000000 = 31046895
- x = 3, y = 290000000 = 301046895
Aclaraciones
- El tipo de división no importa. Si puede obtener 2.05, 0.25 y 5.20 de alguna manera, siéntase libre.
¡Buena suerte a todos ustedes!
Respuestas:
Casco , 14 bytes
Pruébalo en línea!
Explicación
fuente
-
cuál estaba mal.Brachylog v2, 15 bytes
Pruébalo en línea!
Toma entrada en el formulario
[x,y]
.Explicación
Comentario
La debilidad de Brachylog al reutilizar múltiples valores varias veces se muestra aquí; Este programa es casi todo plomería y muy poco algoritmo.
Como tal, puede parecer más conveniente simplemente codificar el valor de y (hay un comentario sobre esta pregunta que supone que 2 es el único valor posible). Sin embargo, de hecho, existen soluciones para y = 3, lo que significa que, desafortunadamente, la tubería también debe manejar el valor de y . El más pequeño que conozco es el siguiente:
(La técnica que utilicé para encontrar este número no es totalmente general, por lo que es posible que haya una solución más pequeña que utilice algún otro enfoque).
Sin embargo, es poco probable que verifique eso con este programa. Brachylog
p
está escrito de una manera muy general que no tiene optimizaciones para casos especiales (como el caso en el que ya se conocen tanto la entrada como la salida, lo que significa que puede hacer la verificación en O ( n log n ) mediante la clasificación, en lugar de que el O ( n !) para el enfoque de fuerza bruta que sospecho que está usando). Como consecuencia, lleva mucho tiempo verificar que 105263157894736842 es una permutación de 315789473684210526 (lo he dejado funcionando durante varios minutos sin ningún progreso obvio).(EDITAR: Revisé la fuente de Brachylog por la razón. Resulta que si usa
p
dos enteros conocidos, el algoritmo utilizado genera todas las permutaciones posibles del entero en cuestión hasta que encuentre uno que sea igual al entero de salida, como el algoritmo es "input → indigits, permute indigits → outdigits, outdigits → output". Un algoritmo más eficiente sería configurar primero la relación outdigits / output , de modo que el retroceso dentro de la permutación pudiera tener en cuenta qué dígitos estaban disponibles).fuente
p
no se ejecutapermutation/2
con dos listas conocidas, incluso cuando se le dan dos enteros conocidos como argumentos; que genera todas las permutaciones del primer número entero (utilizandopermutation/2
con una lista conocida) y luego los compara con el segundo entero.Perl 6 , 56
54bytesPruébalo en línea!
Alternativa interesante, calcular n * x k para k = -1,0,1:
fuente
Limpio , 92 bytes
Pruébalo en línea!
Bastante simple. Explicación que viene en un momento.
fuente
q, 65 bytes
Dividir el número en la base 10, ordenar cada ascendente y verificar si es igual. Si no, incremente y vaya de nuevo
fuente
JavaScript (ES6),
767369 bytesSe guardaron 3 bytes utilizando
eval()
, como lo sugiere @ShieruAsakotoToma entrada como
(x)(y)
.Pruébalo en línea!
Una versión recursiva tendría 62 bytes , pero no es adecuada aquí debido a la gran cantidad de iteraciones requeridas.
¿Cómo?
Ejemplo:
Al agregar dos matrices juntas, cada una de ellas se coacciona implícitamente a una cadena separada por comas. El último dígito de la primera matriz se concatenará directamente con el primer dígito de la segunda matriz sin una coma entre ellos, lo que hace que este formato no sea ambiguo.
Ejemplo:
Pero:
Comentado
fuente
x=>F=y=>(g=x=>r=[...x+''].sort()+'')(y*x)!=g(y)|r!=g(y/x)?F(y+1):y
Puede provocar un desbordamiento de la pila si y está lejos de la solución.eval
:x=>y=>eval("for(;(g=x=>r=[...x+''].sort()+'')(y*x)!=g(y)|r!=g(y/x);y++);y")
eval()
idea. Mi primer intento fue realmente recursivo, pero me di por vencido debido a la gran cantidad de iteraciones requeridas.Haskell,
7674 bytesDos bytes eliminados gracias al comentario de Lynn
fuente
f
puede ser,f x y=[n|n<-[y+1..],all(==s n)[s$n*x,s$n/x]]!!0
pero luego definir su respuesta como operador ahorra dos bytes:x!y=…
y luego su respuesta es(!)
:)Japt, 24 bytes
Solución bastante ingenua con unas pocas cervezas; Estoy seguro de que hay una mejor manera.
Intentalo
fuente
315789473684210526
es la primera solución parax=3
, Javascript o Japt no pueden calcularlo correctamente ya que no se ajusta con doble precisión.Python 2 , 69 bytes
Pruébalo en línea!
fuente
f=lambda x,y,S=sorted:y*(S(`y`)==S(`y*x`)==S(`y/x`))or f(x,y+1)
debería funcionar, pero alcanza el límite de recursión con bastante rapidez, y no sé qué tienen que decir las reglas de PPCG al respecto.Jalea ,
1413 bytes-1 gracias a Erik the Outgolfer (`` usa make_digits, por
D
lo que no fue necesario)+2 arreglando un error (gracias nuevamente a Erik the Outgolfer por señalar el problema de off-by)
Un programa completo que imprime el resultado (como enlace diádico se genera una lista de longitud 1).
Pruébalo en línea!
¿Cómo?
Tenga en cuenta que cuando la división no es exacta, la instrucción decimal implícita (equivalente a a
D
) aplicada antes de la clasificación produce una parte fraccionaria,por ejemplo:
1800÷3D
->[6,0,0]
while
1801÷3D
->[6.0,0.0,0.33333333333337123]
fuente
D
.>=
me lo perdí por completo! NoṢ
tenía idea de que make_digits se lo pusiera, gracias. Sin embargo, tendrá que arreglar y actualizar más tarde ...Mathematica,
8274 bytes-8 bytes gracias a tsh
Función que toma argumentos como
[x,y]
. Efectivamente una fuerza bruta de búsqueda que comprueba si la lista ordenada de dígitosy
,y/x
yxy
son los mismos.Pruébalo en línea!
fuente
x=3
, pero no estoy seguro de que sea ciertox=2
.v = a[1]*10^p[1] + a[2]*10^p[2] + ... + a[n]*10^p[n]
,u = a[1] * 10^q[1] + ... + a[n] * 10^q[n]
. Yu-v = a[1]*(10^p[1]-10^q[1]) + ... + a[n]*(10^p[n]-10^q[n])
como10^x-10^y=0 (mod 9)
siempre se sostiene.u-v=0 (mod 9)
siempre tiene. Si hay una respuesta incorrectaw
, desde entoncesw*x-w=0 (mod 9)
, yw-floor(w/x)=0 (mod 9)
: tenemosfloor(w/x)=0 (mod 9)
. sifloor(w/x)*x <> w
,w-floor(w/x)*x>=9
pero esto entra en conflicto con el hecho de quew-floor(w/x)*x<x
mientras x podría ser 2 o 3.w=0 (mod 9)
se deducew*x-w=0 (mod 9)
porquex-1
no es divisible por 3.IntegerQ
prueba, produce un par de errores cuando intenta hacerloIntegerDigits
en fracciones, pero Mathematica aún los supera y produce la respuesta correcta. No estoy seguro de si se permitirían los errores que se incluyen durante el cálculo, incluso si la respuesta final es correcta.APL (NARS), 490 caracteres, 980 bytes
prueba
Pensé que el problema era un número conveniente que puede variar para que uno tenga los 3 números r, r * x, r * x * x en la forma en que r comienza a un valor de que r * x está cerca de y (donde x e y son entradas del problema usando las mismas letras que la publicación principal). Utilicé la observación de que si el primer dígito de r es d que en r tiene que aparecer también los dígitos d * x y d * x * x, para hacer r (o mejor r * x) una solución.
fuente
05AB1E , 16 bytes
Pruébalo en línea. (NOTA: solución muy ineficiente, por lo tanto, use entradas cercanas al resultado. Funciona para entradas más grandes también localmente, pero en TIO se agota el tiempo de espera después de 60 segundos).
Explicación:
fuente