Najmniejsza liczba dodatnia, której y-ta potęga jest podzielna przez x


15

Zadanie

Biorąc pod uwagę liczby całkowite xi yktóre są co najmniej obydwie 2, znajdź najmniejszą liczbę dodatnią, przez którą y-tą potęgę można podzielić x.

Przykład

Biorąc pod uwagę x=96i y=2, wynik powinien być, 24ponieważ 24jest najmniej pozytywny, nsatysfakcjonujący n^2 is divisible by 96.

Przypadki testowe

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

Punktacja

To jest . Rozwiązanie o najniższej liczbie bajtów wygrywa.

Bibliografia



1
Będzie Xzawsze być większa Y?
Fatalize

@Fatalize Co to ma wspólnego z czymkolwiek?
Leaky Nun

Nie ma przypadku testowego, w którym Xjest mniejszy Y, i może skrócić długość niektórych odpowiedzi (przynajmniej moich), jeśli Xjest zawsze większa niż Y. Wolałbym, żeby to Xbyło większe lub mniejsze, ale wtedy jeden test dla tego drugiego byłby świetny.
Fatalize

1
Twoja lista referencji jest najlepszą ilustracją absurdalnej arbitralności zamawiania wpisów OEIS.
Sparr

Odpowiedzi:


7

Brachylog , 19 17 16 15 12 bajtów

2 bajty zapisane dzięki @LeakyNun.

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

Wypróbuj online!

Wyjaśnienie

               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. Będzie to jednak znacznie wolniejsze.
Fatalize

Dlaczego to będzie wolniejsze?
Leaky Nun


4
Cytując słynnego Fatalize: „nie przejmuj się złożonością”
Leaky Nun


6

JavaScript (ES7), 32 bajty

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

Nigdy nie zdefiniowałeś f. Myślę, że musisz przypisać tę funkcję f.
kamoroso94,

1
@ kamoroso94 Przepraszam, zawsze to robię.
Neil


5

Python 3, 60 43 39 bajtów

Dzięki @LeakyNun i @ Sp3000 za pomoc

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

Funkcja, która pobiera dane wejściowe za pomocą argumentu i zwraca dane wyjściowe.

Jak to działa

Funkcja wykorzystuje rekurencję do wielokrotnego sprawdzania liczb całkowitych i, zaczynając od i=1, aż do i**y%x<1znalezienia tutaj spełniającego wymagany warunek . Uzyskuje się to logicznie biorąc orpod uwagę warunek i wynik wyrażenia dla i+1przyrostu, co tutaj jest -~f(x,y,i+1). Wyrażenie to stale ocenia, Falseaż do jznalezienia satysfakcjonującej wartości , w którym to momencie dokonuje oceny Truei rekursja kończy się. Ponieważ są one odpowiednio równoważne 0i 1w Pythonie, a funkcja była wielokrotnie dodawana 1przez część inkrementującą, funkcja zwraca (j-1)*False + True + (j-1)*1 = (j-1)*0 + 1 + (j-1)*1 = 1 + j-1 = j, zgodnie z wymaganiami.

Wypróbuj na Ideone


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

@LeakyNun Thanks. Właśnie pomyślałem o nieco krótszym sposobie zrobienia tego (43 vs 44) z rekurencją.
TheBikingViking

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

@ Sp3000 Czy twoja funkcja nie powraca Truezamiast z?
Leaky Nun

@LeakyNun Tęsknisz za -~częścią, ale tak, Truex
wróciłaby,

4

Haskell, 31 bajtów

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

Przykład użycia: 96#2-> 24.

Bezpośrednia implementacja: wypróbuj wszystkie liczby całkowite n, zachowaj te, które spełniają warunek, i wybierz pierwszą.


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

4

05AB1E (10 bajtów)

>GN²m¹ÖiNq

Wypróbuj online

  • > Odczytuje pierwszy argument, inkrementuje go i wypycha na stos
  • Gwyskakuje z stosu ( a) i uruchamia pętlę, która zawiera resztę programu, w którym Nprzyjmuje wartość 1, 2, ... a - 1.
  • N²mwypycha Ni drugi wpis z historii wprowadzania, następnie wyskakuje z nich oba i wypycha pierwszy do potęgi drugiego.
  • ¹ wypycha pierwszy wpis z historii wprowadzania na stos.
  • Öwyświetla poprzednie dwa wpisy stosu, a następnie przesuwa a % b == 0stos.
  • iwyskakuje ze stosu. Jeśli true, wykonuje resztę programu; w przeciwnym razie pętla będzie kontynuowana.
  • Nnaciska Nna stos.
  • q kończy program.

Po zakończeniu programu drukowana jest górna wartość stosu.


Prześlij wyjaśnienie, w jaki sposób ten kod działa dla tych, którzy nie znają Twojego języka, ale poza tym dobrą pracę i miły pierwszy post.
Rohan Jhunjhunwala

Ten link wydaje się interesujący.
Leaky Nun

2
Bardzo ładna pierwsza odpowiedź.
Emigna

3

MATL , 9 bajtów

y:w^w\&X<

Wypróbuj online!

Wyjaśnienie

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

Dużo manipuluj stosami.
Leaky Nun

1
Tak. Podejrzewam, że Jelly będzie miała tutaj dużą przewagę, ponieważ unika tych wszystkich „kopiowania” i „zamiany”
Luis Mendo

Nie masz find?
Leaky Nun

@LeakyNun Tak, fale to znajduje wszystkie niezerowe indeksy. ~f1)Musiałoby to być : negacja, znajdź, zdobądź pierwszy wpis
Luis Mendo

3

Faktycznie , 12 11 bajtów

