กู้กำลังสำคัญจากพลังพิเศษ


13

คำจำกัดความ : พลังพิเศษเป็นจำนวนธรรมชาติที่สามารถแสดงในรูปแบบ p nโดยที่ p คือจำนวนเฉพาะและ n เป็นจำนวนธรรมชาติ

ภารกิจ : เมื่อได้รับพลังพิเศษ p n > 1 ให้คืนค่านายกรัฐมนตรี

ทดสอบ :

input output
9     3
16    2
343   7
2687  2687
59049 3

เกณฑ์การให้คะแนน : นี่คือรหัสกอล์ฟคำตอบที่สั้นที่สุดในการชนะไบต์


1
สามารถnเป็น 1 ได้ไหม
user202729

@ user202729: ในวันที่ 4 n = 1ทดสอบกรณี
Emigna

15
บางทีมันอาจจะเป็นการท้าทายมากกว่าที่จะได้รับพลังแทนส่วนที่สำคัญ ตามที่เป็นอยู่นี้เป็นเพียง "รับปัจจัยต่ำสุดที่ไม่ใช่ 1"
Jo King

คำตอบ:


13

ภาษาการเขียนโปรแกรมของเช็คสเปียร์ , 209 207 ไบต์

T.Ajax,.Page,.Act I:.Scene I:.[Enter Ajax and Page]Ajax:Listen tothy!Page:You cat!Scene V:.Page:You be the sum ofyou a cat!Be the product ofthe quotient betweenI you you worse I?If soLet usScene V.Open heart

ลองออนไลน์!

(I/you)*you<Iสั้นกว่าI%you>0SPL


1
เครื่องมือที่เหมาะสมสำหรับงาน
Jeremy Weirich

12

คุณแน่ใจหรือไม่ว่ารายการ (หรือ[]ประมาณจำนวน) เป็นผลลัพธ์ที่ถูกต้อง
Erik the Outgolfer


หืมไม่รู้เรื่องนั้นขอบคุณ
Erik the Outgolfer

8
สำหรับผู้ที่สงสัยf = push list of prime factors (no duplicates)
MCCCS

7

Java 8, 46 39 37 ไบต์

n->{int r=1;for(;n%++r>0;);return r;}

-7 ไบต์อ้อมขอบคุณที่@Tsathoggua
-2 ไบต์ขอบคุณJoKing

ลองออนไลน์

คำอธิบาย:

n->{               // Method with integer as both parameter and return-type
  int r=1;         //  Start the result-integer `r` at 1
  for(;n%++r>0;);  //  Increase `r` by 1 before every iteration with `++r`
                   //  and loop until `n` is divisible by `r`
  return r;}       //  After the loop, return `r` as result

การติดตามคำตอบของ Luis Mendo ใน python3เป็นไปได้ไหมที่จะเขียนn->{for(int i=1;++i<=n;)if(n%i<1)return i;}เพื่อให้ได้ 43 ตัวอักษร? (ฉันไม่พูดภาษาจาวา)
Tsathoggua

@Tathathua ในขณะที่คุณมีมันไม่ได้เนื่องจากวิธีการจาวาจะต้องมีผลตอบแทนเสมอ n->{for(int i=1;++i<=n;)if(n%i<1)return i;return n;}จะใช้งานได้ แต่น่าเสียดายอีกต่อไป จาวาสามารถกลับมาครั้งเดียวในลูปที่ไม่มีที่สิ้นสุดซึ่งแน่นอนบันทึกไบต์ดังนั้นขอบคุณ! n->{for(int i=1;;)if(n%++i<1)return i;}. เนื่องจากiจะกลายเป็นnในที่สุด (เช่นเดียวกับกรณีทดสอบ2687) และn%n==0ที่i<=nไม่จำเป็นต้องใช้ในกรณีนี้
Kevin Cruijssen

1
ประมาณ37 ไบท์ ฉันไม่คุ้นเคยกับ Java มากพอที่จะดูว่าจะสามารถเล่นกอล์ฟได้อีกหรือไม่
Jo King

