กู้คืนพลังงานจากพลังงานหลัก


16

ดูเหมือนว่าหลายคนต้องการที่จะมีสิ่งนี้ดังนั้นตอนนี้มันเป็นภาคต่อของความท้าทายนี้ !

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

ภารกิจ : รับพลังพิเศษหน้า n > 1 ให้ส่งคืนพลังงาน n

ทดสอบ :

input output
9     2
16    4
343   3
2687  1
59049 10

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


2
หมายเหตุ : ความท้าทายนี้อาจไม่สำคัญในภาษากอล์ฟบางภาษา แต่มันก็ไม่สำคัญสำหรับภาษาหลักบางภาษาเช่นเดียวกับภาษาของเดือนมิถุนายนปี 2018 ที่ QBasic
Erik the Outgolfer

เราสามารถแสดงผล True แทน 1 ได้หรือไม่? หรือมิฉะนั้นลอยแทน ints?
Jo King

1
@ โจกิ้งใช่ใช่
Leun Nun

คำตอบ:



5

Python 3 , 49 ไบต์

f=lambda n,x=2:n%x and f(n,x+1)or n/x<2or-~f(n/x)

ลองออนไลน์!

เอาต์พุตTrueแทน 1 ( ตามที่อนุญาตโดย OP ) ฟังก์ชันแบบเรียกซ้ำที่ค้นหาปัจจัยต่ำสุดซ้ำแล้วเรียกใช้ฟังก์ชันอีกครั้งด้วยกำลังไฟต่ำสุดถัดไปจนกระทั่งถึง 1 นี่คือส่วนขยายของคำตอบของคำถามก่อนหน้านี้





3

dc , 50 41 ไบต์

1si[dli1+dsi%0<X]dsXx[dli/dli<Y]sYdli<Yzp

ลองออนไลน์!

รับอินพุตจากด้านบนของสแต็ก (ใน TIO ใส่อินพุตในส่วนหัวเพื่อโหลดลงในสแต็กก่อนที่จะดำเนินการ) ส่งออกไปยัง stdout

คำอธิบาย

รีจิสเตอร์ที่ใช้:

i: ตัวหารทดลองปัจจุบันขณะที่Xกำลังทำงาน ต่อมาเราพบตัวหาร

X: แมโครdli1+dsi%0<Xซึ่งมีเอฟเฟกต์ "การเพิ่มขึ้นiจากนั้นตรวจสอบโมดูลัสด้วยค่าในสแต็ก (ซึ่งจะเป็นอินพุตต้นฉบับ) หากไม่ใช่ศูนย์ให้ทำซ้ำ"

Y: แมโครdli/dli<Yซึ่งมีเอฟเฟกต์ "เพิ่มสำเนาของด้านบนปัจจุบันของสแต็กหารด้วยหารiทำซ้ำจนกว่าiจะถึง"

โปรแกรมเต็มรูปแบบ:

1si                 Initialize i
[dli1+dsi%0<X]dsXx  Define and run X
[dli/dli<Y]sY       Define Y
dli<Y               Run Y, but only if needed (if the input wasn't just i)
z                   The stack is i^n, i^(n-1), ... ,i, so print the stack depth

ฉันพบทางออกที่ดีกว่ามาก! กำลังแก้ไขในขณะนี้ ...
Sophia Lechner

3

ใบหน้า 86 ไบต์

(%d@)\$*,c'$,io>Av"[""mN*c?*m1*mp*m%*s1"$pN1p:~+p1p%%Np?%~:=/NNp+?1?-%N1?%=p%'$i?w1'%>

ไชโยยาวกว่าชวา!

ลองออนไลน์!

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

(%d@)

\$*,c'$,io>  ( setup - assign $ to "%d", * to a number, o to stdout )
Av"[""mN*    ( set " to input and allocate space for N for int conversion )
c?*          ( calloc ?, starting it at zero - this will be the output )
m1*          ( allocate variable "1", which gets the value 1 eventually )
mp*m%*       ( p is the prime, % will be used to store N mod p )

