11 olmadan Palindromik Asallar


14

Çift basamaklı her palindrom 11 ile bölünebilir, bu nedenle 11 çift basamaklı tek [palindromik asal] dır. - David Wasserman, OEIS

Bugün araştırmamı yapmadan önce, programım palindromik primleri hesaplarken çift sayı (11 hariç) rakamları atladığında manuel olarak öğrendim. Göreviniz: bir tamsayı girişi N verildiğinde, Stephen'ın Palindromic Sekansı ™ ndaki N terimini veren bir program veya işlev oluşturun.

Stephen'ın Palindromik Dizisi ™

Stephen'ın Palindromic Sequence ™ 11 ile başlar ve 11'e bölünebilen palindromik yarı- yarıçaplarla devam eder. Temel olarak, 11 sayılmazsa asal olacak tüm yarı-yarılar. Tersi, bu listenin çift sayıda rakam içermesidir! Yaşasın. Ve, tek sayıları olan çok sayıda sayı, zaten asal olduklarından atlanır.

Dizinin başlangıcı:

1   : 11
2   : 22
3   : 33
4   : 55
5   : 77
6   : 121
7   : 737
8   : 979
9   : 1111
10  : 1441
11  : 1661
12  : 1991
13  : 3113
14  : 3223
15  : 3443
16  : 3883
17  : 7117
18  : 7447
19  : 7997
20  : 9119
21  : 9229
22  : 9449
23  : 10901

* 1331 (11 ^ 3) ve benzerleri bu dizinin ruhuna uysa da, kurallara uymazlar.

Daha uzun test vakaları:

26  : 91619
31  : 103301
41  : 139931
51  : 173371
61  : 305503
71  : 355553
81  : 395593
91  : 725527
101 : 772277
127 : 997799
128 : 1099901
141 : 3190913
151 : 3739373
161 : 7589857
171 : 9460649
200 : 11744711
528 : 39988993

Giriş

Tamsayı N,> = 1. Yanıtınızda belirtirseniz, 0 dizinli bir N kullanabilirsiniz (test senaryolarını ayarladığınızdan emin olun). Sondaki satırsonlarına izin verilir.

Çıktı

Stephen'ın Palindromic Sequence ™ 'in nci terimi. Sondaki satırsonlarına izin verilir.

kurallar

  • Programınızın / fonksiyonunuzun alabileceği tek giriş N'dir. Programınız, örneğin OEIS'den bir sıra getiremez (diğer bir deyişle standart boşluklar geçerlidir ).
  • Altı basamağa kadar bir çıktı yazdırabilmeniz gerekir (N = 127). Zaman bir faktör değildir - ancak programınız / işleviniz çok hızlı bir şekilde uzarsa, algoritmanın çalıştığını kanıtlamanız gerekir. Diliniz doğal olarak daha uzun çıktılara izin veriyorsa, sınırına kadar doğal olarak genişlemesine izin verebilir veya hangisini tercih ederseniz on basamakta kapatabilirsiniz. Geçerli bir çıktı gibi görünmediği sürece, sınırınızın ötesinde çıktı / sonlandırma önemli değildir.
  • Geçersiz girişteki program / fonksiyon fonksiyonu önemsizdir.


7
11 dahil edilmeli mi? Bu yarı zamanlı değil.
xnor

1
@xnor 11, dizinin başlangıcı olarak tanımlanır. Bunun bir yarı-periyot olmadığı konusunda haklısın, ama 1 tanımı gereği bir Fibonacci numarası da değil :)
Stephen

Yanıtlar:


9

Jöle , 18 13 bayt

ṬÆẸש11ŒḂµ#ṛ®

Bazı nedenlerden dolayı, aynı şeyi yapmamıza rağmen, ilk revizyonumdan çok daha yavaş.

Çevrimiçi deneyin!

N = 127

dennis-home:~$ time jelly eun 'ṬÆẸש11ŒḂµ#ṛ®' <<< 127
997799

real    1m43.745s
user    1m43.676s
sys     0m0.113s

Nasıl çalışır

ṬÆẸש11ŒḂµ#ṛ®  Main link. No arguments.

         µ     Combine all links to the left into a chain.
          #    Read an integer n from STDIN and call the chain monadically, with
               argument k = 0, 1, 2, ... until n values of k result in a truthy
               output. Return the array of all matching values of k.
