Optimus'tan başka primler


36

Meydan okuma

Bir giriş tamsayı verilen n > 0, çıkışı (asal sayı diğer daha ndurumunda, n(basamak sayısını değiştirmeden) n ondalık genişleme bir rakam değiştirilmesiyle üretilebilmektedir kendisi asal).

Örnekler

Örneğin, n = 2. Ondalık genişletmede bir basamağı değiştirerek 2, üç ek asal sayı bulabiliriz 3, 5, 7, öyleyse a(n) = 3.

Başka bir örnek için n = 13,. Bir rakamı değiştirerek, asal sayıları alabilirsiniz 11, 17, 19, 23, 43, 53, 73, 83, yani a(13) = 8.

Son bir örnek için n = 20,. Bir rakamı değiştirerek, asal sayıları alabilirsiniz 23, 29, yani a(20) = 2.

Sıra

İşte başlamanız için ilk 20 terim. Bu OEIS A048853 .

4, 3, 3, 4, 3, 4, 3, 4, 4, 4, 7, 4, 8, 4, 4, 4, 7, 4, 7, 2

kurallar

  • Giriş ve çıktının, dilinizin yerel tamsayı tipine uyacağı varsayılabilir.
  • Giriş ve çıkış herhangi bir uygun formatta verilebilir .
  • Baştaki sıfırları dikkate almayın (örneğin, 03bu formülasyonun altında bir asal sayı değildir).
  • Tam bir program veya bir işlev kabul edilebilir. Bir işlevse, çıktıyı yazdırmak yerine geri gönderebilirsiniz.
  • Mümkünse, lütfen başkalarının kodunuzu deneyebilmesi için çevrimiçi bir test ortamına bir bağlantı ekleyin!
  • Standart boşluklar yasaktır.
  • Bu bu nedenle normal golf kurallarının tümü geçerli olur ve en kısa kod (bayt cinsinden) kazanır.

4
nÇıktının en küçük olduğunu düşünmeye çalışıyorum 0. Bence öyle n = 200. Ben de onlar demet gelip düşünüyorum: 200,202,204,206,208, 320,322,...,328, 510,...,518, 620,...628, 840,...,848, vb
Mühendis Tost

"Girdi ve çıktının, dilinizin yerel tamsayı tipine uyacağı varsayılabilir" ifadesi, girdi olarak dizge olarak alınmamıza izin vermediğini belirtir mi?
Dead Possum

1
@DeadPossum Hayır, buna izin verilir. Örneğin, yalnızca 32 bit tamsayı kullanıyorsanız, giriş olarak 2 ^ 100 endişelenmenize gerek yok.
AdmBorkBork

Eğer denize atılıyorsam bana haber verin ... Şimdi 3 farklı gönderim var
Patrick Roberts

2
@EngineerToast İlk örnek üssü (294001) bulduktan sonra, nihayet OEIS : A192545 ve A158124'e bakmayı düşündüm . Ayrıca ilgili: A143641 .
Ørjan Johansen

Yanıtlar:


10

05AB1E , 17 16 14 11 bayt

ā°`<Ÿʒ.L}pO

Açıklama:

ā             Push inclusive range from 1 to the length of the input
 °            Raise 10 to the power of each element
  `           Push each element to the stack
   <          Decrement the topmost element
    Ÿ         Inclusive range
              For 13, this creates an array like [10 11 12 13 14 .. 98 99]
     ʒ.L}     Only keep elements with a levenshtein distance to the input of
              exactly one
         p    Check each element for primality
          O   Sum

Çevrimiçi deneyin! veya 100'e kadar .


1
.L? Ciddi anlamda? .L?!?!
Outgolfer Erik,

@EriktheOutgolfer L.
Okx

Demek istediğim, levenstein mesafesi için yerleşik bir yer var!
Outgolfer Erik,

@EriktheOutgolfer ¯ \ _ (ツ) _ / ¯
Okx

