Plus petit nombre positif dont la puissance y est divisible par x


15

Tâche

Étant donné des nombres entiers xet yqui sont tous les deux au moins 2, trouvez le plus petit nombre positif dont la ypuissance -th est divisible par x.

Exemple

Étant donné x=96et y=2, la sortie devrait être 24puisque 24c'est la plus petite nsatisfaction positive n^2 is divisible by 96.

Cas de test

x  y output
26 2 26
96 2 24
32 3 4
64 9 2
27 3 3

Notation

C'est du . Solution avec le plus petit nombre de victoires d'octets.

Les références



1
Sera Xtoujours supérieur à Y?
Fatalize

@Fatalize Qu'est-ce que cela a à voir avec quoi que ce soit?
Leaky Nun

Il n'y a pas de cas de test où Xest inférieur à Y, et cela peut réduire la longueur de certaines réponses (du moins la mienne) si elle Xest toujours supérieure à Y. Je préférerais que cela Xpuisse être plus grand ou plus petit, mais alors un cas de test pour ce dernier serait génial.
Fatalize

1
Votre liste de références est la meilleure illustration que j'ai vue du caractère arbitraire ridicule des commandes d'entrées OEIS.
Sparr

Réponses:


7

Brachylog , 19 17 16 15 12 octets

2 octets enregistrés grâce à @LeakyNun.

:[I:1]*$r=#>

Essayez-le en ligne!

Explication

               Input = [X, Y]
:[I:1]*        Get a list [X*I, Y] (I being any integer at this point)
       $r=     Get the first integer which is the Yth root of X*I
          #>   This integer must be strictly positive
               This integer is the Output


@LeakyNun Merci. Ce sera cependant beaucoup plus lent.
Fatalize

Pourquoi cela sera-t-il plus lent?
Leaky Nun


4
Pour citer le célèbre Fatalize: "ne vous souciez pas de la complexité"
Leaky Nun


6

JavaScript (ES7), 32 octets

f=(x,y,i=1)=>i**y%x?f(x,y,i+1):i

Vous n'avez jamais défini f. Je pense que vous devez attribuer la fonction à f.
kamoroso94

1
@ kamoroso94 Désolé, je fais toujours ça.
Neil


5

Python 3, 60 43 39 octets

Merci à @LeakyNun et @ Sp3000 pour leur aide

f=lambda x,y,i=1:i**y%x<1or-~f(x,y,i+1)

Une fonction qui prend l'entrée via un argument et renvoie la sortie.

Comment ça fonctionne

La fonction utilise la récursivité pour vérifier à plusieurs reprises les nombres entiers i, en commençant par i=1, jusqu'à ce que celui qui satisfait la condition requise, ici i**y%x<1, soit trouvé. Ceci est réalisé en prenant la logique orde la condition et le résultat de l'expression pour i+1incrémenté, qui est ici -~f(x,y,i+1). Cette expression est évaluée en continu Falsejusqu'à ce qu'une valeur satisfaisante jsoit trouvée, moment auquel elle est évaluée Trueet la récursivité s'arrête. Étant donné que ceux-ci sont respectivement équivalents à 0et 1en Python, et que la fonction a été ajoutée à plusieurs reprises 1via la partie d'incrémentation, la fonction revient (j-1)*False + True + (j-1)*1 = (j-1)*0 + 1 + (j-1)*1 = 1 + j-1 = j, comme requis.

Essayez-le sur Ideone


1
def f(x,y,i=1):¶ while i**y%x:i+=1¶ print(i)
Leaky Nun

@LeakyNun Merci. Je viens de penser à un moyen un peu plus court de le faire (43 vs 44) avec la récursivité.
TheBikingViking

2
39:f=lambda x,y,z=1:z**y%x<1or-~f(x,y,z+1)
Sp3000

@ Sp3000 Votre fonction ne revient-elle pas à la Trueplace de z?
Leaky Nun

@LeakyNun Vous manquez la -~partie, mais oui, elle reviendrait Truesi elle xétait 1.
Sp3000

4

Haskell, 31 octets

x#y=[n|n<-[1..],mod(n^y)x<1]!!0

