Numaram Polignac numarası mı?


21

Bir numara olduğunu, ancak ve ancak bir Polignac de sayıdır tek ve edilemez bir şekilde temsil edilebilir p + 2 , n burada n, negatif olmayan bir tamsayıdır ve p , bir asal sayıdır.

Görev

Olumlu bir tamsayı alan bir kod yazın ve bunun bir Polignac numarası olup olmadığını belirler. Biri doğru, biri yanlış olmak üzere iki farklı değer verebilirsiniz. Bayt sayınızı en aza indirmeyi hedeflemelisiniz.

Test Kılıfları

Olumlu durumlar için işte OEIS

1, 127, 149, 251, 331, 337, 373, 509, 599, 701, 757, 809, 877, 905, 907, 959, 977, 997, 1019, 1087, 1199, 1207, 1211, 1243, 1259, 1271, 1477, 1529, 1541, 1549, 1589, 1597, 1619, 1649, 1657, 1719, 1759, 1777, 1783, 1807, 1829, 1859, 1867, 1927, 1969, 1973, ...

İşte bazı olumsuz durumlar:

22, 57

İki farklı çıktı yerine gerçek ve sahte çıktılar alabilir miyiz?
Okx

@Okx Hayır diyeceğim.
Wheat Wizard


Err ... Olumsuz durumlar için, temelde herhangi bir sayı OEIS hakkı değil mi? Belli bir şeyi kaçırmadığımdan emin olmak.
Magic Octopus Urn

@MagicOctopusUrn Evet.
Buğday Sihirbazı

Yanıtlar:


11

Japt , 9 14 13 bayt

o!²mnU dj |Uv

Çevrimiçi test edin! veya 1000'den küçük tüm Polignac tam sayılarını bulun .

Çıkışlar 1falsy girişler ve 0truthy için.

açıklama

 o!²  mnU dj |Uv
Uo!p2 mnU dj |Uv  : Ungolfed
                  : Implicit: U = input integer (e.g. 9)
Uo                : Create the range [0..U), and map each item X to
  !p2             :   2 ** X.               [1, 2, 4, 8, 16, 32, 64, 128, 256]
      m           : Map each of these powers of 2 by
       nU         :   subtracting from U.   [8, 7, 5, 1, -7, -23, -57, -119, -247]
          d       : Return whether any item in the result is
           j      :   prime.                (5 and 7 are, so `true`)
             |    : Take the bitwise OR of this and
              Uv  :   U is divisble by (missing argument = 2).
                  : This gives 1 if U cannot be represented as p + 2^n or if U is even.
                  : Implicit: output result of last expression

Bu, 2 & 3 için yanlış sonuçlar veriyor gibi görünüyor; geri geliyor falseama onlar de Polignac sayıları değil.
Shaggy

@Shaggy 3sabittir, ancak ilk başta bile davalara bakmak zorunda kalmıyorduk. Tamir ediyorum.
ETHproductions

@Shaggy Şimdi düzeltildi.
ETHProductions

Düzeltmenin 3herhangi bir bayta mal olmadığının iyi bir şey olduğunu söylemek üzereydim - sonra düzeltmeyi gördüm 2- Ouch!
Shaggy

: Kodlama hatası gibi görünmeyen rekabetçi bir program için O +1
Downgoat

8

Jöle , 11 10 bayt

@Dennis sayesinde 1 bayt kaydedildi

Ḷ2*³_ÆPS<Ḃ

Çevrimiçi deneyin!

Nasıl çalışır

Ḷ2*³_ÆPS<Ḃ   Main link. Argument: n (integer)
Ḷ            Lowered range; yield [0, 1, 2, ..., n-1].
 2*          Reversed exponentiation with 2; yield [1, 2, 4, ..., 2**(n-1)].
   ³_        Reversed subtraction with the input; yield [n-1, n-2, n-4, ..., n-2**(n-1)].
     ÆP      Replace each item with 1 if it is prime, 0 otherwise.
       S     Sum; yield a positive integer if any item was prime, 0 otherwise.
         Ḃ   Yield n % 2.
        <    Yield 1 if the sum is less than n % 2, 0 otherwise.
             This yields 1 if and only if the sum is 0 and n is odd.

