이중 프라임 단어

Sep 09 2020

\ 길이의 단어 / 문자열을 고려하십시오.$n\$, 문자 AZ, az 만 포함합니다. 단어 / 문자열은 n이 소수이고 문자의 합 s도 소수 인 경우에만 이중 소수 단어이며 알파벳 ( a=1, B=2, c=3등) 의 숫자 위치를 사용합니다 .

수치 사이의 차이가 없기 때문에 입력은 대문자 또는 소문자의 알파벳 문자의 조합 a또는이 A.

출력은 언어와 관련된 적절한 논리 형식입니다. 즉, True 또는 False, T 또는 F, 1 또는 0 등. 출력이 표시 될 형식을 지정하는 것은 높이 평가되지만 필수는 아닙니다. (출력에는 n, s가 포함될 필요는 없지만 아래에 데모 및 예제로 포함)

승리 조건은 문자열이 이중 소수인지 감지 할 수있는 바이트 단위의 가장 짧은 코드로, n과 s가 소수가되도록 조건을 맞 춥니 다. (이제 n, s의 가능한 4 가지 상황 모두에서 사례를 포함했습니다.)

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)

답변

5 cairdcoinheringaahing Sep 09 2020 at 05:03

젤리 , 12 바이트

ŒuO_64µL,SẒP

온라인으로 시도하십시오!

작동 원리

Œ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 바이트

Dominic van Essen이 지적한 버그 수정을위한 +3 바이트

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

온라인으로 시도하십시오!

대문자와 소문자를 모두 정수 1 ... 26으로 변환하기 위해 ASCII 코드 포인트 모듈로 32를 사용할 수 있습니다. sum(!x%%1:x)는의 제수를 계산하는 골프 방법이며 x,이면 2와 같습니다 x.

미 골프 :

`?` = 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 바이트

->a{[a.size,a.upcase.bytes.map{|i|i-64}.sum].all? &:prime?}

DrQuarius 덕분에 솔루션 수정 후 +33 바이트.

온라인으로 시도하십시오! 또는 모든 테스트 케이스 확인

4 Abigail Sep 09 2020 at 06:48

perl -Mfeature = say -MList :: Util = sum -pl, 95 바이트

s/[^a-z]//gi;$m=sum map-64+ord,split//,uc;$_=(1 x y===c)!~/^(11+)\1+$|^1$/&&(1x$m)!~/^(11+)\1$/

온라인으로 시도하십시오!

어떻게 작동합니까?

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.

이를 결합하면 프로그램은 조건과 일치하는 행에 1을 인쇄하고 일치하지 않는 행에 대해서는 빈 행을 인쇄합니다.

4 KevinCruijssen Sep 09 2020 at 13:41

05AB1E , 10 바이트

gAIlk>O‚pP

문자 목록으로 입력합니다.

온라인으로 시도 하거나 모든 테스트 사례를 확인하십시오 .

설명:

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 바이트

function(s,S=sum,t=S(utf8ToInt(s)%%32))S(!nchar(s)%%1:t)^S(!t%%1:t)==4

온라인으로 시도하십시오!

나는 이것을 시도하기 전에 Robin Ryder의 대답 을 들여다 보지 않도록 강요 했으며 (만족스럽게) 우리는 다소 다른 골프 트릭을 사용했다는 것이 밝혀졌습니다.

t모든 문자 인덱스의 합계입니다. 이것은보다 크거나 같음이 확실합니다 nchar(s)(문자열 s이 "A"또는 "a"인 경우에만 동일 함 ). 그래서 우리는 modulo 1:t대신에 문자열 길이의 소수성을 테스트하기 위해 modulo 를 사용할 수 있으며 1:nchar(s),를 저장하기 위해 변수 선언에 낭비 문자가 필요하지 않습니다 nchar(s).

두 소수 테스트 모두 문자 인덱스의 합계와 문자열 길이가 모두 소수 인 경우 2 sum(!t%%1:t)sum(!nchar(s)%%1:t)같아야합니다.
둘 다 2인지 확인할 수 있지만 ==2두 번 (더하기 a &또는 이와 동등한) 이 필요하므로 낭비적인 것 같습니다. 합계가 4인지 확인해도됩니까? 우리가 걱정해야 할 가장 중요한 경우는 그들 중 하나가 1이고 다른 하나가 3과 같으면 문자열 "D"에 대해 발생합니다 (제수 1,2 및 4가있는 길이 = 1 및 문자 인덱스 = 4). 그래서 그것은 Ok가 아닙니다. 곱할 수 있습니까? 또한 1과 4가 다시 4를 줄 것이기 때문입니다 (문자열 "F"에 대해 생각해보십시오).
그러나-문자열 길이가 문자 인덱스의 합보다 작거나 같아야한다는 것을 알고 있기 때문에 지수를 사용할 수 있습니다. 4를 얻는 유일한 방법은 4 ^ 1 또는 2 ^ 2이므로 문자열 길이가 4 인 경우 문자 인덱스 합계는 1이 될 수 없으며 2 ^ 2가 유일한 가능성입니다.

따라서 이중 소수에 대한 최종 결합 검사는이며 sum(!nchar(s)%%1:t)^sum(!t%%1:t)==4, 개별 테스트에 비해 3 개의 문자를 절약합니다.

4 Shaggy Sep 11 2020 at 23:47

록 스타 , 327 321 319 바이트

