Це слово coprime?


18

Давши слово, поводьтеся з кожною буквою як з цифрою в англійському алфавіті (так вона aстає 1, bстає 2, zстає 26 тощо) і перевірте, чи всі вони, включаючи дублікати, є парними одночасними .

Введено рівно одне слово з малих англійських букв. Вихідним є факт, якщо слово є одночасним: будь-які значення truthy / falsey, але лише два їх варіанти. Стандартні лазівки заборонені.

Тестові приклади:

  • man: True
  • day: True(спасибі Ørjan Johansen)
  • led: False( l=12і d=4є gcd=4)
  • mana: True(хоча aтрапляється декілька разів, 1 і 1 є копримами)
  • mom: False( gcd(13,13)=13))
  • of: False(завдяки xnor; хоча 15∤6, gcd(15,6)=3)
  • a: True(якщо немає пар букв, трактуйте це слово також як копрієм)

Це , тому найкоротший код у байтах виграє!


1
Чи можемо ми вивести, 0якщо вони є одночасними, а 1якщо ні?
ділнан

2
Запропонований тестовий випадок, який би day: True
Ørjan Johansen

1
Я б також запропонував of: Falseпомилковий приклад, коли жодне значення не є кратним іншому.
xnor

@dylnan ні, це суттєво інтуїтивно. Так чи інакше, відповідь Деніса краще ;-)
bodqhrohro

@LuisMendo будь-яка тритуга / фальси, але лише дві.
bodqhrohro

Відповіді:


12

Мова Вольфрама (Mathematica) , 36 байт

CoprimeQ@@LetterNumber@Characters@#&

Спробуйте в Інтернеті!


Мова Вольфрама (Mathematica) , 33 байти

CoprimeQ @@ (ToCharacterCode @ # - 96) &

Спробуйте в Інтернеті!


1
CoprimeQ@@(ToCharacterCode@#-96)&на три байти коротше.
Міша Лавров

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

Піт просто перевершив Джеллі?



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

Чи Θдійсно необхідний фінал ?
Містер Xcoder

@ Mr.Xcoder: Ні, я гадаю, що ні. Я просто припустив, що нам потрібно використовувати 2 дістриктних значення, але тепер, коли я дивлюся, нічого в цьому не виникає. Тоді Truthy / Falsy має бути гаразд.
Емінья

@Emigna Я додав пояснення до цього: має бути лише два варіанти вихідних значень.
bodqhrohro

@bodqhrohro: Гаразд. Я повернувся до попередньої версії, щоб відповідати цій новій вимозі.
Емінья


4

Python 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хоча?
Вінсент

4

Python 3 , 61 59 байт

Використання байтів python в якості аргументу:

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

Останній перевіряючий дільник - 23, найбільший простір нижче 26.

Спробуйте в Інтернеті!

Дякуємо @Dennis за збереження двох байтів.


3
c%96%x<1for c in sекономить 2 байти.
Денніс

4

Perl 6 , 34 32 байти

-2 байти завдяки nwellnhof

{[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 байт)
Conor O'Brien

@ ConorO'Brien Ні, ви тільки що відображається aна 0LOL
Джо Кінгу

@JoKing oh, ok lol
Conor O'Brien

Ця стратегія була глючить, тест: 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

JavaScript (Node.js) , 60 байт

f=(s,v=23)=>n=v<2||f(s,v-1)&&Buffer(s).every(c=>c%32%v||n--)

Спробуйте в Інтернеті!


62 байти , проходячи рекурсивно та використовуючи every(c=>c%32%v||n--,n=1).
Арнольд

@Arnauld Дякую І я пограв у нього ще 2 байти.
tsh

3

Желе , 11 байт

ŒcO_96g/€ỊẠ

Спробуйте в Інтернеті!

  • Дякую Деннісу за те, що зауважив мої буліни

Œ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
ỊẠперевертає булеви.
Денніс

3

MATL , 10 байт

96-YF&fdA&

Виходи 1для копрімусу, в 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

Алгоритм Маркова, інтерпретований eMain ( 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 правил розбивають «складені літери» на їхні «прості літери», не враховуючи кратності. (Наприклад, tстає beз - за 20 факторів , як добуток ступеня 2 і потужністю 5.)

Наступні 36 правил (такі як cb->bc) сортують отримані основні фактори.

Наступні 9 правил (такі як bb->F) замінюють повторний простий коефіцієнт на F, тоді ще 9 правил (наприклад b->) позбудуться решти однієї літери.

На даний момент у нас або є порожній рядок, або рядок одного або декількох Fs, і останнє правило ->!Tдодає a !Tна початку. Потім правила FF->Fі TF->Fспростіть результат до !Tабо !F. У цей момент діє !->.правило, яке говорить нам позбутися !та зупинитись: повертаючись Tза словосполученням та Fінше.

(Дякуємо bodqhrohro за вказівку на помилку в попередній версії, яка спричинила, що цей код дасть порожній рядок на вході a.)


1
Не дає Tні Fна aтест.
bodqhrohro

@bodqhrohro Дякую за улов! (Врешті-решт мій байт зменшився, тому що я зрозумів, що рахую кожну нову лінію як два байти.)
Міша Лавров


2

Сітківка 0.8.2 , 45 байт


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

Спробуйте в Інтернеті!Пояснення:


;

Вставте роздільники між кожною буквою та на початку та в кінці.

{`\w
#$&

Додайте #до кожної літери а.

}T`l`_l

Перемістіть кожну букву 1 назад в алфавіті, видаливши as. Потім повторіть описані вище операції, поки всі букви не будуть видалені. Це перетворює кожну букву в її 1-індекс алфавіту в одинаковий.

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

Перевірте, чи мають два значення спільний коефіцієнт, більший за 1. (Тут можна знайти більше однієї пари літер із загальним фактором, наприклад у слові yearling.)

^0

Перевірте, чи не знайдено загальних факторів.


2

R + пракма бібліотека, 75 байт

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

Я використовую gcdфункцію вpracma бібліотеці, оскільки, наскільки мені відомо, R не має для цього вбудованої. Я використовую підхід порівняння добутку gcds з самими числами.

65 байт (кредит: @ J.Doe)

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


1

Japt , 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

Java 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 's 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, 121 111 байт

{$[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

Стакс , 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

Виходи 1 для True, 0 для false.

Мабуть, є кращий спосіб зробити перетворення на числову частину, але це працює.


Автор Стакса тут. Дякуємо, що спробували stax! Ось програма, що використовує ваш алгоритм, що пакує до 10 байт. 2SOF{96-F:!* Повідомте мене, якщо ви хочете дізнатися більше про це. Перший - безкоштовно!
рекурсивний

@recursive Дякую, що ви створили Stax! Наразі це моя мова для гольфу на вибір. Я бачу, як працює ваша відповідь, і мені доведеться продовжувати працювати над покращенням своїх відповідей у ​​майбутньому.
Мульти

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:
∇

я вважаю за краще це останнє, тому що це легше, швидше, довіряється (бо менше менше можливостей переповнення), простіше писати і як це має бути (навіть якщо у нього є кілька байт більше ...)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.