Menor número positivo cuja y-ésima potência é divisível por x


15

Tarefa

Dados inteiros xe yquais são ambos, pelo menos 2, encontre o menor número positivo cuja y-a potência é divisível por x.

Exemplo

Dado x=96e y=2, a saída deve ser 24uma vez 24é o menor positivo nsatisfazendo n^2 is divisible by 96.

Casos de teste

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

Pontuação

Isso é . Solução com menor número de bytes ganhos.

Referências



1
Vai Xser sempre maior do que Y?
Fatalize 22/08/16

@Fatalize O que isso tem a ver com alguma coisa?
Freira vazada

Não existe um caso de teste em que Xseja menor que Y, e isso pode reduzir o comprimento de algumas respostas (pelo menos as minhas) se Xfor sempre maior que Y. Eu preferiria que isso Xpudesse ser maior ou menor, mas um caso de teste para o último seria ótimo.
Fatalize 22/08/16

1
Sua lista de referências é a melhor ilustração que eu já vi da arbitrariedade ridícula do pedido de entrada do OEIS.
Sparr

Respostas:


7

Brachylog , 19 17 16 15 12 bytes

2 bytes salvos graças a @LeakyNun.

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

Experimente online!

Explicação

               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 Thanks. Isso será muito mais lento.
Fatalize 21/08/16

Por que isso será mais lento?
Leaky Nun


4
Para citar o famoso Fatalize: "não ligo para a complexidade" #
Leaky Nun


6

JavaScript (ES7), 32 bytes

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

Você nunca definiu f. Eu acho que você precisa atribuir a função f.
precisa saber é o seguinte

1
@ kamoroso94 Desculpe, estou sempre fazendo isso.
Neil


5

Python 3, 60 43 39 bytes

Obrigado a @LeakyNun e @ Sp3000 pela ajuda

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

Uma função que recebe entrada via argumento e retorna a saída.

Como funciona

A função usa recursão para verificar repetidamente números inteiros i, começando com i=1, até que um que satisfaça a condição necessária, aqui i**y%x<1, seja encontrado. Isso é obtido tomando a lógica orda condição e o resultado da expressão para i+1incrementado, o que aqui é -~f(x,y,i+1). Essa expressão é avaliada continuamente Falseaté que um valor satisfatório jseja encontrado; nesse momento, ele avalia Truee a recursão para. Como eles são respectivamente equivalentes a 0e 1em Python, e a função foi adicionada repetidamente 1por meio da parte de incremento, a função retorna (j-1)*False + True + (j-1)*1 = (j-1)*0 + 1 + (j-1)*1 = 1 + j-1 = j, conforme necessário.

Experimente no Ideone


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

@LeakyNun Thanks. Eu apenas pensei em uma maneira um pouco mais curta de fazê-lo (43 vs 44) com recursão.
TheBikingViking

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

@ Sp3000 Sua função Truenão retorna em vez de z?
Leaky Nun

@LeakyNun Você está faltando a -~parte, mas sim, voltaria Truese xfoi 1.
SP3000

4

Haskell, 31 bytes

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

Exemplo de uso: 96#2->24 .

Implementação direta: tente todos os números inteiros n, mantenha aqueles que atendem à condição e escolha o primeiro.


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

4

05AB1E (10 bytes)

>GN²m¹ÖiNq

Experimente online

  • > Lê o primeiro argumento, o incrementa e o empurra na pilha
  • Gabre a pilha ( a) e inicia um loop que contém o restante do programa em que Nassume o valor1, 2, ... a - 1 .
  • N²mempurra Ne a segunda entrada do histórico de entrada, em seguida, abre as duas e empurra a primeira para a potência da segunda.
  • ¹ coloca a primeira entrada do histórico de entrada na pilha.
  • Ö exibe as duas entradas anteriores da pilha e pressiona a % b == 0 a pilha.
  • iaparece isso da pilha. Se verdadeiro, ele executa o restante do programa; caso contrário, o loop continuará.
  • N empurra N a pilha.
  • q finaliza o programa.

Quando o programa termina, o valor superior da pilha é impresso.


Publique uma explicação de como esse código funciona para aqueles que não estão familiarizados com o seu idioma, mas de outra forma um bom trabalho e uma boa primeira postagem.
Rohan Jhunjhunwala

Esse link parece interessante.
Leaky Nun

2
Muito boa primeira resposta.
Emigna

3

MATL , 9 bytes

y:w^w\&X<

Experimente online!

Explicação

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

Manipulação de pilha muito.
Leaky Nun

1
Sim. Eu suspeito que Jelly terá uma grande vantagem aqui, uma vez que evita todos aqueles "cópia" e "Swap"
Luis Mendo

Você não tem find?
Leaky Nun

@LeakyNun Sim, fmas encontra todos os índices diferentes de zero. Portanto, teria que ser ~f1): negatve, find, get the first entry
Luis Mendo

3

Na realidade , 12 11 bytes

Muito obrigado a Leaky Nun por suas muitas sugestões. Sugestões de golfe são bem-vindas. Experimente online!

;)R♀ⁿ♀%0@íu