Bir süre geçtiğini biliyorum ama <bir bayttan tasarruf etmek için silebilirsiniz . Filtre 100/ 1000/ 10000/ etc dosyasını kaldırmasa bile , hiçbir zaman bir asal değer değildir, bu nedenle çıktıyı etkilemez.
Kevin Cruijssen

5

Python 2 , 146 136 127 121 118 bayt

Önerileriniz için @ Mr.Xcoder'e teşekkürler

lambda I:sum(all(i%v for v in range(2,i))*sum(z!=x for z,x in zip(I,`i`))==1for i in range(1+10**~-len(I),10**len(I)))

Açıklama:

Önce atlayarak, giriş uzunluğuna eşit uzunlukta sayılar üretin (1,10,100,1000, ...)

for i in range(1+10**~-len(I),10**len(I))

Üretilen sayının girişten yalnızca bir rakamla farklı olduğunu kontrol edin

sum(z!=x for z,x in zip(I,`i`))==1

Asal olup olmadığını kontrol et

all(i%v for v in range(2,i))

saymak

sum(...)    

Çevrimiçi deneyin!


Bunu bir lambda yapmamak ve r=rangedaha çok kullandığınızdan daha kısa olabilir mi?
Stewie Griffin

1
Bu gibi şeyler için çalışır mı 143? Çünkü görüyorum ki range(1,10), bu dışlıyor 0ve 103asal
Bay Xcoder

@ Mr.Xcoder sabit
Ölü

1
Buna gerek yok 0içinde r(0,10). r(10)yeterli.
Bay Xcoder

1
Ayrıca, şunu belirtmenizi öneririm:lambda I,r=range:
Bay Xcoder

4

Javascript (ES6) 148 bayt

Girdiyi dizge olarak alır ve sayı olarak döndürür

n=>(n.replace(/./g,"$`a$' ").split` `.map(s=>s&&[..."0123456789"].map(d=>r+=+(t=s.replace(/a/,d))[0]&&t^n&&(p=v=>t>1&(--v<2||t%v&&p(v)))(t)),r=0),r)

Örnek kod pasajı:

f=
n=>(n.replace(/./g,"$`a$' ").split` `.map(s=>s&&[..."0123456789"].map(d=>r+=+(t=s.replace(/a/,d))[0]&&t^n&&(p=v=>t>1&(--v<2||t%v&&p(v)))(t)),r=0),r)

for(var k=1;k<=20;k++)
  o.innerText+=f(""+k)+" "
<pre id=o></pre>



3

Mathematica, 105 bayt

