จำนวนบวกที่น้อยที่สุดซึ่งกำลัง y คือ th หารด้วย x


15

งาน

ได้รับจำนวนเต็มxและyซึ่งมีทั้งที่อย่างน้อย2หาจำนวนบวกที่เล็กที่สุดที่มีyอำนาจ -th xหารด้วย

ตัวอย่าง

ได้รับx=96และy=2การส่งออกที่ควรจะเป็น24ตั้งแต่24เป็นบวกที่เล็กที่สุดที่น่าพอใจnn^2 is divisible by 96

Testcases

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

เกณฑ์การให้คะแนน

นี่คือรหัสกอล์ฟโซลูชันที่มีจำนวนไบต์ต่ำสุดที่ชนะ

อ้างอิง


ที่เกี่ยวข้อง
Leun Nun

1
จะXยิ่งใหญ่กว่าเสมอY?
ลดขนาด

@ สรุปสิ่งที่เกี่ยวข้องกับอะไร?
Leun Nun

ไม่มีกรณีทดสอบที่เป็นXน้อยกว่าYและสามารถลดความยาวของคำตอบบางอย่าง (ที่เหมืองน้อย) ถ้าสูงกว่าเสมอX Yฉันอยากที่จะมีXขนาดใหญ่ขึ้นหรือเล็กลง แต่จากนั้นหนึ่งกรณีทดสอบสำหรับหลังจะดีมาก
ลดขนาด

1
รายการอ้างอิงของคุณเป็นภาพประกอบที่ดีที่สุดที่ฉันได้เห็นถึงความเด็ดขาดของ OEIS ในการสั่งซื้อ
SPARR

คำตอบ:


7

Brachylog , 19 17 16 15 12 ไบต์

บันทึก 2 ไบต์ด้วย @LeakyNun

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

ลองออนไลน์!

คำอธิบาย

               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 ขอบคุณ มันจะช้ากว่านี้มาก
ลดขนาด

ทำไมสิ่งนี้ถึงช้าลง
Leun Nun


4
เพื่ออ้างอิง Fatalize ที่มีชื่อเสียง: "ไม่ต้องห่วงเรื่องความซับซ้อน"
Leaky Nun

6

วุ้น 6 ไบต์

ÆE÷ĊÆẸ

ลองออนไลน์! หรือตรวจสอบกรณีทดสอบทั้งหมด

มันทำงานอย่างไร

Æ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*%⁸i0ยังเป็น 6 ไบต์
Leun Nun

ฉันคิดว่ารับประกันคำตอบแยกต่างหาก
เดนนิส

6

JavaScript (ES7), 32 ไบต์

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

fคุณไม่เคยกำหนดไว้ fฉันคิดว่าคุณต้องกำหนดฟังก์ชั่น
kamoroso94

1
@ kamoroso94 ขออภัยฉันทำเช่นนี้ตลอดไป
Neil


5

Python 3, 60 43 39 ไบต์

ขอบคุณ @LeakyNun และ @ Sp3000 สำหรับความช่วยเหลือ

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

ฟังก์ชันที่รับอินพุตผ่านอาร์กิวเมนต์และส่งคืนเอาต์พุต

มันทำงานอย่างไร

ฟังก์ชันใช้การเรียกซ้ำเพื่อตรวจสอบจำนวนเต็มซ้ำ ๆiโดยเริ่มจากi=1จนกว่าi**y%x<1จะพบเงื่อนไขที่ต้องการตรงนี้ นี่คือความสำเร็จโดยการใช้ตรรกะorของสภาพและผลของการแสดงออกสำหรับการเพิ่มขึ้นซึ่งที่นี่ก็คือi+1 -~f(x,y,i+1)นิพจน์นี้ประเมินผลอย่างต่อเนื่องFalseจนกระทั่งjพบมูลค่าที่น่าพอใจณ จุดที่ประเมินTrueและหยุดการเรียกซ้ำ เนื่องจากสิ่งเหล่านี้เทียบเท่ากับ0และ1ใน Python ตามลำดับและฟังก์ชั่นได้รับการเพิ่มซ้ำ ๆ1ผ่านส่วนที่เพิ่มขึ้นฟังก์ชันจึงส่งกลับ(j-1)*False + True + (j-1)*1 = (j-1)*0 + 1 + (j-1)*1 = 1 + j-1 = jตามที่ต้องการ

ลองใช้กับ Ideone


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

@LeakyNun ขอบคุณ ฉันคิดว่าวิธีที่สั้นกว่าเล็กน้อยที่จะทำ (43 vs 44) ด้วยการเรียกซ้ำ
TheBikingViking

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

@ SP3000 ไม่ได้ฟังก์ชั่นของคุณกลับมาTrueแทนz?
Leun Nun

@LeakyNun คุณหายไป-~ส่วนหนึ่ง แต่ใช่มันจะกลับมาTrueถ้าxเป็น 1
Sp3000

4

Haskell, 31 ไบต์

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

ตัวอย่างการใช้งาน: ->96#224

การใช้งานโดยตรง: ลองใช้จำนวนเต็มทั้งหมดnรักษาค่าที่ตรงกับเงื่อนไขและเลือกค่าแรก