Abordagem original de 12 bytes. Experimente online!

1WX│1╖╜ⁿ%WX╜

Outra abordagem de 12 bytes. Experimente online!

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

Uma abordagem de 13 bytes. Experimente online!

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

Ungolfing:

Primeiro algoritmo

       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.

Algoritmo original

       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.

Terceiro algoritmo

       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.

Quarto algoritmo

     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 Esperando uma das suas sugestões de golfe a vencer: D
Sherlock9

@LeakyNun Também ficaria feliz em publicar essas abordagens, a menos que você queira publicá-las.
Sherlock9

+1 para o sorriso;)
Leaky Nun

2

R, 61 bytes , 39 bytes , 37 bytes , 34 bytes

Eu ainda sou um novato em programação R e essa é a minha primeira função que crio em R ( Yay! ), Então acredito que ainda há espaço para melhorias.

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

O teste on-line pode ser realizado aqui: RStudio on rollApp .


Grandes progressos:

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

which.maxfunciona porque retorna o valor mais alto em um vetor e, se houver vários, retornará o primeiro. Nesse caso, temos um vetor de muitos FALSEs (que são 0s) e algumas TRUEs (que são 1s); portanto, ele retornará o primeiro VERDADEIRO.


Outro progresso:

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

Finalmente, ele supera a resposta usando Python por dois bytes. :)

Outro progresso: (Novamente!)

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

Muito obrigado a Axeman e user5957401 pela ajuda.


Eu acho que seu link de teste está morto.
TheBikingViking

@TheBikingViking Obrigado por apontar isso. Eu vou editá-lo depois de ter meu almoço tardio
Anastasiya-Romanova秀

2
Se você usar which.min, poderá se livrar do ==0. O mulo vai devolver um número, o qual não ser menor do que 0.
user5957401

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

Para o mesmo comprimento de 34 bytes, você também tinha o mesmo function(x,y)which(!(1:x)^y%%x)[1].
plannapus

2

dc, 23 22 bytes

Obrigado a Delioth por sua dica sobre métodos de entrada, salvando um byte

sysxz[zdlylx|0<F]dsFxp

Utiliza o operador de profundidade da pilha zpara incrementar o caso de teste diretamente na pilha e o operador de exponenciação modular |para, bem, exponenciação modular. Repita o teste até que o restante não seja maior que zero.


1
Tecnicamente, você não precisa do ?início, pois uma maneira padrão de invocar algumas coisas é > echo "x y [program]"|dc, onde xe ysão as mesmas que as perguntas xey serão colocadas na pilha normalmente.
Delioth 22/08/16

@ Delioth Interessante, obrigado! Eu sempre usei a -eopção, mas vou usá-la a partir de agora.
Joe

@ Delioth, para mim, usar aspas gera erros, lembrando-me que "não está implementado dc, enquanto não usar aspas obviamente gera erros de shell. Há algo a ser feito sobre isso? Eu sei que stderrpode ser ignorado, mas ainda me incomoda.
Joe

1

05AB1E , 8 bytes

Lsm¹%0k>

Explicação

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

Experimente online


1

Perl 6 ,  26  25 bytes

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

Explicação:

# 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 bytes

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

0

Dyalog APL , 11 bytes

Tradução disso .

0⍳⍨⊣|(⍳⊣)*⊢

0⍳⍨Encontre o primeiro zero nos
⊣|remanescentes da divisão quando x divide
(⍳⊣)*os números inteiros de um a x , elevado à potência de
y

TryAPL online!


0

PowerShell v2 +, 48 bytes

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

Pega entrada $xe $y. Constrói um intervalo de 1a $xe depois usa Where-Objectpara filtrar esses números. O filtro pega a string "$_*"(ou seja, o número atual com um asterisco) e usa a multiplicação de strings para concatenar esses $yhorários, depois tacografa uma final 1no final e depois as canaliza para iex(abreviado Invoke-Expressione semelhante a eval). Isso toma o lugar de[math]::Pow($_,$y) , pois o PowerShell não tem um operador de exponenciação e é dois bytes mais curto. Isso é alimentado no operador do módulo %com $x- assim, se for divisível, será 0, então encapsulamos isso em parênteses e pegamos o Boolean-not!(...)disso. Portanto, se for divisível, será incluído por esse filtro e todos os outros números serão excluídos.

Finalmente, encapsulamos os números resultantes em parênteses (...)e obtemos o [0]índice. Como o intervalo inserido foi classificado 1..$x, este será o menor. Isso fica no pipeline e a impressão está implícita.

Casos de teste

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 bytes

Inclui +3 para -p(não +1, pois o código contém ')

Execute com a entrada em STDIN

power.pl <<< "96 2"

power.pl:

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

0

Pitão, 9 bytes

AQf!%^THG

Um programa que recebe a entrada de uma lista do formulário [x, y]no STDIN e imprime o resultado.

Experimente online

Como funciona

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 bytes

Desculpe, mas não posso testar isso no meu celular. :)

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

Golfe

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

Você está usando $ z onde você deve estar usando $ x e eu não acho que você está incrementando $ i no circuito
theLambGoat
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.