@ โจกิ้งฉันไม่เห็นอะไรเลยที่จะตีกอล์ฟต่อไปดังนั้นขอบคุณสำหรับ -2
Kevin Cruijssen

5

Python 3 , 36 35 ไบต์

-1 ไบต์ขอบคุณ mathmandan

f=lambda n,x=2:n%x and f(n,x+1)or x

ลองออนไลน์!

ฟังก์ชันเรียกซ้ำที่ค้นหาปัจจัยแรกที่ใหญ่กว่า 1


1
ดี คุณสามารถ (ปกติ) บันทึกไบต์ถ้าคุณแทนที่ด้วยif/else ชอบand/or f=lambda n,x=2:n%x and f(n,x+1)or x
คณิตศาสตร์


4

ช่องว่าง , 80 61 60 ไบต์

[S S T  T   N
_Push_-1][S S S N
_Push_0][T  N
T   T   _Read_STDIN_as_number][N
S S N
_Create_Label_LOOP][S S S T N
_Push_1][T  S S T   _Subtract][S N
S _Duplicate][S S S N
_Push_0][T  T   T   _Retrieve][S N
T   _Swap][T    S T T   _Modulo][N
T   T   N
_If_0_Jump_to_Label_LOOP][S S T T   N
_Push_-1][T S S N
_Multiply][T    N
S T _Print_as_number]

-20 ไบต์ขอบคุณที่@JoKing

เพิ่มตัวอักษรS(ช่องว่าง), T(แท็บ) และN(บรรทัดใหม่) เป็นการเน้นเท่านั้น
[..._some_action]เพิ่มเป็นคำอธิบายเท่านั้น

ลองใช้ออนไลน์ (ด้วยพื้นที่ว่างเปล่าแท็บและบรรทัดใหม่เท่านั้น)

คำอธิบายในรหัสเทียม:

Integer n = STDIN as integer
Integer i = -1
Start LOOP:
  i = i - 1
  if(n modulo-i is negative)
    Go to next iteration of LOOP
  else
    i = i * -1
    Print i
    Exit with error: No exit defined

ตัวอย่างการเรียกใช้: input = 9

Command   Explanation                    Stack        Heap     STDIN    STDOUT    STDERR

SSTTN     Push -1                        [-1]
SSSN      Push 0                         [-1,0]
TNTT      Read STDIN as integer          [-1]         {0:9}    9
NSSN      Create Label_LOOP              [-1]         {0:9}
 SSSTN    Push 1                         [-1,1]       {0:9}
 TSST     Subtract top two (-1-1)        [-2]         {0:9}
 SNS      Duplicate top (-2)             [-2,-2]      {0:9}
 SSSN     Push 0                         [-2,-2,0]    {0:9}
 TTT      Retrieve                       [-2,-2,9]    {0:9}
 SNT      Swap top two                   [-2,9,-2]    {0:9}
 TSTT     Modulo top two (9%-2)          [-2,-1]      {0:9}
 NTSN     If neg.: Jump to Label_LOOP    [-2]         {0:9}

 SSTTN    Push -1                        [-2,-1]      {0:9}
 TSST     Subtract top two (-2-1)        [-3]         {0:9}
 SNS      Duplicate top (-2)             [-3,-3]      {0:9}
 SSSN     Push 0                         [-3,-3,0]    {0:9}
 TTT      Retrieve                       [-3,-3,9]    {0:9}
 SNT      Swap top two                   [-3,9,-3]    {0:9}
 TSTT     Modulo top two (9%-3)          [-3,0]       {0:9}
 NTSN     If neg.: Jump to Label_LOOP    [-3]         {0:9}
 SSTTN    Push -1                        [-3,-1]      {0:9}
 TSSN     Multiply top two (-3*-1)       [3]          {0:9}
 TNST     Print as integer               []           {0:9}             3
                                                                                  error

โปรแกรมหยุดทำงานโดยมีข้อผิดพลาด: ไม่พบทางออก


