Encontre um número não relacionado

20

Dados 2 números inteiros não negativos como entrada, produza um número inteiro não negativo que não pode ser criado através de nenhum operador matemático nas 2 entradas.

Por exemplo, dadas entradas 2e 3,6, 0, 5, 1, 9, 8, 23, 2 são todas saídas inválidas.

As operações que devem ser levadas em consideração são:

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

Nos casos em que uma operação levaria a um não inteiro (como 2/3), sempre use floor. tão2 / 3 = 0

Suponha que qualquer operação inválida (como dividir por 0) resulte em 0.

Entrada

2 números inteiros não negativos.

Métodos de E / S padrão são aceitos

Você pode supor que a entrada sempre estará dentro de um intervalo que pode ser manuseado para o seu idioma, no entanto, lembre-se de que ainda existem brechas padrão .

Saída

Qualquer número inteiro não negativo que não possa ser criado por meio de nenhuma das operações acima nas 2 entradas.

Casos de teste

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

Pontuação

Este é o pois o menor número de bytes vence!

Skidsdev
fonte
Relacionado
Skidsdev 24/05
Eu acho que a única maneira de resolver isso é encontrar algum número primo que é maior que (a + b)
Morto Possum
1
@DeadPossum seria definitivamente uma solução válida, embora talvez não seja a única ou a mais golfista;) #
Skidsdev
Aposto que há alguma linguagem de fantasia que pode fazê-lo em dois bytes: D
Morto Possum
16
Não relacionado
HyperNeutrino

Respostas:

20

Retina , 3 bytes

.
1

Experimente online!

Pega entradas separadas por espaço (ou qualquer caractere que não seja de nova linha)

Substitui todos os dígitos por 1e une os números resultantes por outro 1.

Prova de correção

Cortesia de Martin Ender

  • Esta operação calcula um resultado com mais um dígito que o número de dígitos dos dois números juntos; a única operação que poderia produzir um resultado tão grande é a exponenciação.

  • O resultado é uma repunit (um número cujos dígitos são todos 1).

  • "Sabe-se [...] que um repunit na base 10 não pode [...] ser um poder perfeito". Isso significa que esse resultado também não pode ser produzido por exponenciação.

Leo
fonte
tecnicamente, isso não está unindo os números resultantes a outro 1, é simplesmente aceitar a entrada como uma sequência de 2 números separados por espaço e substituir cada caractere por um 1. Mas, dito isso, não consigo encontrar exemplos que provem que você está errado. .. ainda
Skidsdev 24/05
O @Mayube, é claro, funciona e, como tal, poderia funcionar com qualquer string, não apenas uma composta por dois números separados por um único espaço. Minha explicação é em termos da abstração "dois números de entrada".
Leo
2
"Sabe-se [...] que um repunit na base 10 não pode [...] ser um poder perfeito". Nenhuma operação na lista fornecida, exceto a exponenciação, pode resultar em mais dígitos do que o número total de dígitos de entrada, portanto, isso deve ser válido.
Martin Ender
Seu idiota atrevido! +1
Fund Monica's Lawsuit
Também funciona no QuadR !
Adám 27/06/17
11

Gelatina , 3 bytes

+Æn

Experimente online!

Explicação:

+Æn Arguments: x, y
+                            x + y.
 Æn Find a prime larger than
Erik, o Outgolfer
fonte
Eu acho que isso é válido ...
Erik the Outgolfer
Eu suponho que isso soma a entrada e gera o primeiro primo maior que a soma?
Skidsdev
1
@DeadPossum Eu estava prestes a escrever um. Espero ter jogado bem.
Erik the Outgolfer
1
O postulado de Bertrand deve ser quase bom o suficiente para provar trabalhos de concatenação. Concatenando com o número menor b à direita, temos a..b> = 10a> 4a> 2 (a + b), e concatenando com o número menor b à esquerda, temos b..a> (b + 1) uma. O único caso interessante não pequeno aqui deve ser b = 1, onde temos 1..a> 2a = 2 (a + b) - 2. O local onde esse limite é o mais apertado é a = 9 .... 9 Este é o único caso não pequeno que pode ser um problema para o postulado de Bertrand. No entanto, há melhores resultados como mathoverflow.net/questions/2724
tehtmi
1
Acho que há uma versão do postulado de Bertrand, as provas n <p <2n - 2, que devem funcionar para tudo. Eu estava pensando n <p <2n.
Tehtmi 25/05
9

