Các từ kép

Sep 09 2020

Hãy xem xét một từ / chuỗi có độ dài \$n\$, chỉ bao gồm các chữ cái AZ, az. Một từ / chuỗi là một từ nguyên tố kép nếu và chỉ khi n là số nguyên tố và tổng của các chữ cái, s, cũng là số nguyên tố, sử dụng vị trí số của chúng trong bảng chữ cái ( a=1, B=2, c=3, v.v.).

Đầu vào có thể là bất kỳ sự kết hợp nào của các ký tự chữ hoa hoặc chữ thường, vì không có sự khác biệt về số giữa ahoặc A.

Đầu ra là bất kỳ định dạng logic thích hợp nào liên quan đến ngôn ngữ của bạn. tức là Đúng hoặc Sai, T hoặc F, 1 hoặc 0, v.v. Chỉ định định dạng đầu ra của bạn sẽ xuất hiện được đánh giá cao, nhưng không bắt buộc. (Đầu ra không cần bao gồm n, s, nhưng tôi bao gồm chúng dưới đây như là minh chứng và ví dụ)

Điều kiện thắng là mã ngắn nhất tính bằng byte có thể phát hiện xem một chuỗi có phải là số nguyên tố kép hay không, phù hợp với cả hai điều kiện để n và s là số nguyên tố. (Bây giờ tôi đã bao gồm các trường hợp từ tất cả 4 tình huống có thể xảy ra của n, s.)

Ví dụ

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)

Trả lời

5 cairdcoinheringaahing Sep 09 2020 at 05:03

Thạch , 12 byte

ŒuO_64µL,SẒP

Hãy thử nó trực tuyến!

Làm thế nào nó hoạt động

Œ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 để sửa một lỗi do Dominic van Essen chỉ ra

`?`=sum;s=?b<-utf8ToInt(scan(,""))%%32;l=?b^0;l-1&5>?c(!s%%1:s,!l%%1:l)

Hãy thử nó trực tuyến!

Lưu ý rằng để chuyển đổi cả chữ hoa và chữ thường thành các số nguyên 1 ... 26, chúng ta có thể sử dụng mô-đun ASCII codepoint 32. sum(!x%%1:x)là một cách đơn giản để đếm số ước của x, sẽ bằng 2 iff xlà số nguyên tố.

Không thích:

`?` = 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 sau khi sửa giải pháp, cảm ơn DrQuarius.

Hãy thử nó trực tuyến! hoặc Xác minh tất cả các trường hợp thử nghiệm

4 Abigail Sep 09 2020 at 06:48

perl -Mfeature = say -MList :: Util = sum -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$/

Hãy thử nó trực tuyến!

Làm thế nào nó hoạt động?

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.

Kết hợp điều này và chương trình sẽ in 1 trên các dòng phù hợp với điều kiện và một dòng trống cho các dòng không khớp.

4 KevinCruijssen Sep 09 2020 at 13:41

05AB1E , 10 byte

gAIlk>O‚pP

Nhập dưới dạng danh sách các ký tự.

Hãy thử trực tuyến hoặc xác minh tất cả các trường hợp thử nghiệm .

Giải trình:

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

Hãy thử nó trực tuyến!

Tôi buộc mình không nhìn vào câu trả lời của Robin Ryder trước khi đánh vào câu trả lời này, và (hài lòng) hóa ra chúng tôi đã sử dụng một số thủ thuật chơi gôn khá khác nhau.

tlà tổng tất cả các chỉ số chữ cái. Điều này chắc chắn phải lớn hơn-hoặc-bằng- nchar(s)(nó chỉ bằng nếu chuỗi slà "A" hoặc "a"). Vì vậy, chúng ta có thể sử dụng modulo 1:tđể kiểm tra tính nguyên thủy của độ dài chuỗi thay vì modulo 1:nchar(s)và không cần ký tự lãng phí trên khai báo biến để lưu trữ nchar(s).

Cả hai bài kiểm tra tính nguyên thủy sum(!t%%1:t)và sum(!nchar(s)%%1:t)phải bằng 2 nếu cả chỉ số tổng và độ dài chuỗi đều là số nguyên tố.
Chúng tôi có thể kiểm tra nếu cả hai đều là 2, nhưng điều này yêu cầu ==2hai lần (cộng với một &hoặc tương đương), điều này có vẻ lãng phí. Kiểm tra xem tổng là 4 có ổn không? Trường hợp cạnh mà chúng ta cần lo lắng là nếu một trong số chúng bằng 1 và số còn lại 3: điều này xảy ra đối với chuỗi "D" (length = 1 và character-index = 4 với các ước số 1,2 và 4). Vì vậy, nó không Ok. Chúng ta có thể nhân chúng lên không? Cũng không, vì 1 và 4 sẽ lại cho 4 (hãy nghĩ về chuỗi "F").
Nhưng - vì chúng ta biết rằng độ dài chuỗi phải nhỏ hơn hoặc bằng tổng các chỉ số ký tự, chúng ta có thể sử dụng lũy ​​thừa: cách duy nhất để lấy 4 là 4 ^ 1 hoặc 2 ^ 2, và kể từ tổng-ký tự-chỉ số không thể là 1 nếu độ dài chuỗi là 4, 2 ^ 2 là khả năng duy nhất.

Vì vậy, kiểm tra kết hợp cuối cùng cho tính nguyên thủy kép là sum(!nchar(s)%%1:t)^sum(!t%%1:t)==4tiết kiệm 3 ký tự so với kiểm tra chúng riêng lẻ.

4 Shaggy Sep 11 2020 at 23:47

Rockstar , 327 321 319 byte