F=Count[Range[f=IntegerDigits;g=10^Length@f@#/10,10g],n_/;PrimeQ@n&&MatchQ[f@n-f@#,{x=0...,_,x}]&&n!=#]&;

Çevrimiçi deneyin!

Functionpozitif bir tamsayı bekliyor #. Girdi hanelerinin listesini döndüren fişleve eşit olarak ayarlar IntegerDigits. Biz almak Rangeden güzere 10g(dahili), nerede g=10^Length@f@#/10en büyük gücüdür 10girişine eşit veya daha az #, daha sonra öyle ki . kontrol eder asal, basamak listesi arasında fark olup olmadığını kontrol eder ve biçimde olabilir ve olmasını sağlar bu ve vardır .CountnPrimeQ@n&&MatchQ[f@n-f@#,{x=0...,_,x}]&&n!=#PrimeQ@nnMatchQ[f@n-f@#,{x=0...,_,x}]n#{0..., _, 0...}n!=#n#Unequal


3

JavaScript (ES6), 153 142 139 bayt

n=>([...n].map((c,i,[...a])=>[...''+1e9].map((u,j)=>s+=j+i&&j!=c?p((a.splice(i,1,j),a.join``)):0),s=0,p=q=>eval('for(k=q;q%--k;);k==1')),s)

Girdiyi dizge olarak kabul eder. Geçersiz girdi için tanımsız davranış, ancak aklıma gelen herhangi bir dizgide hatasız sonlanması gerekiyor. Yine de, evrenin sıcağı ölümünden önce, özellikle de uzun ipler için.

gösteri

f=
n=>([...n].map((c,i,[...a])=>[...''+1e9].map((u,j)=>s+=j+i&&j!=c?p((a.splice(i,1,j),a.join``)):0),s=0,p=q=>eval('for(k=q;q%--k;);k==1')),s)
console.log([...''+1e19].map((_,i)=>f(i+1+'')).join())
i.onchange=()=>console.log(f(i.value))
<input id=i>

İyileştirmeler

reduce()Çağrıları çağrılara yeniden aktararak ve çağrının kapsamı içinde işlev parametresindeki map()diziyi dolaylı olarak kopyalayarak 11 bayt kurtardı .asplice()

Kaydedilen 3 sayesinde bayt @Neil dönüştürmek için 'ın önerisi [...Array(10)]için [...''+1e9].

Unifified kod

input => (
  [...input].map(
    (char, decimal, [...charArray]) =>
      [...'' + 1e9].map(
        (unused, digit) => sum +=
          digit + decimal && digit != char ?
            prime(
              (
                charArray.splice(decimal, 1, digit)
                , charArray.join``
              )
            ) :
            0
      )
    , sum = 0
    , prime = test => eval('for(factor = test; test % --factor;); factor == 1')
  )
  , sum
)

açıklama

İşlev map(), bu cevaptan ödünç alınan ve değiştirilen ilkellik testini geçen permütasyon miktarını toplamak için iki seviyeli bir kullanım kullanır .

(Orijinal cevap)

reduce((accumulator, currentValue, currentIndex, array) => aggregate, initialValue)

Yani, örneğin, bir dizinin toplamını hesaplamak için, bir geçeceğini initialValueait 0ve bir dönüş aggregateeşit accumulator + currentValue. Bu yaklaşımı biraz değiştirerek, bunun yerine, birincillik testini geçen permütasyon sayısını hesaplıyoruz:

reduce(
  (passedSoFar, currentDecimal, currentIndex, digitArray) =>
    isValidPermutation() ?
      passedSoFar + prime(getPermutation()) :
      passedSoFar
  , 0
)

Bu esasen, her birinin belirli bir değerini değiştirerek reduce()tüm permütasyonlarını yineleyen içseldir . Öyleyse , her birinin yerine geçebilecek olan tüm olası şeyleri yinelemek için bir dışa ihtiyacımız var .digitArraydecimalpermutatedDigitreduce()permutatedDigitdecimal0-9

Uygulamadaki anormallikler

[...''+1e9].map((u,j)=>...En kısa yoluydu @Neil bir argüman yineleme için düşünebildiğim 0yoluyla 9. Bu durumda bunu yapmak tercih edilir u, ancak ubu durumda dizideki her eleman için kullanışlı değildir.

i+jÜçlü durumda 0, meydan okuma şartnamesine göre, lider hanenin olası bir permütasyonu olmadığından emin olmak için kontrol eder . Asıllığın ilkellik sınavından geçecek bir aday olmamasını j!=csağlar n.

(a.splice(i,1,j),a.join``)biraz karışıklık. splice()basamağını yerine decimal == isahip permutatedDigit == jolabilirler, ama splice()getiri kaldırılan elemanları (bu durumda, eşit olacaktır [a[i]]yerine modifiye edilmiş dizi), biz değiştirilmiş dizisi geçirmek için virgül operatörünü kullanmalıdır aönce asallık testine, ancak join()bunu ing bir sayı dizisine.

Son olarak, eval()kanonik yaklaşımla karşılaştırıldığında daha kısa olduğu için bir bayt tasarruf etmektir.

q=>eval('for(k=q;q%--k;);k==1')

q=>{for(k=q;q%--k;);return k==1}

Asal teste yapılan referans, pkullanılmayan bir argüman olarak map()çağrıda başlatılır .


İpuçları sayfasında [...''+1e9]daha kısa olduğunu düşünüyorum .
Neil

2

Python 2 , 134 bayt

lambda x,r=range,l=len:sum(~-f*(~-l(x)==sum(`f`[t]==x[t]for t in r(l(x))))and all(f%v for v in r(2,f))for f in r(10**~-l(x),10**l(x)))

Çevrimiçi deneyin!

Daha şık, daha uzun sürüm:

lambda x,r=range,l=len:l(filter(lambda f:(~-f*(~-l(x)==sum(`f`[t]==x[t]for t in r(l(x)))))*all(f%v for v in r(2,f)),r(10**~-l(x),10**l(x))))

Giriş bir Dize olarak alınır.


Açıklama (eski versiyon)

  • lambda x,r=range,l=len:- String parametresi xve iki sabit parametreli bir lambda tanımlar r=rangevel=len .

  • sum(1...) - 1 byte tasarruf sağlayan uzunluğu al len([...]) .

  • for f in r(10**~-l(x),10**l(x))- Girilen değerle kesinlikle aynı büyüklükteki tüm sayıları oluşturur (beklenir 0). Örneğin, bir giriş 3, sonuçlanacaktır[1, 2, 3, 4, 5, 6, 7, 8, 9] .

  • sum(1for t in r(l(x))if`f`[t]==x[t])==~-l(x)and f>1 - Mevcut sayının girişten tam 1 basamak uzakta olup olmadığını ve 1'den yüksek olup olmadığını kontrol eder.

  • all(f%v for v in r(2,f)) - Mevcut sayının asal olup olmadığını kontrol eder.


1
Bazı baytları kurtarmak sum(1for..ifBOOL)için değişikliği koundunuzsum(BOOLfor)
Dead Possum

Dizge olarak girdi alma izni var mı? "Girdi ve çıktının dilinizin ana tamsayı tipine uyduğu varsayılabilir"
ifadesine bakın.

@DeadPossum Bazı cevaplar yok. Neden izin verilmiyor?
Bay Xcoder

Bugün oylar bitti, ama en kısa sürede +1 olacak: D
Dead Possum

@DeadPossum Tabii. Sakın unutma yoksa sana ping yaparım! ( </joke>)
Bay Xcoder

1

JavaScript (ES6), 137 bayt

i=(a=prompt()).length;s=0;while(i--)for(j=0;j<=9;j++){(b=[...a]).splice(i,1,j);k=b=b.join('');while(b%--k);s+=i+j&&a[i]!=j&&k==1}alert(s)

Uyarlar benim diğer cevabı Web API yöntemleri kullanarak tam bir program boyun prompt()ve alert().


1

Fasulye , 126 bayt

00000000: a64d a065 8050 80a0 5d20 8001 a64d a06f  ¦M e.P. ] ..¦M o
00000010: 8025 39b5 cb81 2065 27a6 4da0 6680 2581  .%9µË. e'¦M f.%.
00000020: 0035 cb81 2066 27a6 53d0 80cd a05e 8043  .5Ë. f'¦SÐ.Í ^.C
00000030: cf20 5d00 2080 82a0 65a5 3a20 66a6 4da0  Ï ]. .. e¥: f¦M 
00000040: 6780 4da0 5e80 53d0 80a0 5e20 807b 2300  g.M ^.SÐ. ^ .{#.
00000050: b5cc a05e 8f4b c120 6728 264d a06f 814e  µÌ ^.KÁ g(&M o.N
00000060: cecc a065 8b20 6681 4cd0 84a0 5d20 6581  ÎÌ e. f.LÐ. ] e.
00000070: 2066 814c a067 8025 3a26 206f b130        f.L g.%:& o±0

Çevrimiçi deneyin!

Bir uyarlama Tam program JavaScript gönderimimin .

JavaScript Eşdeğeri

i=a.length
s=0
while(i--){
  j=10
  while(j--){
    (b=[...a]).splice(i,1,j)
    k=b=b.join('')
    while(b%--k);
    s+=i+j&&a[i]!=j&&k==1
  }
}
s

açıklama

abir dize olarak girişin ilk satırı olarak örtülü olarak başlatılır ve son ifade s, asal izinlerin toplamını içeren örtük olarak çıkar.


1

Kabuğu , 32 bayt

Lof§&ȯ=1Σzo±≠d⁰o=Ld⁰L↑o≤Ld⁰Lmdİp

Çevrimiçi deneyin!

Ungolfed / Açıklama

                              İp  -- get all primes
                            md    -- and convert them to list of digits
                     ↑o≤   L      -- take as long as the lenghth of these digit lists are ≤ ..
                        Ld⁰       -- .. the number of digits of input 
 of                               -- from those primes filter:
               o=Ld⁰L             --   same number of digits as input
   §&                             --   and
        Σz                        --   the number of..
          o±≠d⁰                   --   .. digits that differ from input digits ..
     ȯ=1                          --   .. must be one
L                                 -- finally count them


1

PHP , 151 147 141 140 136 134 129 128 bayt

@Einacio sayesinde -6 bayt; @Titus sayesinde -1 bayt

<?php for($i=$m=10**strlen($n=$argv[1]);$i-->$m/10;)if(levenshtein($n,$i)==$f=$t=1){while($t<$i)$f+=$i%$t++<1;$c+=$f==2;}echo$c;

Çevrimiçi deneyin!

Yorumlarla birlikte biçimlendirilmiş:

<?php
// Work through each integer with the same number of digits as the input $argv[1].
for ($i = $m = 10 ** strlen($n = $argv[1]); $i-- > $m / 10;)
    // Is it exactly one digit different from the input?
    if (levenshtein($n, $i) == $f = $t = 1) {
        // Count its factors.
        while ($t < $i) $f += $i % $t++ < 1;
        // If there are exactly 2 factors then it's a prime, so increment the counter.
        $c += $f == 2;
    }
// Print the final count.
echo $c;

Elimden geldiğince kısa tutmak için:

  • birleşik ödevler $f = $t = 1 ;
  • ++başka bir ifadenin parçası olarak bir artışla snook $f += $i % $t++ == 0(artış, sonra yürütülür modül ve sonucunu etkilemez);
  • ve ifkoşullu bir artış için bir ifade kullanmak $c += $f == 2;yerine , tamsayı olarak kullanıldığında boolean'ın, yerine 1 olduğunda, boolean'ın doğru olduğu gerçeğini kullanmıştır if ($f == 2) $c++;.

1
$ c tanımlamanıza gerek yok, ilk + 0 olarak sayılır +
Einacio

@Einacio Golf kuralları nelerdir? Tanımlanmamış bir değişken uyarı bildirimi verdiği için buna izin var mı?
WebSmithery

@Einacio Görünüşe göre STDERR herhangi bir çıktı göz ardı edilebilir, bu yüzden öneri için teşekkürler.
WebSmithery

1
Kullanımı için +1 levenshtein. İyi fikir! $i%$t++<1daha kısa $i%$t++==0.
Titus,


0

PHP, 100 + 1 bayt

for(;~($a=$argn)[$i];$i++)for($d=-!!$i;$d++<9;$c+=$k==1)for($a[$i]=$d,$k=$a;--$k&&$a%$k;);echo$c-$i;

Pipe ile çalıştırın -nRveya çevrimiçi deneyin .

Yıkmak

for(;~($n=$argn)[$i];$i++)  # loop through argument digits, restore $n in every iteration
    for($d=-!!$i;               # loop $d from 0 (1 for first digit)
        $d++<9;                 # ... to 9
        $c+=$k==1                   # 3. if divisor is 1, increment counter
    )
        for($n[$i]=$d,              # 1. replace digit
            $k=$n;--$k&&$n%$k;      # 2. find largest divisor of $n smaller than $n
        );
echo$c-$i;                  # print counter - length

0

Java 8, 201 194 bayt

n->{String s=n+"";int r=0,i=0,j,k,t,u,l=s.length();for(;i<l;i++)for(j=0;++j<10;r+=n==u|t<2?0:1)for(u=t=new Integer(s.substring(0,i)+j+(i<l?s.substring(i+1):"")),k=2;k<t;t=t%k++<1?0:t);return r;}

Açıklama:

Burada dene.

n->{                        // Method with integer as parameter and return-type
  String s=n+"";            //  String representation of the input-int
  int r=0,                  //  Result-integer
      i=0,j,k,              //  Index-integers
      t,u,                  //  Temp integers
      l=s.length();         //  Length of the String
  for(;i<l;i++)             //  Loop (1) from 0 to `l` (exclusive)
    for(j=0;++j<10;         //   Inner loop (2) from 1 to 10 (exclusive)
        r+=                 //     And after every iteration, raise the result by:
           n==u             //      If the current number equals the input
           |t<2?            //      or it is not a prime:
            0               //       Add nothing to the result-counter
           :                //      Else:
            1)              //       Raise the result-counter by one
      for(                  //    Inner loop (3)
          u=t=              //     First set both `u` and `t` to:
              new Integer(  //      Convert the following String to an integer: 
               s.substring(0,i)
                            //       Get the substring from 0 to `i` (exclusive)
               +j           //       + `j`
               +(i<l?       //       + If `i` is smaller than the String-length:
                  s.substring(i+1)
                            //          The substring from 0 to `i` (inclusive)
                 :          //         Else:
                  "")),     //          Nothing
          k=2;              //     And start `k` at 2
              k<t;          //     Continue looping as long as `k` is smaller than `t`
        t=t%k++<1?          //     If `t` is divisible by `k`:
           0                //      Change `t` to 0
          :                 //     Else:
           t                //      Leave `t` as is
      );                    //    End of inner loop (3)
                            //    (`t` remained the same after loop 3? -> It's a prime)
                            //   End of inner loop (2) (implicit / single-line body)
                            //  And of loop (1) (implicit / single-line body)
  return r;                 //  Return the result-counter
}                           // End of method

new Integer(s.substring(0,i)+j+(i<l?s.substring(i+1):"") bu tam sayılara neden olur:

İçin 0-9: 1, 2, 3, 4, 5, 6, 7, 8, 9.
İçin 10: 10, 20, 30, 40, 50, 60, 70, 80, 90, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19.
İçin 11: 11, 21, 31, 41, 51, 61, 71, 81, 91, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19.
vb.


0

JavaScript (ES7), 118 bayt

Bir dize olarak girdi alır.

n=>[...2**29+'4'].map(d=>n.replace(/./g,c=>s+=d+i>0&(P=k=>N%--k?P(k):N-n&&k==1)(N=p+d+n.slice(++i),p+=c),i=p=0),s=0)|s

Çevrimiçi deneyin!

Yorumlananlar

n =>                        // n = input number (as a string)
  [...2**29 + '4']          // generate "5368709124" (all decimal digits)
  .map(d =>                 // for each digit d in the above string:
    n.replace(/./g, c =>    //   for each digit c in n:
      s +=                  //     increment s if the following code yields 1:
        d + i > 0 & (       //       if this is not the first digit of n or d is not "0":
          P = k =>          //         P = recursive function taking k and using N:
            N % --k ?       //           decrement k; if k is not a divisor of N:
              P(k)          //             do recursive calls until it is
            :               //           else:
              N - n &&      //             return true if N is not equal to n
              k == 1        //             and k is equal to 1 (i.e. N is prime)
          )(                //         initial call to P ...
            N =             //           ... with N defined as:
              p +           //             the current prefix p
              d +           //             followed by d
              n.slice(++i), //             followed by the trailing digits
                            //             (and increment the pointer i)
            p += c          //           append c to p
          ),                //         end of initial call
          i = p = 0         //         start with i = p = 0
    ),                      //   end of replace()
    s = 0                   //   start with s = 0
  ) | s                     // end of map(); return s

0

Yakut ile -rprime101 bayt,

-rprime10flOOr(lOg10n)+1n

->n{d=n.digits;Prime.each(10**l=d.size).count{|x|d.zip(e=x.digits).count{|a,b|a==b}==l-1&&e.size==l}}

Çevrimiçi deneyin!

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.