s1"$pN       ( scan " into N with $ as format; also assigns 1 to 1 )

1p:~         ( begin loop, starting p at 1 )
  +p1p       ( increment p )
  %%Np       ( set % to N mod p )
?%~          ( repeat if the result is nonzero, so that we reach the factor )

:=           ( another loop to repeatedly divide N by p )
  /NNp       ( divide N by p in-place )
  +?1?       ( increment the counter )
  -%N1       ( reuse % as a temp variable to store N-1 )
?%=          ( repeat while N-1 is not 0 -- i.e. break when N = 1 )

p%'$i?       ( sprintf ? into ', reusing the input format string )
w1'%>        ( write to stdout )

3

ภาษาหลายภาษาของAttacheและWolfram (Mathematica) 10 ไบต์

PrimeOmega

ลองใช้ทูตออนไลน์! ลอง Mathematica ออนไลน์!

เพียงแค่ตัวในการคำนวณจำนวนตัวประกอบสำคัญที่Nมี

คำอธิบาย

เนื่องจากN = p k , Ω ( N ) = Ω ( p k ) = k , ผลลัพธ์ที่ต้องการ








2

ช่องว่าง 141 ไบต์

[S S S N
_Push_0][S N
S _Duplicate_0][T   N
T   T   _Read_STDIN_as_number][T    T   T   _Retrieve][S S S T  N
_Push_1][N
S S N
_Create_Label_LOOP_1][S S S T   N
_Push_1][T  S S S _Add][S N
S _Duplicate][S T   S S T   S N
_Copy_2nd_input][S N
T   _Swap_top_two][T    S T T   _Modulo][N
T   S S N
_If_0_Jump_to_Label_BREAK_1][N
S N
N
_Jump_to_Label_LOOP_1][N
S S S N
_Create_Label_BREAK_1][S S S N
_Push_0][S T    S S T   S N
_Copy_2nd_input][N
S S T   N
_Create_Label_LOOP_2][S N
S _Duplicate_input][S S S T N
_Push_1][T  S S T   _Subtract][N
T   S S S N
_If_0_Jump_to_Label_BREAK_2][S N
T   _Swap_top_two][S S S T  N
_Push_1][T  S S S _Add][S N
T   _Swap_top_two][S T  S S T   S N
Copy_2nd_factor][T  S T S _Integer_divide][N
S N
T   N
_Jump_to_Label_LOOP_2][N
S S S S N
_Create_Label_BREAK_2][S N
N
_Discard_top][T N
S T _Print_as_number]

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

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

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

Integer n = STDIN as input
Integer f = 1
Start LOOP_1:
  f = f + 1
  if(n modulo-f == 0)
    Call function BREAK_1
  Go to next iteration of LOOP_1

function BREAK_1:
  Integer r = 0
  Start LOOP_2:
    if(n == 1)
      Call function BREAK_2
    r = r + 1
    n = n integer-divided by f
    Go to next iteration of LOOP_2

function BREAK_2:
  Print r as number to STDOUT
  Program stops with an error: Exit not defined

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

Command    Explanation                    Stack           Heap    STDIN   STDOUT   STDERR

SSSN       Push 0                         [0]
SNS        Duplicate top (0)              [0,0]
TNTT       Read STDIN as number           [0]             {0:9}   9
TTT        Retrieve                       [9]             {0:9}
SSSTN      Push 1                         [9,1]           {0:9}
NSSN       Create Label_LOOP_1            [9,1]           {0:9}
 SSSTN     Push 1                         [9,1,1]         {0:9}
 TSSS      Add top two (1+1)              [9,2]           {0:9}
 SNS       Duplicate top (2)              [9,2,2]         {0:9}
 STSSTSN   Copy 2nd from top              [9,2,2,9]       {0:9}
 SNT       Swap top two                   [9,2,9,2]       {0:9}
 TSTT      Modulo top two (9%2)           [9,2,1]         {0:9}
 NTSSN     If 0: Jump to Label_BREAK_1    [9,2]           {0:9}
 NSNN      Jump to Label_LOOP_1           [9,2]           {0:9}

 SSSTN     Push 1                         [9,2,1]         {0:9}
 TSSS      Add top two (2+1)              [9,3]           {0:9}
 SNS       Duplicate top (3)              [9,3,3]         {0:9}
 STSSTSN   Copy 2nd                       [9,3,3,9]       {0:9}
 SNT       Swap top two                   [9,3,9,3]       {0:9}
 TSTT      Modulo top two (9%3)           [9,3,0]         {0:9}
 NTSSN     If 0: Jump to Label_BREAK_1    [9,3]           {0:9}
