首要或最高因素


14

挑战:

给定一系列非负整数,范围为0 to Infinity,则检查所有数字是否都是质数。(如果需要,您也可以将输入作为字符串输入)

输入:

输入:数字数组

输出:每个元素替换为以下元素之一的数组:

-1                 -----> If 0, 1
1                  -----> If it is a prime number greater than 1
the highest factor -----> If that number is not prime

返回-1(0,1),1(对于素数> = 2)或给定数的最高因数(对于非素数)

例子:

[1, 2, 3, 4, 10, 11, 13]                        ---> [-1, 1, 1, 2, 5, 1, 1]
[100, 200, 231321, 12312, 0, 111381209, 123123] ---> [50, 100, 77107, 6156, -1, 1, 41041]

注意:

输入将始终是有效的,即它将仅由数字和未经测试的小数组成。该数组可以为空,如果是,则返回空数组。

限制:

这是因此每种语言的最短代码(以字节为单位)获胜。

排行榜:

这是一个堆栈片段,用于按语言生成常规排行榜和获胜者概述。

为了确保您的答案显示出来,请使用以下Markdown模板以标题开头。

# Language Name, N bytes

N您提交的文件大小在哪里。如果您提高了分数,可以将旧分数保留在标题中,方法是将它们打掉。例如:

# Ruby, <s>104</s> <s>101</s> 96 bytes

如果您想在标头中包含多个数字(例如,因为您的分数是两个文件的总和,或者您想单独列出解释器标志罚分),请确保实际分数是标头中的最后一个数字:

# Perl, 43 + 2 (-p flag) = 45 bytes

您还可以将语言名称设置为链接,然后该链接将显示在页首横幅代码段中:

# [><>](http://esolangs.org/wiki/Fish), 121 bytes


2
我强烈建议您使用沙盒解决以后的问题,在发布问题之前提供对问题的反馈
Jo King

@Joking:对于无穷大,您必须输出所有数字直至无穷大。这只适合您,您还必须确保它不会超时或其他任何情况。JK:超时错误是您

4
只是想指出,在“如果素数大于1”中,实际上不需要大于1,因为素数始终大于1
Ivo Beckers

5
定义最高因子。我应该返回数字本身吗?最高可除质数?最高因素本身不是吗?
尼斯(Nissa)'18年

2
我认为我们的程序仅需要处理不超过我们选择的语言的最大整数大小的整数(对于那些不支持任意大整数的整数)
JDL

Answers:


9

果冻 7 6 字节

ÆḌṪ€o-

单链链接,该列表接受非负整数列表并重现大于或等于-1的整数列表。

在线尝试!

怎么样?

注意:

  • 所有素数都有一个适当的除数(一个)
  • 所有复合材料都具有多个适当的除数(一个除数外)
  • 没有数字本身可以作为适当的除数
  • Jelly的get-proper-divisors原子,ÆḌ以升序产生一系列适当的除数
  • 零和一没有适当的除数(它们既不是素数,也不是复合数)
  • 将Jelly的尾原子()应用于空列表将产生零
  • 没有数字具有零的适当除数(更不用说是最大的除数)
  • 在Jelly中,所有非零数字都是真实的,而零是虚假的

ÆḌṪ€o- | Link: list of integers   e.g. [ 0, 1,  2,  5,     10,    5183]
ÆḌ     | proper divisors (vectorises)  [[],[],[1],[1],[1,2,5],[1,71,73]]
  Ṫ€   | tail €ach                     [ 0, 0,  1,  1,      5,      73]
     - | literal minus one
    o  | logical OR (vectorises)       [-1,-1,  1,  1,      5,      73]

8

果冻9 8字节

@Dennis节省了1个字节

:ÆfṂ€$~~

在线尝试!运行所有测试用例

已评论

我们采取的事实上,这两个优势,nan并且inf成为0当按位非被应用到他们的果冻。

:ÆfṂ€$~~ - main link, taking the input list
 ÆfṂ€$   - treat these two links as a monad:
 Æf      -   get the lists of prime factors (0 --> 0; 1 --> empty list; prime --> itself)
    €    -   for each list,
   Ṃ     -   isolate the minimum prime factor (turns empty lists into 0)
:        - divide each entry by its minimum prime factor (0/0 --> nan; 1/0 --> inf)
      ~~ - bitwise NOT x2 (nan or inf --> 0 --> -1; other entries are unchanged)

3
您这次不使用JavaScript吗?好的回答顺便说一句

3
我真的很喜欢~~:ÆfṂ€$~~通过消除帮助程序链接来节省一个字节。
丹尼斯

@丹尼斯啊!$是我一直在寻找的东西。:) 谢谢!
Arnauld

7

R,68 62字节

Map(function(n,v=rev(which(!n%%1:n)))"if"(n<2,-1,v[2]),scan())

