Số dương nhỏ nhất có lũy thừa y chia hết cho x


15

Bài tập

Cho các số nguyên xycả hai đều ít nhất 2, tìm số dương nhỏ nhất có ylũy thừa thứ nhất chia hết cho x.

Thí dụ

Với x=96y=2, sản lượng nên được 24kể từ khi 24là dương nhỏ nhất nthỏa mãn n^2 is divisible by 96.

Tủ thử

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

Chấm điểm

Đây là . Giải pháp với số lần đếm byte thấp nhất.

Người giới thiệu



1
Sẽ Xluôn luôn lớn hơn Y?
Gây tử vong

@Firthize Điều đó có liên quan gì?
Leaky Nun

Không có trường hợp thử nghiệm nào Xnhỏ hơn Yvà nó có thể làm giảm độ dài của một số câu trả lời (ít nhất là của tôi) nếu Xluôn luôn lớn hơn Y. Tôi muốn có cái đó Xcó thể lớn hơn hoặc nhỏ hơn, nhưng sau đó một trường hợp thử nghiệm cho cái sau sẽ là tuyệt vời.
Gây tử vong

1
Danh sách tài liệu tham khảo của bạn là minh họa tốt nhất tôi từng thấy về sự độc đoán lố bịch của việc đặt hàng nhập OEIS.
Sparr

Câu trả lời:


7

Brachylog , 19 17 16 15 12 byte

Lưu 2 byte nhờ @LeakyNun.

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

Hãy thử trực tuyến!

Giải trình

               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 Cảm ơn. Điều này sẽ chậm hơn nhiều mặc dù.
Gây tử vong vào

Tại sao điều này sẽ chậm hơn?
Leaky Nun


4
Để trích dẫn Fatalize nổi tiếng: "đừng quan tâm đến sự phức tạp"
Leaky Nun

6

Thạch , 6 byte

ÆE÷ĊÆẸ

Hãy thử trực tuyến! hoặc xác minh tất cả các trường hợp thử nghiệm .

Làm thế nào nó hoạt động

ÆE÷ĊÆẸ  Main link. Arguments: x, y

ÆE      Yield the exponents of x's prime factorization.
  ÷     Divide them by y.
   Ċ    Ceil; round the quotients up to the nearest integer.
    ÆẸ  Return the integer with that exponents in its prime factorization.

1
R*%⁸i0cũng là 6 byte.
Leaky Nun

Tôi nghĩ rằng đảm bảo một câu trả lời riêng biệt.
Dennis

6

JavaScript (ES7), 32 byte

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

Bạn không bao giờ xác định f. Tôi nghĩ bạn cần gán chức năng cho f.
kamoroso94

1
@ kamoroso94 Xin lỗi, tôi mãi mãi làm điều đó.
Neil


5

Trăn 3, 60 43 39 byte

Cảm ơn @LeakyNun và @ Sp3000 đã giúp đỡ

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

Một hàm nhận đầu vào thông qua đối số và trả về đầu ra.

Làm thế nào nó hoạt động

Hàm sử dụng đệ quy để liên tục kiểm tra các số nguyên i, bắt đầu bằng i=1, cho đến khi i**y%x<1tìm thấy một điều kiện cần, tại đây , được tìm thấy. Điều này đạt được bằng cách lấy logic orcủa điều kiện và kết quả của biểu thức để i+1tăng dần, ở đây là -~f(x,y,i+1). Biểu thức này liên tục đánh giá Falsecho đến khi jtìm thấy một giá trị thỏa mãn , tại đó nó đánh giá Truevà dừng đệ quy. Vì các giá trị này tương ứng với 01trong Python và hàm đã liên tục được thêm vào 1thông qua phần tăng dần, nên hàm trả về(j-1)*False + True + (j-1)*1 = (j-1)*0 + 1 + (j-1)*1 = 1 + j-1 = j , theo yêu cầu.

Hãy thử nó trên Ideone


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

@LeakyNun Cảm ơn. Tôi chỉ nghĩ ra một cách ngắn hơn một chút để làm điều đó (43 so với 44) với đệ quy.
TheBikingViking 21/8/2016

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

@ Sp3000 Không phải chức năng của bạn trở lại Truethay vì z?
Leaky Nun

@LeakyNun Bạn đang thiếu -~một phần, nhưng vâng, nó sẽ trở lại Truenếu xlà 1.
Sp3000

4

Haskell, 31 byte

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