Ṭ                Untruth; yield [0, 0, 0, ..., 1] (k-1 zeroes followed by a 1) or
                 [] if k = 0.
 ÆẸ              Unexponents; consider the resulting array as exponents of the
                 sequence of primes and yield the corresponding integer. For k = 0,
                 this yields 1. For k > 0, it yields the k-th prime.
   ש11          Multiply the result by 11 and copy the product to the register.
       ŒḂ        Test if the product is a palindrome.
           ṛ®  Replace the resulting array with the integer in the register.

15

Python 2 , 76 73 72 70 69 68 bayt

n=input();c=k=m=11
while n:m*=k/c;k+=c;n-=`k`==`k`[::~m%k-c]
print k

3 bayt golf için @WheatWizard sayesinde!

1 byte kapalı golf için @ ØrjanJohansen'a teşekkürler!

68 bayta giden yol için @xnor ve @ ØrjanJohansen'e teşekkürler!

Giriş 0 dizinlidir. Çevrimiçi deneyin! ya da ilk 31 test vakasını doğrulayın .

Arka fon

Hatırlatma; Wilson teoremi devletler tüm tamsayılar için p> 1 ,

anlamı (p - 1)! +1 bölünemeyen bir p ancak ve ancak p asal.

Eğer p> 1 olduğu değil asal, bu kompozit; let q en küçük asal böleni p . Açıkça q ≤ p / q . İki durum söz konusudur:

  • Eğer q = p / q ise , p = q²'ye sahibiz .

    Eğer q = 2 , (p - 1)! = 3! = 6 , yani (p - 1)! s , 2 modülo p ile uyumludur .

    Eğer p / q = q> 2 , bu 2q p < . Bu şekilde, q ve 2q'nin her ikisi de , ürünü p - 1'in faktöriyeli olan 1,…, p - 1 arasındadır , bu yüzden 2p = 2q² = q · 2q bölünür (p - 1)! eşit.

  • Eğer q <p / q , q ve p / q her ikisi de 1,…, p - 1 arasındaysa , p = q · p / q bölünür (p - 1)! eşit.

Özetliyor,

tüm tamsayılar için p> 1 .

Şimdi, tüm tamsayı kongrüansları ve tüm a , b ve c tamsayıları için aşağıdakiler geçerlidir.

Ne zaman bir = -1 , b = 11 olduğunda , ve C = -1 , biz takip ettiğini

ve 21 ve -23 uyumlu modulo 44 ve -1 ve 11p-1 uyumlu modulo 11p olduğundan , aşağıdaki sonuca varıyoruz.

Tüm olası p değerleri için , sonuç ( 11 , 21 veya 11p - 1 ) 0,…, 11p - 1 aralığına düşer , bu nedenle bu değerler Python'un %operatörü tarafından döndürülecek değerlerle eşleşir .

Nasıl çalışır

Girişi n'ye kaydettikten sonra c , k ve m ila 11 arasında başlangıç ​​yaparız . c , programın geri kalanı için sabit olacaktır. Orada üç oluşumları olduklarından c aşağıdaki satırda ve atama c maliyetleri sadece iki bayt, bu bir bayt kaydeder. k , bir önceki paragraftaki p'nin anlamı kullanılarak 11p olarak düşünülebilir ; başlangıçta, k = 11 = 11 · 1! . m 11 · (p - 1) yerini alır ! ; başlangıçta, m = 11 = 11 · 0! . k ve mm = 11 · (k / 11) ilişkisini tatmin edecek ! her zaman.

n bulmamız gereken “Stephen'ın palindromlarının” sayısını temsil eder. Yana k = 11 başlangıçta, yapabiliriz çıktı k diğer hesaplamalar olmadan aynen. Ancak n pozitif olduğunda while döngüsüne gireriz. Döngü çarparak başlar m ile k / C = p , daha sonra ilave 11 için k , böylece artan p . Eğer k dizisinin bir üyesi olan, biz çıkarma 1 den n ve baştan başlayın. Bir kez n ulaşır 0 , biz istenilen endeksinde dizisi üyesini bulundu ve döngünün patlak ardından son değerini yazdırmak k.

İfade

`k`==`k`[::~m%k-c]