Exemple d'utilisation: 96#2 -> 24.

Implémentation directe: essayez tous les entiers n, conservez ceux qui remplissent la condition et choisissez le premier.


2
Aussi 31:x#y=until(\n->mod(n^y)x<1)(+1)0
xnor

4

05AB1E (10 octets)

>GN²m¹ÖiNq

Essayez-le en ligne

  • > Lit le premier argument, l'incrémente et le pousse sur la pile
  • Gouvre la pile ( a) et démarre une boucle qui contient le reste du programme où Nprend la valeur1, 2, ... a - 1 .
  • N²mpousse Net la deuxième entrée de l'historique d'entrée, puis les fait éclater toutes les deux et pousse la première à la puissance de la seconde.
  • ¹ pousse la première entrée de l'historique des entrées dans la pile.
  • Ö ouvre les deux entrées de pile précédentes, puis pousse a % b == 0 sur la pile.
  • isaute cela de la pile. Si vrai, il exécute le reste du programme; sinon, la boucle continue.
  • N pousse N sur la pile.
  • q termine le programme.

À la fin du programme, la valeur supérieure de la pile est imprimée.


Veuillez poster une explication du fonctionnement de ce code pour ceux qui ne connaissent pas votre langue, mais sinon bon travail et bon premier post.
Rohan Jhunjhunwala

Ce lien semble intéressant.
Leaky Nun

2
Très belle première réponse.
Emigna

3

MATL , 9 octets

y:w^w\&X<

Essayez-le en ligne!

Explication

y       % Take x and y implicitly. Push x again
        % STACK: x, y, x
:       % Range from 1 to x
        % STACK: x, y, [1, 2, ..., x]
w       % Swap
        % STACK: x, [1, 2, ..., x], y
^       % Power, element-wise
        % STACK: x, [1^y,  2^y, ..., x^y]
w       % Swap
        % STACK: [1^y, 2^y, ..., x^y], x
\       % Modulo, element-wise
        % STACK: [mod(1^y,x), mod(2^y,x), ..., mod(x^y,x)]
        % A 0 at the k-th entry indicates that x^y is divisible by x. The last entry
        % is guaranteed to be 0
&X<     % Arg min: get (1-based) index of the first minimum (the first zero), say n
        % STACK: n
        % Implicitly display

Manipulation de pile beaucoup.
Leaky Nun

1
Oui. Je pense que Jelly aura un gros avantage ici, car cela évite tous ces "copier" et "échanger"
Luis Mendo

Tu ne l'as pas find?
Leaky Nun

@LeakyNun Oui, fmais cela trouve tous les indices non nuls. Il faudrait donc ~f1): négocier, trouver, obtenir la première entrée
Luis Mendo

3

En fait , 12 11 octets

Un grand merci à Leaky Nun pour ses nombreuses suggestions. Suggestions de golf bienvenues. Essayez-le en ligne!

;)R♀ⁿ♀%0@íu

Approche originale sur 12 octets. Essayez-le en ligne!

1WX│1╖╜ⁿ%WX╜

Une autre approche de 12 octets. Essayez-le en ligne!

w┬i)♀/♂K@♀ⁿπ

Une approche sur 13 octets. Essayez-le en ligne!

k╗2`╜iaⁿ%Y`╓N

Ungolfing:

Premier algorithme

       Implicitly pushes y, then x.
;      Duplicate x.
)      Rotate duplicate x to bottom of the stack.
R      Range [1, x] (inclusive).
♀ⁿ     Map a**y over the range.
♀%     Map a**y%x over the range.
0@í    new_list.index(0)
u      Increment and print implicitly at the end of the program.

Algorithme d'origine

       Implicitly pushes x, then y.
1WX    Pushes a truthy value to be immediately discarded 
         (in future loops, we discard a**y%x)
|      Duplicates entire stack.
         Stack: [y x y x]
1╖     Increment register 0.
╜      Push register 0. Call it a.
ⁿ      Take a to the y-th power.
%      Take a**y mod x.
W      If a**y%x == 0, end loop.
X      Discard the modulus.
╜      Push register 0 as output.

Troisième algorithme

       Implicitly pushes y, then x.