Ḷ2*⁸_ÆPS<Ḃ bir bayt kaydeder. tio.run/##ASQA2/9qZWxsef//4bi2Mirigbhfw4ZQUzzhuIL/…
Dennis

@Dennis Teşekkürler, 3-byte alternatif olması gerektiğini biliyordum ¬;ḂẠ. S<Ḃkutunun dışında olsa da, en azından benim için :-)
ETHproductions

8

JavaScript (ES6),  56 54  53 bayt

İade 0 veya1.

f=(n,p=1,x=y=n-p)=>n>p?y%--x?f(n,p,x):x!=1&f(n,p*2):n

Çevrimiçi deneyin!

Nasıl?

p=1 ile başlıyoruz . Y = n - olup olmadığını test ediyoruz.y=np kompozitve buna göre bir boole. Bir sonraki testp×2 ile gerçekleştirilir.

En kısa sürede p büyüktür n , biz tekrarlama ve dönüş durdurmak n .

Tüm yinelemelerin sonuçları AND'dur ve boolean değerleri ya 0 veya1.

Tüm ara sonuçların gerçeğe uygun olması koşuluyla, aşağıdaki gibi bitsel bir testle sonuçlanır:

1 & 1 & 1 & n

Bu verir 1 eğer ise ve n tek olması durumunda , girişi bir Polignac numarası olarak doğrulamak için gereken son şarttır.


3
Harika bir teknik. Muhtemelen açıkça söyleyemeyen n%2veya benzeri olmayan tek geçerli cevap : P
ETHproductions

Bunun 262145 ve 2097153 gibi 2 ^ M + 1 formundaki Polignac sayıları için yanlış negatifleri vardır (müteakip olanlar 4722366482869645213697, 38685626227668133590597633, 5192296858534827628530496329220097, vb.). Örneğin, 262139, 262259, 2097131 ve 2097187’yi doğru tanımladığı için sorun olan sayıların büyüklüğü değildir. Tabii ki özyinelemeden dolayı, yığın büyüklüğünü test etmek için çok büyük bir şeye büyütmek zorunda kaldım ve sadece yukarıda listelenen ilk iki 2 ^ M + 1 de Polignac sayısının etrafındaki aralıkları test ettim.
Deadcode

1
@Deadcode Bunu bildirdiğiniz için teşekkür ederiz. Şimdi düzeltildi.
Arnauld,

1
@Arnauld Ah, haklısın :) Sadece emin olmak için, bunu yaptım ve yeterince eminim, düzeltildi.
Deadcode

1
@Deadcode temiz! :)
Arnauld,

7

Python 2 , 60 57 56 bayt

f=lambda n,k=1,p=-1:k/n or(n-k&n-k-p%k>0)&n&f(n,k+1,p*k)

Çevrimiçi deneyin!


Vay, bu etkileyici verimsiz. Wilson teoremi ile ana test . Artı tarafta 262145 ve 2097153 için doğru çalışır (sınırsız yığın ve bignum büyüklüğü varsayılarak); diğer gönderilerden bazıları yok. Asal algoritması 4'e "truthy" verir, çünkü (-6)% 4 = 2, ancak sayılar tarafından reddedildiği için bu bir problem değil &n&. 5 sayısı bir Polignac numarası olsaydı yanlış bir negatif olurdu, çünkü 1 + 4 = 5, ama bu zaten sorun değil çünkü 2 + 3 = 5.
Deadcode

7

Jöle , 10 bayt

Daha önce gönderilene alternatif bir 10-byte Jelly gönderimi.

_ÆRBS€’×ḂẠ

Polignac sayıları için 1 döndüren monadik bir bağlantı ve aksi halde 0 .

Çevrimiçi deneyin! veya görmek 1000 yaşın altındakileri .

Nasıl?

_ÆRBS€’×ḂẠ - Link: number, n  e.g.  1    3      5                  6                   127
 ÆR        - prime range            []   [2]    [2,3,5]            [2,3,5]             [2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127]
