Đảo ngược và thêm thoái hóa


22

Giới thiệu

Đảo ngược và thêm đơn giản như âm thanh của nó, lấy nvà thêm nó vào các chữ số của nó theo thứ tự ngược lại. (ví dụ: 234 + 432 = 666).

Nếu bạn áp dụng quy trình này nhiều lần, một số số cuối cùng sẽ đạt số nguyên tố và một số sẽ không bao giờ đạt được số nguyên tố.

Thí dụ

Tôi hiện đang có

Đại diện 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!

Con số này đạt một số nguyên tố

Ngược lại, bất kỳ bội số nào của 3 sẽ không bao giờ đạt được một số nguyên tố, điều này là do tất cả các bội số của 3 có tổng bằng một chữ số là bội số của 3 và ngược lại. Do đó, đảo ngược và thêm vào bội số 3 sẽ luôn dẫn đến bội số mới của 3 và do đó không bao giờ là số nguyên tố.

Bài tập

Lấy một số nguyên dương nvà xác định nếu liên tục đảo ngược và thêm sẽ bao giờ dẫn đến một số nguyên tố. Xuất ra một giá trị trung thực hoặc giả. Hoặc là sự thật để đạt đến một giá trị chính và giả cho không hoặc cách khác xung quanh cả hai đều được chấp nhận.

Số nguyên tố sẽ được coi là đạt đến số nguyên tố trong số lần lặp bằng không.

Đây là vì vậy hãy cố gắng làm cho mã của bạn càng ngắn càng tốt.

Các trường hợp thử nghiệm

Đúng khi đạt tới số nguyên tố sai vì không bao giờ đạt tới số nguyên tố

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

Dấu

Trong khi tôi đang viết thử thách này, tôi đã phát hiện ra một mẹo hay giúp vấn đề này trở nên dễ dàng hơn. Nó không phải là không thể nếu không có thủ thuật này và nó cũng không tầm thường với nó nhưng nó cũng có ích. Tôi đã có rất nhiều niềm vui khi khám phá điều này vì vậy tôi sẽ để nó trong một spoiler bên dưới.

Lặp đi lặp lại và thêm sẽ luôn đạt bội số 11 trong 6 lần lặp trở xuống. Nếu nó không đạt được một số nguyên tố trước khi nó đạt bội số 11 thì nó sẽ không bao giờ đạt được một số nguyên tố.


Tôi thấy nó là một vấn đề toán học nhiều hơn là một vấn đề mã hóa. Tôi đoán các vấn đề về mã có các quy tắc cụ thể được đưa ra trong mã bởi người trả lời; Tôi không nghĩ đó là trường hợp với thử thách này.
Arjun

@ DulkTheFree-Elf Tôi nghĩ rằng sự khác biệt giữa vấn đề này và các vấn đề "mã hóa" điển hình là thường thì sau này, thuật toán được thực hiện là hiển nhiên và đó chỉ là vấn đề thực hiện trong càng ít mã càng tốt. Thử thách này buộc bạn phải đưa ra một thuật toán từ đầu. Cả hai đặt ra các câu đố độc đáo của riêng mình nhưng cuối cùng cả hai vẫn là vấn đề mã hóa.
Thuật sĩ lúa mì

Tôi đồng ý với nhận xét đó của bạn, nhưng theo tôi, việc đưa ra thuật toán như vậy trong thử thách này là công việc của một nhà toán học hơn là lập trình viên. Tôi không biết người khác nghĩ gì, nhưng đó ít nhất là những gì tôi nghĩ. Vì vậy, điều này có downvote của tôi.
Arjun

1
@ DulkTheFree-Elf Tôi ghét phải chia sẻ nó với bạn nhưng tìm ra các thuật toán hiệu quả để giải quyết vấn đề trong phần quan trọng của việc trở thành một lập trình viên giỏi.
Thuật sĩ lúa mì

Tôi đồng ý với điều đó quá. Nhưng thuật toán cho thử thách này sẽ có nhiều giá trị toán học hơn. Người ta sẽ phải tìm hoặc tạo ra các định lý toán học đã được chứng minh để đảm bảo đầu ra chính xác với mọi đầu vào có thể, theo ý kiến ​​của tôi, các nhà toán học làm gì. Các phương pháp phổ biến như vũ phu v.v ... sẽ không hoạt động trong trường hợp này.
Arjun

Câu trả lời:


7

Ruby , 84 79 77 74 byte

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

Hãy thử trực tuyến!

Nếu tôi hiểu đúng, khi chúng tôi đạt được bội số 11, chúng tôi có thể dừng lại (chúng tôi sẽ chỉ nhận được bội số của 11 sau đó)


Có một cái gì đó mạnh mẽ hơn chúng ta có thể chứng minh với thông tin trong spoiler.
Thuật sĩ lúa mì

3

Haskell , 65 byte

fmất một Integervà trả về a Bool. Truecó nghĩa là nó đạt đến một nguyên tố.

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

Hãy thử trực tuyến!

Thật không may, thử nghiệm chính ngắn nhưng không hiệu quả có nghĩa là các Truetrường hợp thử nghiệm của OP khác với11 phát triển quá lớn để kết thúc. Nhưng ví dụ 11432 là một Truetrường hợp kết thúc.

