Étant donné une valeur x, trouvez la plus petite valeur numérique supérieure à y qui peut être multipliée et divisée par x tout en conservant tous les chiffres d'origine.
- Les nouveaux numéros ne perdent pas de chiffres.
- Les nouveaux numéros ne gagnent pas de chiffres.
Par exemple:
Entrée: x = 2, y = 250000
- Original: 285714
- Division: 142857
- Multiplication: 571428
Cela est vrai car 285714 est supérieur à y ; puis lorsqu'il est divisé par x donne 142857 et lorsqu'il est multiplié par x donne 571428 . Dans les deux tests, tous les chiffres originaux de 285714 sont présents et aucun chiffre supplémentaire n'a été ajouté.
Les règles
- X doit être égal à 2 ou 3, car tout élément supérieur prend trop de temps à calculer.
- Y doit être un nombre entier supérieur à zéro .
- Le code le plus court gagne.
Cas de test
Ce sont mes cas de test les plus courants car ils sont les plus rapides à tester.
- 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
Clarifications
- Le type de division n'a pas d'importance. Si vous pouvez obtenir 2.05, 0.25 et 5.20, n'hésitez pas.
Bonne chance à vous tous!
Réponses:
Husk , 14 octets
Essayez-le en ligne!
Explication
la source
-
ce qui n'allait pas.Brachylog v2, 15 octets
Essayez-le en ligne!
Prend la saisie dans le formulaire
[x,y]
.Explication
Commentaire
La faiblesse de Brachylog à réutiliser plusieurs valeurs plusieurs fois apparaît ici; ce programme est presque entièrement de plomberie et très peu d'algorithme.
En tant que tel, il peut sembler plus pratique de simplement coder en dur la valeur de y (il y a un commentaire sur cette question en faisant l'hypothèse que 2 est la seule valeur possible). Cependant, il existe en fait des solutions pour y = 3, ce qui signifie que malheureusement, la plomberie doit également gérer la valeur de y . Le plus petit que je sache est le suivant:
(La technique que j'ai utilisée pour trouver ce nombre n'est pas entièrement générale, il est donc possible qu'il existe une solution plus petite utilisant une autre approche.)
Il est peu probable que vous vérifiiez cela avec ce programme. Brachylog
p
est écrit d'une manière très générale qui n'a pas d'optimisations pour des cas spéciaux (comme le cas où l'entrée et la sortie sont déjà connues, ce qui signifie que vous pouvez faire la vérification dans O ( n log n ) via le tri, plutôt que le O ( n !) pour l'approche de force brute que je soupçonne qu'il utilise). Par conséquent, il faut très longtemps pour vérifier que 105263157894736842 est une permutation de 315789473684210526 (je l'ai laissé fonctionner pendant plusieurs minutes maintenant sans progrès évident).(EDIT: J'ai vérifié la source Brachylog pour la raison. Il s'avère que si vous utilisez
p
sur deux entiers connus, l'algorithme utilisé génère toutes les permutations possibles de l'entier en question jusqu'à ce qu'il en trouve une qui est égale à l'entier de sortie, comme l'algorithme est "entrée → indigits, permutent indigits → sur-chiffres, sur-chiffres → sortie". Un algorithme plus efficace serait de configurer la relation entre les chiffres et les sorties en premier , de sorte que le retour arrière dans la permutation puisse prendre en compte les chiffres disponibles.)la source
p
ne fonctionne paspermutation/2
avec deux listes connues, même si on leur donne deux entiers connus comme arguments; il génère toutes les permutations du premier entier (en utilisantpermutation/2
avec une liste connue) puis les compare avec le second entier.Perl 6 , 56
54octetsEssayez-le en ligne!
Alternative intéressante, calculer n * x k pour k = -1,0,1:
la source
Nettoyer , 92 octets
Essayez-le en ligne!
Assez simple. Explication à venir dans un moment.
la source
q, 65 octets
Divisez le nombre sur la base 10, triez chaque ordre croissant et vérifiez s'il est égal. Sinon, incrémentez y et recommencez
la source
JavaScript (ES6),
767369 octetsEnregistré 3 octets en utilisant
eval()
, comme suggéré par @ShieruAsakotoPrend l'entrée comme
(x)(y)
.Essayez-le en ligne!
Une version récursive serait de 62 octets , mais elle n'est pas bien adaptée ici en raison du nombre élevé d'itérations requises.
Comment?
Exemple:
Lorsque vous ajoutez deux tableaux ensemble, chacun d'eux est implicitement contraint à une chaîne séparée par des virgules. Le dernier chiffre du premier tableau va être directement concaténé avec le premier chiffre du deuxième tableau sans virgule entre eux, ce qui rend ce format sans ambiguïté.
Exemple:
Mais:
Commenté
la source
x=>F=y=>(g=x=>r=[...x+''].sort()+'')(y*x)!=g(y)|r!=g(y/x)?F(y+1):y
Peut provoquer un débordement de pile si y est loin de la solution.eval
:x=>y=>eval("for(;(g=x=>r=[...x+''].sort()+'')(y*x)!=g(y)|r!=g(y/x);y++);y")
eval()
idée. Ma première tentative était en effet récursive, mais j'ai abandonné en raison du nombre élevé d'itérations requises.Haskell,
7674 octetsDeux octets rasés grâce au commentaire de Lynn
la source
f
pouvez l'être,f x y=[n|n<-[y+1..],all(==s n)[s$n*x,s$n/x]]!!0
mais en définissant votre réponse en tant qu'opérateur, vous économisez deux octets:x!y=…
puis votre réponse est(!)
:)Japt, 24 octets
Solution assez naïve sur quelques bières; Je suis sûr qu'il y a une meilleure façon.
Essayez-le
la source
315789473684210526
c'est la première solutionx=3
, Javascript ou Japt ne peuvent pas le calculer correctement car il ne tient pas en double précision.Python 2 , 69 octets
Essayez-le en ligne!
la source
f=lambda x,y,S=sorted:y*(S(`y`)==S(`y*x`)==S(`y/x`))or f(x,y+1)
devrait fonctionner, mais il atteint la limite de récursivité assez rapidement, et je ne sais pas ce que les règles PPCG ont à dire à ce sujet.Gelée ,
1413 octets-1 merci à Erik l'Outgolfer (`` utilise make_digits, donc ce
D
n'était pas nécessaire)+2 a corrigé un bogue (merci encore à Erik the Outgolfer pour avoir signalé le problème de coupure)
Un programme complet imprimant le résultat (en tant que lien dyadique une liste de longueur 1 est produite).
Essayez-le en ligne!
Comment?
Notez que lorsque la division n'est pas exacte, l'instruction décimale implicite (équivalente à a
D
) appliquée avant le tri donne une partie fractionnaire,par exemple:
1800÷3D
->[6,0,0]
tandis que
1801÷3D
->[6.0,0.0,0.33333333333337123]
la source
D
.>=
j'ai totalement raté ça!Ṣ
Je n'avais aucune idée que make_digits y était défini - merci. Devra corriger et mettre à jour plus tard si ...Mathematica,
8274 octets-8 octets grâce à tsh
Fonction qui prend les arguments comme
[x,y]
. Effectivement, une recherche par force brute qui vérifie si la liste triée de chiffres poury
,y/x
etxy
sont les mêmes.Essayez-le en ligne!
la source
x=3
, mais je ne suis pas sûr que ce soit vrai pourx=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]
. Etu-v = a[1]*(10^p[1]-10^q[1]) + ... + a[n]*(10^p[n]-10^q[n])
depuis10^x-10^y=0 (mod 9)
tient toujours.u-v=0 (mod 9)
tient toujours. S'il y a une mauvaise réponsew
, depuisw*x-w=0 (mod 9)
, etw-floor(w/x)=0 (mod 9)
: nous l'avonsfloor(w/x)=0 (mod 9)
. sifloor(w/x)*x <> w
,w-floor(w/x)*x>=9
mais ce conflit avec le fait quew-floor(w/x)*x<x
tandis que x pourrait être 2 ou 3.w=0 (mod 9)
il en résultew*x-w=0 (mod 9)
carx-1
n'est pas divisible par 3.IntegerQ
test, il produit quelques erreurs lorsqu'il essaie de faireIntegerDigits
sur des fractions, mais Mathematica les dépasse toujours et produit la bonne réponse. Je ne sais pas si les erreurs incluses lors du calcul seraient autorisées, même si la réponse finale est correcte.APL (NARS), 490 caractères, 980 octets
tester
Je pensais que le problème était un nombre pratique qui peut varier, donc on a les 3 nombres r, r * x, r * x * x dans la façon dont r commence à une valeur qui r * x est proche de y (où x et y sont des entrées du problème en utilisant les mêmes lettres que la poste principale). J'ai utilisé l'observation que si le premier chiffre de r est d, alors que dans r doit apparaître aussi les chiffres d * x et d * x * x, pour faire r (ou mieux r * x) une solution.
la source
05AB1E , 16 octets
Essayez-le en ligne. (REMARQUE: Solution très inefficace, utilisez donc des entrées proches du résultat. Cela fonctionne également pour les entrées plus grandes localement, mais sur TIO, le délai expirera après 60 secondes.)
Explication:
la source