Занятие, которое я иногда выполняю, когда мне скучно, состоит в написании пары символов в соответствующих парах. Затем я рисую линии (поверх вершин, никогда не ниже), чтобы соединить этих персонажей. Например, я мог бы написать и затем нарисовать линии так:
Или я мог бы написать
После того, как я нарисовал эти линии, я пытаюсь нарисовать замкнутые петли вокруг кусков, чтобы моя петля не пересекала ни одну из линий, которые я только что нарисовал. Например, в первом случае мы можем нарисовать только один цикл вокруг всего, но во втором мы можем нарисовать цикл вокруг только s (или всего остального)
Если мы немного поэкспериментируем с этим, то обнаружим, что некоторые строки можно нарисовать только так, чтобы замкнутые циклы содержали все или ни одной буквы (как в нашем первом примере). Мы будем называть такие строки хорошо связанными строками.
Обратите внимание, что некоторые строки могут быть нарисованы несколькими способами. Например, можно нарисовать обоими из следующих способов (и третий не входит):
Если один из этих способов может быть нарисован так, что может быть выполнен замкнутый цикл, содержащий некоторые символы без пересечения какой-либо из линий, тогда строка не является хорошо связанной. (так что не очень хорошо связаны)
задача
Ваша задача - написать программу для идентификации строк, которые хорошо связаны между собой. Ваш ввод будет состоять из строки, где каждый символ появляется четное число раз, а ваш вывод должен быть одним из двух различных последовательных значений, одно, если строки хорошо связаны, а другое - иначе.
Кроме того, ваша программа должна быть хорошо связанной строкой, означающей
Каждый символ появляется четное количество раз в вашей программе.
Он должен вывести истинное значение, когда передал сам.
Ваша программа должна быть в состоянии произвести правильный вывод для любой строки, состоящей из символов из печатного ASCII или вашей собственной программы. С каждым персонажем появляется четное количество раз.
Ответы будут оцениваться как их длины в байтах с меньшим количеством байтов, что является лучшим показателем.
намек
Строка не является хорошо связанной, если существует непрерывная непустая строгая подстрока, так что каждый символ появляется четное число раз в этой подстроке.
Тестовые случаи
abcbac -> True
abbcac -> False
bbbb -> False
abacbc -> True
abcbabcb -> True
abcbca -> False
источник
abcbca -> False
.there
.Ответы:
Regex (ECMAScript 2018 или .NET),
1401261181009882 байта^(?!(^.*)(.+)(.*$)(?<!^\2|^\1(?=(|(<?(|(?!\8).)*(\8|\3$){1}){2})*$).*(.)+\3$)!?=*)
Это намного медленнее, чем 98-байтовая версия, потому что
^\1
слева от просмотра и, следовательно, оценивается после него. Смотрите ниже простое переключение, которое восстанавливает скорость. Но из-за этого два приведенных ниже TIO ограничены выполнением меньшего набора тестов, чем раньше, и .NET один слишком медленно проверяет свое регулярное выражение.Попробуйте онлайн! (ECMAScript 2018)
Попробуйте онлайн! (.СЕТЬ)
Чтобы отбросить 18 байт (118 → 100), я бесстыдно украл действительно хорошую оптимизацию из регулярного выражения Нейла, которая избавляет от необходимости помещать заглядывание внутрь отрицательного заднего обзора (в результате получается 80-байтовое неограниченное регулярное выражение). Спасибо тебе, Нил!
Это устарело, когда было отброшено еще 16 невероятных байтов (98 → 82) благодаря идеям jaytea , которые привели к 69-байтовому неограниченному регулярному выражению! Это намного медленнее, но это гольф!
Обратите внимание, что
(|(
отсутствие операций для обеспечения регулярного связывания регулярного выражения приводит к очень медленной оценке его в .NET. Они не имеют этого эффекта в ECMAScript, потому что необязательные совпадения нулевой ширины рассматриваются как несоответствия .ECMAScript запрещает квантификаторы утверждений, поэтому это усложняет требования к ограниченному источнику . Тем не менее, в этот момент игра в гольф настолько хороша, что я не думаю, что снятие этого конкретного ограничения откроет дальнейшие возможности для игры в гольф.
Без дополнительных символов, необходимых для того, чтобы он прошел ограничения (
10169 байт):^(?!(.*)(.+)(.*$)(?<!^\2|^\1(?=((((?!\8).)*(\8|\3$)){2})*$).*(.)+\3))
Это медленно, но это простое редактирование (всего 2 дополнительных байта) восстанавливает всю потерянную скорость и многое другое:
^(?!(.*)(.+)(.*$)(?<!^\2|(?=\1((((?!\8).)*(\8|\3$)){2})*$)^\1.*(.)+\3))
Я написал его с использованием молекулярного просмотра (
10369 байт), прежде чем преобразовать его в просмотр с переменной длиной:^(?!.*(?*(.+)(.*$))(?!^\1$|(?*(.)+.*\2$)((((?!\3).)*(\3|\2$)){2})*$))
И чтобы помочь сделать мое регулярное выражение хорошо связанным, я использовал вариант приведенного выше регулярного выражения:
(?*(.+)(.*$))(?!^\1$|(?*(.)+.*\2$)((((?!\3).)*(\3|\2$)){2})*$)\1
При использовании с
regex -xml,rs -o
, это идентифицирует строгую подстроку ввода, которая содержит четное число каждого символа (если таковой существует). Конечно, я мог бы написать программу без регулярных выражений, чтобы сделать это для меня, но где было бы в этом удовольствие?источник
Желе, 20 байт
Попробуйте онлайн!
Первая строка игнорируется. Это только для того, чтобы удовлетворить условию, что каждый символ появляется четное количество раз.
Следующая строка сначала
Ġ
группирует индексы по их значению. Если затем взять длину каждого подсписка в результирующем списке (Ẉ
), мы получим количество раз, которое появляется каждый символ. Чтобы проверить, являются ли какие-либо из них нечетными , мы получаем последнее значениеḂ
для каждого счетчика и спрашиваем, существуетẸ
ли истинное (ненулевое) значение.Следовательно, эта вспомогательная ссылка возвращает ли подстроку нельзя .
В основной ссылке мы берем все подстроки input (
Ẇ
),Ṗ
отключаем последнюю (чтобы мы не проверяли, можно ли обвести всю строку), и запускаем вспомогательную ссылку (Ç
) для€
подстроки ach. В результате получается, чтоẠ
все подстроки нельзя обвести.источник
J , 34 байта
Попробуйте онлайн!
-8 байт благодаря FrownyFrog
оригинал
J , 42 байта
Попробуйте онлайн!
объяснение
источник
abc
только запись Perl не «проваливается» на ней. (У него есть и другие проблемы.)1:@':.,02|~*'=1(#.,)*/@(0=2|#/.~)\.\
2:@':.,|~*'>1(#.,)*/@(1>2|#/.~)\.\
также кажется действительнымPython 3.8 (предварительная версия) , 66 байт
Попробуйте онлайн!
Эра Выражений Назначения на нас. С PEP 572, включенным в Python 3.8, игра в гольф никогда не будет прежней. Вы можете установить раннюю версию 3.8.0a1 для разработчиков здесь .
Выражения присваивания позволяют использовать
:=
для присваивания переменной inline при оценке этого значения. Например,(a:=2, a+1)
дает(2, 3)
. Это, конечно, может быть использовано для хранения переменных для повторного использования, но здесь мы идем на шаг дальше и используем их как накопитель в понимании.Например, этот код вычисляет кумулятивные суммы
[1, 3, 6]
Обратите внимание, что при каждом прохождении по списку накопленная сумма
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
сам себя.источник
Python 2 , 74 байта
Попробуйте онлайн!
Выполняет итерацию по строке, отслеживая
P
набор символов, видимых нечетное количество раз. В спискеd
хранятся все прошлые значенияP
, и, если текущее значениеP
уже указаноd
, это означает, что в символах, которые были видны с того времени, каждый символ появлялся четное число раз. Если это так, проверьте, прошли ли мы весь ввод: если у нас есть, примите, потому что вся строка спарена, как и ожидалось, и отклоните в противном случае.Теперь об ограничении источника. Персонажи, нуждающиеся в сопряжении, помещены в различные безобидные места, подчеркнутые ниже:
В
f<s
принимает значение в0
то время как на парыf
, воспользовавшись именем функции также бытьf
так , что она определяется (по времени функция называется) . В0^0
поглощает^
символ.0
ВP={0}
неудачно: в Python{}
вычисляется в пустой Словаре , а не пустое множество , как мы хотим, и здесь мы можем поставить в любом элементе несимвольного и будет безвредными. Я не вижу ничего лишнего, чтобы вставить, и вставил0
и продублировал этоbmn0
, стоя 2 байта. Обратите внимание, что начальные аргументы оцениваются, когда функция определена, поэтому переменные, которые мы определяем сами, не могут быть здесь вставлены.источник
Perl 6 , 76 байт
Попробуйте онлайн!
Любая лямбда, которая возвращает None Junction of None Junction, которая может быть увеличена до истинного / ложного значения. Я бы порекомендовал не удалять это,
?
что увеличивает возвращаемый результат, в противном случае вывод становится довольно большим .Это решение немного сложнее, чем нужно, из-за того, что несколько задействованных функций не связаны между собой, например
..
,all
,>>
, и%%
т.д. Без ограничений источника, это может быть 43 байта:Попробуйте онлайн!
Объяснение:
источник
Perl 5
-p
,94,86,78 байтOutput 0, если хорошо связан 1 в противном случае.
78 байт
86 байт
94 байта
Как это работает
-p
с}{
завершающим трюком для вывода$\
в концеm-.+(?{
..})(?!)-
, чтобы выполнить код над всей непустой подстрокой (.+
сначала совпадает со всей строкой, а после выполнения кода между(?{
...})
возвратами из-за принудительного сбоя(?!)
$Q|=@q&grp,
мусор из-за ограничения источника$\|=
целочисленное поразрядное или присваивание, если есть почти 1,$\
будет 1 (true), по умолчанию оно пустое (false)$&eq$_
случай, когда sbustring - целая строка, поразрядно записывается^
с "отсутствием нечетных символов"($g=$&)=~/./g
скопировать$g
совпавшую подстроку в (потому что она будет перезаписана после следующего совпадения с регулярным выражением) и вернуть массив символов подстроки./^/
мусор, который оценивается в 1grep
1&(@m=$g=~/\Q$_/g),
для каждого символа в подстроке получить массив символов в$g
соответствии самому себе, массив в скаляре оценивает его размер иgrep
фильтровать символы с нечетным вхождением1&x
эквивалентноx%2==1
источник
Сетчатка ,
15096 байтПопробуйте онлайн! Ссылка включает в себя тестовые случаи, в том числе и себя. Редактировать: с помощью @Deadcode отыграли оригинальное регулярное выражение, а затем добавили немного меньше, чтобы сохранить исходный макет. Объяснение:
Утвердите, что не
\3
существует подстроки, которая соответствует следующим ограничениям.Утверждают, что подстрока не является всей исходной строкой.
Утверждают, что нет
\6
такого персонажа , который:Для того , чтобы передать ограничение компоновки источника, я заменил
((((
с(?:(^?(?:(
и((
с(|(
. У меня все еще оставалось одно ограничение источника))
и оставались символы!()1<{}
, поэтому я изменил+
на{1,}
и вставил бесполезные,(?!,<)?
чтобы использовать остальные.источник
C # (интерактивный компилятор Visual C #) ,
208206200198 байтПопробуйте онлайн!
-2 байта благодаря @KevinCruijssen!
Наконец-то он опустился ниже 200, так что я, возможно, пока играю в гольф :) Я закончил тем, что создал второй TIO, чтобы проверить все на основе предыдущего ответа.
Попробуйте онлайн!
Вещи, которые сделали эту задачу сложной:
==
не разрешен++
не был разрешенAll()
Функция Linq была запрещенаКод комментария ниже:
источник
Python 2 , 108 байт
Попробуйте онлайн!
-2 благодаря Эрджану Йохансену .
источник
Брахилог , 16 байт
Попробуйте онлайн!
Отпечатки
false.
для правдивых случаев иtrue.
ложных случаев. Версия TIO слишком медленная, чтобы справиться сама с собой, но она явно хорошо связана, поскольку представляет собой строку с уникальными символами, повторяемыми дважды.объяснение
источник
05AB1E ,
2220 байтВыводится,
1
если строка хорошо связана, и0
если строка плохо связана.Попробуйте онлайн или проверьте все контрольные примеры .
Объяснение:
Базовая программа
ŒsKεsS¢ÈP}à
( 11 байт ) выдает результаты,0
если они хорошо связаны, а1
если нет. ТрейлингÈ
(is_even) является полупериодом, который инвертирует вывод, поэтому1
для строк с хорошей связью и0
для строк с плохой связью. Другие части не могут выполнить правила соревнования.источник