反转并添加简并性


22

介绍

反向和加法听起来很简单,以n相反的顺序将其加到其数字上。(例如234 + 432 = 666)。

如果重复应用此过程,则某些数字最终将达到质数,而某些数字将永远不会达到质数。

我目前有

11431代表

11431 is not prime
11431 + 13411 = 24842 which is not prime
24842 + 24842 = 49684 which is not prime
49684 + 48694 = 98378 which is not prime
98378 + 87389 = 185767 which is prime!

这个数字很重要

相反,任何3的倍数都不会达到质数,这是因为3的所有倍数的数字总和是3的倍数,反之亦然。因此,反向并加3的倍数总是会导致新的3的倍数,因此永远不会是素数。

任务

取一个正整数n,确定是否反复进行加和运算会得到质数。输出真实或虚假值。要么为真达到虚假的虚假值,要么为真至假。

质数将被视为在零次迭代中达到质数。

这是因此请尝试使代码尽可能短。

测试用例

真达到顶峰虚假永远顶峰

11 -> True
11431 -> True
13201 -> True
13360 -> True
13450 -> True
1019410 -> True
1019510 -> True
22 -> False
1431 -> False
15621 -> False
14641 -> False

暗示

当我写这个挑战时,我发现了一个很酷的技巧,可以使这个问题容易得多。没有这个把戏是不可能的,它也不是小事,但确实有帮助。我发现这个过程非常有趣,因此我将其留在下面的扰流板中。

重复的反向和加法运算总是在6次或更短的迭代中达到11的倍数。如果它在达到11的倍数之前没有达到素数,它将永远不会达到素数。


我发现它更多的是数学问题,而不是编码问题。我猜代码问题有特定的规则,这些规则由应答者在代码中实现;我认为挑战并非如此。
Arjun

@ DobbyTheFree-Elf我认为此问题与典型的“编码”问题之间的区别在于,对于后者而言,通常要实现的算法是显而易见的,而这仅仅是用尽可能少的代码来完成的问题。这一挑战迫使您从头开始提出一种算法。两者都构成了自己独特的难题,但最终都仍然是编码问题。
小麦巫师

我同意您的意见,但我认为,提出这种挑战中存在的这种算法,与其说是程序员,不如说是数学家的工作。我不知道其他人的想法,但这至少是我的想法。因此,我对此表示反对。
Arjun

1
@ DobbyTheFree-Elf我讨厌把它给您,但在成为一名优秀程序员的关键部分中,找到了有效的算法来解决问题。
小麦巫师

我也同意这一点。但是,应对这一挑战的算法将具有更多的数学价值。人们将必须找到或创建经过验证的数学定理,以保证在所有可能的输入下都能得到正确的输出,我认为这是数学家所做的。在这种情况下,无法使用诸如蛮力之类的常见方法。
Arjun

Answers:


7

红宝石84 79 77 74字节

->x{y=1;x+="#{x}".reverse.to_i while(2...x).any?{|z|0==y=x%z}&&x%11>0;y>0}

在线尝试!

如果我做对了,当我们达到11的倍数时,我们可以停止(此后,我们只会得到11的倍数)


我们可以用扰流板中的信息来证明更强大的功能。
小麦巫师

3

Haskell,65个字节

fInteger并返回BoolTrue表示达到了黄金时期。

f n=gcd(product[2..n-1])n<2||gcd 33n<2&&f(n+read(reverse$show n))

在线尝试!

不幸的是,简短但效率低下的主要测试意味着OP的True测试用例除了11变得太大而无法完成。但是例如11432 True确实可以完成。

您也可以尝试再长3个字节,TIO可以完成所有True测试用例:

f n=and[mod n i>0|i<-[2..n-1]]||gcd 33n<2&&f(n+read(reverse$show n))

在线尝试!

两种版本的素数测试均以1折断,但碰巧它仍然达到素数(2)。

否则,我在Ruby提交的剧透中注意到了与GB相同的东西:

一旦数字增长到偶数长度,下一个迭代将被11整除。一旦数字被11整除,所有后续迭代也将被整除。


@WheatWizard好吧,这意味着迭代次数是有限的,(我很抱歉,注释中没有剧透标签)最多6个步骤来检查我认为的(例如最大为100)。简短地尝试一下,但这似乎并没有给我一个更短的解决方案。你是说比这更强大的东西吗?
与Orjan约翰森

不,那是6个最大值
Wheat


2

Python 2中78个 70 69字节

f=lambda x:all(x%a for a in range(2,x))or x%11and f(x+int(`x`[::-1]))

在线尝试!

说明

该程序依赖于以下事实:

永远失去的每个数字将在不到6个动作中达到11的倍数

该程序是具有循环逻辑比较的递归lambda。它首先检查n是否为素数。

all(x%a for a in range(2,x))

如果是这样,则返回true。

如果为假,我们检查它是否为11的倍数。

x%11

如果为false,则返回false;否则,返回f下一次迭代的结果

f(x+int(`x`[::-1]))

2

果冻,11字节

ṚḌ$+$6СÆPS

在线尝试!


为了阅读此答案的任何人的利益,最后S一个T也是。RD$+$也可以是+RD$$RD+<newline>Ç(所有琐碎的修改)
HyperNeutrino

我选择@HyperNeutrino S是因为它显示> 1的可能性较小。没有RD,只有ṚḌ,我选择了ṚḌ$+$以便更好地组织它。
暴民埃里克(Erik the Outgolfer)'17

我懒得点点滴滴;我知道你为什么放S; 我应该把它选出来T,但这主要是为了其他所有人的利益。
HyperNeutrino

1

05AB1E14 13字节

编辑:保存了一个字节,因为如果堆栈上没有足够的元素,则输入将被重用

