Добре пов'язаний виклик


40

Діяльність, яку я іноді роблю, коли мені нудно, - це написати пару персонажів, що відповідають парам. Потім я малюю лінії (на вершинах ніколи внизу), щоб з'єднати ці символи. Наприклад, я можу написати і тоді я намалювала б рядки як:abcbac

Перша посилання

Або я можу написатиabbcac

Друга ланка

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

Намальована петля

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

Зауважте, що деякі рядки можна намалювати декількома способами. Наприклад, може бути намальований обома наступними способами (і третій не входить):bbbb

Шлях 1 або Шлях 2

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

Завдання

Ваше завдання - написати програму для визначення рядків, які добре пов’язані. Ваш вхід буде складатися з рядка, де кожен символ відображається парним числом разів, а ваш висновок повинен бути одним з двох чітких послідовних значень, одне, якщо рядки добре пов'язані, а інше - інакше.

Крім того, ваша програма повинна мати добре пов'язане значення рядка

  • Кожен символ відображається рівною кількістю разів у вашій програмі.

  • Він повинен виводити значення "truthy", коли він передається сам.

Ваша програма повинна бути в змозі створити правильний вихід для будь-якого рядка, що складається з символів з друкованого ASCII або вашої власної програми. З кожним символом з’являється рівномірна кількість разів.

Відповіді будуть оцінені як їх довжина в байтах, менша кількість байтів - краща оцінка.

Підказка

Рядок недостатньо пов'язаний, якщо існує суцільна непорожня сувора підрядка, така що кожен символ з’являється парною кількістю разів у цій підрядці.

Випробування

abcbac -> True
abbcac -> False
bbbb -> False
abacbc -> True
abcbabcb -> True
abcbca -> False

1
Тестовий приклад: abcbca -> False.
Ørjan Johansen

Я думаю, що ваш натяк містить зайве there.
Джонатан Фрех

2
Тож, щоб було зрозуміло: чи рядка має загальну парну кількість кожного символу, не має значення, чи це добре пов'язана рядок. Ця вимога стосується лише вихідного коду програм. Це, звичайно, лише питання семантики, оскільки програмам може бути визначено поведінку для введених рядків, що мають непарну загальну кількість будь-яких символів (і принаймні одна подана програма користується цим).
Deadcode

Які види символів можуть бути у вхідних даних?
xnor

@xnor Я додав це до виклику. Сподіваємось, що це очистить.
Пшеничний майстер

Відповіді:


19

Regex (ECMAScript 2018 або .NET), 140 126 118 100 98 82 байт

^(?!(^.*)(.+)(.*$)(?<!^\2|^\1(?=(|(<?(|(?!\8).)*(\8|\3$){1}){2})*$).*(.)+\3$)!?=*)

Це набагато повільніше, ніж версія 98 байтів, тому що ^\1ліворуч від області пошуку і, таким чином, оцінюється після неї. Дивіться нижче простий комутатор, який відновлює швидкість. Але завдяки цьому два TIO нижче обмежуються виконанням меншого набору тестових випадків, ніж раніше, і .NET один занадто повільний, щоб перевірити власний вираз.

Спробуйте в Інтернеті! (ECMAScript 2018)
Спробуйте в Інтернеті! (.NET)

Щоб скинути 18 байт (118 → 100), я безсоромно вкрав дійсно приємну оптимізацію з регексу Ніла, що дозволяє уникнути необхідності вводити лукаголовку всередині негативного вигляду позаду (отримуючи 80-байтний необмежений регулярний вираз). Дякую, Ніл!

Це стало застарілим, коли він скинув неймовірні ще 16 байт (98 → 82) завдяки ідеям jaytea , що призвело до необмеженого регулярного виразка в 69 байт! Це набагато повільніше, але це гольф!