Ví dụ sử dụng: 96#2-> 24.

Thực hiện trực tiếp: thử tất cả các số nguyên n, giữ các số nguyên đáp ứng điều kiện và chọn số nguyên đầu tiên.


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

4

05AB1E (10 byte)

>GN²m¹ÖiNq

Dùng thử trực tuyến

  • > Đọc đối số đầu tiên, tăng nó và đẩy nó lên ngăn xếp
  • Gbật ngăn xếp ( a) và bắt đầu một vòng lặp chứa phần còn lại của chương trình, nơi Nnhận giá trị1, 2, ... a - 1 .
  • N²mđẩy Nvà mục thứ hai từ lịch sử đầu vào, sau đó bật cả hai và đẩy cái đầu tiên lên sức mạnh của cái thứ hai.
  • ¹ đẩy mục nhập đầu tiên từ lịch sử đầu vào vào ngăn xếp.
  • Öbật hai mục nhập ngăn xếp trước đó, sau đó đẩy a % b == 0vào ngăn xếp.
  • ibật ra từ ngăn xếp. Nếu đúng, nó thực thi phần còn lại của chương trình; mặt khác, vòng lặp tiếp tục.
  • Nđẩy Nvào ngăn xếp.
  • q chấm dứt chương trình.

Khi chương trình kết thúc, giá trị trên cùng của ngăn xếp được in.


Vui lòng gửi một lời giải thích về cách mã này hoạt động cho những người không quen thuộc với ngôn ngữ của bạn, nhưng nếu không thì công việc tốt và bài đăng đầu tiên tốt đẹp.
Rohan Jhunjhunwala

Liên kết đó có vẻ thú vị.
Nữ tu rò rỉ

2
Câu trả lời đầu tiên rất hay.
Emigna

3

MATL , 9 byte

y:w^w\&X<

Hãy thử trực tuyến!

Giải trình

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

Thao tác xếp chồng nhiều.
Leaky Nun

1
Vâng. Tôi nghi ngờ Jelly sẽ có lợi thế lớn ở đây, vì nó tránh được tất cả những "bản sao" và "hoán đổi"
Luis Mendo

Bạn không có findà
Nữ tu rò rỉ

@LeakyNun Có, fnhưng điều đó tìm thấy tất cả các chỉ số khác. Vì vậy, nó sẽ phải là ~f1): phủ nhận, tìm kiếm, có được mục đầu tiên
Luis Mendo

3

Thực ra , 12 11 byte

Rất cám ơn Leaky Nun vì nhiều gợi ý của anh ấy. Gợi ý chơi golf chào mừng. Hãy thử trực tuyến!

;)R♀ⁿ♀%0@íu

Cách tiếp cận 12 byte gốc. Hãy thử trực tuyến!

1WX│1╖╜ⁿ%WX╜

Một cách tiếp cận 12 byte khác. Hãy thử trực tuyến!

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

Một cách tiếp cận 13 byte. Hãy thử trực tuyến!

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

Ungolfing:

Thuật toán đầu tiên

       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.

Thuật toán gốc

       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.

Thuật toán thứ ba

       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.

Thuật toán thứ tư

     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 Chờ đợi một trong những gợi ý chơi gôn chiến thắng của bạn: D
Sherlock9

@LeakyNun Tôi cũng rất vui khi được đăng những cách tiếp cận đó, trừ khi bạn muốn tự mình đăng chúng.
Sherlock9

+1 cho nụ cười nhếch mép;)
Leaky Nun

2

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

Tôi vẫn là người mới trong lập trình R và hóa ra đây là chức năng đầu tiên tôi tạo trong R ( Yay! ) Vì vậy tôi tin rằng vẫn còn chỗ để cải thiện.

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

Kiểm tra trực tuyến có thể được tiến hành ở đây: RStudio trên rollApp .


Tiến bộ lớn:

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

which.maxhoạt động bởi vì nó trả về giá trị cao nhất trong một vectơ và nếu có nhiều thì nó sẽ trả về giá trị đầu tiên. Trong trường hợp này, chúng ta có một vectơ gồm nhiều FALSE (là 0) và một vài TRUE (là 1s), vì vậy nó sẽ trả về TRUE đầu tiên.


Một tiến bộ khác:

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

Cuối cùng, nó đánh bại câu trả lời bằng Python bằng hai byte. :)

Một tiến bộ khác: (Một lần nữa!)

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