Không tích hợp sẵn để kiểm tra số nguyên tố!
Không có chuyển đổi trường hợp!
Không có cách nào để có được điểm mã của một nhân vật!

Tại sao tôi lại làm những điều này với chính mình ?! Đã dành quá lâu để làm cho thứ chết tiệt đó hoạt động, tôi chắc chắn rằng còn lâu mới có thể chơi gôn một cách tối ưu nhưng nó sẽ làm được ngay bây giờ.

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

Hãy thử nó ở đây (Mã sẽ cần được dán vào)

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+$

Hãy thử nó trực tuyến! Liên kết bao gồm các trường hợp thử nghiệm. Giải trình:

\W|\d|_

Xóa bất kỳ thứ gì không phải là chữ cái.

$ ¶$`

Nhân đôi các chữ cái.

\G.
1

Thay thế các chữ cái trên dòng đầu tiên bằng 1s, do đó lấy độ dài bằng đơn vị.

T`L`l

Chuyển các chữ cái còn lại thành chữ thường.

[t-z]
55$& [j-z] 55$&
T`_l`ddd

Chuyển chúng thành các chữ số sẽ tổng thành vị trí số của chúng.

.
$*

Chuyển đổi các chữ số thành một ngôi, do đó lấy tổng của chúng.

A`^(..+)\1+$

Xóa mọi giá trị tổng hợp.

Kiểm tra xem cả hai giá trị vẫn còn.

3 Noodle9 Sep 09 2020 at 07:15

Python 3 , 86 78 87 byte

Đã lưu 8 byte nhờ ovs !!!
Đã thêm 9 byte để sửa một lỗi được Robin Ryder vui lòng chỉ ra .

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))

Hãy thử nó trực tuyến!

Trả về giá trị true hoặc falsey.

3 xash Sep 10 2020 at 05:18

Brachylog , 11 byte

ḷạ-₉₆ᵐ+ṗ&lṗ

Hãy thử nó trực tuyến!

Làm thế nào nó hoạt động

ḷạ-₉₆ᵐ+ṗ&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

Ngôn ngữ Wolfram (Mathematica) , 34 byte

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

Hãy thử nó trực tuyến!

-22 byte từ @att

2 Shaggy Sep 09 2020 at 06:37

Japt , 16 byte

Êj ©Uu ¬mc xaI j

Thử nó

2 Jonah Sep 10 2020 at 11:24

J , 27 22 18 byte

1*/@p:#,1#.32|3&u:

Hãy thử nó trực tuyến!

-5 byte nhờ xash

-4 byte cảm ơn Dominic van Essen

  • 32|3&u: Biến mỗi chữ cái thành chỉ mục của nó bằng cách chuyển đổi đầu tiên thành số ascii của nó, sửa đổi bằng 32.
  • 1#. Tổng.
  • #, Thêm độ dài danh sách.
  • 1...p: Hai số đó có phải là số nguyên tố không?
  • */@ Nhân chúng với nhau - chúng có phải là nguyên tố không?
2 tom Sep 10 2020 at 01:53

C - 119 108 99 98 byte (gcc)

@ceilingcat đã lưu một byte khác!

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);}

thử nó trực tuyến

trước đây

Rất cám ơn @DominicvanEssen và @ceilingcat vì đã tiết kiệm được 20 byte! - và đặc biệt là Dominic để sửa lỗi trên n = 1 (không phải số nguyên tố)

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);}

lần thử đầu tiên dưới 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;}

Trong thực tế, có thể tiết kiệm 3 byte bằng cách sử dụng while(c%--b)trong quy trình thứ hai, nhưng điều này không thành công đối với trường hợp p (1), ví dụ 'a'. hoặc các ký tự đơn lẻ khác.

thử nó trực tuyến

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)

Hãy thử nó trực tuyến!

1 GalenIvanov Sep 09 2020 at 14:08

Hệ số , 78 byte

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

Hãy thử nó trực tuyến!

1 Lyxal Sep 09 2020 at 06:18

05AB1E , 11 byte

uÇ64-Op¹gp&

Hãy thử nó trực tuyến!

Số byte bị xóa do thiếu giới hạn đầu vào

1 Arnauld Sep 09 2020 at 05:55

JavaScript (Node.js) , 88 byte

Trả về 0 hoặc 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)

Hãy thử nó trực tuyến!

Đã nhận xét

Chức năng trợ giúp

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

Chức năng chính

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

Sử dụng regex nhận dạng chính từ câu trả lời của @ Abigail

$_.=$".1x s/./1x(31&ord$&)/ge;$_=!/\b((11+)\2+|1)\b/

Hãy thử nó trực tuyến!

1 DrQuarius Sep 13 2020 at 12:39

Ruby , 50 55 50 byte

->s{[s.size,s.upcase.sum-64*s.size].all? &:prime?}

Hãy thử nó trực tuyến!

+5 byte do hiểu nhầm về việc liệu các mảng có thể được coi là đúng hay không.

-5 byte nhờ Razetime, sử dụng mẹo hay là đặt "&: prime?" ở cuối thay vì thực hiện ".map (&: prime?)" trước ".all?".

Được đăng riêng vì giải pháp của Razetime thực sự không tính tổng chỉ mục bảng chữ cái mà chỉ đơn giản là thứ tự ascii. Nó không thành công đối với các từ nguyên tố kép "DiningTable" và "METER" .

1 LegionMammal978 Oct 28 2020 at 01:05

Husk , 12 byte

&ṗL¹ṗṁȯ-64ca

Hãy thử nó trực tuyến! Xuất ra một số trung thực nếu từ đó là một từ nguyên tố kép và 0 nếu không.