w      Pushes the full prime factorization of x.
┬      Transposes the factorization (separating primes from exponents)
i      Flatten (into two separate lists of primes and exponents).
)      Rotate primes to the bottom of the stack.
♀/     Map divide over the exponents.
♂K     Map ceil() over all of the divided exponents.
@      Swap primes and modified exponents.
♀ⁿ     Map each prime ** each exponent.
π      Product of that list. Print implicitly at the end of the program.

Quatrième algorithme

     Implicitly pushes x, then y.
k╗   Turns stack [x y] into a list [x, y] and saves to register 0.
2    Pushes 2.
  `    Starts function with a.
  ╜i   Pushes register 0 and flattens. Stack: [x y a]
  a    Inverts the stack. Stack: [a y x]
  ⁿ%   Gets a**y%x.
  Y    Logical negate (if a**y is divisible by x, then 1, else 0)
  `    End function.
╓    Push first (2) values where f(x) is truthy, starting with f(0).
N    As f(0) is always truthy, get the second value.
     Print implicitly at the end of the program.

@LeakyNun En attente de l'une de vos suggestions de golf gagnantes: D
Sherlock9

@LeakyNun Je serais également heureux de publier ces approches, sauf si vous souhaitez les publier vous-même.
Sherlock9

+1 pour le sourire narquois;)
Leaky Nun

2

R, 61 octets , 39 octets , 37 octets , 34 octets

Je suis toujours un débutant dans la programmation R et il s'avère que c'est ma première fonction que je crée dans R ( Yay! ) Je pense donc qu'il y a encore place à l'amélioration.

function(x,y){for(n in 2:x){if(n^y%%x==0){cat(x,y,n);break}}}

Le test en ligne peut être effectué ici: RStudio sur rollApp .


Progrès majeurs:

function(x,y){which.max((1:x)^y%%x==0)}

which.maxfonctionne car il renvoie la valeur la plus élevée dans un vecteur et s'il y en a plusieurs, il retournera le premier. Dans ce cas, nous avons un vecteur de nombreux FAUX (qui sont des 0) et quelques VRAIS (qui sont des 1), il retournera donc le premier VRAI.


Un autre progrès:

function(x,y)which.max((1:x)^y%%x==0)

Enfin, il bat la réponse en utilisant Python de deux octets. :)

Un autre progrès: (encore!)

function(x,y)which.min((1:x)^y%%x)

Un grand merci à Axeman et user5957401 pour l'aide.


Je pense que votre lien de test est mort.
TheBikingViking du

@TheBikingViking Merci d'avoir signalé cela. Je vais le modifier après avoir pris mon déjeuner tardif
Anastasiya-Romanova

2
si vous utilisez which.min, vous pourriez vous débarrasser de la ==0. Le module renverra un nombre, qui ne sera pas inférieur à 0.
user5957401

1
@ user5957401 Edited.Bolshoe spasibo ...
Anastasiya-Romanova

Pour la même longueur de 34 octets, vous aviez également le même function(x,y)which(!(1:x)^y%%x)[1].
plannapus

2

dc, 23 22 octets

Merci à Delioth pour son conseil sur les méthodes de saisie, la sauvegarde d'un octet

sysxz[zdlylx|0<F]dsFxp

Utilise l'opérateur de profondeur de pile zpour incrémenter le cas de test directement sur la pile et l'opérateur d'exponentiation modulaire |pour, eh bien, l'exponentiation modulaire. Répétez les tests jusqu'à ce que le reste ne soit pas supérieur à zéro.


1
Techniquement, vous n'avez pas besoin de ?au début, car une façon standard d'invoquer certaines choses est > echo "x y [program]"|dc, où xet ysont les mêmes que la Question- x et y seront déposés sur la pile comme d'habitude.
Delioth

@Delioth Intéressant, merci! J'ai toujours juste utilisé l' -eoption, mais je vais l'utiliser à partir de maintenant.
Joe

@Delioth, pour moi, l'utilisation de guillemets génère des erreurs me rappelant que ce "n'est pas implémenté dans dc, alors que ne pas utiliser de guillemets donne évidemment des erreurs de shell. Y a-t-il quelque chose à faire à ce sujet? Je sais stderrqu'on peut l'ignorer, mais ça me dérange toujours.
Joe