Rất cám ơn Axemanuser5957401 đã giúp đỡ.


Tôi nghĩ rằng liên kết kiểm tra của bạn đã chết.
TheBikingViking

@TheBikingViking Cảm ơn bạn đã chỉ ra điều đó. Tôi sẽ chỉnh sửa nó sau khi ăn trưa muộn
Anastasiya-Romanova

2
nếu bạn sử dụng which.min, bạn có thể thoát khỏi ==0. Mô-đun sẽ trả về một số không nhỏ hơn 0.
user5957401

1
@ user5957401 Đã chỉnh sửa.Bolshoe spasibo ...
Anastasiya-Romanova

Đối với cùng độ dài 34 byte, bạn cũng có tương tự function(x,y)which(!(1:x)^y%%x)[1].
plannapus

2

đc 23 22 byte

Cảm ơn Delioth về mẹo của anh ấy về các phương thức nhập liệu, tiết kiệm một byte

sysxz[zdlylx|0<F]dsFxp

Sử dụng toán tử độ sâu ngăn xếp zđể tăng trường hợp thử nghiệm trực tiếp trên ngăn xếp và toán tử lũy thừa mô đun |cho, lũy thừa mô đun. Lặp lại thử nghiệm cho đến khi phần còn lại không lớn hơn 0.


1
Về mặt kỹ thuật, bạn không cần ?ngay từ đầu, như một cách tiêu chuẩn để gọi một số thứ là > echo "x y [program]"|dc, ở đâu xy giống như Câu hỏi x và y sẽ được thả vào ngăn xếp như bình thường.
Delioth

@Delioth Thú vị, cảm ơn! Tôi luôn chỉ sử dụng -etùy chọn, nhưng tôi sẽ sử dụng tùy chọn đó kể từ bây giờ.
Joe

@Delioth, đối với tôi, sử dụng dấu ngoặc kép sẽ nhắc nhở tôi rằng "không được triển khai trong dckhi không sử dụng dấu ngoặc kép rõ ràng sẽ gây ra lỗi shell. Có bất cứ điều gì để làm về điều này? Tôi biết stderrcó thể bỏ qua, nhưng nó vẫn làm phiền tôi.
Joe


1

Perl 6 ,  26  25 byte

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

Giải trình:

# 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

Toán học, 36 byte

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


0

PowerShell v2 +, 48 byte

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

Đưa đầu vào $x$y. Xây dựng một phạm vi từ 1đến $x, sau đó sử dụng Where-Objectđể lọc các số đó. Bộ lọc lấy chuỗi "$_*"(tức là số hiện tại có dấu hoa thị) và sử dụng phép nhân chuỗi để nối các $ykhoảng thời gian đó, sau đó xử lý một trận chung kết 1ở cuối, sau đó chuyển sang iex( cuối cùng Invoke-Expressionvà tương tự eval). Điều này thay thế [math]::Pow($_,$y), vì PowerShell không có toán tử lũy thừa và ngắn hơn hai byte. Điều đó được đưa vào toán tử modulo %với $x- do đó, nếu nó chia hết, điều này sẽ xảy ra 0, vì vậy chúng tôi gói gọn nó trong parens và lấy Boolean-not!(...)trong đó. Do đó, nếu chia hết, nó sẽ được bao gồm bởi bộ lọc này và tất cả các số khác sẽ bị loại trừ.

Cuối cùng, chúng tôi gói gọn các số kết quả trong parens (...)và lấy [0]chỉ mục. Vì phạm vi đã nhập được sắp xếp 1..$x, đây sẽ là nhỏ nhất. Điều đó còn lại trên đường ống và in ấn là ẩn.

Các trường hợp thử nghiệm

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

Bao gồm +3 cho -p(không phải +1 vì mã chứa ')

Chạy với đầu vào trên STDIN

power.pl <<< "96 2"

power.pl:

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

0

Bình thường, 9 byte

AQf!%^THG

Một chương trình lấy đầu vào của danh sách biểu mẫu [x, y]trên STDIN và in kết quả.

Dùng thử trực tuyến

Làm thế nào nó hoạt động

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

Xin lỗi, nhưng tôi không thể kiểm tra điều này từ điện thoại di động của mình. :)

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

Chơi gôn

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

Bạn đang sử dụng $ z trong đó bạn nên sử dụng $ x và tôi không nghĩ rằng bạn đang tăng $ i trong vòng lặp
theLambGoat
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.