Давайте возьмем функцию которая берет строку и удаляет все пары смежных одинаковых символов. Например
Обратите внимание, что когда две пары перекрываются, мы удаляем только одну из них.
Мы будем называть строку идеально спаренной, если повторное приложение в конечном итоге даст пустую строку. Например, строка выше не идеально спарена, потому что если мы снова применим мы все равно получим . Однако такая строка, как , идеально спарена, потому что если мы применяем три раза, мы получаем пустую строкуf a b a e a b b c c a d d e f
Ваша задача - написать идеально спаренный компьютерный код, который принимает строку (для печати ASCII) и решает, является ли она идеально спаренной. Сама строка байта вашего источника должна быть идеально спаренной строкой , хотя ваш код не обязательно должен быть ограничен печатным ASCII.
Вы можете вывести два различных значения: одно для случая, когда вход идеально спарен, и другое для случаев, когда это не так.
Это вопрос кода-гольфа, поэтому ответы будут оцениваться по размеру в байтах их источника с меньшим количеством байтов, которые будут лучше.
Тестовые случаи
источник
Ответы:
Haskell,
146124 байтаБез комментариев. Возвращает либо
True
илиFalse
.Попробуйте онлайн!
Редактировать: -22 байта благодаря @Cat Wizard
источник
Python 2 , 94 байта
Попробуйте онлайн!
Весь шаг обновления
ss=[cc+ss,ss[1:]][cc==ss[:1]]
отменяется просто=[+,[
.источник
05AB1E ,
26 24 22 2018 байт-2 байта благодаря овс . Выводит 0, если строка идеально согласована, 1 в противном случае.
Попробуйте онлайн!
Предыдущие версии
Это просто полагается на неопределенное поведение (так что нет «мертвого кода») и выводит [['0']] для идеально спаренных строк и [['1']] для неидеально согласованных строк:
И объяснил 22-байтовую версию, которая является только вышеупомянутой, но не злоупотребляет UB, и дает нормальные значения.
источник
Cubix , 54 байта
Ничего не выводится, если строка идеально спарена и в
1
противном случае.Попробуй здесь
Cubified
объяснение
Большинство символов являются наполнителями, необходимыми для идеального сопряжения кода. Заменив их на
.
(no-op), мы получимЭто можно разбить на три этапа:
i
и?
).источник
V ,
20, 18 байтовПопробуйте онлайн!
HexDump:
Выходы 0 для правдивых, 1 для ложных. Спасибо nmjcman101 за косвенное сохранение 2 байтов.
источник
^$
с.
и возвращать 0 для truthy, что - нибудь еще для falsy? Я немного запутался в правилах после того, как не сделал это некоторое время.R ,
142126 байтУжесточенная логика и некоторые байты комментариев, сыгранные @Giuseppe
Попробуйте онлайн!
Оригинал:
Попробуйте онлайн!
Функция рекурсивного детектора с последующим комментарием со всеми символами в функции в обратном порядке.
источник
APL (Dyalog) , 38 байт
Попробуйте онлайн!
источник
Сетчатка ,
2826 байтПопробуйте онлайн!
Выходы
`C1\).(`+0`C1\).(`+
для ложных и`C1\).(`+1`C1\).(`+
правдивых случаев.источник
Brain-Flak ,
228200 байтПопробуйте онлайн!
Это немного доказательство концепции. Это может быть короче. Однако он не использует никаких комментариев.
Выводится,
0,0
если вход идеально спарен, а0,1
если нет.источник
sed 4.2.2 , 34 байта
Попробуйте онлайн!
Парные строки дают пустой вывод, непарные дают
ct:
Тривиальная палиндромная версия в 32
:;ss(.)\1ss;t;/./cc/./;t;1\).(;:
. Старое решение было:;ss((..??\??))\1ss1;t;;/./cc/./t:
(изменено, потому что текущее злоупотреблениеc
меньше, отредактируйте: yay теперь только 1 символ послеc
: D)(обратите внимание, что
;
это разделитель операторов):
объявляет пустой ярлык:t
объявляет этикеткуt
ss((..??\??))\1ss1
является заменой, в sed вы можете изменить разделитель на замену, и это то, что я сделал, изменив егоs
, так что он заменяет первое (как обозначено1
в конце)матч
((..??\??))\1
.
любой персонаж.??
сопровождаемый необязательным дополнительным символом\??
и необязательный?
с ничем
Теперь эта замена в паре с самим собой, так что
;
до и после нее тоже отменяютсяt
и вернуться к метке, пока больше не будет успешных замен/..?/
if.
(подстановочный знак), за которым.?
следует необязательный символcc
изменить буфер наc
источник
Brain-Flak ,
112 110108 байтПопробуйте онлайн!
Это основано на моем ответе от Соответствия скобок? ,
Пытался не использовать комментарии, но застрял, пытаясь собрать
{}
пару pop nilads ( ). Проблема заключается в том, что проще всего объединить пару скобок в другую пару того же типа. В то время как это легко для других nilads,{...}
монада создает петли. Чтобы выйти из цикла, вы должны нажать 0, но как только вы выйдете из цикла, вам нужно будет вытолкнуть 0, что усугубляет проблему.66-байтовое готовое решение:
Попробуйте онлайн!
Выходы
1
или1,0
если вход идеальное сопряжение,0,0
если нет.Без комментариев версия, 156 байт
Попробуйте онлайн!
Как указал Cat Wizard, первый ответ не работает для всех переводчиков, так как не все обрабатывают
#
комментарии. Эта версия не содержит комментариев.источник
Japt,
2422 байтаВыходы
false
для правды иtrue
фальсея.Попытайся
источник
«e"(.)%1
работать?«
, все же.Brain-Flak , 96 байт
Попробуйте онлайн!
Ничего не выводится, если вход идеально согласован, и
0
иначе.Неидеально спаренная (оригинальная) версия:
Попробуйте онлайн!
источник
Haskell , 66 байт
Попробуйте онлайн!
Cat Wizard сэкономил 6 байт.
источник
Добавить ++ , 146 байт
Попробуйте онлайн!
Забавный факт: это было 272 байта задолго до того, как объяснение было начато, теперь оно превосходит Java.
Выходы
True
для идеально сбалансированных струн иFalse
другихК моему большому удовлетворению, эта версия превосходит скучную версию палиндромиза на 2 байта, чтобы результат не печатался дважды. Я также стремился иметь как можно меньше мертвого кода, тем не менее, есть некоторые закомментированные разделы, и код завершается с кодом ошибки 1 после печати правильного значения.
NB : ошибка с
BF
командами была исправлена во время разработки этого ответа.Как это работает
Код начинается с определения двух ключевых функций,ф ф а также г , Эти две функции используются для вычисления следующего шага в процессе удаления пар и работают полностью изф ф т.е. только ф ф вызывается из основной программы, никогда г , Если мы определим входную строку какS , f f (S) модифицирует S следующим образом:
Во-первых, идентичные соседние символы вS сгруппированы вместе. Для примераa b b b a a b a c c это дает массив [ [ a ] , [ b b b ] , [ a a ] , [ b ] , [ a ] , [ c c ] ] , Над каждым из подсписков (т.е. одинаковыми группами) мы запускаем функциюг и замените подсписки на результат функции.
As you can seex indicates how many of the next character we wish to keep. For simple pairs, we remove them entirely (yielding 0 of the next character), for lone characters we leave them untouched, or yield 1 of them, and for groups where x>2 , we want x−2 of the character. In order to generate x of the character, we repeat the character with
*
, and the function naturally returns the top element of the stack: the repeated string.Afterg(s) has been mapped over each group s , we splat the array to the stack to get each individual result with g , this essentially removes them, as the empty string concatenated with any string r results in r . Anything after the two
BF
. Finally, the^
flag at the function definition (D,ff,@^^,
) tells the return function to concatenate the strings in the stack and return them as a single string. For pairs, which yielded the empty string from;;
is a comment, and is thus ignored.The first two lines define the two functions,ff and g , but don't execute ff just yet. We then take input and store it in the first of our 4 variables. Those variables are:
As you can see, all variables and functions (aside fromg ) have two letter names, which allows them to be removed from the source code fairly quickly, rather than having a comment with a significant amount of xyab . g doesn't do this for one main reason:
If an operator, such asabc , the function name needs to be enclosed in g , the gg , the code for ff and g would have to change to
€
, is run over a user defined function{...}
, so that the entire name is taken by the operator. If however, the name is a single character, such as{...}
can be omitted. In this case, if the function name waswhich is 4 bytes longer.
An important term to introduce now is the active variable. All commands except assignment assign their new value to the active variable and if the active variable is being operated on, it can be omitted from function arguments. For example, if the active variable isx=5 , then we can set x=15 by
The active variable isx by default, but that can be changed with the
`
command. When changing the active variable, it is important to note that the new active variable doesn't have to exist beforehand, and is automatically assigned as 0.So, after definingff and g , we assign the input to xx with xx is empty. Therefore, we assign a truthy value to aa with 1 . We then assign the truthiness of xx to bb with the two lines
xx:?
. We then need to manipulate our loop conditions ever so slightly. First, we want to make sure that we enter the while loop, unlessaa:1
, the shortest such value beingWhich first makesbb the active variable, then runs the boolean command on xx . The respective choices of aa:=1 and bb:=¬¬xx matter, as will be shown later on.
Then we enter our while loop:
A while loop is a construct in Add++: it operates directly on code, rather than variables. Constructs take a series of code statements, separated with
,
which they operate on. While and if statements also take a condition directly before the first,
which consist of a single valid statement, such as an infix command with variables. One thing to note: the active variable cannot be omitted from the condition.The while loop here consists of the conditionaa and bb are truthy. The body of the code first makes yy the active variable, in order to store the result of ff(x) . This is done with
aa*bb
. This means to loop while bothWe then activate our loop conditionaa . We have two conditions for continued looping:
One of Add++'s biggest drawbacks is the lack of compound statements, which necessitates having a second loop variable. We assign our two variables:
With the code
Wherexx variable to be the yy variable with
|
is the inequality operator, andB
converts to boolean. We then update thexx:yy
, in preperation for the next loop.This while loop eventually reduces the input into one of two states: the empty string or a constant string, even when applied toff . When this happens, either aa or bb result in False, breaking out of the loop.
After the loop is broken, it can break for one of two reasons, as stated above. We then output the value ofaa . If the loop was broken due to x=y , then both the output and aa are False. If the loop was broken because yy was equal to the empty string, then bb is falsy and aa and the output are truthy.
We then reach our final statement:
The program can now be in one of three states, in all of which the active variable isbb :
As you can see,bb is equal to the expected output (albeit reversed from the logical answer), so we simply output it. The final bytes that help us beat Java come from the fact that bb is the active variable, so can be omitted from the argument, leaving us to output either True or False , depending on whether the input is perfectly balanced or not.
источник
JavaScript (ES6), 76 bytes
Returns a boolean.
Try it online!
Suggested by @Shaggy: 58 bytes by returning an empty string for perfectly paired or throwing an error otherwise.
источник
Wolfram Language (Mathematica),
7064 bytesTry it online!
Without comments, 92 bytes
Try it online!
источник
Lua, 178 bytes
Try it online!
While it is a terribly long solution, this does make quite a bit of use of Lua-specific quirks. This is actually a minified brute force stack algorithm. The program is made complicated by the fact that Lua's patterns don't allow replacing pairs and regex is not built in.
Explanation:
источник
Gol><>, 30 bytes
Try it online!
Everything after the first
B
is excess code and is not executed. A function that returns the top of stack as1
if the input is a perfect pairing,0
otherwise.Explanation:
источник
Cubix, 30 bytes
Try it online!
Outputs
1
if the string is perfectly paired and nothing otherwise.Cubified
Simplified
The logic and general structure are the same as in Mnemonic's answer, but without an explicit check for the empty string.
источник
Haskell, 92 bytes
Try it online!
@nimi's answer is pretty cool, it doesn't use any comments. This one is shorter but does use a comment.
@xnor's answer is also pretty cool, it does use comments and is shorter than this one.
источник
Python 2, 114 bytes
Try it online!
Returns
True
for perfectly-paired strings,False
otherwise.(Actually fails to verify itself, because
(.)
won't match the newlines in the code! But @Cat Wizard said this is okay, because newlines aren't printable ASCII characters, so my program needn't handle them.)This is a perfectly-paired version of:
for which a “lazier” perfectization of
code + '##' + f(code[::-1])
would give 120 bytes. (That is, renaming the variables etc. to introduce more collapsed pairs inside the comment half of the code saved 6 bytes.)источник
Jelly,
26 2422 bytesTry it online!
Weirdly seems to work without moving the backwards code to an unused link.
Returns 0 if the input is perfectly paired, 1 otherwise.
Active code:
источник
Attache, 82 bytes
Try it online!
Nothing incredible here.
Fixpoint
s a function which removes consecutive pairs.источник
Java 8,
158156154 bytesReturns a boolean (
true
/false
).-2 bytes thanks to @raznagul.
Try it online.
Explanation:
источник
s
ton
and adding a second space toreturn s.isEmpty
you can removes n
from the comment, saving 2 bytes in total.