Kata Utama Ganda

Sep 09 2020

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

5 cairdcoinheringaahing Sep 09 2020 at 05:03

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
5 RobinRyder Sep 09 2020 at 20:34

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
5 Razetime Sep 09 2020 at 14:37

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

4 Abigail Sep 09 2020 at 06:48

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.

4 KevinCruijssen Sep 09 2020 at 13:41

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)
4 DominicvanEssen Sep 10 2020 at 04:51

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.

4 Shaggy Sep 11 2020 at 23:47

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)

3 Neil Sep 09 2020 at 05:21

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.

3 Noodle9 Sep 09 2020 at 07:15

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.

3 xash Sep 10 2020 at 05:18

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?
3 J42161217 Sep 09 2020 at 04:59

Bahasa Wolfram (Mathematica) , 34 byte

PrimeQ@*Tr/@(LetterNumber@#&&1^#)&

Cobalah secara online!

-22 byte dari @att

2 Shaggy Sep 09 2020 at 06:37

Japt , 16 byte

Êj ©Uu ¬mc xaI j

Cobalah

2 Jonah Sep 10 2020 at 11:24

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?
2 tom Sep 10 2020 at 01:53

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

2 user Sep 09 2020 at 09:00

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!

1 GalenIvanov Sep 09 2020 at 14:08

Faktorkan , 78 byte

: d ( s -- ? ) dup [ length ] dip >lower [ 96 - ] map sum [ prime? ] bi@ and ;

Cobalah secara online!

1 Lyxal Sep 09 2020 at 06:18

05AB1E , 11 byte

uÇ64-Op¹gp&

Cobalah secara online!

Byte dihapus karena kurangnya batasan input

1 Arnauld Sep 09 2020 at 05:55

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
1 Xcali Sep 11 2020 at 10:36

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!

1 DrQuarius Sep 13 2020 at 12:39

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

1 LegionMammal978 Oct 28 2020 at 01:05

Husk , 12 byte

&ṗL¹ṗṁȯ-64ca

Cobalah secara online! Menghasilkan angka kebenaran jika kata tersebut merupakan kata prima ganda, dan 0 jika sebaliknya.