Kata Utama Ganda
Pertimbangkan kata / string dengan panjang \$n\$, hanya menyertakan huruf AZ, az. Kata / string adalah kata prima ganda jika dan hanya jika n adalah bilangan prima dan jumlah huruf, s, juga prima, menggunakan posisi numeriknya dalam alfabet ( a=1, B=2, c=3, dll.).
Masukan dapat berupa kombinasi karakter alfabet huruf besar atau kecil, karena tidak ada perbedaan numerik antara aatau A.
Keluaran adalah format logis yang sesuai dengan bahasa Anda. yaitu Benar atau Salah, T atau F, 1 atau 0, dll. Menentukan format keluaran Anda sangat dihargai, tetapi tidak wajib. (Output tidak perlu menyertakan n, s, tetapi saya menyertakannya di bawah ini sebagai demonstrasi dan contoh)
Kondisi menang adalah kode terpendek dalam byte yang dapat mendeteksi jika sebuah string adalah bilangan prima ganda, yang cocok untuk kedua kondisi n dan s menjadi bilangan prima. (Saya sekarang telah memasukkan kasus dari semua 4 kemungkinan situasi n, s.)
Contoh
Input -> Output (n, s)
Prime -> True (5, 61)
han -> True (3, 23)
ASK -> True (3, 31)
pOpCoRn -> True (7, 97)
DiningTable -> True (11, 97)
METER -> True (5, 61)
Hello -> False (5, 52)
SMILE -> False (5, 58)
frown -> False (5, 76)
HelpMe -> False (6, 59)
John -> False (4, 47)
TwEnTy -> False (6, 107)
HelloWorld -> False (10, 124)
Donald -> False (6, 50)
telePHONES -> False (10, 119)
A -> False (1, 1)
C -> False (1, 3) {1 is not prime}
d -> False (1, 4)
Jawaban
Jelly , 12 byte
ŒuO_64µL,SẒP
Cobalah secara online!
Bagaimana itu bekerja
ŒuO_64µL,SẒP - Main link, takes string s as argument e.g. s = "Prime"
Œu - Convert to upper case "PRIME"
O - Convert to ordinals [80, 82, 73, 77, 69]
_64 - Subtract 65 (call this L) [16, 18, 9, 13, 5]
µ - Start a new link with L as the left argument
L - Take the length 5
S - Take the sum 61
, - Pair the two values [5, 61]
Ẓ - Take primality of each [1, 1]
P - Take product 1
R , 68 71 byte
+3 byte untuk memperbaiki bug yang ditunjukkan oleh Dominic van Essen
`?`=sum;s=?b<-utf8ToInt(scan(,""))%%32;l=?b^0;l-1&5>?c(!s%%1:s,!l%%1:l)
Cobalah secara online!
Perhatikan bahwa untuk mengubah huruf besar dan kecil menjadi bilangan bulat 1 ... 26, kita dapat menggunakan titik kode ASCII modulo 32. sum(!x%%1:x)adalah cara yang tepat untuk menghitung jumlah pembagi x, yang akan sama dengan 2 jika xbilangan prima.
Ungolfed:
`?` = sum # shorthand for sum
b = utf8ToInt(scan(, "")) %% 32 # take input and convert to ASCII, then take mod 32
s = sum(b)
l = sum(b^0) # l = length(b)
5 > sum(c(!s%%1:s,!l%%1:l)) # sum the number of divisors of s and l, and check whether you get <5.
& l!=1 # and that l is not 1
Ruby , 27 59 byte
->a{[a.size,a.upcase.bytes.map{|i|i-64}.sum].all? &:prime?}
+33 byte setelah memperbaiki solusinya, terima kasih kepada DrQuarius.
Cobalah secara online! atau Verifikasi semua kasus uji
perl -Mfeature = say -MList :: Util = jumlah -pl, 95 byte
s/[^a-z]//gi;$m=sum map-64+ord,split//,uc;$_=(1 x y===c)!~/^(11+)\1+$|^1$/&&(1x$m)!~/^(11+)\1$/
Cobalah secara online!
Bagaimana cara kerjanya?
s/[^a-z]//gi; # Clean the input, remove anything which isn't an ASCII letter.
uc; # Upper case the string
split//, # Split it into individual characters
-64+ord # Calculate its value:
# subtract 64 from its ASCII value
map # Do this for each character, return a list
$m=sum # Sum the values, and store it in $m
y===c # Returns the length of the input string
(1 x y===c) # Length of the input string in unary
/^(11+)\1+$|^1$/ # Match a string consisting of a composite
# number of 1's, or a single 1
!~ # Negates the match, so
(1 x y===c)1~/^(11+)\1+$|^1$/ # this is true of the input string (after
# cleaning) has prime length
(1x$m)!~/^(11+)\1+$/ # Similar for the sum of the values --
# note that the value is at least 2, so
# no check for 1.
Menggabungkan ini, dan program akan mencetak 1 pada baris yang cocok dengan kondisi, dan baris kosong untuk baris yang tidak cocok.
05AB1E , 10 byte
gAIlk>O‚pP
Masukkan sebagai daftar karakter.
Cobalah secara online atau verifikasi semua kasus pengujian .
Penjelasan:
g # Get the length of the (implicit) input-list
A # Push the lowercase alphabet
I # Push the input-list of characters
l # Convert the input to lowercase
k # Get the (0-based) index of each character in the alphabet-string
> # Increase each by 1 to make them 1-based indices
O # Take the sum of that
‚ # Pair the length together with this sum
p # Check for both whether they're a prime (1 if it's a prime; 0 if not)
P # And check if both are truthy by taking the product of the pair
# (after which the result is output implicitly)
R , 70 byte
function(s,S=sum,t=S(utf8ToInt(s)%%32))S(!nchar(s)%%1:t)^S(!t%%1:t)==4
Cobalah secara online!
Saya memaksakan diri untuk tidak mengintip jawaban Robin Ryder sebelum mencoba ini, dan (secara memuaskan) ternyata kami telah menggunakan beberapa trik golf yang agak berbeda.
tadalah total dari semua indeks huruf. Ini pasti lebih besar-dari-atau-sama-dengan nchar(s)(hanya sama jika stringnya sadalah "A" atau "a"). Jadi kita bisa menggunakan modulo 1:tuntuk menguji primalitas panjang string, bukan modulo 1:nchar(s), dan tidak perlu membuang karakter pada deklarasi variabel untuk disimpan nchar(s).
Kedua uji primalitas sum(!t%%1:t)dan sum(!nchar(s)%%1:t)harus sama dengan 2 jika jumlah indeks huruf dan panjang string adalah bilangan prima.
Kami dapat memeriksa apakah keduanya 2, tetapi ini membutuhkan ==2dua kali (plus a &atau setara), yang tampaknya sia-sia. Bolehkah memeriksa bahwa totalnya adalah 4? Kasus tepi yang perlu kita khawatirkan adalah jika salah satu dari mereka sama dengan 1 dan 3 lainnya: ini terjadi untuk string "D" (panjang = 1 dan indeks-karakter = 4 dengan pembagi 1,2 dan 4). Jadi tidak baik-baik saja. Bisakah kita memperbanyaknya? Juga tidak, karena 1 dan 4 akan memberikan 4 lagi (pikirkan tentang string "F").
Tetapi - karena kita tahu bahwa panjang string harus kurang dari atau sama dengan jumlah indeks karakter, kita dapat menggunakan eksponen: satu-satunya cara untuk mendapatkan 4 adalah 4 ^ 1 atau 2 ^ 2, dan karena jumlah-indeks-karakter tidak boleh 1 jika panjang-string adalah 4, 2 ^ 2 adalah satu-satunya kemungkinan.
Jadi pemeriksaan terakhir gabungan untuk double-primality adalah sum(!nchar(s)%%1:t)^sum(!t%%1:t)==4, menyimpan 3 karakter dibandingkan dengan mengujinya secara terpisah.
Rockstar , 327 321 319 bytes
Tidak ada built-in untuk menguji bilangan prima!
Tidak ada konversi kasus!
Tidak ada cara untuk mendapatkan titik kode karakter!
Mengapa saya melakukan hal-hal ini pada diri saya sendiri ?! Menghabiskan begitu lama hanya untuk mendapatkan pekerjaan sialan itu, saya yakin itu jauh dari golf secara optimal tetapi itu akan berhasil untuk saat ini.
F takes N
let D be N
let P be N aint 1
while P and D-2
let D be-1
let M be N/D
turn up M
let P be N/D aint M
return P
G takes I
Y's0
N's27
while N
cast N+I into C
if C is S at X
return N
let N be-1
return G taking 64
listen to S
X's0
T's0
while S at X
let T be+G taking 96
let X be+1
say F taking T and F taking X
Coba di sini (Kode perlu ditempelkan)
Retina 0.8.2 , 77 byte
\W|\d|_
$ ¶$`
\G.
1
T`L`l
[t-z]
55$& [j-z] 55$&
T`_l`ddd
.
$* A`^(..+)\1+$
¶
Cobalah secara online! Tautan termasuk kasus uji. Penjelasan:
\W|\d|_
Hapus apa pun yang bukan surat.
$ ¶$`
Gandakan hurufnya.
\G.
1
Gantilah huruf-huruf pada baris pertama dengan 1s, sehingga membentuk panjang unary.
T`L`l
Ubah huruf yang tersisa menjadi huruf kecil.
[t-z]
55$& [j-z] 55$&
T`_l`ddd
Konversikan menjadi digit yang akan menjumlahkan posisi numeriknya.
.
$*
Ubah angka menjadi unary, sehingga mengambil jumlahnya.
A`^(..+)\1+$
Hapus nilai komposit apa pun.
¶
Periksa apakah kedua nilai tersebut masih ada.
Python 3 , 86 78 87 byte
Disimpan 8 byte berkat ovs !!!
Menambahkan 9 byte untuk memperbaiki bug yang ditunjukkan oleh Robin Ryder .
lambda s:~-len(s)*all(n%i for n in(len(s),sum(ord(c)&31for c in s))for i in range(2,n))
Cobalah secara online!
Mengembalikan nilai benar atau salah.
Brachylog , 11 byte
ḷạ-₉₆ᵐ+ṗ&lṗ
Cobalah secara online!
Bagaimana itu bekerja
ḷạ-₉₆ᵐ+ṗ&lṗ (is the implicit input)
ḷ to lowercase
ạ to list of char codes
-₉₆ᵐ minus 96 (so 'a' -> 1)
+ summed
ṗ prime?
&l and is the input's length
ṗ prime?
Bahasa Wolfram (Mathematica) , 34 byte
PrimeQ@*Tr/@(LetterNumber@#&&1^#)&
Cobalah secara online!
-22 byte dari @att
Japt , 16 byte
Êj ©Uu ¬mc xaI j
Cobalah
J , 27 22 18 byte
1*/@p:#,1#.32|3&u:
Cobalah secara online!
-5 byte berkat xash
-4 byte berkat Dominic van Essen
32|3&u:Ubah setiap huruf menjadi indeksnya dengan terlebih dahulu mengonversi ke nomor ascii-nya, moddingnya menjadi 32.1#.Jumlah.#,Tambahkan panjang daftar.1...p:Apakah masing-masing dari kedua bilangan itu prima?*/@Kalikan semuanya - apakah semuanya prima?
C - 119108 99 98 byte (gcc)
@ceilingcat menyimpan byte lain!
b,t,e;p(c){for(;--e&&c%e;);c=e==1;}a(char*a){t=0;for(e=b=strlen(a);b;)t+=a[--b]%32;t=p(e)*p(e=t);}
coba online
sebelumnya
Terima kasih banyak kepada @DominicvanEssen dan @ceilingcat karena telah menghemat 20 byte! - dan khususnya kepada Dominic untuk memperbaiki kesalahan pada n = 1 (non-prime)
b,t,e;p(c){for(b=c;--b&&c%b;);c=b==1;}a(char*a){t=0;for(e=b=strlen(a);b;)t+=a[--b]%32;t=p(e)*p(t);}
upaya pertama di bawah 119 byte
a(char*a){int t=0,d=strlen(a),e=d;while(d)t+=a[--d]%32;return p(e)*p(t);}
p(int c){int b=c;while(--b&&c%b);return b<2;}
Sebenarnya dapat menghemat 3 byte dengan menggunakan while(c%--b)dalam rutinitas kedua, tetapi ini gagal untuk kasus p (1) misalnya 'a'. atau karakter tunggal lainnya.
coba online
Scala , 75 74 69 byte
| =>p(|size)&p(|map(_&95-64)sum)
def p(n:Int)=(2 to n/2)forall(n%_>0)
Cobalah secara online!
Faktorkan , 78 byte
: d ( s -- ? ) dup [ length ] dip >lower [ 96 - ] map sum [ prime? ] bi@ and ;
Cobalah secara online!
05AB1E , 11 byte
uÇ64-Op¹gp&
Cobalah secara online!
Byte dihapus karena kurangnya batasan input
JavaScript (Node.js) , 88 byte
Mengembalikan 0 atau 1 .
s=>(g=k=>n%--k?g(k):k==1)(Buffer(s).map(c=>x+=n<(n+=c>64&(c&=31)<27&&c),x=n=0)|n)&g(n=x)
Cobalah secara online!
Berkomentar
Fungsi pembantu
g = k => // g is a helper function testing if n is prime
n % --k ? // decrement k; if it does not divide n:
g(k) // do recursive calls until it does
: // else:
k == 1 // test whether k = 1
Fungsi utama
s => // s = input string
g( // test if the 'sum of the letters' is prime
Buffer(s).map(c => // for each ASCII code c in s:
x += // increment x if ...
n < ( // ... n is less than ...
n += // ... the new value of n:
c > 64 & // if c is greater than 64
(c &= 31) < 27 // and c mod 32 is less than 27:
&& c // add c mod 32 to n
), //
x = n = 0 // start with x = n = 0
) | n // end of map(); yield n
) // end of the first call to g
& g(n = x) // 2nd call to g with the 'length' x
Perl 5 -pl , 52 byte
Menggunakan regex identifikasi utama dari jawaban @ Abigail
$_.=$".1x s/./1x(31&ord$&)/ge;$_=!/\b((11+)\2+|1)\b/
Cobalah secara online!
Ruby , 50 55 50 byte
->s{[s.size,s.upcase.sum-64*s.size].all? &:prime?}
Cobalah secara online!
+5 byte karena kesalahpahaman tentang apakah array dapat dianggap benar.
-5 byte berkat Razetime, menggunakan trik bagus untuk meletakkan "&: prime?" di akhir daripada melakukan ".map (&: prime?)" sebelum ".all?".
Diposting secara terpisah karena solusi Razetime sebenarnya tidak menjumlahkan indeks alfabet tetapi hanya ordinal ascii. Gagal untuk kata prima ganda "DiningTable" dan "METER" .
Husk , 12 byte
&ṗL¹ṗṁȯ-64ca
Cobalah secara online! Menghasilkan angka kebenaran jika kata tersebut merupakan kata prima ganda, dan 0 jika sebaliknya.