Eksik astarları yazdırın


18

Görev

Sayısal bir girdi iletildiğinde x, x1 olmayan karekökün altındaki primerleri yazdırmayan veya döndüren bir program veya işlev yazın x.

Örnekler

Izin vermek f(x)fonksiyonu olmak:

>>> f(4)
[]

>>> f(5)
[2]

>>> f(20)
[3]

>>> f(60)
[7]

>>> f(100)
[3, 7]

>>> f(10000)
[3, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]

Bonus Kuralları

  • Dilinizin sağladığı tüm yapıları kullanabilirsiniz.
  • Programınız x, diliniz tarafından tanımlanan üst sınır kadar yüksek bir girdiyi desteklemelidir .

1 Karekökün sadece karekök altındaki asallar olarak kullanılması aslında faktörleri arasında yer alabilir x. Bu kısıtlama yapılmazsa, daha büyük sayılar çok fazla basılı sayıya sahip olur.


3
"Sadece karekökün altındaki primerler aslında faktörler arasında yer alabilir x" doğru değildir: bir sayının karekökünden daha büyük bir asal faktörü olabilir. Gerçekten de, ilk iki örneğiniz (5 ve 20), tüm asallarda olduğu gibi, iki kez de tüm garip asallarda olduğu gibi bu özelliğe sahiptir ....
Greg Martin

1
@GregMartin Evet, yapabilirler - ancak faktörlerin ilk yarısında bulunamazlar. 7 ^ 2 48'den büyük olduğu için 48'in eksik primerlerine 7'nin dahil edilmemesi mantıklıdır. (Akıl yürütmem orada yatıyor)
Addison Crump

Yanıtlar:


8

Jelly, Jelly'in kod sayfasında 6 bayt

½ÆRḟÆf

Çevrimiçi deneyin!

Açıklama:

½ÆRḟÆf
 ÆR    All primes less than or equal to
½      the square root of the input
   ḟ   but with the following removed:
    Æf All prime factors of {the input, by default}

5
Jöle cevapları genellikle meydan okumayı tam anlamıyla tarif eder: P
ETHproductions

6

MATL , 10 9 bayt

X^ZqGYfX-

Çevrimiçi deneyin!

açıklama

X^    % Implicit input. Square root
Zq    % Array if primes up to that
G     % Push input again
Yf    % Array of prime factors
X-    % Set difference. Implicit display


5

MATLAB, 57 54 bayt

function h(p);a=primes(p^.5);a(~ismember(a,factor(p)))

Oldukça basit, sqrt (p) 'ye kadar bir dizi prim alır, daha sonra p faktörleri olanları kaldırır. Noktalı virgül kapalı olduğu için varsayılan olarak son satırın çıktısını yazdırır.


1
MATLAB'ı hiç denemedim, ancak okuduğum şeye göre, sqrt (p) p ^ 0.5 veya belki p ^ .5 olarak yazılabilir, ancak ikinci öneri hakkında emin değilim
t-clausen.dk

Güzel! :) Aynı yaklaşımı kullanarak bir Octave sunumu yayınladım .
Stewie Griffin

4

Pyth, 10 bayt

fP_T-S@Q2P

Bir sayı girdisi alan ve bir liste basan program.

Test odası

Nasıl çalışır

fP_T-S@Q2P   Program. Input: Q
fP_T-S@Q2PQ  Implicit input fill
f            Filter
     S@Q2    the 1-indexed range up to floor(sqrt(Q))
    -    PQ  with the prime factors of Q removed
 P_T         by primality
             Implicitly print


3

PHP, 76 bayt

for($n=1;++$n*$n<$x=$argv[1];){for($i=$n;$n%--$i;);if($i<2&&$x%$n)echo$n,_;}

$ n> 1 için golf benim is_prime çözüm kullanır

Komut satırı bağımsız değişkeninden girdi alır. İle çalıştırın -r.


2

Mathematica, 46 bayt