1
คุณต้องการi == nเช็คหรือไม่ n%nจะเป็น 0 อย่างไรก็ตาม
Jo King

@ โจกิ้งอ่าแน่นอน ขอขอบคุณบันทึกไว้ที่นั่น 19 ไบต์ :)
Kevin Cruijssen

คุณสามารถวนซ้ำถ้าไม่ได้n%iและโทรพิมพ์หลังจากนั้น?
Jo King

1
@ โจกิ้งฉันไม่แน่ใจ ช่องว่างไม่ได้มีลูปจริงๆมันแค่มีป้ายกำกับ สามตัวเลือกเดียวที่ฉันมีคือ: 1. ข้ามไปที่ป้ายกำกับที่ไม่มีเงื่อนไข 2. ข้ามไปยังป้ายกำกับที่แน่นอนถ้าด้านบนสุดของสแต็กเป็น 0 3. ข้ามไปยังป้ายกำกับที่แน่นอนหากด้านบนสุดของสแต็กเป็นลบ น่าเสียดายที่ไม่มี "ข้ามไปยังป้ายถ้าบวก" เพื่อดำเนินการต่อวง ฉันสามารถทำได้โดยคูณด้วย -1 ก่อนตรวจสอบค่าลบ แต่ฉันสงสัยว่าจะสั้นกว่านี้
Kevin Cruijssen

1
พยายามทำด้วยโมดูลัสเชิงลบและสิ้นสุดที่ <s> 62 </s> 60 ไบต์ (yay) ปรากฎว่าคุณไม่สามารถจัดเก็บตามที่อยู่ฮีปเชิงลบได้ (แม้ว่าจะมีการบันทึก 0 ไบต์ไว้สองสามรายการ)
Jo King






2

Forth (gforth) , 34 ไบต์

: f 1 begin 1+ 2dup mod 0= until ;

ลองออนไลน์!

คำอธิบาย

  1. ซ้ำจำนวนเต็มเริ่มต้นจาก 2
  2. หยุดและกลับมาเมื่อคุณพบอันที่หารด้วย n โดยไม่เหลือ

รหัสคำอธิบาย

: f               \ Define a new word
  1               \ place a 1 on the stack (to use as a counter/index)
  begin           \ start indefinite loop
    1+ 2dup       \ increment counter and duplicate counter and prime power
    mod           \ calculate power % index
  0= until        \ end the loop if modulus is 0 (no remainder)
;                 \ end word definition




1

U + 1D414เป็นอักขระหนึ่งตัว แต่ใน UTF-8 และ UTF-16 จะมี 4 ไบต์
Ruud Helderman

1
@RuudHelderman ถูกต้อง แต่นี่ไม่ได้อยู่ใน UTF-8 หรือ UTF-16
Okx

1
@RuudHelderman คุณอาจต้องการที่จะเห็นNeim เพจรหัส
JungHwan Min

@JungHwanMin ขอบคุณ; การเรียกดูการส่ง Neim ก่อนหน้าของ Okx ฉันสังเกตเห็นปฏิกิริยาที่ไม่รู้เล็กน้อยของฉันไม่ใช่ครั้งแรก คุณสมบัติที่ชาญฉลาด แต่ไม่ชัดเจน คำอธิบายใบสำคัญแสดงสิทธิ (ทำที่นี่ ) การอ้างถึงข้อมูลแท็ก code-golf : "หากไม่มีการระบุคำถามเพื่อให้คะแนนโดยตัวละครจะได้คะแนนเป็นไบต์หากไม่ได้ระบุการเข้ารหัสอักขระที่จะใช้สำหรับการให้คะแนนคำตอบที่ใช้คะแนน Unicode นอก 0 ถึง 255 ระบุการเข้ารหัสที่ใช้ "
Ruud Helderman

