Chen üstadı mı?


27

İki koşulu yerine getiriyorsa, sayı Chen asaldır:

  • Kendisi asal
  • Kendisi artı iki asal veya yarı asaldır.

Asal, tam olarak iki bölenin olduğu ve bu bölenlerin kendisinden ve birinden oluştuğu bir sayıdır.

Yarı asal, iki asal maddenin ürünü olan bir sayıdır. (12 = 2 * 2 * 3'ün yarı asal olmadığını, 25 = 5 * 5 olduğunu unutmayın).

Göreviniz bir sayının Chen üssü olup olmadığını belirlemek. Evet için herhangi bir gerçek değeri ve hayır için herhangi bir sahte değeri vermelisiniz.

Giriş, birine eşit veya bundan büyük herhangi bir tam sayı olacaktır. Ayrıca bir dize, karakter dizisi veya bir dizi veya rakam olarak da alınabilir.

Örnekler:

101 -> truthy
223 -> falsy
233 -> truthy
1 -> falsy

Bu OEIS A109611 .

Bu, kısmen, Sophie Germain'in bir başbakanı mıyım? ki, ne yazık ki, kopya olarak kapatıldım, bu yüzden kopya olmayan bir şekilde ilgili bir meydan okuma gönderiyorum.


TrueTruthy ve 2veya Falsefalsy (tutarsız falsy değerleri) için geri dönebilir miyiz ?
Bay Xcoder

@ Mr.Xcoder Asla yapamayacağınızı söylemedi
Okx

Yarı-asal için, "tam olarak iki asal faktör" çokluğu sayıyor mu? Mı 2 * 2 * 2 * 3 * 3yarı asal? Ne hakkında 5 * 5?
Ağaç değil

@ Notatree 5*5yarı asal, 2*2*2*3*3değil. Ben tam olarak iki dedim .
Okx,

Öyleyse, çokluk sayıyor mu? (Bunu iddia olabilir 2*2*2*3*3yani tam iki asal çarpanlarını sahiptir 2ve 3ve 5*5yani bir asal çarpanı vardır 5.) Belki soruya içine düzenleme olabilir?
Bir ağaç değil

Yanıtlar:



11

05AB1E , 8 bayt

p¹ÌÒg3‹*

Çevrimiçi deneyin!

açıklama

p¹ÌÒg3‹*   Argument n
p          Push isPrime(n)
 ¹ÌÒ       Push list of prime factors of (n+2)
    g3‹    Length of list is lower than 3
       *   Multiplication of boolean values, 0 if either is 0 (false)

6

ArnoldC , 1339 bayt

LISTEN TO ME VERY CAREFULLY q
I NEED YOUR CLOTHES YOUR BOOTS AND YOUR MOTORCYCLE p
GIVE THESE PEOPLE AIR
HEY CHRISTMAS TREE c
YOU SET US UP 0
HEY CHRISTMAS TREE d
YOU SET US UP 0
HEY CHRISTMAS TREE l
YOU SET US UP p
STICK AROUND l
GET TO THE CHOPPER d
HERE IS MY INVITATION p
I LET HIM GO l
ENOUGH TALK
BECAUSE I'M GOING TO SAY PLEASE d
BULLSHIT
GET TO THE CHOPPER c
HERE IS MY INVITATION c
GET UP 1
ENOUGH TALK
YOU HAVE NO RESPECT FOR LOGIC
GET TO THE CHOPPER l
HERE IS MY INVITATION l
GET DOWN 1
ENOUGH TALK
CHILL
I'LL BE BACK c
HASTA LA VISTA, BABY
IT'S SHOWTIME
HEY CHRISTMAS TREE p
YOU SET US UP 0
GET YOUR ASS TO MARS p
DO IT NOW
I WANT TO ASK YOU A BUNCH OF QUESTIONS AND I WANT TO HAVE THEM ANSWERED IMMEDIATELY
HEY CHRISTMAS TREE n
YOU SET US UP 0
GET YOUR ASS TO MARS n
DO IT NOW q p
HEY CHRISTMAS TREE g
YOU SET US UP 42
GET TO THE CHOPPER g
HERE IS MY INVITATION n
YOU ARE NOT YOU YOU ARE ME 2
ENOUGH TALK
BECAUSE I'M GOING TO SAY PLEASE g
GET TO THE CHOPPER p
HERE IS MY INVITATION p
GET UP 2
ENOUGH TALK
GET YOUR ASS TO MARS n
DO IT NOW q p
GET TO THE CHOPPER g
HERE IS MY INVITATION 5
LET OFF SOME STEAM BENNET n
ENOUGH TALK
BECAUSE I'M GOING TO SAY PLEASE g
TALK TO THE HAND "t"
BULLSHIT
TALK TO THE HAND "f"
YOU HAVE NO RESPECT FOR LOGIC
BULLSHIT
TALK TO THE HAND "f"
YOU HAVE NO RESPECT FOR LOGIC
YOU HAVE BEEN TERMINATED

Çevrimiçi deneyin!

(Bu benim codegolf'teki ilk yazım. SE, lütfen yanlış biçimlendirilmişse bana bildirin. Bu bayt sayımının rekabetçi olmadığını, sadece eğlence amaçlı olduğunu biliyorum.)



5

Pyth, 10 bayt

&P_Q>3lP+2

Çevrimiçi deneyin!

Nasıl?

&P_Q>3lP+2  # input: Q
        +2  # Q + 2
       P    # prime factors
    >3l     # length lower than 3?
 P_Q        # Q is prime?
&           # and both results

>. <Outgolfed>. <
Bay

@ Mr.Xcoder aslında, 5 dakika önce mayın gönderdim
Uriel

Evet, internet bağlantısı zayıf olduğu için görmedim
Bay Xcoder

3

Python ile sympy ,  69  56 bayt

-Alephalfa sayesinde 13 bayt (1.1 no'lu sembole yükseltme yaparak ve primeomega(n+2)yerine kullanarak sum(factorint(n+2).values()))

... Gryphon'un silinen gönderiminden devralmak.

from sympy import*
lambda n:primeomega(n+2)<3*isprime(n)

TrueChen için döndüren adsız bir işlev , Falseaksi halde.

n+2Asal faktörün çarpımlarını toplayarak faktörleri sayar .

Karşılaştırma yapılmadan önce bununla 3çarpıldığına dikkat isprime(n)edin <, bu nedenle asal olmayanlar niçin kod testleri faktörlerden n+2daha azsa 0(her zaman sonuç veren False) varsa, asal için asal nn+2yoksa yarı asal mı olduğunu kontrol eder .


@Gryphon - Ben devraldım, ancak herhangi bir ithalat olmadan yenilebilir.
Jonathan Allan,

Aşırı oldum! İşin 3*isprime(n)püf noktası, şartlı ifadeyi temizlemek için aradığım şeydi.
Chase Vogeli

Ah, @icosahedron, sizinkini fark etmemiştim, üzgünüm - bu çok benzer. Bu cevabı bu şekilde ele almaktan çekinmeyin, sadece bana bildiriniz, ben de bunu sileceğim
Jonathan Allan,

Bence senaryonun primeomega işlevi var.
alephalpha

@alephalpha Teşekkürler, sadece onu görmek için 1.1'e yükselttik, bu da baytları koruyacak!
Jonathan Allan,


3

Java 8, 85 84 83 bayt

n->{int a=n+2,b=0,c=0,i=1;for(;i++<n;b+=n%i<1?1:0)c+=a%i<1?1:0;return n>1&b<2&c<3;}

Özyinelemeli yerine yinelemeli bir yaklaşım kullanarak @ OlivierGrégoire sayesinde -1 bayt .

Açıklama:

Burada dene.

n->{            // Method with integer parameter and boolean return-type
  int a=n+2,    //  Start `a` at the input + 2
      b=0,c=0,  //  Start `b` and `c` at 0
      i=1;      //  Start `i` at 1
  for(;i++<n;   //  Loop from 1 to `n` (and raise `i` immediately by 1)
    b+=n%i<1?   //   If the input is divisible by `i`
        1       //    Raise `b` by 1
       :        //   Else:
        0)      //    Leave `b` as is
    c+=a%i<1?   //   If the input + 2 is divisible by `i`:
        1       //    Raise `c` by 1
       :        //   Else:
        0;      //    Leave `c` as is
                //  End of loop (implicit / single-line body)
  return n>1    //  Return if the input is larger than 1
         &b<2   //   And `b` is now smaller than 2
         &c<3;  //   And `c` is now smaller than 3
}               // End of method

İteratif sürümü sadece bir bayt kısadır: n->{int N=n+2,f=0,F=0,d=1;for(;d++<n;f+=n%d<1?1:0)F+=N%d<1?1:0;return n>1&f<2&F<3;}.
Olivier Grégoire


2

JavaScript (ES6), 63 61 bayt

g=(e,i=e)=>i--<3?1:e%i?g(e,i):g(i)+1
f=e=>e>1&g(e)<2&g(e+2)<3
Test cases:<br><textarea id=i rows=6 oninput="go()">101&#10;223&#10;233&#10;1</textarea><br><pre id=q></pre><script>window.onload=function go(){document.getElementById('q').innerHTML=document.getElementById('i').value.split('\n').map(e=>e+' -> '+f(+e)).join('\n')}</script>

Bir işlevi tanımlar falır nargüman olarak ve sonucu döndürür. Nasıl sonuçlandığına çok sevindim g; bir sayıdaki asal faktörlerin sayısını sayar.

Kevin Cruijssen'in &numarası sayesinde 2 byte tasarruf sağlar .

Ungolfed

Ω = (n,          // Ω(n) = number of n's prime factors, n > 1.
    i = n) =>    // Start iterating from i = n - 1. Since we'll immediately
                 // decrement i, n is used here.
    --i          // Immediately decrement i.

    < 2          // If i = 0 or i = 1, n is a prime at this point.
    ? 1 :        // Therefore Ω(n) = 1.

    n % i != 0 ? // If n is not divisible by i,
    Ω(n, i)      // try again with i := i - 1 (immediately decremented, so use i).

    : Ω(i) + 1   // n is divisible by i. Since we're counting down from n - 1
                 // and i is the first such number, i is n's largest non-trivial
                 // divisor, and thus n/i is a prime.
                 // Therefore Ω(n) = Ω(i) + Ω(n/i) = Ω(i) + 1.

is_chen = n =>     // An integer n ≥ 1 is a Chen prime if and only if:
    n > 1          // n > 1,
    & Ω(n) < 2     // Ω(n) = 1 < 2, i.e. n is a prime, and
    & Ω(n + 2) < 3 // Ω(n + 2) < 3, i.e. n + 2 is a prime or a semiprime.

İkisini de &&değiştiremez &misin? 0 / 1'den beri JS'de de truthy / falsey değerleri var mı?
Kevin Cruijssen

@KevinCruijssen Bu iş gibi görünüyor. Çok kötü |ve &kısa devre yapma, bu daha fazla bayttan tasarruf etmenizi sağlayabilir g.
PurkkaKoodari

2

Japt , 22 20 19 13 12 bayt

U°j ©2¨°Uk l
  • Obarakon'un farklı bir yöntem önerisi sayesinde 6 bayt kurtarıldı.

Dene


2

PHP, 64 bayt

for($i=$n=$argn+2;--$i;$argn%$i?:$q++)$n%$i?:++$p;echo$p<4^--$q;

0truthy için baskı , sahte için diğer tamsayılar. Pipe ile çalıştırın -nRveya çevrimiçi deneyin .

Yıkmak

for($i=$n=$argn+2;--$i; # loop $i from N+1 to 1
    $argn%$i?:$q++)         # if $i divides N, increment $q
    $n%$i?:++$p;            # if $i divides N+2, increment $p
echo$p<4                # $p is 1 for a prime, 3 for a semiprime
    ^--$q;              # $q is 2 for prime; so this is 1^1 (==0) for a Chen Prime

tutarlı sahte değer, 65 bayt:

for($i=$n=2+$k=$argn;--$i;$k%$i?:$q++)$n%$i?:++$p;echo$p<4&$q==2;

baskılar 1truthy için ve 0falsy için.


1

SymPy ile Python 3 , 73 71 bayt

lambda n:(sum(factorint(n+2).values())<3)&isprime(n)
from sympy import*

Çevrimiçi deneyin!


Bu, daha önce burada yayınlanan bir cevabın daha golflü bir versiyonudur, ancak silinmiş gibi görünüyor.


2 byte tasarruf için @JonathanAllan teşekkürler!


1
... ayrıca ihtiyacınız olmadığını unutmayın, f=isimsiz bir fonksiyon oluşturmak kod-golf için uygun.
Jonathan Allan,


1

APL NARS, 23 karakter

{1≥⍵:0⋄(1=⍴π⍵)∧3>⍴π⍵+2}

Burada π⍵, from'dan farklı factors faktörleri dizisini döndürür; bazı testler:

  f←{1≥⍵:0⋄(1=⍴π⍵)∧3>⍴π⍵+2}
  f 101
1 
  f 223
0 
  f 233
1 
  f 1
0
  f ¯10
0

1

Regex (ECMAScript), 31 bayt

^(?!((xx+)(\2(xx))*)(\1\4)+$)xx

Çevrimiçi deneyin! (tüm Chen primleri ≤ 1000 gösteriliyor)

Bir n dizgesine bakıldığında, xbu regex, eğer n , bir Chen üssü ise ve eğer n eşleşirse eşleşir .

N'nin 2'den büyük olduğunu ve dizenin formda olmadığını iddia eder. ((xx+)(\2(xx))*)(\1\4)+
Bu regex'in kaç kez (\2(xx))tekrarlandığına bağlı olarak iki anlamı vardır .
0 kez tekrarlandığında, regex basitleştirilebilir (xx+)\1+, bu sayede bileşik sayılarla eşleşir.
Olumlu sayıda kez tekrarlandığında, regex eşittir((xx+)(\2xx)+)(\1xx)+

Bu regex biraz açıklama gerektiriyor, ancak çok az bilgi sağlayacağım.
Cebirden geçerseniz ((xx+)(\2xx)+)(\1xx)+, bunun a*b*c-2nerede olduğu formun numaralarıyla eşleşir a≥4,b≥2,c≥2.
Bu yüzden n + 2, 2'den fazla ana faktöre sahip olduğunda (neredeyse) eşleşecektir . (yani ne asal ne de yarı asal)
6, 16 veya 25 ile eşleşmediğini, ancak bunun önemli olmadığını, çünkü hepsinin kompozit olduğunu unutmayın.

Böylece n , bileşik olmadıkça(?!((xx+)(\2(xx))*)(\1\4)+$) eşleşecektir ve n + 2, asal veya yarı asaldır. Maalesef bu 1 (ve 0) içerir, öyleyse n'nin en az 2 olduğunu kontrol ederiz.
xx

Birkaç farklı "31-byter":

^xx(?!((x*)(\2xx)+)\1?(\1xx)*$)
^(?!(xx((x*)(\3xx)+))\2?\1*$)xx

1

Ruby , 49 41 bayt

->n{/^(.?|((..+)\3+))(\2+|..)$/!~?l*n+=2}

Çevrimiçi deneyin!

-8 bayt için teşekkürler H.PWiz

Nasıl?

İlk olarak, 'l'tekrarlanan n + 2 kez bir dizi olsun . Ardından şunları kontrol etmek için bir regex uygulayın:

  • Uzunluk 2 veya 3 (.?)(..)
  • Uzunluk, birleşik sayı artı 2'dir ((..+)\1)(..)
  • Uzunluk en az 3 sayılı bir üründür ((..+)\2)\1+

2 regex bölümü anlamsız ve görmezden gelmek güvenli olan dördüncü bir durum oluşturur: (.?)\2+boş dizgeye veya tek karaktere \2boşalır çünkü boş.


Eğer iki yarısını birleştirebilirsiniz |birbirine yaklaştırır: ^((..+)\2+)(\1+|..)$. Ayrıca, regex ile bu sorunu bana benzer bir zamanda denedi düzgün bir tesadüf :)
H.PWiz

Kullanabileceğin inanıyoruz .yerine .?girdi daima en az 1 olduğundan
H.PWiz

0

Julia, 59 bayt

x->((0∉x%(2:x-1))&(length(find(x->x==0,(x+2)%(2:x)))<=2))


0

Haskell , 163 bayt

p k=last$(not$elem 0(map(mod k)[2..k-1])):[1>2|k<=1]
r=round
s n=p(r n)||any(\(a,b)->p(r a)&&p(r b))[(n/x,x)|x<-[2..n],n/x==(fromIntegral.r)n/x]
c n=p(r n)&&s(n+2)

Ç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.