코 프라임이란 단어입니까?


18

단어가 주어지면 모든 문자를 영어 알파벳의 숫자로 취급하고 (따라서 a1 b이되고, 2 z가되고, 26이되는 등) 중복을 포함하여 모든 문자 가 짝을 이루는 coprime인지 확인하십시오 .

입력은 정확히 영어 소문자의 한 단어입니다. 결과는 단어가 코 프라임 (coprime) 인 경우에 해당합니다. 진실 / 거짓 값이지만 두 가지 변형 만 있습니다. 표준 허점은 금지되어 있습니다.

테스트 사례 :

  • man: True
  • day: True(Ørjan Johansen 덕분에)
  • led: False( l=12그리고 d=4가지고 gcd=4)
  • mana: True( a여러 번 발생 하지만 1과 1은 coprimes입니다)
  • mom: False( gcd(13,13)=13))
  • of: False(XNOR 덕분에,하지만 15∤6, gcd(15,6)=3)
  • a: True(문자 쌍이없는 경우 해당 단어를 coprime으로 취급)

이것은 이므로 바이트 단위의 가장 짧은 코드가 이깁니다!


1
0그들이 coprime이고 1그렇지 않은 경우 출력 할 수 있습니까 ?
dylnan

2
버그가 대답을 잡은 것이 권장 테스트 케이스 :day: True
Ørjan 요한센

1
또한 of: False값이 다른 배수가 아닌 잘못된 예를 제시 하는 것이 좋습니다 .
xnor

@ dylnan 아니오, 그것은 직관적입니다. 어쨌든, Dennis의 대답은 더 낫다 ;-)
bodqhrohro

@LuisMendo 모든 진실 / 거짓이지만 단 두 가지입니다.
bodqhrohro

답변:



8

젤리 , 10 바이트

ØaiⱮgþ`P$Ƒ

온라인으로 사용해보십시오!

작동 원리

ØaiⱮgþ`P$Ƒ  Main link. Argument: s (string)

