从原动力中恢复原动力


13

定义素数幂是自然数,可以以p n的形式表示,其中p是素数,n是自然数。

任务:给定素数p n > 1,返回素数p。

测试用例

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

计分:这是。以字节为单位的最短答案将获胜。


1
可以n是1吗?
user202729

@ user202729:在第四个测试用例中n = 1
Emigna

15
获得动力部分而不是主要部分可能更具挑战性。
Jo King

Answers:


13

莎士比亚编程语言209207字节

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<II%you>0SPL中的短。


1
这项工作的正确工具。
Jeremy Weirich


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个字符?(我不会讲Java。)
Tsathoggua

@Tsathoggua正如您现在所没有的那样,因为Java方法必须始终具有返回值。n->{for(int i=1;++i<=n;)if(n%i<1)return i;return n;}可以,但是不幸的是更长。Java可以在无限循环中有一个返回,但是确实可以节省字节,所以谢谢!n->{for(int i=1;;)if(n%++i<1)return i;}。由于最终i会变成n(和测试用例一样2687)和n%n==0,因此i<=n在这种情况下不是必需的。
凯文·克鲁伊森

1
37个字节怎么样。我对Java不够熟悉,看看是否还能打高尔夫球
Jo King

@JoKing我看不到有什么可以进一步打高尔夫球的了,所以感谢-2。
凯文·克鲁伊森

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
mathmandan


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

@JoKing Ah,当然。谢谢,在那里保存了19个字节。:)
Kevin Cruijssen

您能否只循环而不循环n%i然后再调用打印?
Jo King

1
@JoKing我很确定不是。空格实际上并没有循环,只是跳转到标签。我仅有的三个选择是:1.无条件跳转到某个标签;2.如果栈顶为0,则跳转到某个标签;3.如果堆栈顶部为负,则跳至某个标签。不幸的是,没有“跳转来标记是否为正”来继续循环。我可以通过在检查负数之前乘以-1来完成此操作,但是我怀疑这样做会更短。
凯文·克鲁伊森

1
尝试以负模数进行操作,最终以<s> 62 </ s> 60个字节(是)结束。原来您不能存储在负堆地址(尽管0保存了几个字节)
Jo King






2

第四(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

Neim,1个字节

𝐔

在线尝试!


U + 1D414是一个字符,但在UTF-8和UTF-16中由4个字节表示。
Ruud Helderman

1
@RuudHelderman是的,但这不在UTF-8或UTF-16中。
Okx

1
@RuudHelderman您可能想看Neim 代码页
JungHwan Min

@JungHwanMin谢谢;浏览Okx早期的Neim提交内容时,我注意到我的反应并非一无是处。功能巧妙,但远非显而易见;认股权证的说明(如做在这里)。引用代码高尔夫球标记信息:“除非问题指定为按字符计分,否则按字节计分。如果未指定用于计数的字符编码,则应使用0到255之间的Unicode代码点进行回答说明使用的编码。”
Ruud Helderman

每个元共识 @RuudHelderman ,如果答案未指定编码,则默认为该语言的默认编码。如果不存在,则为UTF-8。在这种情况下,Neim具有定义的默认编码,因此假定它是答案的编码,而答案者不必这样解释。
JungHwan Min



1

R32 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

在线尝试!

取消高尔夫:

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从第一个数字环路搜索倒着,并认为平均分配所有的数字。因为我们要倒退,所以最小的存储在vairable中A

VB为您提供了一个与您的函数名称相匹配的免费变量(在我的情况下为A)。函数执行结束时,将返回该变量中的值(除非有明确的Return语句。


1
您根本不需要总理检查。一批(1以外)最小的因素是保证是一个素数,否则就不会有一个较小的因素
乔金

@JoKing D'oh!当然,不能相信我错过了。谢谢!
Brian J






By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.