放弃所有正方形,分开我的人


37

定义

  • 完全平方是可以被表示为正方形另一个整数的整数。例如,36是一个完美的正方形,因为6^2 = 36
  • 平方数是一个整数,除之外,任何整数都不能将其整除1。例如,10是一个无平方数。但是,12不是自由平方数,因为12它可以被整除4并且4是一个完美的平方。

任务

给定一个正整数n,输出除的最大平方无数n

测试用例

n   output
1   1
2   2
3   3
4   2
5   5
6   6
7   7
8   2
9   3
10  10
11  11
12  6
13  13
14  14
15  15
16  2
17  17
18  6
19  19
20  10
21  21
22  22
23  23
24  6
25  5
26  26
27  3
28  14
29  29
30  30
31  31
32  2
33  33
34  34
35  35
36  6
37  37
38  38
39  39
40  10
41  41
42  42
43  43
44  22
45  15
46  46
47  47
48  6
49  7
50  10

计分

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

有标准漏洞

参考


1
...被称为激进分子 -就是1980年代!
乔纳森·艾伦

密切相关,只需将两个输出相乘即可。编辑:没关系,它只匹配cubefree数字。
xnor

Answers:


45

05AB1E,2个字节

fP

在线尝试!

这个怎么运作

f   Implicitly take input and compute the integer's unique prime factors.
 P  Take the product.

26
> _>真的... ??
HyperNeutrino

@HyperNeutrino是的-如果数字不是无平方的,那是因为其一些质数具有多重性。
乔纳森·艾伦

@JonathanAllan我只是对内置的独特素数感兴趣。我希望果冻有其中一种...
HyperNeutrino

@HyperNeutrino这是05AB1E,要习惯它。05AB1E具有一些真正多余的内置函数,这些内置函数显然可以节省字节。
暴民埃里克(Erik the Outgolfer)'17年

6
更正,“保存字节”,大概没有。
Draco18s

14

Brachylog,3个字节

ḋd×

在线尝试!

一个非常原始的答案...

说明

ḋ          Take the prime factors of the Input
 d         Remove duplicates
  ×        Multiply

1
同样,Brachylog击败了Jelly,因为这里有两个字节的原子只是一个字节。> :-P
HyperNeutrino's

4
拥有很多内置功能的果冻通常被视为优势。但是更多的内建函数意味着它们平均需要更长的名称。因此,在高尔夫语言设计中需要权衡取舍。

2
我并不想成为“那个家伙”,也许我只是误解了字节数,但这不是6个字节吗?mothereff.in/byte-counter#ḋd ×
人船长

5
@CaptainMan Brachylog使用256个字符的自定义代码页,您可以在此处找到。
致命

14

JavaScript(ES6),55 54 50 46字节

引用OEIS
a(n)是n的最小除数u,使得n除以u ^ n

更新的实现:
a(n)是n个正整数u 的最小除数u,使得n除以u ^ n

let f =

n=>(g=(p,i=n)=>i--?g(p*p%n,i):p?g(++u):u)(u=1)

for(n = 1; n <= 50; n++) {
  console.log(n,f(n));
}


特别是解决问题的好方法。考虑到缺乏
内在的



9

CJam,8个字节

rimf_&:*

为什么该程序中的每个操作都必须为2个字节-_-

在线尝试!

ri       e# Read int from input
  mf     e# Get the prime factors
    _&   e# Deduplicate
      :* e# Take the product of the list

我找不到重复数据删除的方法。真好!
路易斯·门多

@LuisMendo我最近才发现。我一直以为这是多集交集,但显然只是普通集的交集。
Business Cat

9

视网膜36 30 28字节

