Membalikkan dan menambah degenerasi

22

Intro

Membalik dan menambahkan sesederhana kedengarannya, ambil ndan tambahkan ke digitnya dalam urutan terbalik. (mis. 234 + 432 = 666).

Jika Anda menerapkan proses ini berulang kali beberapa angka pada akhirnya akan mencapai angka prima, dan beberapa tidak akan pernah mencapai angka prima.

Contoh

Saat ini saya punya

11431 rep.

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!

Jumlah ini mencapai prima

Sebaliknya setiap kelipatan dari 3 tidak akan pernah mencapai prima, ini karena semua kelipatan dari 3 memiliki jumlah digit yang merupakan kelipatan dari 3 dan sebaliknya. Dengan demikian membalikkan dan menambahkan kelipatan 3 akan selalu menghasilkan kelipatan baru 3 dan karenanya tidak pernah prima.

Tugas

Ambil bilangan bulat positif ndan tentukan apakah pembalikan berulang dan penambahan akan menghasilkan bilangan prima. Keluarkan nilai yang benar atau salah. Entah kebenaran untuk mencapai nilai prima dan palsu untuk tidak atau sebaliknya keduanya dapat diterima.

Bilangan prima akan dianggap mencapai bilangan prima dalam iterasi nol.

Ini jadi cobalah membuat kode Anda sesingkat mungkin.

Uji Kasus

Benar untuk mencapai yang utama salah untuk tidak pernah mencapai yang utama

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

Petunjuk

Sementara saya menulis tantangan ini, saya menemukan trik keren yang membuat masalah ini jauh lebih mudah. Bukan tidak mungkin tanpa trik ini dan juga tidak sepele dengan trik ini, tetapi itu memang membantu. Saya sangat senang menemukan ini jadi saya akan membiarkannya di spoiler di bawah ini.

Terbalik terbalik dan tambah akan selalu menekan kelipatan 11 dalam 6 iterasi atau kurang. Jika tidak mencapai prime sebelum mencapai multiple 11, itu tidak akan mencapai prime.

Wisaya Gandum
sumber
Saya menemukan lebih banyak masalah matematika daripada masalah coding. Saya kira masalah kode memiliki aturan khusus yang diterapkan dalam kode oleh penjawab; Saya pikir bukan itu masalahnya dengan tantangan ini.
Arjun
@ DobbyTheFree-Elf Saya pikir perbedaan antara masalah ini dan masalah "coding" yang umum adalah bahwa untuk yang terakhir, algoritme yang akan diterapkan jelas dan hanya masalah melakukannya dalam kode sesedikit mungkin. Tantangan ini memaksa Anda untuk membuat algoritma dari awal. Keduanya menimbulkan teka-teki unik mereka sendiri tetapi pada akhirnya keduanya masih masalah coding.
Wheat Wizard
Saya setuju dengan komentar Anda itu, tetapi menurut pendapat saya, menghadirkan algoritma seperti ini dalam tantangan ini lebih merupakan pekerjaan ahli matematika daripada seorang programmer. Saya tidak tahu apa yang dipikirkan orang lain, tetapi setidaknya itulah yang saya pikirkan. Jadi, ini ada downvote saya.
Arjun
1
@ DobbyTheFree-Elf Saya tidak suka menjelaskannya kepada Anda tetapi menemukan algoritma yang efisien untuk memecahkan masalah di bagian penting menjadi seorang programmer yang baik.
Wheat Wizard
Saya setuju dengan itu juga. Tetapi algoritma untuk tantangan ini akan memiliki lebih banyak nilai matematika. Orang harus menemukan atau membuat teorema matematika yang terbukti untuk menjamin output yang benar dengan setiap input yang mungkin, yang menurut saya apa yang dilakukan ahli matematika. Pendekatan umum seperti brute force dll tidak akan berfungsi dalam kasus ini.
Arjun

Jawaban:

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}

Cobalah online!

Jika saya melakukannya dengan benar, ketika kita mencapai kelipatan 11 kita bisa berhenti (kita hanya akan mendapatkan kelipatan 11 setelah itu)

GB
sumber
Ada sesuatu yang lebih kuat yang bisa kita buktikan dengan informasi di spoiler.
Wheat Wizard
3

Haskell , 65 byte

fmengambil Integerdan mengembalikan a Bool. Trueberarti mencapai puncak.

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

Cobalah online!

Sayangnya tes prime pendek tapi tidak efisien berarti bahwa Truekasus uji OP selain 11tumbuh terlalu besar untuk diselesaikan. Tetapi misalnya 11432 adalah Truekasus yang selesai.

Anda juga dapat mencoba ini 3 byte lebih lama, yang TIO dapat menyelesaikan semua Truekasus uji:

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

Cobalah online!

Tes utama kedua versi 'istirahat pada 1, tetapi kebetulan itu sampai ke prima (2).

Kalau tidak, saya perhatikan tentang hal yang sama dengan GB di spoiler pengiriman Ruby:

Setelah angka tumbuh panjang genap, iterasi berikutnya akan dapat dibagi dengan 11. Begitu angka dibagi dengan 11, maka semua akan mengikuti iterasi.