[Dp#D11Ö#R+]p

在线尝试!

使用问题中的提示

怎么运行的

[              # begin infinite loop
               # implicit input
 D             # duplicate input
  p            # push primality of input
   #           # if prime, break
    D          # duplicate input
     11        # push 11
       Ö       # push input % 11 == 0
        #      # if multiple of 11, break
               # implicit push input
          R    # reverse input
           +   # add both numbers
            ]  # end infinite loop
             p # push primality of result; 1 if prime, 0 if multiple of 11
               # implicit print

0

MATLAB,88 81字节

function r=f(n);r=0;for i=1:7 r=r+isprime(n);n=n+str2num(fliplr(num2str(n)));end;

0

JavaScript(ES6),73个字节

返回0true

f=n=>{for(d=n;n%--d;);return d<2||n%11&&f(+[...n+''].reverse().join``+n)}

已评论

这是基于Wheat Wizard描述的魔法破坏者公式。

f = n => {              // given n:
  for(d = n; n % --d;); // find the highest divisor d of n
  return                //
    d < 2 ||            // if this divisor is 1, return true (n is prime)
    n % 11 &&           // else: if 11 is a divisor of n, return 0
    f(                  // else: do a recursive call with
      +[...n + '']      // the digits of n
      .reverse().join`` // reversed, joined,
      + n               // coerced to a number and added to n
    )                   //
}                       //

测试用例

我已从代码段中删除了两个最大的输入,因为它们需要几秒钟才能完成。(但是它们也可以工作。)


0

Mathematica,45个字节

Or@@PrimeQ@NestList[#+IntegerReverse@#&,#,6]&

0

微软SQL服务器,826个 786 *字节

*我回想起了Microsoft Sql Server 2012中引入的IIF函数

set nocount on
use rextester
go
if object_id('dbo.n','IF')is not null drop function dbo.n
go
create function dbo.n(@ bigint,@f bigint)returns table as return
with a as(select 0 c union all select 0),b as(select 0 c from a,a t),c as(select 0 c from b,b t),
d as(select 0 c from c,c t),e as(select 0 c from d,d t),f as(select 0 c from e,e t),
v as(select top(@f-@+1)0 c from f)select row_number()over(order by(select 0))+@-1 n from v
go
with u as(select cast(a as bigint)a from(values(11),(11431),(13201),(13360),(13450),(1019410),(1019510),(22),(1431),
(15621),(14641))u(a)),v as(select a,a c from u union all select a,c+reverse(str(c,38))from v
where 0=any(select c%n from dbo.n(2,c/2))and c%11>0)select a,iif(0=any(select max(c)%n from dbo.n(2,max(c)/2)),0,1)
from v group by a option(maxrecursion 0)

在线检查

更整齐的格式

SET NOCOUNT ON;
USE rextester;
GO
IF OBJECT_ID('dbo.n', 'IF') IS NOT NULL DROP FUNCTION dbo.n;
GO
CREATE FUNCTION dbo.n(@ BIGINT,@f BIGINT)RETURNS TABLE AS RETURN
  WITH
    a AS(SELECT 0 c UNION ALL SELECT 0),
    b AS(SELECT 0 c FROM a,a t),
    c AS(SELECT 0 c FROM b,b t),
    d AS(SELECT 0 c FROM c,c t),
    e AS(SELECT 0 c FROM d,d t),
    f AS(SELECT 0 c FROM e,e t),
    v AS(SELECT TOP(@f-@+1)0 c FROM f)
    SELECT ROW_NUMBER()OVER(ORDER BY(SELECT 0))+@-1 n FROM v;
GO
WITH u AS(
  SELECT CAST(a AS BIGINT) a
  FROM(VALUES (11), (11431), (13201), (13360), (13450), (1019410), (1019510),
              (22), (1431), (15621), (14641)) u(a)
),
v AS(
  SELECT a, a c FROM u
    UNION ALL
  SELECT a, c + reverse(str(c, 38))
  FROM v
  WHERE 0 = ANY(SELECT c % n FROM dbo.n(2, c / 2)) AND c % 11 > 0
)
SELECT a, IIF(0 = ANY(SELECT MAX(c) % n FROM dbo.n(2, MAX(c) / 2)), 0, 1)
FROM v
GROUP BY a
OPTION (MAXRECURSION 0);

您是否需要/*true*//*false*/注释?
Esolanging Fruit

否。用于根据预期结果分隔输入数据的注释。
安德烈·奥德戈夫

您可以删除它们吗?
硕果累累

是的,当然可以删除评论。
Andrei Odegov '17

您似乎已经对输入进行了硬编码。我不太确定,但我认为可接受的输入格式是从表格中选择它们
Jo King

0

果冻,9个字节

ṚḌ+Ɗ6СẒẸ

在线尝试!

怎么运行的

ṚḌ+Ɗ6СẒẸ    Monadic main link.
ṚḌ+Ɗ         Monad: Reverse and add to original.
    6С      Repeatedly apply the above 6 times, collecting all iterations
       ẒẸ    Is any of them a prime?

0

PHP 114字节

<?php function f($n){$n1=strrev((string)$n);$r=$n+(int)$n1;for($i=2;$i<$r;$i++){if($r%$i==0){die('0');}}die('1');}

更具可读性的版本:

<?php function f($n)
{
    $n1 = strrev((string)$n);
    $r = $n + (int)$n1;
    for ($i = 2; $i < $r; $i++) {
        if ($r % $i == 0) {
            die('0');
        }
    }
    die('1');
}

f(11431 );

在线尝试!

我用这个东西来计数字节。


嗯,应该终止。那我误会了这个问题。编辑了问题,以便在出现“假”情况下终止。
安德鲁

ñ
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.