仅使用基本R,不使用库的解决方案!感谢Giuseppe高尔夫球了6个字节。

用于scan读取空格分隔的数字列表,%%以识别哪些因素。v然后包含所有因子按升序排列的向量(包括1和n)。它具有很好的属性,当我们reverse时v,我们想要的数字将排在第二位,从而避免了对lengthor 的昂贵调用tail(如果n是质数,则v包含n 1,否则包含n (factors in descending order) 1)。

输出示例(此处为 TIO链接):

> Map(function(n,v=rev(which(!n%%1:n)))"if"(n<2,-1,v[2]),scan())
1: 0 1 2 3 4 5 6 7 8 9
11: 
Read 10 items
[[1]]
[1] -1

[[2]]
[1] -1

[[3]]
[1] 1

[[4]]
[1] 1

[[5]]
[1] 2

[[6]]
[1] 1

[[7]]
[1] 3

[[8]]
[1] 1

[[9]]
[1] 4

[[10]]
[1] 3

如果你认为一个列表不是一个可接受的返回类型,然后换出Mapsapply,并添加3个字节。



不错-没想到初始化!
JDL

6

05AB1E11 9 8 字节

Ñε¨àDd<+

-3字节由于@Emigna,改变©d1-®+Dd<+€¨€àε¨à

只有我的第二个05AB1E答案,因此绝对可以打高尔夫球

在线尝试。

说明:

Ñ           # Divisors of each item in the input-list (including itself)
            #  [1,2,10,3] → [[1],[1,2],[1,2,5,10],[1,2,3]]
 ε          # For each:
  ¨         #  Remove last item (so it's now excluding itself)
            #   [[1],[1,2],[1,2,5,10],[1,2,3]] → [[],[1],[1,2,5],[1,2]]
   à        #  And get the max
            #   [[],[1],[1,2,5],[1,2]] → ['',1,5,2]
    D       # Duplicate the list
     d      # Is it a number (1 if it's a number, 0 otherwise)
            #  ['',1,5,2] → [0,1,1,1]
      <     # Subtract 1
            #  [0,1,1,1] → [-1,0,0,0]
       +    # Add both lists together
            #  ['',1,5,2] and [-1,0,0,0] → ['-1',1,5,2]

1
Dd<+应该工作代替©d1-®+。您也不需要,ï因为它们仍然是整数。您可以将它放在页脚中,以使输出看起来更好。
Emigna '18年

@Emigna啊,1-不是<很愚蠢。。谢谢D代替©...®!我确实已经把ï脚注放到了页脚中。
凯文·克鲁伊森

1
甚至更好:Ñε¨àDd<+
Emigna '18年

比我的十二乘车好得多。
魔术章鱼缸


4

Japt,6个字节

打完高尔夫球后,结果几乎和乔纳森的解决方案一样短。

®â¬ÌªJ

尝试一下


说明

®          :Map
 ⬠       :  Proper divisors
   Ì       :  Get last element (returns null if the array is empty)
    ª      :  Logical OR
     J     :  -1

-m
Oliver

3

Python 3,62个字节

lambda l:[max([k for k in range(1,n)if n%k<1]+[-1])for n in l]

在线尝试!

对于01 range(1,n)为空,因此代码的计算结果为max([]+[-1]) = -1。对于质数,[1,n)中唯一的除数是1,这是所需的输出。


椰子,50字节

map$(n->max([k for k in range(1,n)if n%k<1]+[-1]))

在线尝试!


3

爪哇8,105个 103 87字节

a->{for(int i=a.length,n,x;i-->0;a[i]=n<2?-1:n/x)for(n=a[i],x=1;++x<n;)if(n%x<1)break;}

修改输入数组,而不是返回新的数组以节省字节。

在线尝试。

说明:

a->{                  // Method with integer-array parameter and no return-type
  for(int i=a.length,n,x;i-->0;
                      //  Loop backward over the array
      a[i]=           //    After every iteration: change the current item to:
           n<2?       //     If the current item is 0 or 1:
            -1        //      Change it to -1
           :          //     Else:
            n/x)      //      Change it to `n` divided by `x`
     for(n=a[i],      //   Set `n` to the current item
         x=1;++x<n;)  //   Inner loop `x` in range [2,`n`)
       if(n%x<1)      //    If `n` is divisible by `x`:
         break;}      //     Stop the inner loop (`x` is now the smallest prime-factor)
                      //   (if the loop finishes without hitting the `break`,
                      //    it means `n` is a prime, and `x` and `n` will be the same)

3

Haskell,52个 49字节

map(\x->last$[d|d<-[1..x-1],mod x d<1]++[-1|x<2])

在线尝试!

