Encuentra un número no relacionado


20

Dados 2 enteros no negativos como entrada, genera un entero no negativo que no se puede crear a través de ningún operador matemático en las 2 entradas.

Por ejemplo, las entradas dadas 2y 3, 6, 0, 5, 1, 9, 8, 23, 2son todas las salidas inválidas.

Las operaciones que deben tenerse en cuenta son:

Addition        (a + b)
Subtraction     (a - b) and (b - a)
Multiplication  (a * b)
Division        (a / b) and (b / a)
Modulus         (a % b) and (b % a)
Exponentiation  (a ** b) and (b ** a)
Bitwise OR      (a | b)
Bitwise XOR     (a ^ b)
Bitwise AND     (a & b)
Concatenation   (a.toString() + b.toString()) and (b.toString() + a.toString())

En casos donde una operación conduciría a un número no entero (como 2/3), siempre piso. Entonces2 / 3 = 0

Suponga que cualquier operación no válida (como dividir por 0) da como resultado 0.

Entrada

2 enteros no negativos.

Se aceptan métodos estándar de E / S

Puede suponer que la entrada siempre estará dentro de un rango manejable para su idioma dado, sin embargo, recuerde que todavía existen vacíos legales .

Salida

Cualquier número entero no negativo que no se puede crear mediante ninguna de las operaciones anteriores en las 2 entradas.

Casos de prueba

Input  -> Invalid outputs
2, 3   -> 0, 1, 2, 3, 5, 6, 8, 9, 23, 32
0, 0   -> 0
17, 46 -> 0, 2, 12, 17, 29, 63, 782, 1746, 4617, 18487710785295216663082172416, 398703807810572411498315063055075847178723756123452198369
6, 6   -> 0, 1, 6, 12, 36, 66, 46656
1, 1   -> 0, 1, 2, 11

Puntuación

Este es el por lo que gana menos bytes!



Creo que la única forma de resolver esto es encontrar un número primo mayor que (a + b)
Dead Possum

1
@DeadPossum definitivamente sería una solución válida, aunque tal vez no sea la única o la más elegante;)
Skidsdev

Apuesto a que hay un lenguaje elegante que puede hacerlo en un par de bytes: D
Dead Possum

Respuestas:


20

Retina , 3 bytes

.
1

Pruébalo en línea!

Toma entradas separadas por espacio (o cualquier carácter único que no sea de nueva línea)

Reemplaza todos los dígitos con 1, y une los números resultantes con otro 1.

Prueba de corrección

Cortesía de Martin Ender.


técnicamente, esto no es unir los números resultantes con otro 1, simplemente toma la entrada como una cadena de 2 números separados por espacios y reemplaza cada carácter con un 1. Pero dicho esto, no puedo encontrar ningún ejemplo que demuestre que estás equivocado. .. todavía
Skidsdev

@Mayube, por supuesto, sí, y como tal podría funcionar con cualquier cadena, no solo una compuesta por dos números separados por un solo espacio. Mi explicación es en términos de la abstracción de "dos números de entrada".
Leo

2
"Se sabe [sic] que [...] una repunidad en la base 10 no puede ser [...] un poder perfecto". Ninguna operación en la lista dada que no sea la exponenciación puede generar más dígitos que el número total de dígitos de entrada, por lo que esto debería ser válido.
Martin Ender

¡Maldito cabrón! +1
Fondo La demanda de Mónica

¡Funciona también en QuadR !
Adám

11

Jalea , 3 bytes

+Æn

Pruébalo en línea!

Explicación:

+Æn Arguments: x, y
+                            x + y.
 Æn Find a prime larger than

Creo que esto es válido ...
Erik the Outgolfer

Supongo que esto suma la entrada y la salida del primer primo mayor que la suma.
Skidsdev

1
@DeadPossum Estaba a punto de escribir uno. Espero haberlo jugado bien.
Erik the Outgolfer