1

05AB1E , 8 octets

Lsm¹%0k>

Explication

L         # range(1,x) inclusive
 sm       # each to the power of y
   ¹%     # each mod x
     0k   # find first index of 0 (0-based)
       >  # increment to 1-based

Essayez-le en ligne


1

Perl 6 ,  26  25 octets

{first * **$^y%%$^x,1..$x}
{first * **$^y%%$^x,1..*}

Explication:

# bare block with two placeholder parameters 「$^y」 and 「$^x」
{
  # find the first value
  first

  # where when it 「*」 is taken to the power
  # of the outer blocks first parameter 「$^y」
  * ** $^y
  # is divisible by the outer blocks second parameter 「$^x」
  %% $^x,

  # out of the values from 1 to Inf
  1 .. *
}

0

Mathematica, 36 octets

(i=1;While[n=i++;Mod[n^#2,#]!=0];n)&

0

Dyalog APL , 11 octets

Traduction de ceci .

0⍳⍨⊣|(⍳⊣)*⊢

0⍳⍨trouver le premier zéro dans
⊣|les restes de division lorsque x divise
(⍳⊣)*les entiers un par x , élevé à la puissance de
y

TryAPL en ligne!


0

PowerShell v2 +, 48 octets

param($x,$y)(1..$x|?{!(("$_*"*$y+1|iex)%$x)})[0]

Prend entrée $xet $y. Construit une plage de 1à $x, puis utilise Where-Objectpour filtrer ces nombres. Le filtre prend la chaîne "$_*"(c'est-à-dire le numéro actuel avec un astérisque) et utilise la multiplication de chaîne pour concaténer ces $ytemps, puis claque une finale 1à la fin, puis redirige vers iex(court Invoke-Expressionet similaire à eval). Cela remplace [math]::Pow($_,$y), car PowerShell n'a pas d'opérateur d'exponentiation et est deux octets plus court. Qui est introduit dans l'opérateur modulo% avec $x- donc, s'il est divisible, ce sera le cas . Ainsi, s'il est divisible, il sera inclus par ce filtre et tous les autres nombres seront exclus.0 , donc nous l'encapsulons en parens et prenons le booléen-pas!(...)

Enfin, nous encapsulons les nombres résultants en parens (...)et prenons l' [0]index. Depuis la plage entrée triée1..$x , ce sera la plus petite. Cela reste sur le pipeline et l'impression est implicite.

Cas de test

PS C:\Tools\Scripts\golfing> (26,2),(96,2),(32,3),(64,9),(27,3)|%{($_-join', ')+' -> '+(.\smallest-positive-number-divisor.ps1 $_[0] $_[1])}
26, 2 -> 26
96, 2 -> 24
32, 3 -> 4
64, 9 -> 2
27, 3 -> 3


0

Perl, 29 26 octets

Comprend +3 pour -p(pas +1 car le code contient' )

Exécuter avec l'entrée sur STDIN

power.pl <<< "96 2"

power.pl:

#!/usr/bin/perl -p
/ /;1while++$\**$'%$`}{

0

Pyth, 9 octets

AQf!%^THG

Un programme qui prend en entrée une liste du formulaire [x, y]sur STDIN et imprime le résultat.

Essayez-le en ligne

Comment ça fonctionne

AQf!%^THG  Program. Input: Q
AQ         G=Q[0];H=Q[1]
  f        First truthy input T in [1, 2, 3, ...] with function:
     ^TH    T^H
    %   G   %G
   !        Logical not (0 -> True, all other modulus results -> False)
           Implicitly print

-1

PHP 59 octets

Désolé, mais je ne peux pas tester cela depuis mon mobile. :)

function blahblah($x,$y){
  for($i=0;1;$i++){
    if(!$i^$y%$x){
      return $i;
    }
  }
}

Golfé

function b($x,$y){for($i=0;1;$i++){if(!$i^$y%$x)return $i;}

Vous utilisez $ z là où vous devriez utiliser $ x et je ne pense pas que vous augmentez $ i dans la boucle
theLambGoat
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.