Défi
Écrivez une fonction ou un programme qui prend un nombre décimal positif, appelez-le A et affichez deux nombres positifs, B et C , tels que:
- A == B bitxor C
- B et C ne doivent contenir aucun des chiffres 0, 3 ou 7 dans leur représentation décimale.
Exemples
>>> decompose(3)
1, 2
>>> decompose(7)
1, 6
>>> decompose(718)
121, 695
>>> decompose(99997)
2, 99999
>>> decompose(4294967296)
4294968218, 922
>>> decompose(5296080632396965608312971217160142474083606142654386510789497504098664630388377556711796340247136376)
6291484486961499292662848846261496489294168969458648464915998254691295448225881546425551225669515922,
1191982455588299219648819556299554251659915414942295896926425126251962564256469862862114191986258666
Étant donné que la décomposition n'est pas unique, votre fonction / programme n'a pas besoin de produire exactement les mêmes résultats que ces exemples fournis.
Règles très détaillées
Les soumissions doivent prendre la forme d'une fonction ou d'un programme complet .
import
déclarations ne comptent pour le score final.Vous pouvez supposer que l'entrée A contient toujours au moins un chiffre de 0, 3 ou 7.
Vous pouvez supposer qu'une décomposition existe toujours.
Vous pouvez utiliser BigInt s'ils font partie des bibliothèques standard de la langue, ou peuvent être installés via le gestionnaire de packages de jure de la langue .
La fonction doit être rapide. Il ne devrait pas prendre plus de 20 secondes pour s'exécuter sur un ordinateur raisonnablement moderne lorsqu'il reçoit un numéro à 100 chiffres et pas plus de 2 secondes lorsqu'il est alimenté par un numéro à 10 chiffres.
La fonction / le programme doit prendre en charge la saisie d'au moins 100 chiffres .
- Si la fonction / le programme ne peut prendre en charge que des nombres entiers jusqu'à N <100 chiffres, il y aura une pénalité de + 10 × (100 / N - 1) octets au score final. Il s'agit d'encourager les golfeurs à prendre en charge une plus large gamme de nombres même si l'importation peut être détaillée.
Il n'y a aucune restriction sur la présentation des entrées / sorties tant qu'elles sont clairement en représentation décimale.
- La fonction peut entrer et sortir des chaînes / BigInts si les types entiers intégrés ne sont pas suffisants.
- L'entrée peut provenir du paramètre de fonction, de l'argument de ligne de commande ou de STDIN.
- La fonction peut renvoyer le résultat ou simplement imprimer le résultat directement dans STDOUT.
- Cependant, un débordement signé dans les entrées / sorties n'est pas autorisé.
- Les réponses approximatives ne sont pas tolérées, les entrées / sorties doivent être exactes.
Notation
Ceci est un code-golf . La solution la plus courte en octets gagne.
Il y a une pénalité si le programme ne peut prendre en charge que des nombres de moins de 100 chiffres:
- Entiers 64 bits (19 chiffres) = +42 octets
- Entiers 63 bits (18 chiffres) = +45 octets
- Entiers 53 bits (15 chiffres) = +56 octets
- Entiers 31/32 bits (9 chiffres) = +101 octets
Réponses:
CJam, 70 octets
Essayez-le en ligne.
Sélectionne aléatoirement des entiers jusqu'à ce qu'il trouve une correspondance. Cela respecte à peine la limite de 20 secondes pour les entiers 64 bits (en utilisant l'interpréteur Java), j'ai donc ajouté 42 au nombre d'octets réel.
Exemple d'exécution
la source
Common Lisp,
240224183173169 octetsCommon Lisp est un peu bavard pour le golf. Cependant, cela décompose les nombres à 100 chiffres en moins d'une seconde et les nombres entiers à 200 chiffres en moins de dix secondes, donc pas besoin de pénalités. L'algorithme est déterministe.
Le saut de ligne entre les fonctions est uniquement à des fins typographiques. Test avec l'entrée de référence à 100 chiffres:
En bonus, j'inclus une version du code qui construit progressivement la solution de haut en bas. Il peut gérer un nombre de 1000 chiffres en moins de dix secondes, mais ne peut pas participer au golf en raison du code supplémentaire.
la source
Python 2, 103 + 42 = 145 octets
Python prend en charge nativement les bigints, mais ce programme dépasse de loin 20 secondes pour un nombre à 100 chiffres. Cependant, il décompose les entiers 64 bits en environ 2 secondes.
la source
while
boucle pour continuer à essayer des valeurs aléatoires - vous pouvez simplement appeler à nouveau la fonction. Sans besoin d' une structure de contrôle, vous pouvez alors réduire la fonction à unlambda
et ternaire:from random import* d=lambda a,b=0:set(`b`+`a^b`)&set(\'037\')and d(a,randint(1,a))or(b,a^b)
. Bien qu'il soit préférable de ne pas utiliser de fonction.Python 3 (132 octets)
(C'est juste pour stimuler de meilleures solutions. C'est ma solution pour résoudre le problème d'origine dans un film ASCII.)
Bien que le comportement de xor au niveau du bit dans le système décimal soit assez compliqué, il y a une observation majeure: la modification des chiffres bas n'affectera pas les chiffres hauts . Par conséquent, nous pouvons travailler de haut en bas: essayez de libérer les chiffres supérieurs de 0, 3, 7, puis travaillez sur le chiffre suivant, jusqu'à ce que le nombre entier soit calculé. Cela nous permet de fonctionner en temps linéaire, puis le traitement d'un nombre à mille chiffres peut se terminer en moins d'une seconde. (La solution Common Lisp utilise également la même technique, je crois.)
la source
997^8 == 1005
. Je pense qu'il y a un noyau d'idée ici, mais ce n'est pas évident.{1,2,4,5,6,8,9}
, il y en aurait certains qui n'affecteront pas les chiffres élevés. (par exemple997^2 == 999
). Lawhile
boucle intérieure fait l'épuisement pour trouver le choix qui maintient les chiffres élevés valides.