Select[Prime@Range@PrimePi@Sqrt[a=#],!#∣a&]&

Anonim işlev. Sayıyı girdi olarak alır ve sayı listesini çıktı olarak döndürür. Unicode karakteri U + 2223 için bölünür \[Divides].


2

Ruby, 55 bayt

require'prime'
->x{Prime.to_a(x**0.5).select{|n|x%n>0}}

Yerleşik ana numaralandırıcıyı kullanarak oldukça tembel bir cevap.


2

Harika , 14 bayt

@(_> > ^#0.5)P

Kullanımı:

(@(_> > ^#0.5)P)10

Öğe, bağımsız değişkenin karekökünden küçükken öğeleri sonsuz bir asal listesinden alır.


2

Pyke, 10 bayt

,BS#_P)QP-

Burada deneyin!

,B         -    int(sqrt(input))
  S        -   range(1, ^+1)
   #_P)    -  filter(^, is_prime)
         - - ^.remove(V)
       QP  -  factors(input)

2

PowerShell v2 +, 71 bayt

param($n)1..[math]::Sqrt($n)|?{$n%$_-and'1'*$_-match'^(?!(..+)\1+$)..'}

Yinelemeli çözüm. Girişini Alır $nve bir aralık oluşturur 1için Sqrt($n)(aralık operatörü örtük bir üst ucunu döküm olacağını not [int]varsayılan olarak Banker Yuvarlama yapacak olan). Daha sonra kullanımları |?{...}( Where-Objectbir filtre görevi görür operatörü) bu sayıları çekmek için $n%$_sıfır olmayan (yani modülo vasıtasına herhangi bir arta kalan, bir faktör değildir, ve herhangi bir sıfır olmayan truthy olan) her zamanki gibi normal ifade asal test-and olan$true . Bunlar boru hattında bırakılır ve çıktı örtüktür.

Örnekler

(çıktıyı güzelleştirmek için bazı ekstra biçimlendirme ile)

PS C:\Tools\Scripts\golfing> 5,20,60,100,10000|%{"f($_)";(.\print-the-missing-primes.ps1 $_)-join', ';""}
f(5)
2

f(20)
3

f(60)
7

f(100)
3, 7

f(10000)
3, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97

NB - Girdi etrafında daha büyük ise bu önceki sürümlerinde başarısız olur 2500000000, çünkü ..aralık operatörü yalnızca 50,000 adete kadar destekleyebilir. Ancak, bu varsayılan [int]veri tipinin maksimum değerinden daha büyük olduğundan, 2147483647bunun iyi olduğunu düşünüyorum. Makinemde, PSv4 Win8.1, daha yükseğe çıkabilirim, ancak farkı açıklayan belgeler bulamıyorum.


2

JavaScript (ES6), 79 76 bayt

f=(q,n=2,x=n)=>n*n<q?[...--x<2&&q%n?[n]:[],...x>1&&n%x?f(q,n,x):f(q,n+1)]:[]

Özyinelemeli öncelik test işlevime dayanarak . Bunu basitleştirmenin birkaç yolu olması gerektiğini hissediyorum, ama nasıl olduğunu anlayamıyorum ...

Test snippet'i

f=(q,n=2,x=n)=>n*n<q?[...--x<2&&q%n?[n]:[],...x>1&&n%x?f(q,n,x):f(q,n+1)]:[]
<input type="number" step=1 min=4 value=4 oninput="O.innerHTML='['+f(this.value)+']'"><br>
<pre id=O>[]</pre>


2

Oktav, 44 bayt

Bu cevap MattWH'nin MATLAB cevabından esinlenilmiştir , ancak bazı Octave'a özgü özellikleri kullanarak golf oynadım.

@(x)(y=primes(x^.5))(~ismember(y,factor(x)))

Bu, girişi alan anonim bir işlevdir x. Oktav, yilk olarak fonksiyonda oluşturulmasına izin veren (MATLAB'de mümkün değildir), daha sonra tarafından oluşturulan mantıksal maskenin bir parçası olarak kullanılan ismember(yine MATLAB'da bunu yapmak mümkün değildir ) satır içi değişken atama ve indekslemeye sahiptir .


Çok güzel, Octave içine bakmak zorunda kalacak. Bu özellikler golf için yararlı olacaktır!
MattWH


1

TSQL, 130 bayt

DECLARE @v int=10000

,@ INT=2SELECT 2p INTO #
g:INSERT # SELECT @ FROM # HAVING isnull(min(@%p),1)>0SET @+=1IF @*@<@v GOTO g
SELECT*FROM # WHERE @v%p>0

Bu yalnızca bir kez yürütülür, aynı düzenleyicide tekrar yürütmek için geçici tabloyu bırakmanız gerekir

DROP TABLE #

Test etmek için bir sürüm yaptım, çünkü tablo oluşturmak için çevrimiçi izinler kullanılamadığı için biraz daha uzun. Aynı nedenden dolayı açılan masaya ihtiyaç duymaz.

Çevrimiçi deneyin


1

R, 58 63 bayt

for(i in 2:sqrt(x<-scan()))if(x%%i&numbers::isPrime(i))print(i)

2 ile 5 arasındaki tüm değerlerin üzerinden geçer sqrt(x)ve numberspaketle ilgili olup olmadıklarını kontrol eder . hangisinin bölücü olduğunu x%%ihesaplarx mod i0 -> Falseix ve >0 -> Trueeğeri değildir.

+5 bayt, çünkü numbers::Primes(n)işlev ondalık sayılara izin vermez, çalışırken 2:sqrt(x), ififadeye ana kontrol ekler.


1

Haskell, 55 54 bayt

f x=[y|y<-[2..x],y*y<x,[z|z<-[1..y],gcd(z*x)y>1]==[y]]

Çoğunlukla doğrudan iç içe liste kavrayışları. GCD iki rol oynar, y'nin altındaki sayıların y faktörü olup olmadığını test eder ve ayrıca y'nin x faktörü olup olmadığını test eder.

Biraz aralıklı:

f x = [ y|y<-[2..x],     y*y<x,     [z|z<-[1..y], gcd (z*x) y > 1] == [y] ]

İle bir bayt kaydedin gcd(z*x)y>1.
Zgarb

Ayrıca biraz daha hızlı yapmak için önce y * y <x işaretini koydum.
James Hollis

0

Retina , 69 66 bayt

.+
$*
(11\1|^1)+
$#1$*1:$&
M!&`(?!(11+)\1+:)(1+):(?!\2+$)
M%`1
^0

Asalları en büyükten en küçüğe ayrı satırlara yazdırır.

Çevrimiçi deneyin!(Son iki test vakası nedeniyle yaklaşık 10 saniye sürer. Üstbilgi ve altbilgi satır besleme ayrı bir test paketini etkinleştirir ve çıktıyı okunabilirlik için virgülle ayırmaya dönüştürür.)

açıklama

.+
$*

Girişi tekli olarak dönüştürün.

(11\1|^1)+
$#1$*1:$&

Bu, girdinin karekökünü ayırarak ayırır :. Kare kök, karesinin naynı zamanda ilk ntek tamsayıların toplamı olduğu gerçeğine dayanarak hesaplanır . Ardışık tek tam sayıları ileri başvuru ile eşleştirebiliriz (11\1|^1). Bu süreçte grup tam kullanılacaktır nkezn karesi girdiye oturan en büyük sayıdır.

Bu sayının sıradan bir temsilini $#1$*1, ardından bir iki nokta üst üste ve maçın kendisini ekliyoruz.

M!&`(?!(11+)\1+:)(1+):(?!\2+$)

Bu, karekök içine uyan tüm eksik asallarla eşleşir. Asal algılama standart ana kontrol regex'i temel alır ve daha sonra az önce yakaladığımız asalın girdiyi ikinci ileriye doğru bölmediğinden emin oluruz. &Seçeneği kullanarak, tüm asalları elde ettiğimizden emin olmak için çakışan maçlar alırız.

M%`1

Bu, 1s sayısını eşleştirerek her satırı (yani her eksik asayı) ondalık sayıya dönüştürür . Tek sorun, hiç eksik asal bulunamadıysa, bu değerin sıfır eklemesidir.

^0

Yani bu aşama eklenirse sıfırı kaldırır.

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.