+`((^|\3)(^(1+?)|\3\4))+$
$3

一元的输入和输出。

在线尝试!(包括用于十进制<->一元转换的标头和页脚,并一次运行多个测试用例。)

说明

想法是将输入匹配为某个因子的平方。用于匹配正方形的基本正则表达式使用前向引用来匹配连续奇数整数的和:

(^1|11\1)+$

由于我们不希望匹配完美的正方形,而是要被正方形整除的数字,因此我们将其替换1为反向引用本身:

(^(1+?)|\1\2\2)+$

因此,现在1将使用外部组n次,其中n 2是划分输入的最大平方,并且组2存储剩余因子。我们想要的是将整数除以n以除去平方。结果可以表示为group 1times group 的迭代次数2,但这有点棘手。视网膜的视网膜$*可能很快会得到改进,以使用非字符标记作为其右手参数,在这种情况下,我们可以简单地将其替换为$#1$*$2,但这还行不通。

相反,我们以不同的方式分解奇数。让我们回到用匹配完美正方形的简单示例(^1|11\1)+$。我们将拥有两个计数器,而不是拥有一个\1初始化为1并在每次迭代时增加2的计数器。一个初始化为0,一个初始化为1,并且每次迭代它们都都增加1。因此,我们基本上已经将奇数2n + 1分解为(n)+(n + 1)。好处是我们将在其中一个组中得到n。最简单的形式如下:

((^|1\2)(^1|1\3))+$

哪里\2ñ\3N + 1。然而,我们可以稍微更有效地通过注意到这样做N + 1一个迭代等于ñ下一个迭代的,所以我们可以节省一个1位置:

((^|\3)(^1|1\3))+$

现在,我们只需要返回到使用初始因子,而不是1匹配被完美平方除以的输入:

((^|\3)(^(1+?)|\3\4))+$

现在,我们需要做的是最后将整个东西替换$3为,它存储初始因子乘以步数,从输入中减去平方的一个因子。

+程序一开始就反复进行此操作,以计算输入功率包含比平方高的功率。



7

Wolfram语言,29 28字节

-1感谢@Martin Ender♦

Most[1##&@@FactorInteger@#]&

说明:

           FactorInteger@#    (*Get prime factorization as {{a,b},{c,d}}*)
     1##&@@                   (*Multiply list elements together, to get the product of the factors and the product of their exponents*)
Most[                     ]&  (*Take the first element*)

2
刚刚意识到这基本上是@GregMartin对数学答案的评论,只是打高尔夫球而已...
Scott Milner

别难过,我得到的答案更少Times@@(#&@@@FactorInteger@#)&
Ian Miller

Most将其保留为列表。您需要First获取价值。
伊恩·米勒

@IanMiller我意识到这一点,但是只返回一个元素的列表就减少了字节数。我认为这样做还可以,因为它仍然是合理的输出。
斯科特·米尔纳

7

Python,37个字节

f=lambda n,r=1:1>>r**n%n or-~f(n,r+1)

在线尝试!

最大的无平方除数nr具有所有n素数的最小数。我们可以将其检查为r**n%n==0,因为r**n制作n的每个素因的副本r,并且n只有在每个n素因均被表示时才能被整除。

1>>r**n%n相当于int(r**n%n==0)。如果True可以使用输出1,则需要少2个字节。

f=lambda n,r=1:r**n%n<1or-~f(n,r+1)

6

数学,40字节

Times@@(Transpose@FactorInteger@#)[[1]]&

在线尝试!


Times@@#&@@Transpose@FactorInteger@#&节省3个字节(这#&@@是标准技巧[[1]],在这种情况下,通常可以在括号中节省一些额外的字节)。
马丁·恩德

您也可以使用Thread代替Transpose。在Mathematica中,还有一个3字节的运算符Transpose,但是我不知道Mathics是否支持它。
马丁·恩德

6
#&@@(1##&@@FactorInteger@#)&Transpose完全不需要。(1##&@@只是Times@@在伪装,这可以工作在得到了有序对大FactorInteger;并且'#&@@First@在伪装。)
格雷格·马丁

@GregMartin基本上是您自己的解决方案,如果需要,可以随时发布。
帕维尔


5

爱丽丝,4个字节

iDo@

在线尝试!

输入和输出作为字符的代码点给出(适用于所有有效的Unicode代码点)。

说明

好吧,爱丽丝有一个内置的组件,D其定义是“重复的主要因子”。也就是说,只要一个质数p的值可以被p 2整除,就可以将该值除以p。这恰好是此挑战所需的功能。其余的只是输入,输出,终止程序。

将其添加到Alice的原因实际上与该整数序列无关。我试图坚持将除数与子字符串和素数与字符相关联的主题。而且我需要一个与“重复字符”一起使用的函数(通常更有用,因为它使您可以将字符串视为集合,尤其是与各种多集运算符一起使用时)。


可悲的是,即使是内置的,这也不是最短的答案。
Rɪᴋᴇʀ

@Riker好吧,那是因为Alice不是一种高尔夫语言,所以它需要显式的I / O和(因为它是2D语言)程序终止。
马丁·恩德

是的,虽然还是有些难过。
Rɪᴋᴇʀ

@ ConorO'Brien我们在其他地方进行了讨论,这仅在独立运算符是对函数求值的表达式时才有效(此处不是这种情况,因为函数/运算符不是一等值) 。codegolf.meta.stackexchange.com/a/7206/8478
Martin Ender

@ ConorO'Brien抱歉,这是专有的“我们”。
Martin Ender





1

Pyth,8个 6字节

*F+1{P

* -2个字节,感谢@LeakyNun

如果Pyth内置列表产品将为3 ...

试试吧!

*F+1{P
      Q     # Implicit input
     P      # Prime factors of the input
    {       # Deduplicate
  +1        # Prepend 1 to the list (for the case Q==1)
*F          # Fold * over the list

您可以*F+1{P改用。
Leaky Nun

1

C,65 50字节

感谢@ØrjanJohansen消除了对的需要r。由于这个和其他一些肮脏的技巧,我得以压缩15个字节!

d;f(n){for(d=1;d++<n;)n%(d*d)||(n/=d--);return n;}

while消失了,取而代之的是||索引扭曲。<=应该一直<

<=转向<通过移动的增量来获得n%(++d*d)(应该是由于很好地定义运算符优先级)。


原始代码:

d;r;f(n){for(r=d=1;d++<=n;)while(n%d<1)r*=r%d?d:1,n/=d;return r;}

我认为您可以通过删除r来代替它来缩短它while(n%(d*d)<1)n/=d;
与Orjan约翰森

@ØrjanJohansen似乎正确。我当时在考虑建设而不是减少。我要添加一些其他改进,将很快更新。
almyr

++d*dC标准绝对不能很好地定义它-这是显式未定义行为的经典案例。但是无论如何,我们将在这里进行实现。
与Orjan约翰森

实际上,d++<n定义明确的,是否仍应正常工作?我认为旧版本一直到n+1(无害)。
与Orjan约翰森

您可能对未定义的行为是正确的。由于某种原因,我认为运算符优先级可以解决该问题。我所见过的有关UB的大多数示例都使用相同的优先级运算符,但是这里当然也存在数据争用。您也是d++<n正确的,出于某种原因,当我重新编写代码时,我没有看到它。
almyr

0

公理,89字节

f(x:PI):PI==(x=1=>1;g:=factor x;reduce(*,[nthFactor(g,i) for i in 1..numberOfFactors g]))

测试与结果

(38) -> [[i, f(i)] for i in 1..30 ]
   (38)
   [[1,1], [2,2], [3,3], [4,2], [5,5], [6,6], [7,7], [8,2], [9,3], [10,10],
    [11,11], [12,6], [13,13], [14,14], [15,15], [16,2], [17,17], [18,6],
    [19,19], [20,10], [21,21], [22,22], [23,23], [24,6], [25,5], [26,26],
    [27,3], [28,14], [29,29], [30,30]]

这是一个不使用factor()函数的函数

g(x:PI):PI==(w:=sqrt(x);r:=i:=1;repeat(i:=i+1;i>w or x<2=>break;x rem i=0=>(r:=r*i;repeat(x rem i=0=>(x:=x quo i);break)));r)

但是只有125字节


0

R,52个字节

`if`((n=scan())<2,1,prod(unique(c(1,gmp::factorize(n))))

n从标准输入读取。需要gmp安装该库(因此TIO无法正常工作)。使用与上述许多答案相同的方法,但是1由于输入,它会崩溃,因为factorize(1)返回的是class的空向量bigz,崩溃unique,可惜。


这个输出端12时,I输入12
Flounderer

@Flounderer您是正确的,我已经更新了代码。
朱塞佩



0

Pyt,3个字节

←ϼΠ

说明:

←                  Get input
 ϼ                 Get list of unique prime factors
  Π                Compute product of list
                   Implicit print
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.