프라임 테스트를위한 내장 기능이 없습니다!
대소 문자 변환이 없습니다!
캐릭터의 코드 포인트를 얻을 수있는 방법이 없습니다!

왜 나 자신에게 이런 일을 하는가?! 빌어 먹을 일을하는 데 너무 오래 걸렸고, 나는 그것이 최적의 골프와는 거리가 멀다고 확신하지만 지금은 할 것입니다.

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

여기에서 시도해보세요 (코드를 붙여 넣어야합니다).

3 Neil Sep 09 2020 at 05:21

Retina 0.8.2 , 77 바이트

\W|\d|_

$
¶$`
\G.
1
T`L`l
[t-z]
55$&
[j-z]
55$&
T`_l`ddd
.
$*
A`^(..+)\1+$

온라인으로 시도하십시오! 링크에는 테스트 케이스가 포함됩니다. 설명:

\W|\d|_

문자가 아닌 것은 삭제하십시오.

$
¶$`

편지를 복제하십시오.

\G.
1

첫 번째 줄의 문자를 1s로 바꾸어 길이를 단항으로 사용합니다.

T`L`l

나머지 문자를 소문자로 변환하십시오.

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

숫자 위치의 합이 될 숫자로 변환하십시오.

.
$*

숫자를 단항으로 변환하여 합계를 얻습니다.

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

복합 값을 삭제하십시오.

두 값이 모두 여전히 존재하는지 확인하십시오.

3 Noodle9 Sep 09 2020 at 07:15

Python 3 , 86 78 87 바이트

ovs 덕분에 8 바이트 절약 !!! Robin Ryder가
친절하게 지적한 버그를 수정하기 위해 9 바이트를 추가했습니다 .

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

온라인으로 시도하십시오!

진실 또는 거짓 값을 반환합니다.

3 xash Sep 10 2020 at 05:18

Brachylog , 11 바이트

ḷạ-₉₆ᵐ+ṗ&lṗ

온라인으로 시도하십시오!

작동 원리

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

Wolfram 언어 (Mathematica) , 34 바이트

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

온라인으로 시도하십시오!

@att 에서 -22 바이트

2 Shaggy Sep 09 2020 at 06:37

Japt , 16 바이트

Êj ©Uu ¬mc xaI j

시도 해봐

2 Jonah Sep 10 2020 at 11:24

J , 27 22 18 바이트

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

온라인으로 시도하십시오!

xash 덕분에 -5 바이트

-Dominic van Essen 덕분에 4 바이트

  • 32|3&u: 먼저 ASCII 번호로 변환하고 32로 모딩하여 각 문자를 색인으로 변환합니다.
  • 1#. 합집합.
  • #, 목록 길이를 앞에 추가합니다.
  • 1...p: 이 두 숫자가 각각 소수입니까?
  • */@ 그것들을 함께 곱하십시오-모두 소수입니까?
2 tom Sep 10 2020 at 01:53

C- 119108 99 98 바이트 (gcc)

@ceilingcat이 다른 바이트를 저장했습니다!

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

온라인으로 시도

이전에

@DominicvanEssen과 @ceilingcat에게 20 바이트를 절약 해주셔서 감사합니다! -특히 n = 1 (프라임이 아님)의 오류를 수정 한 Dominic에게

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

119 바이트 미만의 첫 번째 시도

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

실제로 while(c%--b)두 번째 루틴에서 사용하여 3 바이트를 절약 할 수 있지만 p (1)의 경우에는 실패합니다 (예 : 'a'). 또는 다른 단일 문자.

온라인으로 시도

2 user Sep 09 2020 at 09:00

Scala , 75 74 69 바이트

| =>p(|size)&p(|map(_&95-64)sum)
def p(n:Int)=(2 to n/2)forall(n%_>0)

온라인으로 시도하십시오!

1 GalenIvanov Sep 09 2020 at 14:08

요소 , 78 바이트

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

온라인으로 시도하십시오!

1 Lyxal Sep 09 2020 at 06:18

05AB1E , 11 바이트

uÇ64-Op¹gp&

온라인으로 시도하십시오!

입력 제한 부족으로 제거 된 바이트

1 Arnauld Sep 09 2020 at 05:55

JavaScript (Node.js) , 88 바이트

0 또는 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)

온라인으로 시도하십시오!

댓글 작성

도우미 기능

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

주요 기능

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 바이트

@Abigail의 답변 에서 프라임 식별 정규식을 사용합니다.

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

온라인으로 시도하십시오!

1 DrQuarius Sep 13 2020 at 12:39

Ruby , 50 55 50 바이트

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

온라인으로 시도하십시오!

배열이 진실한 것으로 간주 될 수 있는지에 대한 오해로 인해 +5 바이트.

Razetime 덕분에 -5 바이트, "& : prime?" ".all?"앞에 ".map (& : prime?)"을하는 대신 끝에.

Razetime의 솔루션은 실제로 알파벳 색인이 아니라 단순히 ascii 서수를 합산했기 때문에 별도로 게시되었습니다. 이중 프라임 단어 "DiningTable"및 "METER"에 대해 실패합니다 .

1 LegionMammal978 Oct 28 2020 at 01:05

Husk , 12 바이트

&ṗL¹ṗṁȯ-64ca

온라인으로 시도하십시오! 단어가 이중 소수 단어이면 진실 숫자를 출력하고 그렇지 않으면 0을 출력합니다.