_          - subtract from n        []   [1]    [3,2,0]            [4,3,1]             [125,124,122,120,116,114,110,108,104,98,96,90,86,84,80,74,68,66,60,56,54,48,44,38,30,26,24,20,18,14,0]
   B       - convert to binary      []   [[1]]  [[1,1],[1,0],[0]]  [[1,0,0],[1,1],[1]  [[1,1,1,1,1,0,1],[1,1,1,1,1,0,0],[1,1,1,1,0,1,0],[1,1,1,1,0,0,0],[1,1,1,0,1,0,0],[1,1,1,0,0,1,0],[1,1,0,1,1,1,0],[1,1,0,1,1,0,0],[1,1,0,1,0,0,0],[1,1,0,0,0,1,0],[1,1,0,0,0,0,0],[1,0,1,1,0,1,0],[1,0,1,0,1,1,0],[1,0,1,0,1,0,0],[1,0,1,0,0,0,0],[1,0,0,1,0,1,0],[1,0,0,0,1,0,0],[1,0,0,0,0,1,0],[1,1,1,1,0,0],[1,1,1,0,0,0],[1,1,0,1,1,0],[1,1,0,0,0,0],[1,0,1,1,0,0],[1,0,0,1,1,0],[1,1,1,1,0],[1,1,0,1,0],[1,1,0,0,0],[1,0,1,0,0],[1,0,0,1,0],[1,1,1,0],0]
    S€     - sum €ach               []   [1]    [2,1,0]            [1,2,1]             [6,5,5,4,4,4,5,4,3,3,2,4,4,3,2,3,2,2,4,3,4,2,3,3,4,3,2,2,2,3,0]
      ’    - decrement              []   [0]    [1,0,-1]           [0,1,0]             [5,4,4,3,3,3,4,3,2,2,1,3,3,2,1,2,1,1,3,2,3,1,2,2,3,2,1,1,1,2,-1]
        Ḃ  - n mod 2                1    1      1                  0                   1
       ×   - multiply               []   [0]    [1,0,-1]           [0,0,0]             [5,4,4,3,3,3,4,3,2,2,1,3,3,2,1,2,1,1,3,2,3,1,2,2,3,2,1,1,1,2,-1]
         Ạ - all truthy?            1    0      0                  0                   1

Bunun nasıl yürüdüğünü anlamak için yaklaşık 10 dakika sürdü ... harika bir teknik, bir dizinin iki güç içermeyen olup olmadığını kontrol etmenin iyi bir yolunu
düşünemedim

7

05AB1E , 9 8 bayt

Emigna sayesinde -1 bayt

Ýo-pZ¹È~

Çıkışlar 0truthy girişler ve 1falsy girişler için.

Çevrimiçi deneyin!


olabilir Z.
Emigna

@Emigna Ah. Bunun 1 baytlık bir alternatifi olduğunu biliyordum!
Okx

6

Python 2,99 bayt

lambda n:n&1-any(n-2**k>1and all((n-2**k)%j for j in range(2,n-2**k))for k in range(len(bin(n))-2))

Çevrimiçi deneyin!

Sızdıran Rahibe sayesinde -4 bayt

Wondercricket sayesinde -2 bayt

Bir hatayı düzeltmek için +8 bayt

Bay Xcoder sayesinde -1 bayt

Einkorn Büyücü sayesinde -3 bayt

Bir hatayı düzeltmek için +12 bayt


Bence bu aynı zamanda Python 3 uyumlu bir cevap mı?
Ari Cooper-Davis

Bunun 1 ve 262 (2) M + 1 formundaki Polignac sayıları için, örneğin 262145 ve 2097153 (sonrakiler 4722366482869645213697, 38685626227668133590597633, 519229685853482762853049632922997, vb.) İçin yanlış bir negatif vardır. Örneğin, 262139, 262259, 2097131 ve 2097187’yi doğru tanımladığı için sorun olan sayıların büyüklüğü değildir.
Deadcode

1
@Deadcode "prime" değerinin 1 olmadığından emin olmak için açık onay; Şimdi çalışması gerekir
HyperNeutrino

6

Regex (ECMAScript), 97 bayt

Bu problem, atomik olmayan bir bakış açısına sahip olmama problemi etrafında çalışmak için ilginç bir durum ortaya koydu. Ve şimdiye kadar ki 2 testin ikisinin de versiyonlarını koymak için iyi bir nedene sahip olduğum tek zaman, ((x+)(?=\2$))*x$ve (?!(x(xx)+)\1*$)aynı regex'te ve ana testi eşleştirmeye karşı korumak için ihtiyacım olan tek zaman 1, (?!(xx+)\1+$)xxdaha büyük bir regex içinde kullanıldığında.

^(?!(xx)*$|(x+)((?!(xx+)\4+$).*(?=\2$)((x+)(?=\6$))*x$|(?!(x(xx)+)\7*$).*(?=\2$)(?!(xx+)\9+$)xx))

Çevrimiçi deneyin!

# For the purposes of these comments, the input number = N.
^
# Assert that N is not the sum of a prime number and a power of 2.
(?!
    (xx)*$                 # Assert that N is odd.
|
    # Since we must cycle through all values for a number X and a corresponding number
    # N-X, this cannot be in an atomic lookahead. The problem then becomes that it
    # consumes characters. Thus we must let X be the larger of the two and N-X be the
    # smaller, and do tests on X followed by tests on N-X. We can't just test X for
    # being prime and N-X for being a power of 2, nor vice versa, because either one
    # could be smaller or larger. Thus, we must test X for being either prime or a
    # power of 2, and if it matches as being one of those two, do the opposite test on
    # N-X.
    # Note that the prime test used below, of the form (?!(xx+)\2+$), has a false match
    # for 0 and 1 being prime. The 0 match is harmless for our purposes, because it
    # will only result in a match for N being a power of 2 itself, thus rejecting
    # powers of 2 as being de Polignac numbers, but since we already require that N is
    # odd, we're already rejecting powers of 2 implicitly. However, the 1 match would
    # break the robustness of this test. There can be de Polignac numbers of the form
    # 2^M+1, for example 262145 and 2097153. So we must discard the 1 match by changing
    # the prime test to "(?!(xx+)\2+$)xx". We only need to do this on the N-X test,
    # though, because as X is the larger number, it is already guaranteed not to be 1.
    (x+)           # \2 = N-X = Smaller number to test for being prime or a power of 2;
                   # tail = X = larger number to test for being prime or a power of 2.
    (
        (?!(xx+)\4+$)      # Test X for being prime.
        .*(?=\2$)          # tail = N-X
        ((x+)(?=\6$))*x$   # Test N-X for being a power of 2. Use the positive version
                           # since it's faster and doesn't have a false match of 0.
    |
        (?!(x(xx)+)\7*$)   # Test X for being a power of 2. Use the negative version
                           # because the testing of X has to be in a lookahead, and
                           # putting the positive version in a positive lookahead would
                           # be worse golf. It doesn't matter that this can have a false
                           # match of 0, because X is guaranteed never to be 0.
        .*(?=\2$)          # tail = N-X
        (?!(xx+)\9+$)xx    # Test N-X for being prime. We must prevent a false match of
                           # 1 for the reason described above.
    )
)

Regex (ECMAScript + moleküler görünüm), 53 52 bayt

^(?!(xx)*$|(?*xx+(((x+)(?=\4$))*x$))\2(?!(xx+)\5+$))

# For the purposes of these comments, the input number = N.
^
# Assert that N is not the sum of a prime number and a power of 2.
(?!
    (xx)*$                   # Assert that N is odd.
|
    (?*
        xx+                  # Force N - \2 to be > 1, because the prime test used
                             # below has a false match of 1, which would otherwise
                             # give us false negatives on de Polignac numbers of the
                             # form 2^M+1, such as 262145 and 2097153.
        (((x+)(?=\4$))*x$)   # Cycle through subtracting all possible powers of 2 from
                             # tail, so we can then test {N - {power of 2}} for being
                             # prime.
                             # \2 = the power of 2
    )
    \2                       # tail = N - \2
    (?!(xx+)\5+$)            # Test tail for being prime. If it matches, this will fail
                             # the outside negative lookahead, showing that N is not a
                             # de Polignac number.
)

Bu sürüm sadece çok daha temiz değil, aynı zamanda çok daha hızlıdır, çünkü N'nin iki sayının toplamının mümkün olduğu tüm yollarını kullanması yerine sadece 2'nin her gücünü N'den çekerek dönebilir ve asal olma farkını test edebilir. .

Moleküler bakış açısı kolayca değişken uzunluktaki bir görünüşe dönüştürülebilir:

Regex (.NET veya ECMAScript 2018), 55 54 bayt

^(?!(xx)*$|xx+(((x+)(?=\4$))*x$)(?<=(?<!^\5+(x+x))\2))

Çevrimiçi deneyin! (.NET)
Çevrimiçi deneyin! (ECMAScript 2018)

# For the purposes of these comments, the input number = N.
^
# Assert that N is not the sum of a prime number and a power of 2.
(?!
    (xx)*$                 # Assert that N is odd.
|
    xx+                    # Force N - \2 to be > 1, because the prime test used
                           # below has a false match of 1, which would otherwise
                           # give us false negatives on de Polignac numbers of the
                           # form 2^M+1, such as 262145 and 2097153.
    (((x+)(?=\4$))*x$)     # Cycle through subtracting all possible powers of 2 from
                           # tail, so we can then test {N - {power of 2}} for being
                           # prime.
                           # \2 = the power of 2
    (?<=
        (?<!^\5+(x+x))     # Test tail for being prime. If it matches, this will fail
                           # the outside negative lookahead, showing that N is not a
                           # de Polignac number.
        \2                 # tail = N - \2
    )
)

Regex'iniz ^(?!(x+)((?!(xx+)\3+$)x*(?!(x(xx)+)\4*$)|x(?!(x(xx)+)\6*$)x*(?!(xx+)\8+$)x)?\1$)çok fazla zorluk çekmeden optimize edilebilir . Sonra, dikkatli bir düşünceyle, daha ileriye doğru golf oynayabilir ^(?!(x+)((x?)(?!(x(x\3)+)\4+$)x*(?!(x(xx)+|\3\3+)\6+$)\3)?\1$). Daha kısa olabilir
H.PWiz

En kısa
yolum

oh, (x(xx)+|\3\3+)->(x\3?(xx)+)
H.PWiz

4

Mathematica, 41 bayt

OddQ@#&&!Or@@PrimeQ[#-2^Range[0,Log2@#]]&

1
Bunun için yerleşik bir şey yok mu? Vay, şaşırdım.
HyperNeutrino

1
Bu Mathematica asal olmak negatif asal gördüğü, yoksa değiştirerek bayt kurtarabilecek burada çok sinir bozucu PrimeQ[#-2^Range[0,Log2@#]]olan PrimeQ[#-2^Range[0,#]]ile ve daha sonra PrimeQ[#-2^Range@#/2].
Greg Martin



4

Brachylog , 15 13 bayt

/₂ℕ|>ṗ;?-₍ḃ+1

Çevrimiçi deneyin!

Polignac sayısı 1000'e kadar çıktı.

false.De Polignac sayıları ve diğerlerini döndürür true..

@ LeakyNun adlı kullanıcının silinmiş yanıtına dayanarak, birkaç hata düzeltildi (izinleri gönderildi).

(Sayı ikilik bir güç olup olmadığını kontrol etmek için @ Jonathan Allan'ın yöntemini kullanarak -2 bayt.)

Verilen numara, eğer bir de Polignac numarası değildir:

/₂ℕ              It's an even number
   |>ṗ           Or there exists a prime number less than the input
      ;?-₍       which when subtracted from the input
          ḃ      gives a result that has a binary form
           +     such that the sum of the bits 
            1    is 1

=h21 bayt daha kısa olurdu ancak 3ikisi için de işe yaramaz .
18'de

Not (mobil olmayan) kişisel: 14 bayt Çevrimiçi deneyin! . Jonathan Allan'ın Jelly cevabından ilham aldı.
sundar - Monica,


Notlarınız için hatırlatma sanırım?
Kroppeb

1
@Deadcode Bu yayınlandığında çalışıyordu ve bu arada bölünme ile ilgili bir şey değişmiş görünüyor - örneğin. Çevrimiçi deneyin! 64 yerine false döndürür. Değişikliğin bu dilden dolayı büyük olasılıkla değişmesi muhtemeldir , ancak bir süredir burada aktif olamadım, bilerek mi yoksa bir böcek mi olduğunu bilmiyorum.
sundar - Monica,

3

Jöle , 13 bayt

ÆRạl2=Ḟ$o/o‘Ḃ

Çevrimiçi deneyin!

ÆRạl2=Ḟ$o/     Main link; argument is z
ÆR             Generate all primes in the range [2..z]
  ạ            Absolute difference with z for each prime
   l2          Logarithm Base 2
     =Ḟ$       For each one, check if it's equal to its floored value (i.e. if it is an integer)
        o/     Reduce by Logical OR to check if any prime plus a power of two equals the z
          o‘Ḃ  Or it's not an odd number. If it's not an odd number, then automatically return 1 (false).

1Yanlış ve 0doğru çıktılar .


Ḷ2*ạfÆRṆsonra eşlik için kontrol edin
Leaky Nun

@LeakyNun Ḷ2*ạfÆRṆo‘Ḃdöner 1hem 127ve 22; Bu doğru değil. Tabi önerdiğin şey değilse.
HyperNeutrino

kullanmanız gerekir, kullanmayın veya kullanmayın. (veya son olumsuzlamamı kaldırabilir ve daha sonra 9/10
baytta

@LeakyNun Oradaki pasajın 0149 için veriyor .
ETHproductions

@ETHproductions doğru. Değişen için _@o düzeltmeleri.
Leaky Nun

2

Perl 6 , 55 bayt

{so$_%2&&$_∉((1,2,4...*>$_) [X+] grep &is-prime,^$_)}

Çevrimiçi deneyin!

  • (1, 2, 4 ... * > $_) Giriş argümanına kadar ikisinin güçlerinin bir sekansıdır (Perl, sağlanan serilerden geometrik seriye girer).
  • grep &is-prime, ^$_ Giriş argümanına kadar asal sayıların listesidir.
  • [X+] İki serinin çapraz ürününün tüm elemanlarının toplamını değerlendirir.

soİki bayt daha az olmadan yapabilirdim , ama sonra iki farklı sahte değer ( 0ve False) verir.


2

Aksiyom, 86 bayt

f(n:PI):Boolean==(~odd?(n)=>false;d:=1;repeat(n<=d or prime?(n-d)=>break;d:=d*2);n<=d)

test ve sonuçlar

(21) -> for i in 1..600 repeat if f(i) then output i
   1
   127
   149
   251
   331
   337
   373
   509
   599

2

Haskell, 104 102 bayt

p x=[x]==[i|i<-[2..x],x`mod`i<1]
h k|even k=1>2|2>1=notElem k$((+)<$>(2^)<$>[0..k])<*>filter(p)[1..k]

açıklama

  • p asal sayıları bulan bir fonksiyondur (çok verimsiz!)
  • Bir listeye (+)uygulanan 2 ^ kısmi fonksiyonuna uygulanan bir liste oluşturma [0..input]
  • Yukarıdakileri, astarları girmek için filtrelenmiş 1 listesine uygulamak
  • Elde edilen kartezyen ürün, girdilerin kartezyen üründe bulunmadığından emin olmak için aranır.
  • Çift bir girişin otomatik olarak yanlış yapıldığından emin olmak için korunur.

GÜNCELLEME: İki bayt golf oynamak için Einkorn Enchanter'e bağır!


1
p x=[x]==[i|i<-[2..x],x`mod`i<1]daha kısa bir primalite testidir.
Wheat Wizard

@EinkornEnchanter Harika! Bana iki bayt golf attın!
maple_shaft

1
Ayrıca yapabilirsiniz filter p[1..k]yerinefilter(p)[1..k]
Buğday Wizard

1

Ortak Lisp, 134 bayt

(lambda(x)(flet((p(x)(loop for i from 2 below x always(>(mod x i)0))))(or(evenp x)(do((j 1(* j 2))(m()(p(- x j))))((or(>= j x)m)m)))))

İade NILargüman bir Polignac sayı olduğunda, Taksi.

Çevrimiçi deneyin!

Ungolfed:

(lambda (n)
  (flet ((prime? (x)                 ; x is prime
           loop for i from 2 below x ; if for i in [2..n-1]
           always (> (mod x i) 0)))  ; is x is not divisible by i
    (or (evenp n)                    ; if n is even is not a Polignac number
        (do ((j 1( * j 2))           ; loop with j = 2^i, i = 0, 1,... 
             (m () (prime? (- n j)))); m = n - 2^i is prime?
            ((or (>= j n)            ; terminate if 2^i ≥ n
                 m)                  ; or if n - 2^i is prime
             m)))))                  ; not a polignac if n - 2^i is prime

1

APL (Dyalog Genişletilmiş) , 12 bayt

2∘|⍲0⍭⊢-2*…

Çevrimiçi deneyin!

Anonim önek taktik işlevi. Gerçeklik için 1, yanlışlık için 0 döndürür.

Büyük ölçüde ETHProductions'un Japt cevabına dayanıyor .

@ Adám'a orjinal cevabımı golf oynamaya yardımcı olduğu ve bu konuda Dyalog Uzatılmış'ı yaptığı için teşekkürler.

Nasıl:

2∘|⍲0⍭⊢-2*…    Tacit prefix function; input will be called 
                Inclusive Range [0..⍵]
         2*      2 to the power of each number in the range
       ⊢-        Subtract each from 
     0          Non-primality check on each resulting number
                Logical NAND
 2∘|             Mod 2
                Not any (bitwise OR reduction, then negated)




0

APL (NARS) 80 karakter, 160 bayt

∇r←f w;n
r←¯1⋄→0×⍳(w≤0)∨w≥9E9⋄r←0⋄→0×⍳0=2∣w⋄n←r←1
→0×⍳w≤n⋄→3×⍳0πw-n⋄n×←2⋄→2
r←0
∇

0π işlevi, argümanını döndüren işlev, asal olandır veya değildir. Benim için bu fonksiyon özyinelemeli değildi, bu yüzden biraz daha uzun ... Test:

  {1=f ⍵:⍵⋄⍬}¨1..1000
1  127  149  251  331  337  373  509  599  701  757  809  877  905  907  959  977  997 

<= 0 veya input> = 9E9 girişi için ¯1 döndürür (hata)

  f¨0 ¯1 ¯2 900000000001
¯1 ¯1 ¯1 ¯1 

0

C # (Visual C # Etkileşimli Derleyici) , 107 bayt

x=>{var r=Enumerable.Range(2,x);return x%2>0&r.All(p=>r.Any(d=>d<p&p%d<1)|r.All(n=>x!=p+Math.Pow(2,n-2)));}

Çevrimiçi deneyin!

En verimli kod değil, ama iş gibi görünüyor. Benim asıl çözüm formülü onları test etmeden önce asal için süzülür ve çok iyi performans gösterdi. Geçerli sürüm 11 bayt daha kısa.

// input x is an integer
x=>{
  // we need to generate several
  // ranges. since this is verbose,
  // generate 1 and keep a reference
  var r=Enumerable.Range(2,x);
  // this is the main condition
  return
     // input must be odd
     x%2>0&
     // generate all possible p's
     // over our range and ensure that
     // they satisfy the following
     r.All(p=>
       // either p is not prime
       r.Any(d=>d<p&p%d<1)
       |
       // or there is no n that satisfies
       // the formula: x=p+2^n
       r.All(n=>x!=p+Math.Pow(2,n-2))
     );
}
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.