Numero positivo più piccolo la cui Y-potenza è divisibile per x


15

Compito

Dati numeri interi xe yche sono entrambi almeno 2, trova il numero positivo più piccolo il cui y-th power è divisibile per x.

Esempio

Dato x=96e y=2, l'output dovrebbe essere 24dato che 24è il più piccolo nsoddisfacente positivo n^2 is divisible by 96.

Casi test

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

punteggio

Questo è . Vince la soluzione con il conteggio di byte più basso.

Riferimenti



1
Sarà Xsempre maggiore di Y?
Fatalizza il

@Fatalize Che cosa ha a che fare con qualcosa?
Leaky Nun,

Non esiste un caso di test in cui Xè inferiore a Ye può ridurre la lunghezza di alcune risposte (almeno la mia) se Xè sempre maggiore di Y. Preferirei che Xpotesse essere più grande o più piccolo, ma un caso di prova per quest'ultimo sarebbe fantastico.
Fatalizza il

1
La tua lista di referenze è la migliore illustrazione che ho visto della ridicola arbitrarietà dell'ordinamento degli ingressi OEIS.
Sparr,

Risposte:


7

Brachylog , 19 17 16 15 12 byte

2 byte salvati grazie a @LeakyNun.

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

Provalo online!

Spiegazione

               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 Grazie. Questo sarà molto più lento però.
Fatalizza il

Perché sarà più lento?
Leaky Nun,


4
Per citare il famoso Fatalize: "non preoccuparti della complessità"
Leaky Nun,


6

JavaScript (ES7), 32 byte

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

Non hai mai definito f. Penso che devi assegnare la funzione a f.
kamoroso94,

1
@ kamoroso94 Mi dispiace, lo faccio per sempre.
Neil,


5

Python 3, 60 43 39 byte

Grazie a @LeakyNun e @ Sp3000 per l'aiuto

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

Una funzione che accetta input tramite argomento e restituisce l'output.

Come funziona

La funzione utilizza la ricorsione per controllare ripetutamente numeri interi i, a partire da i=1, fino a quando non i**y%x<1viene trovata una soddisfacente condizione richiesta . Ciò si ottiene prendendo la logica ordella condizione e il risultato dell'espressione per i+1incrementato, che qui è -~f(x,y,i+1). Questa espressione valuta continuamente Falsefino a quando non jviene trovato un valore soddisfacente , a quel punto valuta Truee si interrompe la ricorsione. Poiché questi sono rispettivamente equivalenti a 0e 1in Python e la funzione è stata aggiunta ripetutamente 1tramite la parte incrementale, la funzione ritorna (j-1)*False + True + (j-1)*1 = (j-1)*0 + 1 + (j-1)*1 = 1 + j-1 = j, come richiesto.

Provalo su Ideone


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

@LeakyNun Grazie. Ho solo pensato a un modo leggermente più breve per farlo (43 vs 44) con la ricorsione.
TheBikingViking

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

@ Sp3000 La tua funzione non ritorna Trueinvece di z?
Leaky Nun,

@LeakyNun Ti manca la -~parte, ma sì, tornerebbe Truese xfosse 1.
Sp3000

4

Haskell, 31 byte

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

Esempio di utilizzo: 96#2-> 24.

Implementazione diretta: prova tutti i numeri interi n, mantieni quelli che soddisfano la condizione e scegli il primo.


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

4

05AB1E (10 byte)

>GN²m¹ÖiNq

Provalo online

  • > Legge il primo argomento, lo incrementa e lo inserisce nello stack
  • Gapre lo stack ( a) e avvia un ciclo che contiene il resto del programma dove Nassume il valore 1, 2, ... a - 1.
  • N²mspinge Ne la seconda voce dalla cronologia di input, quindi le apre entrambe e spinge la prima alla potenza della seconda.
  • ¹ inserisce la prima voce della cronologia di input nello stack.
  • Öapre le due precedenti voci dello stack, quindi inserisce a % b == 0lo stack.
  • ilo estrae dallo stack. Se vero, esegue il resto del programma; in caso contrario, il ciclo continua.
  • Nspinge Nin pila.
  • q termina il programma.

Al termine del programma, viene stampato il valore superiore della pila.


Si prega di inviare una spiegazione del funzionamento di questo codice per coloro che non hanno familiarità con la propria lingua, ma per il resto un buon lavoro e un bel primo post.
Rohan Jhunjhunwala,

Quel collegamento sembra interessante.
Leaky Nun,

2
Molto bella la prima risposta.
Emigna,

3

MATL , 9 byte

y:w^w\&X<

Provalo online!

Spiegazione

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

Stack manipolazione molto.
Leaky Nun,

1
Sì. Sospetto che Jelly avrà un grande vantaggio qui, poiché evita tutte quelle "copie" e "scambi"
Luis Mendo,

Non hai find?
Leaky Nun,

@LeakyNun Sì, fma questo trova tutti gli indici diversi da zero. Quindi dovrebbe essere ~f1): negatve, trova, ottieni la prima voce
Luis Mendo,

3