2
นอกจากนี้ 31:x#y=until(\n->mod(n^y)x<1)(+1)0
xnor

4

05AB1E (10 ไบต์)

>GN²m¹ÖiNq

ลองออนไลน์

  • > อ่านอาร์กิวเมนต์แรกเพิ่มขึ้นและส่งไปที่สแต็ก
  • Gดึง stack ( a) และเริ่มการวนซ้ำที่มีส่วนที่เหลือของโปรแกรมที่Nรับค่า1, 2, ... a - 1จะใช้เวลาในค่า
  • N²mพุชNและรายการที่สองจากประวัติอินพุตจากนั้นป็อปทั้งสองและผลักดันรายการแรกสู่พลังของวินาที
  • ¹ ดันรายการแรกจากประวัติอินพุตไปยังสแต็ก
  • Ö แสดงรายการสแต็กสองรายการก่อนหน้าจากนั้นกด a % b == 0สแต็ก
  • iปรากฏที่จากสแต็ก หากเป็นจริงจะดำเนินการส่วนที่เหลือของโปรแกรม มิฉะนั้นการวนซ้ำจะดำเนินต่อไป
  • N ดัน Nบนสแต็ก
  • q ยกเลิกโปรแกรม

เมื่อโปรแกรมหยุดทำงานค่าสูงสุดของสแต็กจะถูกพิมพ์


กรุณาโพสต์คำอธิบายวิธีการใช้งานรหัสนี้สำหรับผู้ที่ไม่คุ้นเคยกับภาษาของคุณ แต่เป็นงานที่ดีและโพสต์แรกที่ดี
Rohan Jhunjhunwala

ลิงค์นั้นน่าสนใจ
Leun Nun

2
คำตอบแรกที่ดีมาก
Emigna

3

MATL , 9 ไบต์

y:w^w\&X<

ลองออนไลน์!

คำอธิบาย

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

การจัดการกองมาก
Leun Nun

1
อ๋อ ฉันสงสัยว่าวุ้นจะมีข้อได้เปรียบใหญ่ที่นี่เพราะมันหลีกเลี่ยงทุกคน "คัดลอก" และ "แลกเปลี่ยน"
หลุยส์ Mendo

คุณไม่มีfindเหรอ
Leun Nun

@LeakyNun ใช่fแต่นั่นจะค้นหาดัชนีที่ไม่ใช่ศูนย์ทั้งหมด ดังนั้นมันจะต้องเป็น~f1): negatve ค้นหารับรายการแรก
หลุยส์เมนโด

3

อันที่จริง , 12 11 ไบต์

ขอบคุณมากสำหรับ Leaky Nun สำหรับคำแนะนำมากมายของเขา ยินดีต้อนรับคำแนะนำการเล่นกอล์ฟ ลองออนไลน์!

;)R♀ⁿ♀%0@íu

วิธีดั้งเดิมขนาด 12 ไบต์ ลองออนไลน์!

1WX│1╖╜ⁿ%WX╜

อีก 12 ไบต์ ลองออนไลน์!

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

วิธีการ 13 ไบต์ ลองออนไลน์!

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

Ungolfing:

ขั้นตอนวิธีแรก

       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.

อัลกอริทึมดั้งเดิม

       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.

อัลกอริทึมที่สาม

       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.

อัลกอริทึมที่สี่

     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 กำลังรอคำแนะนำกอล์ฟที่ชนะของคุณ: D
Sherlock9

@LeakyNun ฉันยินดีที่จะโพสต์วิธีการเหล่านั้นด้วยเว้นแต่คุณต้องการโพสต์ด้วยตนเอง
Sherlock9

+1 สำหรับรอยยิ้ม;)
Leaky Nun

2

R, 61 ไบต์ , 39 ไบต์ , 37 ไบต์ , 34 ไบต์

ฉันยังเป็นมือใหม่ในการเขียนโปรแกรม R และปรากฎว่านี่เป็นฟังก์ชั่นแรกของฉันที่ฉันสร้างใน R ( Yay! ) ดังนั้นฉันเชื่อว่ายังมีพื้นที่สำหรับการปรับปรุง

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

การทดสอบแบบออนไลน์สามารถดำเนินการได้ที่นี่: RStudio บน rollApp


ความคืบหน้าสำคัญ:

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

which.maxใช้งานได้เพราะมันคืนค่าสูงสุดในเวกเตอร์และหากมีหลายค่ามันจะคืนค่าแรก ในกรณีนี้เรามีเวกเตอร์ของ FALSE จำนวนมาก (ซึ่งคือ 0s) และ TRUEs สองสามอัน (ซึ่งคือ 1 วินาที) ดังนั้นมันจะคืนค่า TRUE แรก


ความคืบหน้าอื่น:

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

ในที่สุดมันก็เต้นคำตอบโดยใช้ Python สองไบต์ :)

ความคืบหน้าอื่น: (อีกครั้ง!)

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

ขอบคุณAxemanและuser5957401 มากสำหรับความช่วยเหลือ


ฉันคิดว่าลิงก์ทดสอบของคุณตาย
TheBikingViking

