Hassas asal
Esin kaynağı En büyük kırılgan asal ürünü bulun .
Pozitif bir tamsayıdan en az 1 rakam çıkararak, negatif olmayan farklı bir tamsayı elde edebiliriz. Bunun Removebağlantılı sorudaki işlevden farklı olduğuna dikkat edin . Bu şekilde üretilen tüm tam sayılar asal değilse asal sayının hassas olduğunu söylüyoruz. Örneğin, \$60649\$ aşağıdaki tam sayıları üretir:
0, 4, 6, 9, 49, 60, 64, 66, 69, 604, 606, 609, 649, 664, 669, 6049, 6064, 6069, 6649
Bu tam sayıların hiçbiri asal değildir, bu nedenle \$60649\$hassas bir asaldır. Baştaki sıfırların kaldırıldığını ve gereksinimin "asal değil" olduğunu unutmayın, bu nedenle \$0\$ve \$1\$her ikisi de nitelendirir, yani örneğin, \$11\$ hassas bir asaldır.
Standart sıra kuralına benzer şekilde, aşağıdaki görevlerden birini yapmalısınız:
- Pozitif bir tam sayı verildiğinde \$n\$, iki farklı, tutarlı * değer çıktılar \$n\$ hassas bir asal mı değil mi
- Pozitif bir tam sayı verildiğinde \$n\$, \$n\$narin asal
- Pozitif bir tam sayı verildiğinde \$n\$, ilk çıktı \$n\$ hassas asal
- Sonsuz olarak hassas asalların listesi çıktı
* : Bunun yerine, kümedeki değerlerin dilinizin doğru ve yanlış tanımına karşılık geldiği iki değer kümesi çıktı almayı seçebilirsiniz. Örneğin, bir Python cevabı, falsey / truthy için boş bir liste, aksi takdirde boş olmayan bir liste çıkarabilir.
Yapmak istediğiniz görevlerden hangisini seçebilirsiniz.
Herhangi bir standart yolla giriş ve çıkış yapabilirsiniz ve bu kod golf olduğu için bayt cinsinden en kısa kod kazanır
Referans için, ilk 20 hassas asal:
2, 3, 5, 7, 11, 19, 41, 61, 89, 409, 449, 499, 881, 991, 6469, 6949, 9001, 9049, 9649, 9949
Dikkat edilmesi gereken birkaç şey daha:
821 - False (Removing the 8 and the 1 gives 2 which is prime)
Karar-problem yöntemi yerine standart G / Ç sıralarından birini uygulayan bir cevap için +100 ödül vereceğim :
- naif bir karar problemi uygulamasından daha kısadır (daha önce gönderilmemişse lütfen böyle bir sürümü kanıt olarak ekleyin)
- veya bu, değerlerin üretilirken değerlerin hassas asal olup olmadığının kontrol edilmesine dayanmaz (örneğin, yalnızca belirli rakamların oluşabileceği gerçeğini veya basitçe "sayıların üzerine bir döngü atarak, hassas asalları bulma" olmayan başka bir şeyi kullanabilir )
Bu, neyin "hassas asal sayıları kontrol etme" olarak sayıldığı konusunda biraz özneldir, bu yüzden ödülü ödüllendirmeye gelince en iyi muhakememi kullanacağım.
Yanıtlar
05AB1E , 4 bayt
Kod
05AB1E kodlamasını kullanır . Verilen sayının hassas bir asal olup olmadığını kontrol eder .
æpJΘ
Çevrimiçi deneyin! veya 1 ile 9949 arasındaki tüm sayıları kontrol edin .
Açıklama
æ # Get the powerset of the number.
p # Check for each element whether it is a prime.
J # Join these numbers into one big number.
Θ # Check whether this joined number is equal to 1.
APL (Dyalog Genişletilmiş) , 16 14 bayt
</1⍭⍎⍕(⊢,,¨)\⍞
∊⍎¨¨ → ⍎⍕@Ngn sayesinde -2 bayt ( ).
Stdin'den tek bir sayı alan ve 1 (doğru) veya 0 (yanlış) yazan tam program.
Buradaki hile, tüm boş olmayan alt dizileri nasıl oluşturduğudur:
(⊢,,¨)/ strstrson karakteri içeren tüm alt dizileri verir .
(⊢,,¨)/ '1234'
→ '1' (⊢,,¨) '2' (⊢,,¨) '3' (⊢,,¨) '4'
→ '1' (⊢,,¨) '2' (⊢,,¨) '4' '34'
→ '1' (⊢,,¨) '4' '34' '24' '234'
→ '4' '34' '24' '234' '14' '134' '124' '1234'
(⊢,,¨)\ strdizge listelerinin bir listesi olarak boş olmayan tüm alt dizileri vererek,(⊢,,¨)/her öneki için geçerlidirstr.
(⊢,,¨)\ '1234'
→ '1' ('2' '12') ('3' '23' '13' '123') ('4' '34' '24' '234' '14' '134' '124' '1234')
Tüm kodun açıklaması:
</1⍭⍎⍕(⊢,,¨)\⍞
⍞ ⍝ Take n from stdin as a string
( )\ ⍝ For each prefix, reduce from right by
,¨ ⍝ prepend the previous char to each string
⊢, ⍝ and append to the previous list of strings
⍎⍕ ⍝ Convert nested strings to a single string,
⍝ and then eval it to get a simple integer vector
1⍭ ⍝ Test each number for primality
</ ⍝ Test if the only truth is the last one
Brachylog , 7 6 bayt
ṗ⊇ᵘṗˢȮ
ṗ⊇ᵘṗˢȮ the implicit input
ṗ is a prime
⊇ᵘ and from every unique subset
ṗˢ select the primes
Ȯ and this should be a list with one element (the prime input itself)
Jöle , 7 bayt
DŒPḌẒḄ’
Hassas bir asalsa sıfır (yanlış) veya değilse sıfır olmayan bir tam sayı (doğru) döndüren pozitif bir tamsayıyı kabul eden monadik bir Bağlantı.
Çevrimiçi deneyin! Veya ilk yirmiye bakın .
Nasıl?
DŒPḌẒḄ’ - Link: n e.g. 824 409
D - decimal digits [8,2,4] [4,0,9]
ŒP - power-set [[],[8]...,[8,2,4]] [[],[4],...,[4,0,9]]
Ḍ - undecimal [0,8,2,4,82,84,24,824] [0,4,0,9,40,49,9,409]
Ẓ - is prime? [0,0,1,0,0,0,0,0] [0,0,0,0,0,0,0,1]
Ḅ - from binary 32 1
’ - decrement 31 0
Japt , 7 bayt
¥à f_°j
Deneyin veya test edin[0,1000)
¥à f_°j :Implicit input of integer string
¥ :Is equal to
à :Combinations
f :Filter
_ :By passing each through a function
° :Postfix increment, to cast to an integer
j :Is prime?
J , 25 23 bayt
Jonah'a -2 teşekkürler!
Doğru olan 1 veya aksi halde 0 içeren bir liste döndürür.
1</@p:(#~2#:@i.@^#)&.":
Nasıl çalışır
1</@p:(#~2#:@i.@^#)&.":
&.": convert the number to a string
( 2 ^#) 2 ^ length
#:@i.@ enumerated and to base 2
#~ select from the string based on the bit mask
&.": convert from strings to numbers
1 p: primes -> 1, non-primes -> 0
so in the delicate prime case, we have
(2^L) - 1 zeros and one 1 for the input itself
</@ reduce from left to right with less-than
(so last position is 1, everything else 0)
Pyth , 14 8 bayt
qjfP_sTy
Açıklama
qjfP_sTy
f # filter
y # all subsets of input
P_sT # with a primality test
j # join result of filter on newlines
q # check if it equals input
Retina 0.8.2 , 53 bayt
^
;
+%`;(.)
$1;$'¶$`;
.+
$*
%A`^.?$|^(..+)\1+$
^1+¶+$
Çevrimiçi deneyin! Bağlantı, test senaryolarını içerir. Açıklama:
^
;
+%`;(.)
$1;$'¶$`;
Girişin tüm alt dizilerini oluşturun.
.+
$*
Sonra tekliye dönüştürün.
%A`^.?$|^(..+)\1+$
Asal olmayanları silin, ancak yeni satırları silmeyin. (Çok satırlı değiştirme de işe yarar, ancak açıklamasını biçimlendirmek daha zordur.)
^1+¶+$
Orijinal girdinin asal olduğunu ancak uygun alt dizilerin hiçbirinin olmadığını kontrol edin.
Scala , 173170 bayt
n=>(s"$n".indices.toSet.subsets.filter{x=>1<x.size&x.size<s"$n".size}.map(_.toSeq.sorted.map(""+n).mkString.toInt).toSet+n).filter{x=>x>1&2.to(x/2).forall(x%_>0)}==Set(n)
R , 163154 bayt
function(x,n=nchar(x),s=sum)(a=apply(!expand.grid(rep(list(0:1),n)),1,function(v)(y=s((x%/%10^(n:1-1)%%10)[v]*10^(s(v):1-1)))&s(!y%%1:y)==2))[1]&!s(a[-1])
X'ten tüm basamak kombinasyonlarını kaldırarak oluşan sayılar arasındaki asal sayıları kontrol eder. İlk kombinasyon çıkarılmasıdır hiçbir basamak: Bu DOĞRU olmalı, ve diğer tüm asal testler YANLIŞ olmalıdır.
Yorum yaptı:
is_delicate_prime=
function(x, # x = number to test
n=nchar(x), # n = number of digits of x
s=sum) # s = alias to sum() function
(a= # a = matrix of all prime-tests:
apply( # apply the function v to each of...
!expand.grid(rep(list(0:1),n)), # all combinations of n of TRUE/FALSE...
1, # row-by-row...
function(v) # defining the output of v as:
(y=s((x%/%10^(n:1-1)%%10) # the digits of x...
[v] # (considering only the elements chosen by v)...
*10^(s(v):1-1))) # multiplied by 10^((v-1)..0)...
&s(!y%%1:y)==2)) # tested for primality AND non-zero
[1] # Finally, output TRUE if a[1] is TRUE...
&!s(a[-1]) # and the sum of all other elements of a are FALSE
Wolfram Dili (Mathematica) , 54 bayt
Select[FromDigits/@Subsets@@RealDigits@#,PrimeQ]=={#}&
JavaScript (ES6), 98 95 bayt
nBir dizge olarak bekler . Bir Boolean değeri döndürür.
n=>[...n].reduce((a,x)=>[...a,...a.map(y=>(g=k=>y%--k?g(k):(p+=q=y>1&k<2,y))(y+=x))],[p=0])|q/p
Nasıl?
Rakamlarının güç kümesini n, sıra korunacak ve nkendisi en son hesaplanacak şekilde hesaplıyoruz . Sonuçta ortaya çıkan tam sayılar arasındaki tek asal sonuncuysa sonuç doğrudur.
Python 2 , 139 \$\cdots\$ 145 142 bayt
Pxeger tarafından nazikçe belirtilen bir hatayı düzeltmek için 36 bayt eklendi . Pxeger
sayesinde 5 bayt tasarruf sağladı !!!
lambda n,R=range:all((g<2or any(g%i<1for i in R(2,g)))-(`g`==n)for g in{int(''.join(n[j]for j in R(len(n))if i>>j&1))for i in R(1,2**len(n))})
Bir tamsayıyı dize olarak girer ve Truehassas bir asal veya farklıysa döndürür False.
Python 3.8 (ön sürüm) , 146144 bayt
Gereksiz parantezleri kaldırarak -2 bayt
Ayrıca Noodle9 onlarınkini göndermeden hemen önce çok benzer bir cevap üzerinde çalışıyordum ve bunu elde etmek için fikirlerini birleştirdim ( oy verin! ). Bu şimdi oldukça farklı çünkü başlangıçta kırılmış bir tane vardı, bu yüzden benimkini göndermeyi düşündüm.
lambda s,R=range:(l:=len(s))*all((g!=int(s))^(g>1)&all(g%k for k in R(2,g))for g in{int(''.join(s[j]for j in R(l)if i>>j&1))for i in R(1,2**l)})
Açıklama:
lambda s,R=range:(l:=len(s))*all((g!=int(s))^(g>1)&all(g%k for k in R(2,g))for g in{int(''.join(s[j]for j in R(l)if i>>j&1))for i in R(1,2**l)})
lambda s : function
,R=range alias `range` built-in to `R`
{ s[j]for j in R(l)if i>>j&1 for i in R(1,2**l)} compute the power-set (excluding the empty set)
int(''.join( )) convert each list of digits to an integer
all( for g in ) check the integers for primality
all(g%k for k in R(2,g)) check for factors in the number
(g>1)& makes sure 0 and 1 aren't treated as prime
(g!=int(s))^ ensure the number itself is prime
(l:=len(s))* store the length in `l`
SageMath , 139 bayt
def f(n):s=str(n);l=len(s);return p(n)*all(~-p(g)for g in{int(''.join(s[j]for j in R(l)if i>>j&1))for i in R(1,2**l-1)})
R=range;p=is_prime
Python cevabımın bağlantı noktası.
Python 3 , 181 bayt
Kullanımı itertools ve bir golfed tarifi powerset.
lambda s,R=range:all(p(int(''.join(t)),R)for t in sum(([*combinations(s,k)]for k in R(1,len(s))),[]))>p(int(s),R)
from itertools import*
p=lambda n,R:any(n%i<1for i in R(2,n))or 2>n
Girişin bir dizge olmasını bekler.
İşlev , girdisi asal değilse ve asal ise pdöndürür ; ana işlev , öğesinin tüm "alt değerlerini" aldığı yeri döndürür . Booleanların bu eşitsizliği gidermesinin tek yolu şudur ki , bu, hepsinin prim olmadığı ve asal olmadığı anlamına gelir .TrueFalse(forall t, p(t)) > p(s)tsTrue > Falsets
Sorumluluk reddi: Bunu yayınladığımda zaten iki python yanıtı vardı.