Python 2 , 8 bytes

'1'.join

Experimente online!

Pega uma lista de duas seqüências numéricas como entradas, produz uma única sequência numérica. Concatena os números com um 1no meio.

O resultado tem muitos dígitos para qualquer coisa, exceto expoente. Note-se que a saída para (x,y)tem mais um dígito que xe ycombinado, a menos que xou yé 0. Para expoente, verificamos verificamos que isso significa que x**ynão corresponde.

  • Se xé 0 ou 1, também é x**y, o que é muito pequeno
  • Se y<=1entãox**y<=x é muito pequeno
  • Se y==2, então x**2deve ter mais dois dígitos que x. Isso acontece x=316, e não podemos verificar nenhum desses trabalhos.
  • Se y==3, então x**3deve ter mais dois dígitos que x. Isso acontece atéx=21 . Podemos verificar se nenhum deles funciona.
  • Se 3<y<13, então x**yrapidamente fica muito tempo. Apenas plausível tem o número certo de dígitos parax<=25 , e podemos verificá-los.
  • Se y>=14, então x**yé muito longo, mesmo para o menor possível x==2.
xnor
fonte
7

CJam (7 caracteres)

{+))m!}

Isso cria um número (a+b+2)!maior que o maior número relacionado em quase todos os casos.

É bastante óbvio que o maior número relacionado deve ser um dos a ** b, b ** a, concat(a, b), concat(b, a).

Se considerarmos logaritmos, descobrimos 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)

Assim, assintoticamente, é maior e precisamos nos preocupar apenas com alguns casos pequenos. De fato, o único caso em que o valor de saída não é maior que todos os números relacionados é 0, 1(ou 1, 0), para o qual ele fornece 6e o maior número relacionado é 10.

Peter Taylor
fonte
3

JavaScript (ES6), 15 bytes

Recebe entrada na sintaxe de currying.

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

a² + b² + 1 falharia em muitas entradas, como 3² + 5² + 1 = 35 ou 7² + 26² + 1 = 726 (concatenação). a² + b² + 2 deve ser seguro. Isso foi exaustivamente testado para 0 ≤ a ≤ b ≤ 50000 .

Demo

Arnauld
fonte
1
Isso deve estar protegido contra concatenação. Seja b o número concatenado à direita. Fixando b, podemos resolver uma equação quadrática para a: a ^ 2 + b ^ 2 + 2 - 10 ^ k * a - b = 0. O discriminante da quadrática deve ser um quadrado perfeito para que essa equação tenha uma solução inteira . O discriminante é 10 ^ 2k - 4 (b ^ 2 - b + 2) = 10 ^ 2k - (2b - 1) ^ 2 - 7. Considere o módulo 9. k não importa e nunca obtemos um resíduo quadrático para qualquer b.
Tehtmi 25/05
3

Python, 115 95 79 bytes

Solução simples e estúpida. Sinta-se livre para me superar.

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 causa de estúpido x/0.
-20 bytes graças a @RobinJames
-16 bytes graças a @tehtmi

HyperNeutrino
fonte
x / y, se y outra 0 será menor ou igual x * y para x, não negativo y então eu acho que você pode ter esses 12 bytes de volta mais outros 3
Robin James Kerrison
@RobinJames Ah, sim, sou burra. Obrigado.
HyperNeutrino 25/05
1
Eu acho que você deve conseguir remover mais 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 esse último, XOR é como adicionar sem transportar e AND está encontrando os bits que transportariam. OR está usando (1, 1) -> 1 em vez de (1,1) -> 2 como em adição real.)
Tehtmi 25/05
2

Python, 27 bytes

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

Produz um número maior que todos os números relacionados.

Experimente online!