1
El postulado de Bertrand debería ser lo suficientemente bueno como para demostrar que la concatenación funciona. Concatenando con el número más pequeño b a la derecha tenemos a..b> = 10a> 4a> 2 (a + b), y concatenando con el número más pequeño b a la izquierda tenemos b..a> (b + 1) a. El único caso interesante no pequeño aquí debería ser b = 1, donde tenemos 1..a> 2a = 2 (a + b) - 2. El lugar donde este límite es el más ajustado es para a = 9 ... 9) Este es el único caso no pequeño que podría ser un problema para el postulado de Bertrand. Sin embargo, hay mejores resultados como mathoverflow.net/questions/2724
tehtmi

1
Supongo que hay una versión del postulado de Bertrand que demuestra que n <p <2n - 2 debería funcionar para todo. Estaba pensando n <p <2n.
tehtmi

9

Python 2 , 8 bytes

'1'.join

Pruébalo en línea!

Toma una lista de dos cadenas de números como entradas, genera una sola cadena de números. Concatena los números con a 1en el medio.

El resultado tiene demasiados dígitos para cualquier cosa que no sea exponente. Tenga en cuenta que la salida de (x,y)tiene un dígito más xy ycombinado, a menos que xo yes 0. Para exponente, se comprueba, comprobamos que esto significa que x**ynunca más partidos.

  • Si xes 0 o 1, entonces también lo es x**y, lo cual es demasiado pequeño
  • Si y<=1, entonces x**y<=xes demasiado pequeño
  • Si y==2, entonces x**2debe tener dos dígitos más que x. Esto sucede hasta x=316, y no podemos verificar ninguno de esos trabajos.
  • Si y==3, entonces x**3debe tener dos dígitos más que x. Esto sucede hasta x=21. Podemos comprobar que ninguno de esos funciona.
  • Si 3<y<13, entonces x**yrápidamente se hace demasiado largo. Solo es plausible tiene el número correcto de dígitos x<=25, y podemos verificarlos.
  • Si y>=14, entonces x**yes demasiado largo, incluso para el más pequeño posible x==2.

7

CJam (7 caracteres)

{+))m!}

Esto crea un número (a+b+2)!que es mayor que el número relacionado más grande en casi todos los casos.

Es bastante obvio que el mayor número relacionado debe ser uno de a ** b, b ** a, concat(a, b), concat(b, a).

Si consideramos logaritmos, encontramos que

  • log(a ** b) = b log a
  • log(concat(a, b)) ~= (log a) + log (b)
  • log((a + b + 2)!) ~= (a + b + 2) log (a + b + 2) - (a + b + 2)

Por lo tanto, asintóticamente es más grande, y solo tenemos que preocuparnos por unos pocos casos pequeños. De hecho, el único caso para el que el valor de salida no es mayor que todos los números relacionados es 0, 1(o 1, 0), para el cual da 6y el número relacionado más grande es 10.


3

JavaScript (ES6), 15 bytes

Toma entrada en la sintaxis de curry.

a=>b=>a*a+b*b+2

a² + b² + 1 fallaría para muchas entradas como 3² + 5² + 1 = 35 o 7² + 26² + 1 = 726 (concatenación). a² + b² + 2 debe ser seguro. Esto se probó exhaustivamente para 0 ≤ a ≤ b ≤ 50000 .

Manifestación


1
Esto debería estar a salvo de la concatenación. Sea b el número concatenado a la derecha. Fijando b, podemos resolver una ecuación cuadrática para a: a ^ 2 + b ^ 2 + 2 - 10 ^ k * a - b = 0. El discriminante de la cuadrática debe ser un cuadrado perfecto para que esta ecuación tenga una solución entera . El discriminante es 10 ^ 2k - 4 (b ^ 2 - b + 2) = 10 ^ 2k - (2b - 1) ^ 2 - 7. Considere el módulo 9. k no importa y nunca obtenemos un residuo cuadrático para cualquier si.
tehtmi

3

Python, 115 95 79 bytes

Estúpida solución directa. Siéntete libre de superarme.

x,y=input()
f=lambda x,y:[x+y,x*y,x**y,int(`x`+`y`)]
print max(f(x,y)+f(y,x))+1

+12 bytes por estúpido x/0.
-20 bytes gracias a @RobinJames
-16 bytes gracias a @tehtmi


x / y si y else 0 será menor o igual x * y para x, y no negativo, así que creo que puede recuperar esos 12 bytes más otros 3
Robin James Kerrison

