Desafio
Escreva uma função ou programa que aceite um número decimal positivo, chame-o de A e produza dois números positivos, B e C , de modo que:
- A == B bitxor C
- B e C não devem conter nenhum dos dígitos 0, 3 ou 7 em sua representação decimal.
Exemplos
>>> decompose(3)
1, 2
>>> decompose(7)
1, 6
>>> decompose(718)
121, 695
>>> decompose(99997)
2, 99999
>>> decompose(4294967296)
4294968218, 922
>>> decompose(5296080632396965608312971217160142474083606142654386510789497504098664630388377556711796340247136376)
6291484486961499292662848846261496489294168969458648464915998254691295448225881546425551225669515922,
1191982455588299219648819556299554251659915414942295896926425126251962564256469862862114191986258666
Como a decomposição não é exclusiva, sua função / programa não precisa produzir exatamente os mesmos resultados que esses exemplos fornecidos.
Regras muito detalhadas
As submissões devem ser na forma de uma função ou programa completo .
import
declarações que contam para a pontuação final.Você pode assumir que a entrada A sempre contém pelo menos um dígito de 0, 3 ou 7.
Você pode assumir que sempre existe uma decomposição.
Você pode usar o BigInt se eles fazem parte das bibliotecas padrão do idioma ou podem ser instalados através do gerenciador de pacotes de jure do idioma .
A função deve ser rápida. Não deve demorar mais de 20 segundos para ser executado em um computador razoavelmente moderno quando alimentado com um número de 100 dígitos e não mais que 2 segundos quando alimentado com um número de 10 dígitos.
A função / programa deve suportar entrada de pelo menos 100 dígitos .
- Se a função / programa puder suportar apenas números inteiros até N <100 dígitos, haverá uma penalidade de + 10 × (100 / N - 1) bytes para a pontuação final. Isso serve para incentivar os golfistas a apoiar uma gama mais ampla de números, mesmo que a importação possa ser detalhada.
Não há restrições à apresentação de entradas / saídas, desde que elas estejam claramente na representação decimal.
- A função pode inserir e enviar strings / BigInts se os tipos inteiros internos não forem suficientes.
- A entrada pode vir do parâmetro da função, argumento da linha de comando ou STDIN.
- A função pode retornar o resultado ou apenas imprimi-lo diretamente em STDOUT.
- No entanto, o estouro assinado nas entradas / saídas não é permitido.
- Respostas aproximadas não são toleradas, as entradas / saídas devem ser exatas.
Pontuação
Este é um código de golfe . A solução mais curta em bytes ganha.
Existe uma penalidade se o programa puder suportar apenas números com menos de 100 dígitos:
- Inteiros de 64 bits (19 dígitos) = +42 bytes
- Inteiros de 63 bits (18 dígitos) = +45 bytes
- Números inteiros de 53 bits (15 dígitos) = +56 bytes
- Inteiros de 31/32 bits (9 dígitos) = +101 bytes
Respostas:
CJam, 70 bytes
Experimente online.
Seleciona aleatoriamente números inteiros até encontrar uma correspondência. Isso mal cumpre o limite de 20 segundos para números inteiros de 64 bits (usando o interpretador Java), então adicionei 42 à contagem de bytes real.
Exemplo de execução
fonte
Lisp comum,
240224183173169 bytesLisp comum é um pouco detalhado para o golfe. No entanto, isso decompõe números de 100 dígitos em menos de um segundo e números inteiros de 200 dígitos em menos de dez segundos, portanto, não há necessidade de penalidades. O algoritmo é determinístico.
O avanço de linha entre as funções é apenas para fins tipográficos. Teste realizado com a entrada de referência de 100 dígitos:
Como bônus, incluo uma versão do código que constrói de maneira incremental a solução de cima para baixo. Ele pode gerenciar um número de 1000 dígitos em menos de dez segundos, mas não pode competir no golfe devido ao código adicional.
fonte
Python 2, 103 + 42 = 145 bytes
O Python suporta nativamente bigints, mas esse programa excede em muito 20 segundos um número de 100 dígitos. No entanto, decompõe números inteiros de 64 bits em cerca de 2 segundos.
fonte
while
loop para continuar tentando valores aleatórios - basta chamar a função novamente. Sem necessidade de estrutura de controle, então você pode entrar em colapso a função a umlambda
e um ternário:from random import* d=lambda a,b=0:set(`b`+`a^b`)&set(\'037\')and d(a,randint(1,a))or(b,a^b)
. Embora você esteja melhor apenas não usando uma função.Python 3 (132 bytes)
(Isso é apenas para estimular melhores soluções. Essa é a minha solução ao resolver o problema original no filme ASCII.)
Embora o comportamento do xor bit a bit no sistema decimal seja bastante complicado, há uma observação importante: modificar os dígitos baixos não afetará os dígitos altos . Portanto, podemos trabalhar de cima para baixo: tente liberar os dígitos superiores de 0, 3, 7 e, em seguida, trabalhe no próximo dígito, até que o número inteiro seja calculado. Isso nos permite executar em tempo linear, e o processamento de um número de mil dígitos pode ser concluído em menos de 1 segundo. (A solução Common Lisp também está usando a mesma técnica que eu acredito.)
fonte
997^8 == 1005
,. Eu acho que há um núcleo de uma idéia aqui, mas não é óbvio.{1,2,4,5,6,8,9}
, haverá alguns deles que não afetarão os dígitos altos. (por exemplo997^2 == 999
). Owhile
loop interno faz o esgotamento para encontrar a opção que mantém os dígitos altos válidos.