@RuudHelderman ต่อฉันทามติ metaหากคำตอบไม่ได้ระบุการเข้ารหัสมันเริ่มต้นที่การเข้ารหัสเริ่มต้นของภาษา หากไม่มีอยู่แสดงว่าเป็น UTF-8 ในกรณีนี้ Neim มีการเข้ารหัสเริ่มต้นที่กำหนดไว้ดังนั้นจึงถือว่าเป็นการเข้ารหัสของคำตอบโดยที่ผู้ตอบไม่ต้องอธิบายเช่นนี้
JungHwan Min



1

R , 32 26 ไบต์

@Giuseppe พร้อมตรรกะที่แตกต่างและวิธีแก้ปัญหาที่สั้นกว่า:

(x=2:(n=scan()))[!n%%x][1]

ลองออนไลน์!

เดิม:

numbers::primeFactors(scan())[1]

ลองออนไลน์!

เห็นได้ชัดว่านี่เป็นพอร์ตที่เหนือกว่าของโซลูชั่น05AB1E




0

PowerShell , 31 ไบต์

param($a)(2..$a|?{!($a%$_)})[0]

ลองออนไลน์!

สร้างช่วงจาก2การป้อนข้อมูล$aดึงองค์ประกอบเหล่านั้นออกwhere( ?) การดำเนินการแบบโมดูโล%ส่งผลให้เป็นศูนย์!(...)(เช่นพวกที่เป็นตัวหารของ$a) แล้วใช้เวลาที่เล็กที่สุดของ[0]มัน ที่เหลืออยู่บนไปป์ไลน์เอาท์พุทเป็นนัย


0

Perl 6 , 22 ไบต์

{grep($_%%*,2..$_)[0]}

ลองออนไลน์!

บล็อกโค้ดแบบไม่ระบุชื่อที่กรองปัจจัยของช่วง 2 ถึงอินพุตและส่งคืนบล็อกแรก ฉันพยายามใช้^$เพื่อบันทึก 2 ไบต์ แต่นั่นไม่ได้ผลในกรณีที่อินพุตนั้นสำคัญ


0

Visual Basic .NET (.NET Framework v4.5), 123 71 ไบต์

-52 ไบต์ขอบคุณ @Jo King

Function A(n)
For i=n To 2 Step-1
A=If(n Mod i=0,i,A)
Next
End Function

ลองออนไลน์!

Ungolfed:

Function A(input As Long) As Long
    For i = input To 2 Step -1
        A = If (input Mod i = 0, i, A)
    Next
End Function

คำอธิบาย:

การiวนซ้ำค้นหาย้อนหลังจากตัวเลขแรกและค้นหาตัวเลขทั้งหมดที่หารเท่า ๆ กัน เพราะเราจะไปข้างหลังที่มีขนาดเล็กจะถูกเก็บไว้ใน Avairable

VB ให้ตัวแปรฟรีที่ตรงกับชื่อฟังก์ชันของคุณ (ในกรณีของฉันA) ในตอนท้ายของการดำเนินการฟังก์ชั่นค่าในตัวแปรนั้นจะถูกส่งกลับ (ยกเว้นReturnคำสั่งที่ชัดเจน


1
คุณไม่จำเป็นต้องมีการตรวจสอบที่สำคัญเลย ปัจจัยที่เล็กที่สุดของตัวเลข (นอกเหนือจาก 1) รับประกันว่าจะเป็นนายกมิฉะนั้นจะมีปัจจัยที่เล็กกว่า
โจคิง

@JoKing D'oh! แน่นอนว่าไม่น่าเชื่อว่าฉันจะพลาด ขอบคุณ!
Brian J


0

Python 3 , 47 45 44 ไบต์

แรงบันดาลใจจากคำตอบที่เควิน Cruijssen ใน Java

2 3 ไบต์ลบออกต้องขอบคุณโจกษัตริย์

lambda n:[i+1for i in range(n)if n%-~i<1][1]

ลองออนไลน์!


1
คุณมีพื้นที่ว่างเพิ่มขึ้นก่อนifและเงื่อนไขสามารถเป็นได้<1
Jo King

1
คุณสามารถบันทึกหนึ่งไบต์โดยทำrange(n)และเพิ่มขึ้นiในสถานที่
Jo King




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