-1 byte graças a Kevin Cruijssen.
-2 bytes graças ao Dead Possum.

Ankoganit
fonte
O seu link TIO está vazio. Além disso, acho que você pode remover o espaço depois, :se não me engano.
Kevin Cruijssen
@KevinCruijssen Opa, resolvi isso, obrigado!
Ankoganit
Você pode remover f=- lambda sem nome é aceitável
Morto Possum
@DeadPossum Não sabia disso, obrigado!
Ankoganit
Você provavelmente poderia se livrar de pelo menos um dos dois noves (e o correspondente +), mas não tenho certeza.
Theo
2

Python 2, 25 bytes

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

Concatena e adiciona 3

Experimente online

TFeld
fonte
Isso funciona se xey são 3?
Robert Benson
@RobertBenson Deveria fazer, depois que você não puder fazer 36 de 3 e 3 #
Skidsdev
Provavelmente isso parece bom para mim. A concatenação reversa deve ter um módulo de resíduo diferente 9. Para exponenciação, há apenas um número finito de casos a serem considerados antes que o resultado da exponenciação tenha muitos dígitos ao longo das linhas da resposta Python do xnor. Não vi nenhum conflito (nem para +1, embora +2 tenha 2 ** 6 = 62 + 2).
Tehtmi 25/05
@tehtmi uma falha em x = y = 0 O experimentá-lo testes de ligação on-line para todas as combinações de X e Y no intervalo [0400]
TFeld
1

Braingolf , 4 bytes

9&+^

Experimente online! (Cabeçalho e rodapé são intérpretes, código é o código braingolf real, args são entradas)

Saídas (a+b+9)**(a+b+9)

Nos meus testes, não consegui encontrar pares nos quais isso não funcionasse.

Skidsdev
fonte
1

Python 2 , 19 bytes

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

Experimente online!

Tenho certeza de que a mudança de bits funciona para todos os casos, mas não estou 100% nisso. De qualquer forma, ele salva alguns bytes sobre a versão de exponenciação.

KSmarts
fonte
1

QBIC , 8 bytes

Cara, existem muitas maneiras legais de pegar esses números e obter um número não relacionado. Eu só tinha que tentar alguns, para ver como o QBIC se manteria. A mais curta é uma porta da resposta Python do xnor, concatenando os números com um 1 no meio:

?;+@1`+;

Todos, um porto da resposta de Retina de Leo:

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

Encontrando o próximo maior primo:

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

sed, 6 bytes

s/ /1/

Try it online!

Input is via stdin in the form "x y", output is to stdout.

Port of this python answer, which includes the proof of correctness. Many thanks to xnor for such a simple method.

Kevin
fonte
1

Java 8, 15 bytes

a->b->a*a+b*b+2

Port from @Arnauld's amazing JavaScript (ES6) answer.
Try it here.

Straight-forward approach (177 170 bytes):

a->b->{int r=1;for(;a+b==r|a-b==r|a*b==r|(b>0?a/b==r|a%b==r:0>1)|Math.pow(a,b)==r|(a|b)==r|(a^b)==r|(a&b)==r|new Integer(""+a+b)==r|new Integer(""+b+a)==r;r++);return r;}

Try it here.

Kevin Cruijssen
fonte
1

05AB1E, 2 4 bytes

+ØDm

Try it online!

Same as the Jelly answer, finds a prime after the sum. One byte shorter :)

EDIT: Now raises it to its own power to suffice for the exception.

Neil A.
fonte
Not the same algorithm actually, this finds a+b'th prime, while mine finds the smallest prime larger than a+b.
Erik the Outgolfer
Either way, it should work.
Neil A.
3
Fails for 6443, 3 (which gives prime 64433, the concatenation).
tehtmi
@tehtmi is correct, this fails.
Skidsdev
See my edit, should work now
Neil A.
1

Brachylog, 3 bytes

+<ṗ

Try it online!

Nothing new here.

       The output
  ṗ    is a prime number
 <     which is strictly greater than
+      the sum of the elements of
       the input.

Now, to figure out how to find an unrelated string...

Unrelated String
fonte