asıl testi gerçekleştirir ve bunun sonucu ( sıra üyeleri için True / 1 , aksi takdirde 0 / False ) n'den çıkarılır . Daha önce görüldüğü gibi, ~ m% k = (-m - 1)% k = (-11 · (p - 1)! - 1)% 11p , p asal ise 10 , p = 4 ise 21 ve 11p - 1 > 43 , p> 4 kompozit ise. Böylece, c = 11 çıkarıldıktan sonra , asal p için -1 ve aksi halde 9'dan büyük bir pozitif tamsayı kalır.

Asal p için , ​`k`[::-1]bize k'nin dize olarak ters basamak sırasına göre temsilini verir , bu nedenle k'nin bir palindrom ​`k`​olup olmadığını kontrol eder . Eğer öyleyse, tüm koşullar yerine getirilir ve k bir sekans üyesidir. Bununla birlikte, p asal değilse, geniş aralık adımı ve k'nin her zaman birden fazla basamağa sahip olması, aynı sayıya eşit sayıda haneye sahip olamayacağı anlamına gelir .​`k`[::-1]​`k`​


4
Söylemeliyim ki, öncelik testiniz gerçekten mükemmel. Bu cevapla rekabet edemem.
Rock Garf Hunter Post

2
Bu umut vericidir ancak 121'i atlar.
xnor

@xnor Ek bir bayt pahasına 121 içermeyi başardı. Teşekkürler!
Dennis

8

Brachylog , 17 bayt

:I{11|ṗ×₁₁≜.↔}ᶠ⁽t

Çevrimiçi deneyin!

Bu 1 endekslidir.

açıklama

:I{          }ᶠ⁽t    Find the Input'th result of the following:
   11                  Output = 11
     |                 Or
          ≜.           Output is an integer…
      ṗ×₁₁             …which is the result of multiplying a prime by 11…
           .↔          …and Output reversed is still the Output

Bu cevapla iki gerçekleştirme:

  • Ben geçmek için herhangi bir girdi (bu yüzden eklemek zorunda bu yüzden) metaforredates (ile ) geçen üstgeçiş çalışmıyor gerçeğini düzeltmek gerekiyor :I.
  • NBir yüklemin sonucunu elde etmek için bir metafor eklemeniz gerekiyor (bu kullanmaktan kaçınacak ᶠ⁽tve bunun yerine örneğin ⁿ⁽).

Her iki değişikliğin uygulanması bu cevabı 14 bayt yapar.


5

Mathematica, 65 60 bayt

