퇴행성 역전 및 추가


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의 배수를 거꾸로 더하면 항상 새로운 3의 배수가되어 소수가되지 않습니다.

태스크

양의 정수를 n취하고 반복적으로 반전하고 더하는 것이 소수인지 확인하십시오. 진실 또는 허위 값을 출력합니다. 에 대한 진실은 프라임 및 허위 가치에 도달하지 못하거나 다른 방법으로 허용됩니다.

소수는 0 반복에서 소수에 도달하는 것으로 간주됩니다.

이것은 이므로 가능한 한 코드를 짧게 만드십시오.

테스트 사례

소수에 도달하면 절대 소수에 도달하지 않습니다.

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이 문제와 일반적인 "코딩"문제의 차이점은 후자에 대해 종종 구현되는 알고리즘이 명백하며 가능한 한 작은 코드로 처리하는 것입니다. 이 도전은 알고리즘을 처음부터 만들어야합니다. 둘 다 고유의 퍼즐을 제시하지만 궁극적으로 여전히 코딩 문제입니다.
— 위트 마법사

나는 당신의 의견에 동의하지만, 내 의견으로는,이 도전에 존재하는 그러한 알고리즘을 생각해내는 것은 프로그래머보다 수학자의 일입니다. 나는 다른 사람들이 어떻게 생각하는지 모르겠지만, 그것은 적어도 내가 생각하는 것입니다. 그래서 이것은 나의 downvote를 가지고 있습니다.
— Arjun

1
@ DobbyTheFree-Elf 나는 당신에게 그것을 나누고 싶지 않지만 좋은 프로그래머가되는 중요한 부분에서 문제를 해결하기위한 효율적인 알고리즘을 찾는 것을 싫어합니다.
— 위트 마법사

나도 동의합니다. 그러나이 도전에 대한 알고리즘은 더 많은 수학적 가치를 가질 것입니다. 가능한 모든 입력으로 올바른 결과를 보장하기 위해 입증 된 수학 이론을 찾거나 만들어야 할 것입니다. 제 생각에는 수학자들이하는 일입니다. 이 경우 무차별 대입과 같은 일반적인 접근 방식은 작동하지 않습니다.
— Arjun

답변:


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

하스켈 , 65 바이트

f를 가져와 a Integer를 반환합니다 Bool. True그것이 소수에 도달한다는 것을 의미합니다.

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

온라인으로 사용해보십시오!

불행히도 짧지 만 비효율적 인 프라임 테스트는 OP의 True테스트 사례 11가 너무 커져서 마무리하기가 어렵다는 것을 의미합니다 . 그러나 예를 들어 11432는 True끝나는 경우입니다.

TIO가 모든 True테스트 사례를 완료 할 수 있도록이 3 바이트 더 길게 시도 할 수도 있습니다 .

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 글쎄 그것은 반복 횟수가 제한되어 있음을 암시합니다 (죄송합니다, 의견에 스포일러 태그가 없음). 짧게 시도해도 이것이 더 짧은 해결책은 아닙니다. 그보다 더 강력한 것을 의미합니까?
— Ørjan Johansen

아니 6 최대입니다
— 밀 마법사


2

파이썬 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의 배수에 도달합니다.

이 프로그램은 회로 논리 비교를 가진 재귀 람다입니다. 먼저 n이 소수인지 확인합니다.

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

이것이 사실이라면 우리는 참을 반환합니다.

False이면 11의 배수인지 확인합니다.

x%11

거짓이면 거짓을 반환하고 그렇지 않으면 f다음 반복 의 결과를 반환합니다

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

2

젤리 , 11 바이트

ṚḌ$+$6СÆPS

온라인으로 사용해보십시오!


이 대답을 읽는 사람의 관심을, 마지막은 S이 될 수 T뿐만 아니라. RD$+$또한이 될 수 +RD$$또는 RD+<newline>Ç(모든 사소한 수정)
— HyperNeutrino

@HyperNeutrino 내가 선택한 S것이> 1보다 적을 가능성이 적기 때문에 선택했습니다 . 이 없습니다 RD. 단지 더 잘 정리할 수 있도록 ṚḌ선택했습니다 ṚḌ$+$.
— Outgolfer Erik

나는 점에 넣기가 너무 게으르다. 나는 당신이 왜 넣었는지 압니다 S; 나는 그 이상을 골랐어 야 T했지만, 그것은 대부분 다른 사람들의 관심사를위한 것입니다.
— HyperNeutrino

1

05AB1E , 14 13 바이트

편집 : 스택에 요소가 충분하지 않으면 입력이 재사용되므로 1 바이트를 절약했습니다.

[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

자바 스크립트 (ES6), 73 바이트

반환 0또는 true.

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

마이크로 소프트 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

당신은 그들을 삭제할 수 있습니까?
— Esolanging 과일

예, 물론 주석을 삭제할 수 있습니다.
— Andrei Odegov

입력을 하드 코딩 한 것 같습니다. 잘 모르겠지만, 수용 가능한 입력 형식이 대신 테이블에서 선택하는 것 같습니다
— Jo King


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 );

온라인으로 사용해보십시오!

바이트를 계산할 때이 것을 사용 했습니다 .


아, 괜찮아요. 나는 그때 질문을 오해했다. 거짓 사례에 대한 질문을 수정했습니다.
— 앤드류

이제 첫 번째 반전이 소수가 아니면 항상 false를 반환합니다. 또한 첫 번째 사례를 확인하지 않고 있습니다.엔프라임입니다. 그리고 TIO는 바이트 카운터를 가지고 있습니다. 심지어 사용할 수있는 제출 템플릿을위한 자동 포맷터도 있습니다
— Jo King
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.