@ TheBikingViking ขอบคุณที่ชี้ให้เห็น ฉันจะแก้ไขมันหลังจากทานมื้อเที่ยง
Anastasiya-Romanova 秀

2
ถ้าคุณใช้คุณอาจจะได้รับการกำจัดของwhich.min ==0โมดูลัสจะส่งคืนตัวเลขซึ่งไม่ต่ำกว่า 0
user5957401

1
@ user5957401 แก้ไขแล้ว Bonshoe spasibo ...
Anastasiya-Romanova 秀

สำหรับระยะเวลาเดียวกันของ 34 function(x,y)which(!(1:x)^y%%x)[1]ไบต์คุณยังมีความคล้ายกัน
plannapus

2

กระแสตรง, 23 22 ไบต์

ขอบคุณ Delioth สำหรับเคล็ดลับเกี่ยวกับวิธีการป้อนข้อมูลบันทึกเป็นไบต์

sysxz[zdlylx|0<F]dsFxp

ใช้ตัวดำเนินการเชิงลึกสแต็กzสำหรับการเพิ่มกรณีทดสอบบนสแต็กโดยตรงและตัวดำเนินการการยกกำลังแบบแยกส่วน|สำหรับการยกกำลังแบบแยกส่วนดี ทำซ้ำการทดสอบจนกว่าส่วนที่เหลือจะไม่มากกว่าศูนย์


1
ในทางเทคนิคคุณไม่จำเป็นต้องมี?จุดเริ่มต้นเป็นวิธีมาตรฐานในการเรียกบางสิ่งคือ> echo "x y [program]"|dcที่ไหนxและyเป็นเช่นเดียวกับคำถาม - x และ y จะถูกทิ้งลงบนสแต็กตามปกติ
Delioth

@Delioth ที่น่าสนใจขอบคุณ! ฉันใช้-eตัวเลือกเสมอ แต่ฉันจะใช้สิ่งนี้นับจากนี้
โจ

@Deloth สำหรับฉันการใช้อัญประกาศพ่นข้อผิดพลาดเตือนฉันที่"ไม่ได้ใช้งานในdcขณะที่ไม่ใช้เครื่องหมายอัญประกาศให้ชัดแจ้งข้อผิดพลาดของเชลล์ มีอะไรที่ต้องทำเกี่ยวกับเรื่องนี้หรือไม่? ฉันรู้ว่าstderrสามารถเพิกเฉยได้
Joe


1

Perl 6 ,  26  25 ไบต์

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

คำอธิบาย:

# 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 ไบต์

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

จะเข้าและ$x $yสร้างช่วงจาก1ถึง$xจากนั้นใช้Where-Objectเพื่อกรองตัวเลขเหล่านั้น ตัวกรองจะใช้สตริง"$_*"(เช่นหมายเลขปัจจุบันที่มีเครื่องหมายดอกจัน) และใช้การคูณสตริงเพื่อต่อ$yเวลาเหล่านั้นจากนั้น tacks ที่สุดท้าย1ในตอนท้ายจากนั้นไปป์ที่iex(สั้นInvoke-Expressionและคล้ายกับeval) สิ่งนี้เกิดขึ้น[math]::Pow($_,$y)เนื่องจาก PowerShell ไม่มีตัวดำเนินการการยกกำลังและสั้นลงสองไบต์ นั่นถูกป้อนเข้าสู่โอเปอเรเตอร์ของโมดูโล%ด้วย$x- ดังนั้นถ้ามันหารได้นี่จะเป็น0ดังนั้นเราจึงสรุปแค็ปซูลใน parens และใช้บูลีน!(...)มันได้ ดังนั้นหากแบ่งได้ตัวกรองนี้จะรวมอยู่ในตัวกรองนี้และหมายเลขอื่น ๆ ทั้งหมดจะถูกยกเว้น

สุดท้ายเราสรุปแค็ปซูลตัวเลขผลลัพธ์ใน parens (...)และนำ[0]ดัชนี ตั้งแต่ช่วงที่ป้อนเรียงลำดับ1..$xสิ่งนี้จะเล็กที่สุด สิ่งที่เหลืออยู่บนไปป์ไลน์และการพิมพ์นั้นเป็นนัย

กรณีทดสอบ

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 ไบต์

รวม +3 สำหรับ-p(ไม่ใช่ +1 เนื่องจากมีรหัส')

รันด้วยอินพุตบน STDIN

power.pl <<< "96 2"

power.pl:

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

0

Pyth, 9 ไบต์

AQf!%^THG

โปรแกรมที่รับอินพุตของรายการของแบบฟอร์ม[x, y]บน STDIN และพิมพ์ผลลัพธ์

ลองออนไลน์

มันทำงานอย่างไร

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 ไบต์

ขออภัยฉันไม่สามารถทดสอบได้จากมือถือของฉัน :)

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

แข็งแรงเล่นกอล์ฟ

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

คุณกำลังใช้ $ z ซึ่งคุณควรใช้ $ x และฉันไม่คิดว่าคุณกำลังเพิ่ม $ i ในลูป
theLambGoat
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.