@RobinJames Ah sí, soy tonto. Gracias.
HyperNeutrino

1
Creo que debería poder eliminar más casos: 1) x - y <= x <= x + y; 2) x% y <= y <= x + y; 3,4,5) x | y = x ^ y + x & y <= x ^ y + 2 * (x & y) = x + y. (Para el último, XOR es como agregar sin acarreo, y AND está encontrando los bits que llevarían. O está tomando (1, 1) -> 1 en lugar de (1,1) -> 2 como en una suma real).
tehtmi

2

Python, 27 bytes

lambda a,b:(a+b+9)**(a+b+9)

Emite un número mayor que todos los números relacionados.

Pruébalo en línea!

-1 byte gracias a Kevin Cruijssen.
-2 bytes gracias a Dead Possum.


Su enlace TIO está vacío. Además, creo que puedes eliminar el espacio después :si no me equivoco.
Kevin Cruijssen

@KevinCruijssen Whoops, solucioné eso, ¡gracias!
Ankoganit

Puede eliminar f=- lambda sin nombre es aceptable
Dead Possum

@DeadPossum No lo sabía, ¡gracias!
Ankoganit

Probablemente podría deshacerse de al menos uno de los dos nueves (y el correspondiente +), pero no estoy totalmente seguro.
Theo

2

Python 2, 25 bytes

lambda x,y:int(`x`+`y`)+3

Concatena y agrega 3

Pruébalo en línea


¿Funciona si xey son ambos 3?
Robert Benson

@RobertBenson debería hacerlo, afaik no puedes hacer 36 de 3 y 3
Skidsdev

Esto probablemente me parece bien. La concatenación inversa debe tener un módulo de residuo diferente 9. Para la exponenciación, solo hay un número finito de casos a considerar antes de que el resultado de la exponenciación tenga demasiados dígitos a lo largo de las líneas de la respuesta de Python de xnor. No vi ningún conflicto (tampoco para +1, aunque +2 tiene 2 ** 6 = 62 + 2).
tehtmi

@tehtmi +1 falla en x = y = 0 El enlace de prueba en línea prueba todas las combinaciones de x e y en el rango [0,400]
TFeld

2

JS (ES6), 12 bytes

x=>x.join`1`

Mismo algoritmo que esta respuesta de Python . Toma datos como una matriz de entradas.


1

Braingolf , 4 bytes

9&+^

Pruébalo en línea!(El encabezado y el pie de página son intérpretes, el código es un código de braingolf real, los argumentos son entradas)

Salidas (a+b+9)**(a+b+9)

De mis pruebas no pude encontrar ningún par en el que esto no funcione.


1

Python 2 , 19 bytes

lambda x,y:x+9<<y+9

Pruébalo en línea!

Estoy bastante seguro de que el cambio de bits funciona para todos los casos, pero no estoy al 100%. De todos modos, ahorra algunos bytes sobre la versión de exponenciación.




1

QBIC , 8 bytes

Hombre, hay muchas maneras geniales de tomar estos números y obtener un número no relacionado. Solo tuve que probar algunos, para ver cómo QBIC seguiría el ritmo. El más corto es un puerto de la respuesta de Python de xnor, concatenando los números con un 1 en el medio:

?;+@1`+;

Todos, un puerto de la Retina de Leo responde:

[0,_l;|+_l;||Z=Z+@1

Encontrar el próximo primo más grande:

c=:+:+1≈µc|+1|c=c+1]?c



1

05AB1E , 2 4 bytes

+ØDm

Pruébalo en línea!

Igual que la respuesta de Jelly, encuentra una prima después de la suma. Un byte más corto :)

EDITAR : ahora lo eleva a su propio poder para ser suficiente para la excepción.


No es el mismo algoritmo en realidad, esto encuentra a+bel primer cebo, mientras que el mío encuentra el cebado más pequeño más grande que a+b.
Erik the Outgolfer

De cualquier manera, debería funcionar.
Neil A.

3
Falla para 6443, 3 (que da el primo 64433, la concatenación).
tehtmi

@tehtmi es correcto, esto falla.
Skidsdev

Ver mi edición, debería funcionar ahora
Neil A.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.