퇴행성 역전 및 추가


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.