n=NextPrime;11Nest[n@#//.x_/;!PalindromeQ[11x]:>n@x&,1,#-1]&

Kullanarak doğrudan primler aracılığıyla NextPrimetekrarlar ve asalın 11 katı palindrom olup olmadığını kontrol eder. N = 528'e kadar çalışır . Sonuçlar 528 ve 529, aralarında 2 16'dan fazla primerdir, bu noktada //.yeterli sayıda ikame girişiminde bulunulmaz.


4

Piton 2 , 111 107 103 102 101 100 91 90 89 bayt

Dennis beni burada dövdü , bu yüzden gidip onun cevabını kontrol et.

Bu cevap sıfır endekslidir

n=input()
r=1
while n:r+=1;c=`r*11`;n-=all(r%x for x in range(2,r))*c==c[::-1]
print r*11

Çevrimiçi deneyin!

Matematik bağımlısı sayesinde bir bayt kurtarıldı

açıklama

Öncelikle girdi alıp nyeni bir değişken oluşturduk r=1. Biz yukarı sayacaktır rbiz azaltacaktır biri bulmak her zaman bir asal ve 11 ürünüdür palindrom ararken no 0 oluncaya kadar.

Bu yüzden bir döngü başlatırız:

while n:

Yaptığımız ilk şey artıştır r

r+=1

Ayrıca bir değişkeni cdize temsili olarak önceden tanımlarızr*11

c=`r*11`

Şimdi nböyle bir sayı bulursak azaltmak istiyoruz . Biz sadece eğer temsil eden bir boolean düşeriz r*11gelen uyan desen r. Bu durumda Falsesıfır çıkarırız ve eğer True1 çıkarır.

Boolean'ı hesaplamak için şunları yaparız:

all(r%x for x in range(2,r))*c==c[::-1]

İlk bölüm asal allolup olmadığını belirleyecektir r. Sonucu ceğer rasal ise bu olacak, cancak rkompozit ""ise boş dize ile çarpıyoruz. Daha sonra c[::-1]bunun tersi olanı karşılaştırırız c. Eğer rasal ve cpalindrom Trueise, her ikisi de başarısız olursa her şey yanlış olarak değerlendirilir.

Ne zaman nsıfır biz basitçe print c.

83 bayt

İşte daha kısa ama maalesef özellikleri karşılamayan özyinelemeli bir çözümdür, çünkü python'un özyineleme kapağına çok hızlı vurur.

f=lambda n,r=1:n and f(n-all(r%x*(`r*11`==`r*11`[::-1])for x in range(2,r)),r+1)+11

Çevrimiçi deneyin!


4

05AB1E , 15 bayt

0 endeksli.

11Iµ11N*DÂQNp*½

Çevrimiçi deneyin!

açıklama

11               # initialize stack with 11
  Iµ             # loop over N in [1 ... inf] until counter equals input
    11N*         # multiply N by 11
        D        # duplicate
         ÂQ      # check if the copy equals its reverse
           Np    # check if N is prime
             *   # multiply the results of the checks together
              ½  # if 1, increase counter

3

Haskell , 94 90 bayt

h#n|n<2=0|mod n h<1=1+h#div n h|j<-h+1=j#n
([n|n<-[0,11..],(==)=<<reverse$show n,3>2#n]!!)

Çevrimiçi deneyin! Örnek kullanımı: ([n|n<-[0,11..],(==)=<<reverse$show n,3>2#n]!!) 127.

[0,11..]sonsuz listeyi oluşturur [0,11,22,33, ...](sırayı 1 dizinli yapmak için sıfır gerekir). nBu listedeki her biri için bir palindrom n==(read.reverse.show)nolup olmadığını kontrol ediyoruz n. en fazla iki ana bölme 3>2#nolup olmadığını kontrol eder n. Çünkü nher zaman 11'e bölünebilir, gerçek bir asal elde edemeyiz, sadece yarı yarılar elde ederiz.

Edit: 4 bayt golf için Ørjan Johansen sayesinde!


Etrafta parantez gerekmez div n h. Ayrıca, sadece verimliliği etkiler, ancak ilki 2#muhtemelen olabilir h#.
Ørjan Johansen

(==)=<<reverse$show ndaha kısadır.
Ørjan Johansen

2

PHP, 82 Bayt

for(;$d<$argn;$i>1||($p=11*$n)!=strrev($p)?:$d++)for($i=++$n;--$i&&$n%$i;);echo$p;

Çevrimiçi deneyin!


"çevrimiçi denemek" giriş nereye yazmak zorunda? "input" kutusuna 1 yazarsam 395593
RosLuP

@RosLuP Normalde -R seçeneği ile komut satırından çalışır. Online Versiyonda limitleriniz var ve $argn=81;bir komut satırı versiyonunda mevcut olan giriş değişkeni
Jörg Hülsermann

bu yüzden sadece girdi değişkeni "$ argn = 81" 'e yazmak zorundadır, örneğin girdi 10 ise "$ argn = 10" tekrar yazınız, tamam, teşekkür ederim
RosLuP

@RosLuP Evet 81 sayısını istediğiniz girişle değiştirin
Jörg Hülsermann

1

Aksiyom, 105 bayt

g(n)==(i:=c:=1;repeat(c=n=>break;i:=i+1;if(prime? i)then(x:=(11*i)::String;x=reverse(x)=>(c:=c+1)));i*11)

ungolf, test kodu ve sonuçları

f(n)==
   i:=c:=1
   repeat
      c=n=>break
      i:=i+1
      if(prime? i)then(x:=(11*i)::String;x=reverse(x)=>(c:=c+1))
   i*11


(5) -> [[i,g(i)]  for i in 1..23]
   (5)
   [[1,11], [2,22], [3,33], [4,55], [5,77], [6,121], [7,737], [8,979],
    [9,1111], [10,1441], [11,1661], [12,1991], [13,3113], [14,3223], [15,3443],
    [16,3883], [17,7117], [18,7447], [19,7997], [20,9119], [21,9229],
    [22,9449], [23,10901]]
                                          Type: List List PositiveInteger
(6) -> [[i,g(i)]  for i in [26,31,41,101,151,200]]
   (6)
   [[26,91619], [31,103301], [41,139931], [101,772277], [151,3739373],
    [200,11744711]]

Burada g (700) = 92511529 böylece sınır> 700 olur; ww (1000) = 703999307 ancak nextPrime () kullanılıyor

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.