Ters ve dejenere eklemek


22

giriş

Ters nçevir ve ekle , göründüğü kadar basittir , ters sırayla basıp rakamlarına ekleyin. (örn. 234 + 432 = 666).

Bu işlemi tekrar tekrar uygularsanız, bazı sayılar sonunda bir asal sayıya çarpacak ve bazıları asla bir asal sayıya ulaşamayacaktır.

Örnek

Şu anda sahibim

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!

Bu sayı başbakan vurur

Buna karşılık, 3'ün hiçbiri asla bir prime çarpmayacak, bunun sebebi 3'ün katlarının hepsinin 3'ün katı olduğu bir rakam toplamı olması ve bunun tersidir. Bu nedenle, 3'ün bir katına tersten eklemek ve eklemek her zaman 3'ün yeni bir katıyla sonuçlanır ve bu nedenle asla bir asal değildir.

Görev

Olumlu bir tamsayı alın nve art arda ters çevirmenin ve eklemenin asla asal sayıya yol açacağını belirleyin. Bir gerçeği ya da sahte bir değer çıktı. Ya asal için bir aşiret ya da aldatmacaya ulaşan bir değere ulaşmaz ya da her ikisi için de başka şekilde kabul edilebilirdir.

Asal sayılar, sıfır yinelemede asal sayıya ulaşır.

Bu , kodunuzu olabildiğince kısa tutmaya çalışın.

Test Kılıfları

Asıl sayıya ulaşmadığı için doğru, asla asal sayıya ulaşmadığı için doğru.

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

İpucu

Bu zorluğu yazarken, bu sorunu iyi bir şekilde kolaylaştıran harika bir numara keşfettim. Bu numara olmadan imkansız değildir ve onunla da önemsiz değildir, ancak yardımcı olur. Bunu keşfederken çok eğlenmiştim, bu yüzden aşağıdan bir yağmacıda bırakacağım.

Tekrarlanan ve geri ekleme her zaman 6 yineleme veya daha az 11'de birden çarpacaktır. Eğer 11'e çarpmadan önce bir prime çarpmazsa, asla bir prime çarpmaz.


Bunu kodlamadan çok matematiksel bir problem olarak buluyorum. Kod sorunlarının, cevaplayıcı tarafından kodda uygulanan belirli kurallara sahip olduğunu tahmin ediyorum; Bence bu zorlukla durum böyle değil.
Arjun

@ DobbyTheFree-Elf Bu problemle tipik "kodlama" problemleri arasındaki farkın, ikincisi için uygulanacak algoritmanın açık olduğu ve mümkün olduğu kadar az kodda yapılması meselesi olduğunu düşünüyorum. Bu zorluk sizi sıfırdan bir algoritma ile zorlar. Her ikisi de kendine özgü bulmacalar yaratır, ancak ikisi de sonuçta hala kodlama sorunudur.
Buğday Sihirbazı

Bu yorumunuzla aynı fikirdeyim, ancak bence bu meydan okumada bu tür bir algoritma ortaya çıkarak bir matematikçinin işi bir programcıdan daha fazla. Başkalarının ne düşündüğünü bilmiyorum, ama en azından düşündüğüm bu. Yani, bu benim aşağı oyum var.
Arjun

1
@ DobbyTheFree-Elf Size kırmaktan nefret ediyorum, ancak iyi bir programcı olmanın çok önemli bir kısmını bir sorunu çözmek için etkili algoritmalar bulmaktan nefret ediyorum.
Buğday Sihirbazı

Ben de aynı fikirdeyim. Ancak bu meydan okuma için algoritma daha matematiksel bir değere sahip olacaktır. Bir kişi, bence matematikçilerin yaptıklarını düşündüğüm her girdiyle doğru çıktılar elde etmek için kanıtlanmış matematik teoremlerini bulmalı veya yaratmalıdır. Bu durumda kaba kuvvet vb gibi ortak yaklaşımlar işe yaramayacaktır.
Arjun

Yanıtlar:


7

Ruby , 84 79 77 74 bayt

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

Çevrimiçi deneyin!