Зауважте, що (|(відсутність можливостей для того, щоб зробити регулярно виражене з'єднання добре пов’язане, це призвело до того, що він дуже повільно оцінюється за .NET. Вони не мають такого ефекту в ECMAScript, оскільки додаткові збіги з нульовою шириною трактуються як не збіги .

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

Без зайвих символів, необхідних для проходження обмежень ( 101 69 байт):

^(?!(.*)(.+)(.*$)(?<!^\2|^\1(?=((((?!\8).)*(\8|\3$)){2})*$).*(.)+\3))

Це повільно, але ця проста редакція (всього на 2 зайвих байта) повертає всю втрачену швидкість і більше:

^(?!(.*)(.+)(.*$)(?<!^\2|(?=\1((((?!\8).)*(\8|\3$)){2})*$)^\1.*(.)+\3))

^
(?!
    (.*)               # cycle through all starting points of substrings;
                       # \1 = part to exclude from the start
    (.+)               # cycle through all ending points of non-empty substrings;
                       # \2 = the substring
    (.*$)              # \3 = part to exclude from the end
    (?<!               # Assert that every character in the substring appears a total
                       # even number of times.
        ^\2            # Assert that our substring is not the whole string. We don't
                       # need a $ anchor because we were already at the end before
                       # entering this lookbehind.
    |                  # Note that the following steps are evaluated right to left,
                       # so please read them from bottom to top.
        ^\1            # Do not look further left than the start of our substring.
        (?=
            # Assert that the number of times the character \8 appears in our
            # substring is odd.
            (
                (
                    ((?!\8).)*
                    (\8|\3$) # This is the best part. Until the very last iteration
                             # of the loop outside the {2} loop, this alternation
                             # can only match \8, and once it reaches the end of the
                             # substring, it can match \3$ only once. This guarantees
                             # that it will match \8 an odd number of times, in matched
                             # pairs until finding one more at the end of the substring,
                             # which is paired with the \3$ instead of another \8.
                ){2}
            )*$
        )
        .*(.)+         # \8 = cycle through all characters in this substring
        # Assert (within this context) that at least one character appears an odd
        # number of times within our substring. (Outside this negative lookbehind,
        # that is equivalent to asserting that no character appears an odd number
        # of times in our substring.)
        \3             # Skip to our substring (do not look further right than its end)
    )
)

Я написав це, використовуючи молекулярний lookahead ( 103 69 байт), перш ніж перетворити його на вигляд змінної довжини позаду:

^(?!.*(?*(.+)(.*$))(?!^\1$|(?*(.)+.*\2$)((((?!\3).)*(\3|\2$)){2})*$))

^
(?!
    .*(?*(.+)(.*$))       # cycle through all non-empty substrings;
                          # \1 = the current substring;
                          # \2 = the part to exclude from the end
    (?!                   # Assert that no character in the substring appears a
                          # total even number of times.
        ^\1$              # Assert that our substring is not the whole string
                          # (i.e. it's a strict substring)
    |
        (?*(.)+.*\2$)    # \3 = Cycle through all characters that appear in this
                          # substring.
        # Assert (within this context) that this character appears an odd number
        # of times within our substring.
        (
            (
                ((?!\3).)*
                (\3|\2$)
            ){2}
        )*$
    )
)

І щоб допомогти зробити свій регекс добре пов’язаним, я використовував варіацію вищевказаного регексу:

(?*(.+)(.*$))(?!^\1$|(?*(.)+.*\2$)((((?!\3).)*(\3|\2$)){2})*$)\1

Якщо використовується з regex -xml,rs -o, це визначає сувору підрядку вводу, яка містить парне число кожного символу (якщо такий існує). Звичайно, я міг би написати програму, що не піддається регексу, щоб зробити це для мене, але де було б у цьому задоволення?


8
wtf це все ще гольф
лише ASCII

@ ASCII тільки і досі гольфують ...
Квінтек

11

Желе, 20 байт

ĠẈḂẸẆṖÇ€Ạ
ĠẈḂẸ
ẆṖÇ€Ạ

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

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

Наступний рядок спочатку Ġоббиває індекси за їх значенням. Якщо ми тоді візьмемо довжину кожного підсписку в отриманому списку ( ), отримаємо кількість разів, коли кожен символ з'явиться. Щоб перевірити, чи є будь-яке з них не парним, ми отримуємо останнє значення кожного числа і запитуємо, чи існує xists істинне (ненулеве) значення.

Отже, це допоміжне посилання повертає те, чи не може бути підрядку обведено.

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


Так, так, це було б і моїм рішенням, але, на жаль, це нудно ... :(
Erik the Outgolfer

8

J , 34 байти

2:@':.,|~*'>1(#.,)*/@(1>2|#/.~)\.\

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

-8 байт завдяки FrownyFrog

оригінальний

J , 42 байти

(*#'.,012&|@~#')=1#.[:,([:*/0=2&|@#/.~)\.\

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

пояснення

(*#'.,012&|@~#') = 1 #. [: , ([: */ 0 = 2&|@#/.~)\.\

(*#'.,012&|@~#')                                       NB. this evaluates to 1
                                                       NB. while supplying extra
                                                       NB. chars we need.  hence...
                 =                                     NB. does 1 equal...
                   1 #.                                NB. the sum of...
                        [: ,                           NB. the flatten of...
                             (                  )\.\   NB. the verb in parens applied
                                                       NB. to every suffix of every
                                                       NB. prefix, ie, all contiguous 
                                                       NB. substrings
                             ([: */ 0 = 2&|@#/.~)      NB. def of verb in paren:
                                             /.~       NB. when we group by each
                                                       NB. distinct char...
                              [: */                    NB. is it the case that
                                                       NB. every group...
                                           @#          NB. has a length...
                                    0 = 2&|            NB. divisible by 2...

1
@Deadcode Оскільки обробка, що означає тестування протилежного тесту для всієї строки, як і для будь-якої іншої підрядки, здається безпечною ставкою, що більшість рішень залишить це поза. Тестуючи abc, лише запис Perl не "провалюється" на ньому. (Однак у нього є й інші проблеми.)
Ørjan Johansen

1
@ ØrjanJohansen Ви неправильно зрозуміли. Я сказав, що рядки з непарною загальною кількістю будь-якого символу (який дискваліфікує лише вихідний код програми, а не добре пов'язані рядки) можуть бути добре пов'язані, і ця програма повертає фальси для деяких з цих добре пов'язаних рядків. Питання прямо дозволяє це невизначене поведінку, тому програма діє. Джона, я думаю, що це дійсно цікаво, що твоя програма робить це, і я захоплююсь тим, що ти придумав метод, який працює таким чином. Я б хотів пояснення. Цей вид програмування мені абсолютно чужий, тому я не розумію коментарів та коду.
Deadcode

1:@':.,02|~*'=1(#.,)*/@(0=2|#/.~)\.\
FrownyFrog

1
2:@':.,|~*'>1(#.,)*/@(1>2|#/.~)\.\також здається дійсним
FrownyFrog

6

Python 3.8 (передвипуск) , 66 байт

lambda l,b={id}:len({str(b:=b^{c})for(c)in l})<len(l)#,<^fmnost{}#

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

Ера вираження призначень на нас. Якщо PEP 572 включений у Python 3.8, гольф ніколи не буде таким самим. Ви можете встановити тут попередній попередній перегляд розробника 3.8.0a1 .

Вирази присвоєння дозволяють використовувати :=для присвоєння змінної вбудовану лінію під час оцінки цього значення. Наприклад, (a:=2, a+1)дає (2, 3). Це, звичайно, можна використовувати для зберігання змінних для повторного використання, але тут ми йдемо на крок далі і використовуємо їх як акумулятор у розумінні.

Наприклад, цей код обчислює сукупні суми [1, 3, 6]

t=0
l=[1,2,3]
print([t:=t+x for x in l])

Зверніть увагу, як при кожному проходженні розуміння списку сукупна сума tзбільшується на, xа нове значення зберігається у списку, отриманому за допомогою розуміння.

Аналогічно b:=b^{c}оновлює набір символів, bщоб увімкнути, чи не містить він символів c, і оцінить нове значення b. Таким чином, код [b:=b^{c}for c in l]перебирає символи cв lі накопичує набір символів бачили непарну кількість разів у кожному непорожньої префікс.

Цей список перевіряється на дублікати, роблячи його зрозумілим набором і перевіряючи, чи не менша його довжина s, а значить, деякі повтори були згорнуті. Якщо так, то повторення означає, що в частині sперегляду між цими часами кожен символ зустрічає парне число чисел, що робить рядок непов'язаним. Python не дозволяє наборам наборів бути незмінними, тому внутрішні набори замість цього перетворюються на рядки.

Набір bініціалізується як необов'язковий аргумент і успішно змінюється в області функцій. Я хвилювався, що це зробить функцію не повторною для використання, але вона, схоже, скине між прогонами.

Для обмеження джерела непарні парні символи заповнюються в коментарі наприкінці. Написання, for(c)in lа не for c in lскасування зайвих паролів безкоштовно. Ми вкладаємо idв початковий набір b, який є нешкідливим, оскільки він може починатися як будь-який набір, але порожній набір не може бути записаний так, {}тому що Python складе порожній словник. Оскільки букви iі dсеред тих , хто потребує спаровування, ми можемо поставити функцію idтам.

Зауважте, що код виводить заперечені булеви, тому він буде правильно віддавати Falseсебе.



5

Python 2 , 74 байти

bmn0=f=lambda s,P={0},d=[]:s<" "if(P in d)else+f(s[f<s:],P^{s[0^0]},[P]+d)

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

Ітератується через рядок, відслідковуючи Pнабір символів, що бачились непарне число разів. У списку dзберігаються всі минулі значення P, і якщо бачити поточне Pвже в d, це означає, що в символах, побачених з того часу, кожен символ з'являвся парним числом разів. Якщо так, перевірте, чи ми пройшли весь вхід: якщо є, прийміть, оскільки вся рядок є парним, як очікувалося, інакше відхиліть.

Тепер про обмеження джерела. Персонажі, які потребують спарювання, набиваються в різні нешкідливі місця, підкреслені нижче:

bmn0=f=lambda s,P={0},d=[]:s<" "if(P in d)else+f(s[f<s:],P^{s[0^0]},[P]+d)
_____              _              _      _    _    ___        ___    

У f<sприймає значення в 0той час як на пари f, скориставшись ім'ям функції також бути fтак , що вона визначається (за часом функція називається) . В 0^0поглинає ^символ.

0В P={0}невдало: в Python {}обчислюється в порожній Словнику , а не порожня множина , як ми хочемо, і тут ми можемо поставити в будь-якому елементі несімвольного і буде нешкідливими. Я не бачу нічого запасного для введення, але вклав 0і скопіював це bmn0, коштувавши 2 байти. Зауважте, що початкові аргументи оцінюються, коли функція визначена, тому змінні, які ми визначаємо самі, сюди не можна вводити.


4

Perl 6 , 76 байт

*.comb[^*X+(^*).map(^*)].grep({$_&[&]($_)}).none.Bag{*}.none%2#*^+XBob2rec%#

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

Яка б лямбда не повертала None Junction of None Junctions, який може бути збільшений до значення truthy / falsey. Я б рекомендував не видаляти те, ?що підсилює результат повернення, інакше вихід стає досить великим .

Це рішення є трохи більш складним , ніж це необхідно, з - за кількох залученими функції будучи непов'язаними, наприклад .., all, >>, і %%т.д. Без обмежень джерела, це може бути 43 байта:

*.comb[^*X.. ^*].grep(?*).one.Bag{*}.all%%2

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

Пояснення:

*.comb                     # Split the string to a list of characters
      [^*X+(^*).map(^*)]   # Get all substrings, alongside some garbage
                        .grep({$_&[&]($_)})        # Filter out the garbage (empty lists, lists with Nil values)
                                           .none                 # Are none of
                                                .Bag{*}          # The count of characters in each substring
                                                       .none%2   # All not divisible by 2

                                               #*^+XBob2rec%#    And garbage to even out character counts

3

Perl 5 -p, 94, 86, 78 байт

m-.+(?{$Q|=@q&grp,$\|=$&eq$_^!grep+/^/&(@m=$g=~/\Q$_/g),($g=$&)=~/./g})(?!)-}{

ouput 0, якщо добре пов'язаний 1 в іншому випадку.

78 байт

86 байт

94 байти

Як це працює

  • -pіз }{закінчуючим трюком для виведення $\в кінці
  • m-.+(?{.. })(?!)-, виконувати код над усіма непустими підрядками ( .+спочатку відповідає всій рядку, а після виконання коду між (?{.. })зворотними треками через невдале примусове(?!)
  • $Q|=@q&grp, сміття через обмеження джерела
  • $\|=ціле побітове чи присвоєння, якщо є майже один 1, $\буде 1 (вірно), за замовчуванням воно порожнє (помилкове)
  • $&eq$_випадок, коли sbustring - це цілий рядок, є побітовим способом, ^з "без випадкового виникнення символів"
  • ($g=$&)=~/./gскопіювати відповідну підрядку в $g(тому що вона буде перезаписана після наступного збігу регулярних виразів) і повернути масив символів підрядки.
  • /^/ сміття, яке оцінюється до 1
  • grep1 &(@m=$g=~/\Q$_/g),для кожного символу в підрядку отримують масив символів у $gвідповідності собі, масив у скалярному оцінює його розмір і grepфільтрує символи з непарною появою 1&xеквівалентноx%2==1

Я не думаю, що це задовольняє обмеження джерела: я рахую непарну кількість відкритих дужок, наприклад
msh210

@ msh210 Не в цьому справа? Якщо є парне число, воно непогано пов'язане
Quintec

@Quintec Однією з вимог , що пред'являються до бути добре пов'язані, що є є парне число кожного символу.
Ørjan Johansen

у моєї першої відповіді була вимога, але після спроби гольфу я її втратила. оновлено, але може бути в гольф.
Nahuel Fouilleul

1
всі джерела тут задовольняють обмеження джерела, також код повертає 0, якщо добре пов'язане і парне число кожного символу
Nahuel Fouilleul

3

Сітківка , 150 96 байт

^(?!(.*)(.+)(.*)$(?<!^\2|^\1(?:(^?(?:(?!\6).)*\6){2})*(|(?!\6).)*(?!.+\6.*\3$)(.){1,}\3)(?!,<)?)

Спробуйте в Інтернеті! Посилання включає тестові випадки, включаючи і себе. Редагувати: Поле оригінального регулярного виразів якимось чином помітив за допомогою @Deadcode, потім підклав резервну копію трохи менш екстравагантно, щоб зберегти макет джерела. Пояснення:

^(?!(.*)(.+)(.*)$

Стверджуйте, що не \3існує підрядки , яка б відповідала наступним обмеженням.

(?<!^\2|

Стверджуйте, що підрядка - це не весь початковий рядок.

^\1(?:(^?(?:(?!\6).)*\6){2})*(|(?!\6).)*(?!.+\6.*\3$)(.){1,}\3)(?!,<)?)

Стверджуйте, що немає символу \6такого:

  • він не відображається між самим символом (ексклюзивним) та кінцем підрядкової
  • вона з’являється рівною кількістю разів між початком підрядки і самим собою (виключно)

Для того, щоб передати обмеження макета джерела, я замінив ((((на (?:(^?(?:(і ((з (|(. Я ще одне джерело обмеження ))вліво і символи !()1<{}залишилися, так що я змінився +в {1,}і вставив даремні (?!,<)?споживати інше.


2
Це, здається, не відповідає обмеженим вимогам до джерела.
Ørjan Johansen

@ ØrjanJohansen Нарешті, я придумав правильне рішення. Хоча там багато сміття, тож може бути щось коротше ...
Ніл

3

C # (Visual C # Interactive Compiler) , 208 206 200 198 байт

x=>!x.GroupBy(c=>c).Any(g=>g.Count()%2>0)&!Enumerable.Repeat(x.Count,x.Count*x.Count).Where(
(l,i)=>i%l>0&!x.Skip(i/l).Take(i%l).GroupBy(c=>c).Any(g=>g.Count()%2>0)
).Any()/*>!oyAnC0EmeablR*WhiS/T*/

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

-2 байти завдяки @KevinCruijssen!

Нарешті отримав його нижче 200, тож я зараз можу займатися гольфом :) Я в кінцевому підсумку створив другий ТІО для тестування речей на основі попередньої відповіді.

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

Те, що зробило це завдання складним:

  • Оператор рівності ==заборонений
  • Оператор збільшення / призначення ++не був дозволений
  • All()Функція Linq заборонена

Коментований код нижче:

// anonymous function that takes an IList as input
x=>
  // the first condition makes sure the string even
  // counts of each character
  !x.GroupBy(c=>c).Any(g=>g.Count()%2>0)&
  // the second condition generates all proper substrings of x
  // and tests for any that contain even character counts
  // the string length `l` is repeated `l*l` times
  !Enumerable.Repeat(x.Count,x.Count*x.Count)
    .Where((l,i)=>
      // check that the substring length is greater than 0
      i%l>0&
      // use skip/take to generate a substring
      // and check for a character count thats odd
      // negate the result meaning we have found
      // a substring that invalidates the input
      !x.Skip(i/l).Take(i%l)
        .GroupBy(c=>c).Any(g=>g.Count()%2>0)
    )
    // if any invalid substrings are found
    // then the result in invalid
    // the comment string at the end is needed
    // to make the program well-linked
    .Any()/*>!oyAnC0EmeablR*WhiS/T*/

Ви можете видалити два пробіли у своєму останньому коментарі.
Кевін Круїссен

@KevinCruijssen - хороший :) Я забув, що вже додав пробіл. Мені довелося кинути ще одне у джерело.
дата


2

Брахілог , 16 байт

sᶠb∋p~j&sᶠb∋p~j&

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

Принти false.для правдивих екземплярів та фальшивих true.примірників. Версія TIO занадто повільна, щоб впоратися, але вона чітко пов'язана, оскільки це рядок з унікальними символами, повтореними двічі.

Пояснення

    Input is a string: "abcacbaa"
sᶠ  Find all substrings: ["abcacbaa","abcacba","abcacb",..,"a"]
b   Behead (now the proper substrings remain): ["abcacba","abcacb",..,"a"]
∋   Take one of them: "abcacb"
p   Permute it: "abcabc"
~j  It is some string repeated twice: "abc"
&   Get the input again: "abcacbaa"
    Then repeat the above.
    If the constraints can be satisfied, the result is true, otherwise false.

1

05AB1E , 22 20 байт

Œε¢Pà}KŒIKεSIS¢ÈP}àÈ

Виводиться, 1якщо рядок добре зв'язаний і 0якщо рядок недостатньо пов'язаний.

Спробуйте його в Інтернеті або перевірити всі тестові випадки .

Пояснення:

Базовою програмою є ŒsKεsS¢ÈP}à( 11 байт ), яка виводить, 0якщо добре зв'язана і 1якщо не добре пов'язана. Поздовжній È(is_even) є напів-оп немає , що інвертує вихідний, тому 1для добре пов'язаних рядків і 0для НЕ дуже добре пов'язаних рядків. Інші частини не відповідають вимогам правил виклику.

Œε¢Pà}K         # No-ops: substrings, map, count, product, maximum, close map, remove
                # Due to the last remove, we're back at the (implicit) input again
Œ               # Take the substrings of the input
 IK             # Remove the input itself from that list of substrings
   ε            # Map each substring to:
    S           #  No-op: transform the substring into a list of characters
     IS         #  Get the input-string as a list of characters
       ¢        #  Count the occurrence of each character in the current substring
        È       #  Check which counts are even (1 if truthy; 0 if falsey)
         P      #  Take the product of that
              # After the map: check if any are truthy by taking the maximum
            È   # Semi no-op: check if this maximum is even (0 becomes 1; 1 becomes 0)
                # (and output the result implicitly)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.