Wielkie podziękowania dla Dziurawej Zakonnicy za wiele sugestii. Sugestie dotyczące gry w golfa mile widziane. Wypróbuj online!

;)R♀ⁿ♀%0@íu

Oryginalne podejście 12-bajtowe. Wypróbuj online!

1WX│1╖╜ⁿ%WX╜

Kolejne 12-bajtowe podejście. Wypróbuj online!

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

Podejście 13-bajtowe. Wypróbuj online!

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

Ungolfing:

Pierwszy algorytm

       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.

Oryginalny algorytm

       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.

Trzeci algorytm

       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.

Czwarty algorytm

     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 Oczekiwanie na jedną ze zwycięskich sugestii dotyczących golfa: D
Sherlock9,

@LeakyNun Z przyjemnością opublikuję również te podejścia, chyba że chcesz je opublikować samodzielnie.
Sherlock9,

+1 za uśmieszek;)
Leaky Nun

2

R, 61 bajtów , 39 bajtów , 37 bajtów , 34 bajtów

Nadal jestem nowicjuszem w programowaniu R i okazuje się, że jest to moja pierwsza funkcja, którą tworzę w R ( Tak! ), Więc wierzę, że jest jeszcze miejsce na ulepszenia.

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

Test online można przeprowadzić tutaj: RStudio na rollApp .


Ważny postęp:

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

which.maxdziała, ponieważ zwraca najwyższą wartość w wektorze, a jeśli jest wiele, zwróci pierwszą. W tym przypadku mamy wektor wielu FAŁSZ (które są 0) i kilka PRAWDZIWYCH (które są 1), więc zwróci pierwszą PRAWDĘ.


Kolejny postęp:

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

Wreszcie, pokonuje odpowiedź za pomocą Pythona o dwa bajty. :)

Kolejny postęp: (znowu!)

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

Ogromne podziękowania dla Axeman i user5957401 za pomoc.


Myślę, że twój link testowy jest martwy.
TheBikingViking

@TheBikingViking Dzięki za zwrócenie na to uwagi. Zmienię go po zjedzeniu mojego późnego lunchu
Anastasiya-Romanova 秀

2
jeśli użyjesz which.min, możesz się go pozbyć ==0. Moduł zwróci liczbę, która nie będzie mniejsza niż 0.
user5957401

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

Przy tej samej długości 34 bajtów miałeś również podobny function(x,y)which(!(1:x)^y%%x)[1].
plannapus

2

dc 23 22 bajty

Podziękowania dla Deliotha za jego wskazówkę dotyczącą metod wprowadzania danych, oszczędzania bajtu

sysxz[zdlylx|0<F]dsFxp

Używa operatora głębokości stosu zdo zwiększania przypadku testowego bezpośrednio na stosie, a operatora modularnego potęgowania |do, cóż, potęgowania modułowego. Powtarzaj test, aż reszta nie będzie większa niż zero.


1
Technicznie nie potrzebujesz ?na początku, ponieważ standardowym sposobem wywoływania niektórych rzeczy jest > echo "x y [program]"|dc, gdzie xi ysą takie same jak Pytanie, a y zostaną upuszczone na stos jak zwykle.
Delioth,

@Delioth Ciekawe, dzięki! Zawsze korzystałem z tej -eopcji, ale od tej pory będę z niej korzystać.
Joe

@Delioth, dla mnie, używanie cudzysłowów generuje błędy przypominające mi, że "nie jest zaimplementowane dc, podczas gdy nie używanie cudzysłowów oczywiście powoduje błędy powłoki. Czy można coś z tym zrobić? Wiem, że stderrmożna to zignorować, ale wciąż mi to przeszkadza.
Joe

1

05AB1E , 8 bajtów

Lsm¹%0k>

Wyjaśnienie

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

Wypróbuj online


1

Perl 6 ,  26  25 bajtów

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

Wyjaśnienie:

# 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 bajtów

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

Pobiera dane wejściowe $xi $y. Konstruuje zakres od 1do $x, a następnie używa Where-Objectdo filtrowania tych liczb. Filtr pobiera ciąg znaków "$_*"(tj. Bieżącą liczbę z gwiazdką) i używa mnożenia ciągu znaków, aby połączyć te $yczasy, a następnie haczyki na 1końcu na końcu, a następnie potokuje to iex(skrót Invoke-Expressioni podobne do eval). Zastępuje to [math]::Pow($_,$y), ponieważ PowerShell nie ma operatora potęgowania i jest o dwa bajty krótszy. Jest on podawany do operatora modulo za %pomocą $x- więc jeśli jest podzielny, będzie to 0, więc ujmujemy to w parens i bierzmy wartość logiczną!(...)tego. Tak więc, jeśli jest podzielna, zostanie uwzględniona przez ten filtr, a wszystkie inne liczby zostaną wykluczone.

Na koniec zamykamy wynikowe liczby w parens (...)i bierzemy [0]indeks. Ponieważ wprowadzony zakres został posortowany 1..$x, będzie to najmniejszy. Pozostaje to w przygotowaniu, a drukowanie jest niejawne.

Przypadki testowe

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 bajtów

Obejmuje +3 dla -p(nie +1, ponieważ kod zawiera ')

Uruchom z wejściem na STDIN

power.pl <<< "96 2"

power.pl:

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

0

Pyth, 9 bajtów

AQf!%^THG

Program, który pobiera dane z listy formularza [x, y] na STDIN i drukuje wynik.

Wypróbuj online

Jak to działa

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 bajtów

Przepraszam, ale nie mogę tego przetestować z telefonu komórkowego. :)

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

Grał w golfa

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

Używasz $ z tam, gdzie powinieneś używać $ x i nie sądzę, że zwiększasz $ i w pętli
theLambGoat 22.08.16
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.