Eğer doğru yaparsam, 11 katına ulaştığımızda durabiliriz (bundan sonra sadece 11'in katlarını alacağız)


Spoydeki bilgilerle kanıtlayabileceğimiz daha güçlü bir şey var.
Buğday Sihirbazı

3

Haskell , 65 bayt

fbir alır Integerve bir döndürür Bool. Truebir asal sayıya ulaştığı anlamına gelir.

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

Çevrimiçi deneyin!

Maalesef kısa ama verimsiz prime test, OP'nin Truetest durumlarının 11bitiremeyecek kadar büyüyeceği anlamına geliyor . Ancak örneğin 11432 biten bir Truedurumdur.

Bu 3 bayttan daha uzun olanı da deneyebilirsiniz, bunun için TIO tüm Truetest durumlarını bitirebilir :

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

Çevrimiçi deneyin!

Her iki sürümün de asal testleri 1'de kırılır, ancak yine de bir asal (2) olur.

Aksi takdirde, Ruby gönderiminin spoilerinde GB ile aynı şeyi farkettim:

Bir sayı eşit uzunlukta büyüdüğünde, bir sonraki yineleme 11 ile bölünebilir


@WheatWizard Yinelemelerin sayısının sınırlandığını, (üzgünüm, yorumlarda spoiler etiketi bulunmadığını), sanırım kontrol etmek için en fazla 6 adım olduğunu düşünüyorum (örneğin 100 maksimum). Kısaca denemek gerekirse, bu bana daha kısa bir çözüm verecek gibi görünmüyor. Bundan daha güçlü bir şey mi demek istiyorsun?
Ørjan Johansen

Hayır, 6 oldu maksimum
Buğday Sihirbazı


2

Python 2 , 78 70 69 bayt

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

Çevrimiçi deneyin!

açıklama

Bu program gerçeğine dayanıyor

Sonsuza dek kaybedilen her sayı, 6 hamleden az 11’de bir

Bu program, devreli mantıksal karşılaştırmaları olan tekrarlanan bir lambdadır. İlk önce n'nin asal olup olmadığını kontrol eder.

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

Eğer bu doğruysa, doğru döneriz.

Eğer yanlışsa, 11'in katı olup olmadığını kontrol ederiz.

x%11

False olursa false döndürürüz aksi takdirde bir fsonraki yinelemenin sonucunu döndürürüz.

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

2

Jöle , 11 bayt

ṚḌ$+$6СÆPS

Çevrimiçi deneyin!


Bu cevabı okuyanların ilgisine göre, sonuncusu da Solabilir T. RD$+$ayrıca olabilir +RD$$veya RD+<newline>Ç(tüm önemsiz değişiklikler)
HyperNeutrino

@HyperNeutrino Ben seçtim Sçünkü bir şeyi gösterme şansı daha az. Hayır RD, sadece var ṚḌve ben ṚḌ$+$daha iyi organize edebilmek için seçtim .
Outgolfer Erik,

Nokta koymak için çok tembeldim; Neden koyduğunu biliyorum S; Bunu seçmeliydim T, ama bu çoğunlukla herkesin ilgisini çekiyor.
HyperNeutrino

1

05AB1E , 14 13 bayt

EDIT : Bir bayt kaydedildi, çünkü yığında yeterli eleman yoksa giriş yeniden kullanılıyor

[Dp#D11Ö#R+]p

Çevrimiçi deneyin!

Sorudaki ipucunu kullanır

Nasıl çalışır

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

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 bayt

0Veya döndürür true.

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

Yorumlananlar

Bu, Buğday Sihirbazı tarafından tarif edilen sihirli-spoiler formülüne dayanmaktadır.

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
    )                   //
}                       //

Test durumları

En büyük iki girişi snippet'ten kaldırdım, tamamlanması birkaç saniye sürdü. (Ama onlar da işe yarıyorlar.)


0

Mathematica, 45 bayt

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

0

Microsoft SQL Server, 826 786 * bayt

* Microsoft SQL Server 2012'de tanıtılan IIF işlevi hakkında hatırladım

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)

Çevrimiçi kontrol et

Daha düzenli biçimlendirme

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*/Ve /*false*/yorumlarına ihtiyacınız var mı?
Esolanging Fruit

Hayır. Girdi verilerini beklenen sonuçlara göre ayırmak için kullanılan yorumlardır.
Andrei Odegov

Onları silebilir misin?
Esolanging Fruit

Evet, elbette, yorumlar silinebilir.
Andrei Odegov

Girdileri kodlanmış gibi görünüyorsunuz. Çok emin değilim, ama kabul edilebilir bir giriş formatının bunları bir tablodan
Jo King

0

Jöle , 9 bayt

ṚḌ+Ɗ6СẒẸ

Çevrimiçi deneyin!

Nasıl çalışır

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

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

Daha okunabilir sürüm:

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

Çevrimiçi deneyin!

Bu şeyi bayt saymak için kullandım .


Ah tamam, sonlandırmalı. O zaman soruyu yanlış anladım. Yanlış-y vakaları için sonlandırmak için soruyu düzenledi.
Andrew

n
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.