NSSSN      Create Label_BREAK_1           [9,3]           {0:9}
SSSN       Push 0                         [9,3,0]         {0:9}
STSSTSN    Copy 2nd from top              [9,3,0,9]       {0:9}
NSSTN      Create Label_LOOP_2            [9,3,0,9]       {0:9}
 SNS       Duplicate top (9)              [9,3,0,9,9]     {0:9}
 SSSTN     Push 1                         [9,3,0,9,9,1]   {0:9}
 TSST      Subtract top two (9-1)         [9,3,0,9,8]     {0:9}
 NTSSSN    If 0: Jump to Label_BREAK_2    [9,3,0,9]       {0:9}
 SNT       Swap top two                   [9,3,9,0]       {0:9}
 SSSTN     Push 1                         [9,3,9,0,1]     {0:9}
 TSSS      Add top two (0+1)              [9,3,9,1]       {0:9}
 SNT       Swap top two                   [9,3,1,9]       {0:9}
 STSSTSN   Copy 2nd from top              [9,3,1,9,3]     {0:9}
 TSTS      Integer-divide top two (9/3)   [9,3,1,3]       {0:9}
 NSNTN     Jump to Label_LOOP_2           [9,3,1,3]       {0:9}

 SNS       Duplicate top (3)              [9,3,1,3,3]     {0:9}
 SSSTN     Push 1                         [9,3,1,3,3,1]   {0:9}
 TSST      Subtract top two (3-1)         [9,3,1,3,2]     {0:9}
 NTSSSN    If 0: Jump to Label_BREAK_2    [9,3,1,3]       {0:9}
 SNT       Swap top two                   [9,3,3,1]       {0:9}
 SSSTN     Push 1                         [9,3,3,1,1]     {0:9}
 TSSS      Add top two (1+1)              [9,3,3,2]       {0:9}
 SNT       Swap top two                   [9,3,2,3]       {0:9}
 STSSTSN   Copy 2nd from top              [9,3,2,3,3]     {0:9}
 TSTS      Integer-divide top two (3/3)   [9,3,2,1]       {0:9}
 NSNTN     Jump to Label_LOOP_2           [9,3,2,1]       {0:9}

 SNS       Duplicate top (1)              [9,3,2,1,1]     {0:9}
 SSSTN     Push 1                         [9,3,2,1,1,1]   {0:9}
 TSST      Subtract top two (1-1)         [9,3,2,1,0]     {0:9}
 NTSSSN    If 0: Jump to Label_BREAK_2    [9,3,2,1]       {0:9}
NSSSSN     Create Label_BREAK_2           [9,3,2,1]       {0:9}
 SNN       Discard top                    [9,3,2]         {0:9}
 TNST      Print as integer               [9,3]           {0:9}           2
                                                                                    error

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








1

Cjam, 5 bytes

rimf,

Try it Online!

Explanation:

ri      take the input and convert it to an int
  mf    factors the input
    ,   take the length of the list

Builtins are great!


Submissions must be programs or functions by default, and we don't consider this a function. Both rimf, (full program) and {mf,} (function) would be valid.
Dennis

@Dennis Yeah, I think I'm kind of confused on that. I also looked at allowed stardard io before and wondered about what I should actually submit... I actually wanted to ask a question on meta about that. But you confirmed that, so thanks!
Chromium








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