Ørjan Johansen
sumber
@WheatWizard Yah itu menyiratkan bahwa jumlah iterasi dibatasi, dengan (maaf, tidak ada tag spoiler dalam komentar) maks 6 langkah untuk memeriksa saya pikir (misalnya 100 maksimal). Mencoba sebentar, ini sepertinya tidak memberi saya solusi yang lebih pendek. Apakah Anda bermaksud sesuatu yang lebih kuat dari itu?
Ørjan Johansen
Tidak, maksimum 6
Wheat Wizard
3

Python 2, 123 110 byte

Disimpan 13 byte berkat Ørjan Johansen dan Wheat Wizard !

n=input()
while 1:
 if all(n%m for m in range(2,n)):print 1;break
 if n%11==0:print 0;break
 n+=int(`n`[::-1])

Mengembalikan 1 jika mencapai prime, 0 jika tidak. Cobalah online!

numbermaniac
sumber
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]))

Cobalah online!

Penjelasan

Program ini mengandalkan fakta bahwa

Setiap angka yang hilang selamanya akan mencapai kelipatan 11 dalam waktu kurang dari 6 gerakan

Program ini adalah lambda rekursif dengan komparatif logis yang digerakkan. Pertama-tama memeriksa apakah n adalah prima.

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

Jika ini benar, kami mengembalikan benar.

Jika itu salah, kami memeriksa apakah kelipatannya 11.

x%11

Jika false, kita mengembalikan false, jika tidak kita mengembalikan hasil fpada iterasi berikutnya

f(x+int(`x`[::-1]))
Wisaya Gandum
sumber
2

Jelly , 11 byte

ṚḌ$+$6СÆPS

Cobalah online!

Erik the Outgolfer
sumber
Untuk kepentingan siapa pun yang membaca jawaban ini, yang terakhir Sbisa menjadi Tjuga. RD$+$bisa juga +RD$$atau RD+<newline>Ç(semua modifikasi sepele)
HyperNeutrino
@HyperNeutrino saya memilih Skarena memiliki sedikit kesempatan untuk menunjukkan sesuatu> 1. Tidak ada RD, adil ṚḌ, dan saya memilih ṚḌ$+$sehingga saya bisa mengaturnya dengan lebih baik.
Erik the Outgolfer
Saya terlalu malas untuk menaruh di titik-titik; Saya tahu mengapa Anda menempatkan S; Saya seharusnya memilih itu T, tapi itu kebanyakan untuk kepentingan orang lain.
HyperNeutrino
1

05AB1E , 14 13 byte

EDIT : Disimpan satu byte karena input digunakan kembali jika tidak ada cukup elemen pada stack

[Dp#D11Ö#R+]p

Cobalah online!

Gunakan petunjuk dalam pertanyaan

Bagaimana itu bekerja

[              # 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
Neil A.
sumber
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;
Steadybox
sumber
0

JavaScript (ES6), 73 byte

Pengembalian 0atau true.

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

Berkomentar

Ini didasarkan pada formula spoiler-ajaib yang dijelaskan oleh 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
    )                   //
}                       //

Uji kasus

Saya telah menghapus dua input terbesar dari cuplikan, karena perlu beberapa detik untuk menyelesaikannya. (Tapi mereka berhasil juga.)

Arnauld
sumber
0

Mathematica, 45 byte

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

Microsoft Sql Server, 826 786 * byte

* Saya ingat tentang fungsi IIF yang diperkenalkan di 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)

Periksa secara online

Pemformatan lebih rapi

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);
Andrei Odegov
sumber
Apakah Anda memerlukan /*true*/dan /*false*/komentar?
Buah Esolanging
Tidak. Ini adalah komentar yang digunakan untuk memisahkan input data sesuai dengan hasil yang diharapkan.
Andrei Odegov
Bisakah Anda menghapusnya?
Buah Esolanging
Ya tentu saja, komentar dapat dihapus.
Andrei Odegov
Anda tampaknya memiliki kode input yang sulit. Saya tidak terlalu yakin, tapi saya pikir format input yang dapat diterima memilih mereka dari sebuah tabel sebagai gantinya
Jo King
0

Jelly , 9 byte

ṚḌ+Ɗ6СẒẸ

Cobalah online!

Bagaimana itu bekerja

ṚḌ+Ɗ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?
Bubbler
sumber
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');}

Versi yang lebih mudah dibaca:

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

Cobalah online!

Saya menggunakan hal ini untuk menghitung byte.

Andrew
sumber
Ah oke, itu harus berakhir. Saya salah mengerti pertanyaan itu. Mengedit pertanyaan untuk mengakhiri kasus false-y.
Andrew
Sekarang selalu mengembalikan false kecuali jika pembalikan pertama adalah yang utama. Anda juga tidak memeriksa kasus pertama, di mananadalah yang utama. Dan TIO memiliki penghitung byte untuk Anda ... bahkan memiliki pemformat otomatis untuk templat pengiriman yang dapat Anda gunakan
Jo King