In realtà , 12 11 byte

Mille grazie a Leaky Nun per i suoi numerosi suggerimenti. Suggerimenti di golf benvenuti. Provalo online!

;)R♀ⁿ♀%0@íu

Approccio originale a 12 byte. Provalo online!

1WX│1╖╜ⁿ%WX╜

Un altro approccio a 12 byte. Provalo online!

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

Un approccio a 13 byte. Provalo online!

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

Ungolfing:

Primo 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 originale

       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.

Terzo 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 In attesa di uno dei tuoi suggerimenti golf vincenti: D
Sherlock9

@LeakyNun Sarei felice di pubblicare anche questi approcci, a meno che tu non voglia postarli tu stesso.
Sherlock9,

+1 per il ghigno;)
Leaky Nun

2

R, 61 byte , 39 byte , 37 byte , 34 byte

Sono ancora un principiante nella programmazione R e si scopre che questa è la mia prima funzione che creo in R ( Yay! ), Quindi credo che ci sia ancora spazio per miglioramenti.

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

Il test online può essere condotto qui: RStudio su rollApp .


Progressi importanti:

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

which.maxfunziona perché restituisce il valore più alto in un vettore e se ce ne sono diversi restituirà il primo. In questo caso, abbiamo un vettore di molti FALSE (che sono 0) e alcuni Veri (che sono 1), quindi restituirà il primo VERO.


Un altro progresso:

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

Infine, batte la risposta usando Python di due byte. :)

Un altro progresso: (di nuovo!)

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

Mille grazie ad Axeman e user5957401 per l'aiuto.


Penso che il tuo link di test sia morto.
TheBikingViking

@TheBikingViking Grazie per averlo sottolineato. Lo modificherò dopo il mio pranzo in ritardo
Anastasiya-Romanova 秀

2
se lo usi which.min, potresti sbarazzarti di ==0. Il modulo restituirà un numero, che non deve essere inferiore a 0.
user5957401

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

Per la stessa lunghezza di 34 byte hai avuto anche lo stesso function(x,y)which(!(1:x)^y%%x)[1].
plannapus,

2

dc, 23 22 byte

Grazie a Delioth per il suo suggerimento sui metodi di input, salvando un byte

sysxz[zdlylx|0<F]dsFxp

Utilizza l'operatore di profondità dello stack zper incrementare il caso di test direttamente sullo stack e l'operatore di esponenziazione modulare |per l'espiazione modulare. Ripetere il test fino a quando il resto non è maggiore di zero.


1
Tecnicamente non hai bisogno ?di all'inizio, in quanto un modo standard per invocare alcune cose è > echo "x y [program]"|dc, dove xe ysono gli stessi di Question-x e y verranno rilasciati nello stack normalmente.
Delioth,

@Delioth Interessante, grazie! Ho sempre usato l' -eopzione, ma la userò d'ora in poi.
Joe,

@Delioth, per me, usare le virgolette genera errori che mi ricordano che "non è implementato dc, mentre non usare le virgolette ovviamente dà errori di shell. C'è qualcosa da fare al riguardo? So che stderrpuò essere ignorato, ma mi dà ancora fastidio.
Joe,

1

05AB1E , 8 byte

Lsm¹%0k>

Spiegazione

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

Provalo online


1

Perl 6 ,  26  25 byte

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

Spiegazione:

# 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

PowerShell v2 +, 48 byte

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

Accetta input $xe $y. Crea un intervallo da 1a $x, quindi utilizza Where-Objectper filtrare quei numeri. Il filtro prende la stringa "$_*"(cioè il numero corrente con un asterisco) e usa la moltiplicazione delle stringhe per concatenare quei $ytempi, quindi attacca un finale 1alla fine, quindi lo dirige verso iex(abbreviato Invoke-Expressione simile a eval). Questo prende il posto di[math]::Pow($_,$y) , poiché PowerShell non ha un operatore di esponenziazione ed è più breve di due byte. Viene inserito nell'operatore modulo %con $x- quindi, se è divisibile, lo sarà 0, quindi lo incapsuliamo in parentesi e prendiamo il Booleano-non!(...)della stessa. Pertanto, se è divisibile, verrà incluso da questo filtro e verranno esclusi tutti gli altri numeri.

Infine, incapsuliamo i numeri risultanti in parentesi (...)e prendiamo l' [0]indice. Poiché l'intervallo immesso è stato ordinato1..$x , questo sarà il più piccolo. Rimane in cantiere e la stampa è implicita.

Casi 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 byte

Include +3 per -p(non +1 poiché il codice contiene ')

Esegui con l'input su STDIN

power.pl <<< "96 2"

power.pl:

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

0

Pyth, 9 byte

AQf!%^THG

Un programma che accetta l'inserimento di un elenco del modulo [x, y]su STDIN e stampa il risultato.

Provalo online

Come funziona

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 byte

Spiacenti, ma non riesco a provarlo dal mio cellulare. :)

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

golfed

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

Stai usando $ z dove dovresti usare $ x e non credo che stai incrementando $ i nel ciclo
theLambGoat
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.