Bạn cũng có thể thử 3 byte này dài hơn một byte, trong đó TIO có thể hoàn thành tất cả các Truetrường hợp thử nghiệm:

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

Hãy thử trực tuyến!

Các bài kiểm tra chính của cả hai phiên bản đều phá vỡ trên 1, nhưng điều đó xảy ra là dù sao nó cũng đạt được số nguyên tố (2).

Mặt khác, tôi nhận thấy điều tương tự như GB trong spoiler của bài nộp Ruby:

Khi một số tăng dần đến chiều dài chẵn, lần lặp tiếp theo sẽ chia hết cho 11. Một khi số đó chia hết cho 11, thì tất cả sẽ lặp lại theo lần lặp.


@WheatWizard Vâng, nó ngụ ý rằng số lần lặp bị giới hạn, với (xin lỗi, không có thẻ spoiler trong các bình luận) tối đa 6 bước để kiểm tra tôi nghĩ (ví dụ 100 là tối đa). Tuy nhiên, cố gắng ngắn gọn, điều này dường như không cho tôi một giải pháp ngắn hơn. Bạn có nghĩa là một cái gì đó mạnh mẽ hơn thế?
Ørjan Johansen

Không, đó là 6 là tối đa
Wheat Wizard


2

Python 2 , 78 70 69 byte

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

Hãy thử trực tuyến!

Giải trình

Chương trình này dựa trên thực tế là

Mỗi số mất mãi mãi sẽ đạt bội số của 11 trong ít hơn 6 lần di chuyển

Chương trình này là một lambda đệ quy với các so sánh logic được lưu hành. Đầu tiên nó kiểm tra nếu n là số nguyên tố.

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

Nếu điều này là đúng, chúng tôi trả lại đúng.

Nếu nó sai, chúng tôi kiểm tra xem nó có phải là bội số của 11 không.

x%11

Nếu sai chúng ta trả về false nếu không chúng ta trả về kết quả của flần lặp tiếp theo

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

2

Thạch , 11 byte

ṚḌ$+$6СÆPS

Hãy thử trực tuyến!


Đối với sự quan tâm của bất cứ ai đọc câu trả lời này, cuối cùng Scũng có thể là một T. RD$+$cũng có thể +RD$$hoặc RD+<newline>Ç(tất cả các sửa đổi nhỏ)
HyperNeutrino

@HyperNeutrino Tôi đã chọn Svì nó ít có cơ hội hiển thị bất cứ điều gì> 1. Không có RD, chỉ là ṚḌ, và tôi đã chọn ṚḌ$+$để tôi có thể tổ chức nó tốt hơn.
Erik the Outgolfer

Tôi đã quá lười biếng để đặt vào các dấu chấm; Tôi biết tại sao bạn đặt S; Tôi nên chọn nó T, nhưng điều đó chủ yếu là vì lợi ích của mọi người khác.
HyperNeutrino

1

05AB1E , 14 13 byte

EDIT : Đã lưu một byte vì đầu vào được sử dụng lại nếu không có đủ phần tử trên ngăn xếp

[Dp#D11Ö#R+]p

Hãy thử trực tuyến!

Sử dụng gợi ý trong câu hỏi

Làm thế nào nó hoạt động

[              # 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 byte

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 byte

Trả về 0hoặc true.

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

Đã bình luận

Điều này dựa trên công thức spoiler ma thuật được mô tả bởi 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
    )                   //
}                       //

Các trường hợp thử nghiệm

Tôi đã xóa hai đầu vào lớn nhất khỏi đoạn trích, vì chúng mất vài giây để hoàn thành. (Nhưng họ cũng làm việc như vậy.)



0

Máy chủ Microsoft Sql, 826 786 * byte

* Tôi đã nhớ lại về chức năng IIF đã được giới thiệu trong Microsoft Sql Server 2012

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)

Kiểm tra trực tuyến

Định dạng gọn gàng hơn

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

Bạn có cần /*true*//*false*/ý kiến?
Trái cây Esolanging

Không. Đó là các ý kiến ​​được sử dụng để phân tách dữ liệu đầu vào theo kết quả mong đợi.
Andrei Odegov

Bạn có thể xóa chúng?
Trái cây Esolanging

Có tất nhiên, các ý kiến ​​có thể bị xóa.
Andrei Odegov

Bạn dường như đã mã hóa cứng các đầu vào. Tôi không chắc lắm, nhưng tôi nghĩ rằng một định dạng đầu vào chấp nhận được đang chọn chúng từ một bảng thay vào đó
Jo King

0

Thạch , 9 byte

ṚḌ+Ɗ6СẒẸ

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

ṚḌ+Ɗ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 byte

<?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');}

Phiên bản dễ đọc hơn:

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

Hãy thử trực tuyến!

Tôi đã sử dụng điều này để đếm byte.


À không sao, nên chấm dứt. Tôi đã hiểu nhầm câu hỏi rồi. Chỉnh sửa câu hỏi để chấm dứt cho các trường hợp sai-y.
Andrew

Bây giờ nó luôn trả về false trừ khi đảo ngược đầu tiên là một số nguyên tố. Bạn cũng không kiểm tra trường hợp đầu tiên, ở đâunlà một nguyên tố Và TIO có bộ đếm byte cho bạn ... nó thậm chí còn có bộ định dạng tự động cho mẫu gửi mà bạn có thể sử dụng
Jo King
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.