Øa          Yield "abc...xyz".
  iⱮ        Find the 1-based index of each c of s in "abc...xyz".
        $Ƒ  Call the monadic chain to the left.
            Yield 1 if the result is equal to the argument, 0 if not.
    gþ`       Take the GCDs of all pairs of indices, yielding a matrix.
       P      Take the columnwise product.
            For coprimes, the column corresponding to each index will contain the
            index itself (GCD with itself) and several 1's (GCD with other indices),
            so the product is equal to the index.


6

Pyth , 9 바이트

{Ism{PhxG

테스트 스위트

설명:
{Ism{PhxG   | Full code
{Ism{PhxGdQ | With implicit variables filled
------------+------------------------------------------
   m      Q | For each char d in the input:
    {P      |  list the unique prime factors of
      hx d  |  the 1-based index of d in
        G   |  the lowercase alphabet
  s         | Group all prime factors into one list
{I          | Output whether the list has no duplicates

피스는 방금 젤리를 능가 했습니까?


6

파이썬 2 - 122 118 바이트

@JonathanAllan 덕분에 -4 바이트

이것은 정직하게 끔찍하지만, 이것을 게시하지 않기 위해 너무 오랜 시간을 보냈습니다.

from fractions import*
def f(n):r=reduce;n=[ord(i)-96for i in n];return r(lambda x,y:x*y/gcd(x,y),n)==r(int.__mul__,n)

온라인으로 사용해보십시오


4
96 for~> 96for; lambda x,y:x*y~> int.__mul__.
Jonathan Frech

5

05AB1E , 11 바이트

Ç96-2.Æ€¿PΘ

온라인으로 사용해보십시오!

설명

Ç96-         # convert to character codes and subtract 96
    2.Æ      # get all combinations of size 2
       €¿    # gcd of each pair
         P   # product of gcds
          Θ  # is true

마지막은 Θ정말 필요한가요?
Mr. Xcoder

@ Mr.Xcoder : 아니요. 방금 우리는 2 개의 구별 값을 사용해야한다고 가정했지만 이제는 그에 대한 도전이 없습니다. 진실한 / 거짓은 괜찮을 것입니다.
Emigna

@Emigna 나는 그것에 대한 설명을 추가했습니다 : 출력 값에는 두 가지 변형 만 있어야합니다.
bodqhrohro

@ bodqhrohro : 알겠습니다. 이 새로운 요구 사항을 준수하기 위해 이전 버전으로 롤백했습니다.
Emigna

5

Brachylog , 11 바이트

ạ{-₉₆ḋd}ᵐc≠

온라인으로 사용해보십시오!

설명

ạ{-₉₆ḋd}ᵐc≠
ạ              Split the input into its character codes
 {     }ᵐ      For each one
  -₉₆          Subtract 96 (a -> 1, b -> 2 etc.)
     ḋd        And find the unique (d) prime factors (ḋ)
         c     Combine them into one list
          ≠    And assert they are all different

4

파이썬 2 , 77 68 64 바이트

lambda a:all(sum(ord(v)%96%i<1for v in a)<2for i in range(2,26))

온라인으로 사용해보십시오!

기본적으로 (입력의 일부 쌍은 동시 프라임이 아님) 경우에만 (입력을 두 개 이상 나누는 숫자 i> 1이있는 경우).


우리처럼 보인다는했다 같은 생각을 하지만 당신은 몇 분으로 나를 이길 :) 수 없습니다 당신은 그 2 바이트 저장 사용 all하고 <2있지만?
Vincent

4

파이썬 3 , 61 59 바이트

파이썬 바이트를 인수로 사용 :

lambda s:all(sum(c%96%x<1for c in s)<2for x in range(2,24))

마지막으로 확인할 제수는 23이며 26보다 큰 소수입니다.

온라인으로 사용해보십시오!

2 바이트를 절약 한 @Dennis에게 감사합니다.


3
c%96%x<1for c in s2 바이트를 절약합니다.
Dennis

4

펄 6 , 34 32 바이트

nwellnhof 덕분에 -2 바이트

{[lcm](@_)==[*] @_}o{.ords X-96}

온라인으로 사용해보십시오!

문자열을 가져와 True 또는 False를 반환하는 익명 코드 블록입니다. 문자의 최소 공배수가 문자의 곱과 같으면 공약수를 공유하지 않습니다.

설명:

                     {.ords X-96}  # Convert the letters to a list of numbers
 {                 }o              # Pass result to the next codeblock
  [lcm](@_)           # The list reduced by the lcm
           ==         # Is equal to?
             [*] @_   # The list reduced by multiplication

내가 실수하지 않으면 작동합니까? (21 bytes)
Conor O'Brien

ConorO'Brien 아니 @, 당신은 매핑 한 a0
조 왕에게

@ JoKing oh, ok lol
코너 오브라이언

그 전략은 버그가 많았습니다. 테스트 사례 : day.
Ørjan Johansen


3

J, 36 바이트

[:(1 =[:*/-.@=@i.@##&,+./~)_96+a.&i.

언 골프

[: (1 = [: */ -.@=@i.@# #&, +./~) _96 + a.&i.

설명

[: (                            ) _96 + a.&i.  NB. apply fn in parens to result of right
                                  _96 + a.&i.  NB. index within J's ascii alphabet, minus 96.
                                               NB. gives index within english alphabet
   (1 =                         )              NB. does 1 equal...
   (    [: */                   )              NB. the product of...
   (                    #&,     )              NB. Flatten the left and right args, and then copy
   (                        +./~)              NB. right arg = a table of cross product GCDs
   (          -.@=@i.@#         )              NB. the complement of the identity matrix.
                                               NB. this removes the diagonal.

온라인으로 사용해보십시오!


[:(1=[:*/+./~#&,~#\~:/#\)_96+a.&i.을위한 34 바이트 당신은`1 = ':)에 공백이 있었다
갈렌 이바노프

1
감사합니다 @GalenIvanov
Jonah


3

젤리 , 11 바이트

ŒcO_96g/€ỊẠ

온라인으로 사용해보십시오!

  • 부울에 주목 해 주신 Dennis에게 감사합니다

ŒcO_96g/€ỊẠ
Œc           All pairs of characters without replacement
  O          Code point of each character
   _96       Subtract 96. a->1, b->2, etc.
        €    For each pair:
      g/       Get the greatest common denominator
         Ị   abs(z)<=1? If they are all 1 then this will give a list of 1s
          Ạ  "All". Gives 1 if they are coprime, 0 if not.

2
ỊẠ부울을 뒤집습니다.
Dennis

3

MATL , 10 바이트

96-YF&fdA&

그렇지 않으면 1coprime에 대한 출력 입니다 0.

온라인으로 사용해보십시오! 또는 모든 테스트 사례를 확인하십시오 .

설명

'man'예를 들어 입력 을 고려하십시오 .

96-  % Implicit input: string. Subtract 96 from (the codepoint of) each element
     % STACK: [13 1 14] 