map                     -- for each element in the input array
  \x->                  -- apply the lambda function
    last                -- pick the last element of the following list
     [d|d<-[1..x-1]     --  all d from 1 to x-1 
           ,mod x d<1]  --    where d divides x 
     ++[-1|x<2]         --  followed by -1 if x<2

3

外壳,8字节

m(|_1→hḊ

在线尝试!

说明

m(|_1→hḊ  Implicit Input         [1,2,3,4,10]
m(        Map each element
       Ḋ    List of divisors     [[1],[1,2],[1,3],[1,2,4],[1,2,5,10]]
     →h     Penultimate element  [0,1,1,2,5]
  |_1       If falsy then -1     [-1,1,1,2,5]

3

随员,23字节

@{Max&-1!Divisors@_@-2}

在线尝试!

29个字节,无点: @(Max&-1@Last@ProperDivisors)

24个字节,也没有点: @(Max&-1@`@&-2@Divisors)

这仅获得倒数第二的除数,n然后取其最大值和-1。少于两个元件的第二到最后一个元素中的阵列是nil,和Max[-1, nil]-1@只需向量化此函数,使其适用于每个原子。



2

R + numbers88 79字节

感谢这些评论,这些评论主要是关于如何提交的一些建议。

function(y)sapply(y,function(x)"if"(x<2,-1,prod(numbers::primeFactors(x)[-1])))

使用除最小因子以外的所有素因子的乘积,以及将空向量的元素乘积定义为 1

在线尝试!


1
节省字节以忽略library呼叫并numbers::primeFactors直接使用。
JDL

1
这是一个TIO链接,可查看JDL的建议,以及将其交换为匿名函数。
朱塞佩

2

Brachylog,10个字节

{fkt|∧_1}ˢ

在线尝试!

为了简洁起见,以下解释主要是命令式的,不能准确反映Brachylog的声明性。

{          Start of inline predicate.
           Implicit input to the predicate.
 f         Create a list of all of the input's factors (including itself).
  k        Remove the last item of this list so that it no longer contains the original number.
   t       Take the last item of the list with the last item removed.
           Implicitly unify the output with the aforementioned last item.
    |      If that failed, because one of the lists was empty...
     ∧     discarding the input, (there's probably some obvious reason ∨ won't work here but I don't know what it is)
      _1   unify the output with -1 instead.
        }  End of the inline predicate.
         ˢ For every item of the input, unify it with the predicate's input and get a list of the corresponding outputs.

我决定学习Brachylog,这样我就可以通过代码高尔夫获得一些乐趣,同时希望通过渗透学习一些实际Prolog的行为,到目前为止,我还是很享受的,即使我不确定如何执行控制字符起作用。


2
“可能有一些明显的原因∨在这里不起作用,但我不知道它是什么。” ->您可以使用.∨代替|∧(我猜您忘记了.),但这是相同的字节数。欢迎来到PPCG(更重要的是Brachylog:p)!
Fatalize

啊,当然!谢谢。
不相关的字符串,


1

Stax14 13 字节

ü±p╞Ö*«òτ♀╣â▀

运行并调试

说明(未包装):

m|fc%c{vsH1?}U? Full program, implicit input-parsing
m               Map
 |fc%c            Get factorisation and length of it (0 and 1 yield [])
      {     } ?   If length != 0:
       v            Decrement
           ?        If still != 0:
        sH            Last element of factorisation
           ?        Else:
          1           Push 1
              ?   Else:
             U      Push -1

映射内的伪代码:

f = factorisation(i)
l = length(f)
if l:
    if --l:
        return f[-1]
    else:
        return 1
else:
    return -1

1

Pyth,12个字节

me+_1f!%dTSt

在这里尝试

说明

me+_1f!%dTSt
m            Q    For each number d in the (implicit) input...
          Std     ... get the range [1, ..., d - 1]...
     f!%dT        ... take the ones that are factors of d...
  +_1             ... prepend -1...
 e                ... and take the last.

1

J,14个字节

1(%0{q:,-)@>.]

在线尝试!

对于每个数字n取最大值(n,1)代替。
将负数添加到其主要因子列表(空列表为1),然后将其除以列表中的第一项。

也是14个字节

(%0{q:) ::_1"0

在线尝试!

将每个数字除以第一个素数。0引发域错误q:,我们在空列表中寻找1的第0个项目-这也是一个错误。对于任何错误的数字,返回-1。


非常好的解决方案!
加伦·伊万诺夫

1

Japt14 11 8字节

®/k v)ªÉ
®        // For each input number,
 /k v    // return the number divided by it's first prime factor,
     )ªÉ // or -1 if such a number doesn't exist (the previous result is NaN).

在线尝试!

多亏Shaggy把这三个讨厌的字节切掉了。


你并不需要过滤的素数- k回报的主要因素N-所以这将成为8个字节:®/k v)ªÉ
长毛

@Shaggy谢谢,不知道它只返回主要因素,因为方法文档没有这么说。
Nit

1
哦,是的,忘记了。意味着要提交一段时间的PR;很快就会这样做。
粗野的

1

JavaScript(Node.js)61 55字节

-6个字节,感谢@shaggy

_=>_.map(_=>eval('for(v=_/(d=_>>1);v!=~~v;v=_/--d);d'))

在线尝试!


说明:

_ =>                                     // input i.e : the original array
    _.map(                               // map over all elements of the array
        eval('                           // eval a string
            for(v=_/(d=_>>1);            // set v = _ / _ >> 1 and set that to d
                v!=~~v;                  // and keep going until v !== floor(v)
                        v=_/d--);        // to _ / d again (d was changed)
                    d'                   // return d
            ))                           // end eval and map and function

这仍然是针对旧代码的,尚未更新。

ES5友好:

 const primeOrNot = function(input) { // the function with argument input
      return input.map(function(value) { // returns the array after mapping over them
           d = Math.floor(value * 0.5); // multiply each element by 0.5 and floor it 
           for(let v = value / d; v != Math.floor(v);) { // for loop goes until v!=~~v
                d --; // subtract one from d
                v = value / d; // set v again to value / d
           }
           return d; // return d
      })
 };


@Shaggy:谢谢
穆罕默德·萨勒曼

1

Bash + GNU实用程序,49

  • @Cowsquack节省了9个字节
factor|sed '/:$/c-1
/: \w+$/c1
s%: %/%
y/ /#/'|bc

说明

  • factor 从STDIN读取输入数字,每行一个,并以以下格式输出 <input number>: <space-separated list of prime factors (ascending)>
  • sed 处理如下:
    • /:$/c-1 输入数字0和1没有素数,并被替换为 -1
    • /: \w+$/c1具有一个质数因子(本身)的数字是质数。替换为1
    • s%: %/%替换:/。这将构建一个算术表达式,以将(非素数)输入数除以最小的素数因子得到最大的因子
    • y/ /#/ 删除其他(不需要)因素的列表(通过注释掉)
  • bc 算术评估和显示

在线尝试!


1
您可能能够删除-r,并为前两个s是你可以使用/regex/cvalue高尔夫字节,从而进一步简化这个表达式可以节省更多的,你可以在最后两个正则表达式的只需替换保存一个字节:/和然后注释掉不需要的部分,例如tio.run/##JYlBCoMwFET3c4qABhdSfuZ/…–
Kritixi Lithos

@Cowsquack很好-谢谢!
Digital Trauma'5





1

Befunge-98(FBBI),39个字节

j&:!+f0p1-1:::' -:!j;3k$.nbj;-\%!!j:1+a

在线尝试!

以结束 &当没有更多数字时,以。这将导致程序停顿60秒,直到TIO结束程序。对于Befunge-98来说,这是不可避免的,至少在TIO上是这样,因为两个口译员都这样做。按下播放键后,您可以稍稍停止该程序,以查看如果等待一分钟会输出什么。


本质上,对于每个新数字,如果为0,则将其变为1。然后将-1放入堆栈,然后是一个从1开始并一直计数到输入数字的数字,在这种情况下,它将打印出堆栈中的第二个数字(-1表示输入0或1,其他表示最大的因数)。每次循环时,如果(input % iterator == 0),我们都会将迭代器的值添加到它后面的堆栈中。这意味着当我们进入输入时,我们只需要丢弃迭代器并打印即可。然后,我们用n并返回读取输入功能。

稍后我会扩展解释,我们将看到...


0

视网膜0.8.2,33字节

%(`^0|^1$
-1
\d+
$*
^(1+)\1+$
$.1

在线尝试!链接包括那些不太慢的测试用例。说明:

%(`

遍历每个输入数字。

^0|^1$
-1

特殊情况0和1。

\d+
$*

转换为一元制(不影响-1)。

^(1+)\1+$
$.1

将每个数字替换为其最大的适当系数(十进制)。


0

tinylisp,75个字节

(load library
(q((L)(map(q((N)(i(l N 2)(- 1)(/ N(min(prime-factors N))))))L

在线尝试!(包含4个额外的字节来为匿名函数命名,以便我们可以在页脚中对其进行调用。)

松开/解释

观察返回1为素数 ñ 最大的因素小于 ñ 用于复合材料 ñ 可以合并成返回 ñ/p 哪里 p 是...的最小素数 ñ

(load library)               Library gives us map, -, /, min, and prime-factors functions

(lambda (L)                  Anonymous function, takes a list of numbers L
 (map                         Map
  (lambda (N)                  Anonymous function, takes a number N
   (if (less? N 2)              If N < 2
    (- 1)                        -1; else
    (/ N                         N divided by
     (min                        the minimum
      (prime-factors N)))))      of the prime factors of N
  L)))                        ... to L
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.