YF   % Exponents of prime factoriation. Each number produces a row in the result
     % STACK: [0 0 0 0 0 1;
               0 0 0 0 0 0;
               1 0 0 1 0 0]
&f   % Two-output find: pushes row and column indices of nonzeros
     % STACK: [3; 3; 1], [1; 4; 6]
d    % Consecutive differences
     % STACK: [3; 3; 1], [3; 2]
A    % All: gives true if the array doesn't contain zeros
     % STACK: [3; 3; 1], 1
&    % Alternative in/out specification: the next function, which is implicit
     % display, will only take 1 input. So only the top of the stack is shown

3

마르코프 알고리즘에 의해 해석으로 이 메인 ( 474 484 463 바이트, 76 78 76 규칙)

a->
d->b
f->bc
h->b
i->c
j->be
l->bc
n->bg
o->ce
p->b
q->q
r->bc
t->be
u->cg
v->bk
x->bc
y->e
z->bm
cb->bc
eb->be
gb->bg
kb->bk
mb->bm
qb->bq
sb->bs
wb->bw
ec->ce
gc->cg
kc->ck
mc->cm
qc->cq
sc->cs
wc->cw
ge->eg
ke->ek
me->em
qe->eq
se->es
we->ew
kg->gk
mg->gm
qg->gq
sg->gs
wg->gw
mk->km
qk->kq
sk->ks
wk->kw
qm->mq
sm->ms
wm->mw
sq->qs
wq->qw
ws->sw
bb->F
cc->F
ee->F
gg->F
kk->F
mm->F
qq->F
ss->F
ww->F
b->
c->
e->
g->
k->
m->
q->
s->
w->
FF->F
TF->F
!->.
->!T

처음 17 개의 규칙은 다중성을 무시하고 "복합 문자"를 "프라임 문자"요소로 고려합니다. (예를 들어, 2의 거듭 제곱과 5의 거듭 제곱의 곱으로 20 개의 요소 tbe있기 때문입니다.)

다음과 같은 36 개의 규칙 (예 cb->bc:)은 결과 주요 요인을 정렬합니다.

다음 9 개의 규칙 (예 bb->F:)은 반복되는 소인수를로 대체 한 F다음 9 개의 규칙 (예 b->:)이 나머지 한 글자를 제거합니다.

이 시점에서 빈 문자열 또는 하나 이상의 Fs 문자열이 있고 마지막 규칙 은 시작 부분에 ->!Ta !T를 추가합니다 . 그런 다음 규칙 FF->FTF->F결과를 !T또는로 단순화하십시오 !F. 이 시점에서 !->.규칙이 적용되어 우리에게 제거 !하고 중단 하도록 지시합니다 : 코 T프라임 단어를 F반환하는 등.

(이 코드가 입력시 빈 문자열을 발생시키는 이전 버전의 버그를 지적한 bodqhrohro에게 감사합니다 a.)


1
도 제공합니다 TFa테스트 케이스.
bodqhrohro

@bodqhrohro 캐치 주셔서 감사합니다! (내가 두 바이트로 모든 줄 바꿈을 계산 깨달았다 때문에 결국, 내 바이트 수는 내려 갔다.)
미샤 라브 로프


2

레티 나 0.8.2 , 45 바이트


;
{`\w
#$&
}T`l`_l
M`;(##+)\1*;(#*;)*\1+;
^0

온라인으로 사용해보십시오! 설명:


;

각 문자 사이와 시작과 끝 사이에 구분 기호를 삽입하십시오.

{`\w
#$&

#각 문자 앞에 a 를 붙 입니다.

}T`l`_l

as를 삭제하고 각 문자 1을 알파벳으로 다시 이동하십시오 . 그런 다음 모든 문자가 삭제 될 때까지 위의 작업을 반복하십시오. 그러면 각 문자가 단항의 1 기반 알파벳 색인으로 변환됩니다.

M`;(##+)\1*;(#*;)*\1+;

두 값이 1보다 큰 공약수를 공유하는지 테스트합니다 (예 : 단어에서 공약수를 가진 둘 이상의 문자 쌍을 찾을 수 있음 yearling).

^0

공통 요인이 없는지 확인하십시오.


2

R + pracma 라이브러리, 75 바이트

function(w){s=utf8ToInt(w)-96;all(apply(outer(s,s,pracma::gcd),1,prod)==s)}

내 지식 gcd에 관해서는 pracma라이브러리에 함수를 사용하고 있습니다 .R에는 내장 기능이 없습니다. 나는 gcd의 곱을 숫자 자체와 비교하는 접근법을 사용하고 있습니다.

65 바이트 (신용 : @ J.Doe)

function(w)prod(outer(s<-utf8ToInt(w)-96,s,pracma::gcd))==prod(s)


1

apt , 14 바이트

;à2 e_®nR+CÃrj

온라인으로 사용해보십시오!

문자 배열로 입력을받습니다.

작동 원리

;à2 e_m_nR+C} rj
;                 Use alternative predefined variables (in this case, C = "a-z")
 à2               Get all pairs
    e_            Does all pairs satisfy that...
      m_            when the character pair is mapped over...
        nR+C}         conversion from "a-z" to [1..26]
              rj    then the two numbers are coprime?


1

자바 10, 86 바이트

a->{var r=1>0;for(int i=1,s=0;++i<24;r&=s<2,s=0)for(var c:a)s+=c%96%i<1?1:0;return r;}

@Vincent 의 Python 3 답변 포트 .

온라인으로 사용해보십시오.

설명:

a->{                 // Method with character-array parameter and boolean return-type
  var r=1>0;         //  Result-boolean, starting at true
  for(int s=0,       //  Sum integer, starting at 0
      i=1;++i<24     //  Loop `i` in the range (1, 24)
      ;              //    After every iteration:
       r&=s<2,       //     If the sum is >= 2: change the result to false
       s=0)          //     And reset the sum to 0
     for(var c:a)    //   Inner loop over the input-characters
       s+=c%96%i<1?  //    If the current character modulo-96 is divisible by `i`
           1         //     Increase the sum by 1
          :          //    Else
           0;        //     Leave the sum the same
  return r;}         //  Return the result-boolean


0

q, 121111 바이트

{$[1=count x;1b;1b=distinct{r:{l:{$[0~y;:x;.z.s[y;x mod y]]}[y;]'[x];2>count l where l<>1}[x;]'[x]}[1+.Q.a?x]]}


0

Stax , 16 바이트

è'B╕i4à!ùà╫æor4Z

실행 및 디버깅

설명

2S{M{$e96-mm{E:!m|A     #Full program, unpacked, implicit input
2S                      #Generate all combinations of size 2
  {       m             #Map for each element
   M                    #Split into size of 1 element
    {       m           #Map for each element
     $e                 #Convert to number
       96-              #Subtract 96
           {    m       #Map for each element
            E:!         #Explode array onto stack, are they coprime
                 |A     #Are all elements of array truthy

True의 경우 1을 출력하고 false의 경우 0을 출력합니다.

숫자 부분으로 변환하는 더 좋은 방법이있을 수 있지만 작동합니다.


Stax 작가는 여기에 있습니다. stax를 사용해 주셔서 감사합니다! 다음은 알고리즘을 사용하여 10 바이트로 묶는 프로그램입니다. 2SOF{96-F:!* 그것에 대해 더 알고 싶으면 알려주십시오. 첫 번째는 무료입니다!
재귀 적

@recursive Stax를 만들어 주셔서 감사합니다! 현재 제가 선택한 골프 언어입니다. 답변이 어떻게 작동하는지 확인할 수 있으며 앞으로 답변을 개선하기 위해 계속 노력해야합니다.
Multi

0

APL (NARS), 16 자, 32 바이트

{(×/p)=∧/p←⎕a⍳⍵}

이 사용 방법은 LCM () = × /을 사용했는데, 입력 배열이 충분히 길면 빠르지 만 오버플로합니다. 다른 대안 솔루션은 조금 느립니다.

{1=×/y∨y÷⍨×/y←⎕a⍳⍵} 
{1=≢,⍵:1⋄1=×/{(2⌷⍵)∨1⌷⍵}¨{x←97-⍨⎕AV⍳⍵⋄(,x∘.,x)∼⍦x,¨x}⍵}

아래의 함수는 위의 함수보다 10 배 빠릅니다 (또는 +)

∇r←h m;i;j;k;v
   r←i←1⋄k←≢v←97-⍨⎕AV⍳m
A: →F×⍳i>k⋄j←i+1⋄→C
B:   →E×⍳1≠(j⌷v)∨i⌷v⋄j←j+1
C:   →B×⍳j≤k
D: i←i+1⋄→A
E: r←0
F:
∇

더 쉽고 빠르며 신뢰할 수 있으며 (오버플로 가능성이 적기 때문에) 작성하기 쉽고 어떻게 해야하는지 (몇 바이트가 더 있더라도)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.