Detectar pares perfeitos

25

Vamos ter uma função f que pega uma string e remove todos os pares de caracteres idênticos adjacentes. Por exemplo

f(abbbacc)=aba

Observe que quando dois pares se sobrepõem, removemos apenas um deles.

Chamaremos uma string perfeitamente emparelhada se um aplicativo repetido eventualmente produzir a string vazia. Por exemplo, a string acima de abbbacc não está perfeitamente emparelhada porque, se aplicarmos f novamente, ainda obteremos aba . No entanto, uma string como eabbccadde está perfeitamente emparelhada porque, se aplicarmos f três vezes, obteremos a string vazia

f(eabbccadde)=eaae

f(eaae)=ee

f(ee)=


Sua tarefa é escrever um código de computador perfeitamente emparelhado que use uma string (de ASCII imprimível) e decida se ele está perfeitamente emparelhado. A bytestring de sua fonte deve ser uma sequência perfeitamente emparelhada , embora seu código não precise necessariamente ser restrito ao ASCII imprimível.

Você pode gerar dois valores distintos: um para o caso em que a entrada está perfeitamente emparelhada e outro para os casos em que não está.

Esta é uma questão de para que as respostas sejam pontuadas pelo tamanho em bytes de sua origem, com menos bytes sendo melhores.


Casos de teste

abbbaccFalseabcbaFalseababFalseabbbaabaccTrueeabbccaddeTruebbbbTrue

Assistente de Trigo
fonte
1
Embora possa ser tarde demais para mudar isso agora, sinto que a parte "desafiadora" do desafio se torna quase inútil se você permitir comentários ou código "morto" semelhante.
Geobits
11
@ Geobits eu discordo. Por um lado, acho que não permitir códigos mortos é apenas um lodo de definições vagas e nunca acaba sendo divertido. Para dois, acho que permitir comentários diminui a barra de entrada. Para três, acredito que o código sem comentários será inevitavelmente melhor com pontuação do que o código com comentários completos. Talvez a reviravolta não seja divertida, mas definitivamente seria menos divertida se eu adicionasse restrições impossíveis de fazer respostas de uma maneira específica.
Assistente de trigo
4
Unary não dá a mínima para sua regra de restrição de origem, mwahahahaha (isto é ... desde que a resposta tenha um número par de bytes).
precisa
2
@ Geobits Uma coisa que pode ter encorajado respostas mais criativas é fatorar o número de etapas para obter a sequência vazia na pontuação. O uso de comentários costuma fazer com que esse número seja bastante alto, porque os comentários se aninham naturalmente onde, como uma pontuação mais baixa, é necessário entrelaçar os pares um pouco. Obviamente, é tarde demais para fazer essa mudança.
Assistente de trigo
1
@dylnan A string vazia pode ser, repetindo para sempre, no entanto, não é uma saída válida.
Assistente de trigo

Respostas:

10

Haskell, 146 124 bytes

((""##))
a===bb=bb==a
((aa:bb))##((cc:dd))|aa===cc=bb##dd|1==1=((cc:aa:bb))##dd
a##""=""===a
""##cc=((cc!!00:cc!!00:""))##cc

Sem comentários. Retorna Trueou False.

Experimente online!

Edit: -22 bytes graças ao @Cat Wizard

nimi
fonte
2
Este é o menos Haskell como Haskell que eu já vi
Cubic
5

Python 2 , 94 bytes

ss=''

for cc in input():ss=[cc+ss,ss[1:]][cc==ss[:1]]

print''==ss##tnirp[,+[=:)(tupni nirof=

Experimente online!

A etapa inteira da atualização é ss=[cc+ss,ss[1:]][cc==ss[:1]]cancelada para apenas =[+,[.

xnor
fonte
5

05AB1E , 26 24 22 20 18 bytes

-2 bytes graças a ovs . Emite 0 se a sequência estiver perfeitamente emparelhada, 1 caso contrário.

ΔγʒgÉ}JJ}ĀqqĀÉgʒγΔ

Experimente online!

ΔγʒgÉ} JJ} ĀqqĀÉgʒγΔ - Programa completo.
Δ} - Até o resultado não mudar mais:
 γʒ} - Divida a sequência em partes de caracteres iguais e filtre por:
   gÉ - O comprimento é estranho?
      JJ - E após a filtragem, junte as peças novamente, mas faça isso
                     duas vezes para salvar 2 bytes, como nas versões anteriores.
         Ā - Verifique se o resultado está vazio
          q - Terminar (sair) da execução. O restante do código é ignorado.
           qĀÉgʒγΔ - Espelhe a peça não correspondida para ajudar no layout de origem.

Versões prévias

Este baseia-se puramente em comportamento indefinido (portanto, não há "código morto") e gera [['0']] para cadeias perfeitamente emparelhadas e [['1']] para cadeias não perfeitamente correspondentes:

ΔγεDgÉ£}JJ}ĀĀ£ÉgDεγΔ 

E a versão de 22 bytes, explicada, que é exatamente a UB acima, mas sem abusar, e produzindo valores sensatos .

ΔγεDgÉ£}JJ}ĀqqĀ£ÉgDεγΔ – Full program.
Δ         }            – Until fixed point is reached (starting from the input value):
 γε    }                 – Group equal adjacent values, and for each chunk,
   DgÉ                     – Duplicate, get its length mod by 2.
      £                    – And get the first ^ characters of it. This yields the
                             first char of the chunk or "" respectively for odd-length
                             and even-length chunks respectively.
         JJ                – Join the result to a string, but do this twice to help
                             us with the source layout, saving 2 bytes.
            Ā           – Check if the result is an empty string.
             q          – Terminate the execution. Any other commands are ignored.
              qĀ£ÉgDεγΔ – Mirror the part of the program that isn't otherwise removed
                          anyways. This part forgoes }JJ} because that substring will
                          always be trimmed by the algorithm anyway.
Mr. Xcoder
fonte
5

Cubix , 54 bytes

U#;[email protected]>??>i..??O.@1^^...u--u.u!ww;..#..U..;..;!^^!

Não produz nada se a sequência estiver perfeitamente emparelhada e 1não.
Experimente aqui

Cubificado

      U # ;
      ! u 1
      @ . O
i > ? ? > i . . ? ? O .
@ 1 ^ ^ . . . u - - u .
u ! w w ; . . # . . U .
      . ; .
      . ; !
      ^ ^ !

Explicação

A maioria dos caracteres é necessária para preencher perfeitamente o código. Substituindo aqueles com .(no-op), obtemos

      U # ;
      ! u 1
      @ . O
i . ? . > i . . ? . . .
. . ^ . . . . u - . . .
. . . w ; . . . . . . .
      . ; .
      . ; !
      ^ ^ !

Isso pode ser dividido em três etapas:

  • Verifique com a sequência vazia (a esquerda ie a ?).
  • Faça um loop, jogando caracteres na pilha e exibindo duplicatas (tudo na parte inferior e direita).
  • Verifique se a pilha está vazia (o material na parte superior).

fonte
4

V , 20 , 18 bytes

òóˆ±òø‚

::‚øò±ˆóò

Experimente online!

Hexdump:

00000000: f2f3 88b1 f2f8 820a 0a3a 3a82 f8f2 b188  .........::.....
00000010: f3f2                                     ..                   ....

Saídas 0 para verdade, 1 para falsidade. Obrigado ao nmjcman101 por salvar indiretamente 2 bytes.

ò        ò        " Recursively...
 ó                "   Remove...
  <0x88>          "     Any printable ASCII character
        ±         "     Followed by itself
          ø       " Count...
           <0x82> "   The number of non-empty strings

::<0x82>øò±<0x88>óò      " NOP to ensure that the code is paired
DJMcMayhem
fonte
Você poderia substituir ^$por .e retornar 0 por verdade, mais alguma coisa por falsidade? Estou um pouco nebuloso com as regras depois de não fazer isso por um tempo.
nmjcman101
Eu acho que funcionaria, exceto que as regras diziam que você pode gerar dois valores distintos , um para o caso em que a entrada está perfeitamente emparelhada e outro para o contrário. . Isso me dá uma idéia ...
DJMcMayhem
3

R , 142 126 bytes

Lógica mais rigorosa e alguns bytes de comentário publicados por @Giuseppe

f=function(x,p="(.)\\1")"if"(grepl(p,x),f(sub(p,"",x)),!nchar(x))##x(rahcn!,x,,p(bus(f,)x,p(lperg("fi")"1\\).("=p,x(noitcnuf=f

Experimente online!

f=function(x,p="(.)\\1")"if"(nchar(x),"if"(grepl(p,x),f(sub(p,"",x)),0),1)##)1,)0,xp(bus(f,)x,p(lperg("fi",)x(rahcn("fi")"1).("=p,x(noitcnuf=f

Original:

Experimente online!

Função detector recursiva seguida de comentário com todos os caracteres da função na ordem inversa.

ngm
fonte
Seu código atualmente gera um erro. Aqui está uma versão de trabalho em 142 bytes.
ovs 25/06
Obrigado. Deve ter sido um acidente de cortar e colar.
ngm
126 bytes - que você pode ser capaz de comprimir o comentário um pouco mais bem ...
Giuseppe
Eu estou querendo saber se `\\ ˋ irá simplificar ou precisa ser duplicado nos comentários.
Jayce
@ JayCe você acha que não precisa estar nos comentários, mas tente isso e parece que não funciona. Não sei porque.
ngm
2

Retina , 28 26 bytes

+`(.)\1

C`^$

$^`C1\).(`+

Experimente online!

Saídas `C1\).(`+0`C1\).(`+para casos falsos e verdadeiros `C1\).(`+1`C1\).(`+.

ovs
fonte
2

Flak cerebral , 228 200 bytes

(()){{{}([]<<{{(({}<<>>)<<>>[({})]){{{{}(<<<<>>()>>)((<<>>))}}}{}{}<<>>{}<<>>}}{}<<>>>>[[]])}}{}(<<({{(())(<<()>>)}}<<>>)>>){{{{}{}}((){{}{}{}{}{}}(()())())[[]((){{}{}}())[]]((){{}{}}[[][]]()){{}{}}}}

Experimente online!

Esta é uma prova de conceito. Provavelmente poderia ser mais curto. No entanto, ele não usa nenhum comentário.

Saída 0,0se a entrada estiver perfeitamente emparelhada e 0,1se a entrada não estiver.

Assistente de Trigo
fonte
2

sed 4.2.2 , 34 bytes

:;:t;ss((..??\??))\1ss1;t;/..??/cc

Experimente online!

Seqüências de caracteres emparelhadas dão saída vazia, outras não emparelhadas ct:

A versão palindrômica trivial é 32 :;ss(.)\1ss;t;/./cc/./;t;1\).(;:. A solução antiga foi :;ss((..??\??))\1ss1;t;;/./cc/./t:(alterada porque a atual abusava cmenos, edit: yay agora só há 1 caractere depois c: D)

(observe que ;é o separador de instruções)

: declara um rótulo vazio

:t declara o rótulo t

ss((..??\??))\1ss1é uma substituição, no sed, você pode alterar o delimitador para uma substituição, e foi isso que fiz ao alterá-lo s; portanto, o que isso faz é substituir o primeiro (como indicado 1no final)

  • partida de ((..??\??))\1

    • . qualquer personagem
    • .?? seguido por um caractere opcional opcional
    • \?? e um opcional ?
    • seguido pela mesma coisa ao lado
  • com nada

Agora, essa substituição está emparelhada com ela mesma, então o ;s antes e depois também são cancelados

t e volte ao rótulo até que não haja mais substituições bem-sucedidas

/..?/se .(curinga) seguido por .?um caractere opcional for correspondido

  • cc altere o buffer para c
Kritixi Lithos
fonte
2

Brain-Flak , 112 110 108 bytes

(()){{}({<<(({}<<>>)<<>>[({})]){{((<<>>)<<>>)}}{}{##{

}<<>>>>{}<<>>}<<>>)}{}((){{<<>>[[]]}})##}{}])}{([)}(}

Experimente online!

Isso se baseia na minha resposta de Os colchetes são compatíveis? .

Tentei não usar comentários, mas fiquei preso tentando fazer o pop nilads ( {}) par. O problema está na maneira mais fácil de emparelhar um par de colchetes: envolvê-lo em outro par do mesmo tipo. Embora isso seja fácil para outras nilads, a {...}mônada cria loops. Para sair do loop, você precisa pressionar um 0, mas depois de sair do loop, é necessário exibir o 0, o que agrava o problema.

A solução pré-emparelhada de 66 bytes é:

(()){{}({<(({}<>)<>[({})]){((<>)<>)}{}{}<>>{}<>}<>)}{}((){<>[[]]})

Experimente online!

Saídas 1ou 1,0se a entrada for um emparelhamento perfeito, 0,0se não.

Versão sem comentários, 156 bytes

(()){{{}({<<(({}<<>>)<<>>[({{}((<<[[]]>>)){}}{}(<<[]>>){{}{}}{})]){{((<<>>)<<>>)}}{{}{}{}}{}{}<<>>>>{}<<>>}<<>>)}}{{}{}}{}((){<<>>[[]]})(<<()()>>){{}{}{}}{}

Experimente online!

Como o Assistente de Gato apontou, a primeira resposta não funciona para todos os intérpretes, pois nem todos lidam com #comentários. Esta versão não contém comentários.

Brincadeira
fonte
Note que isto só funciona no interpretador ruby brainflak e, portanto, não é uma resposta brainflak pura
Assistente de trigo
@ CatWizard Existe um intérprete canônico do Brain-Flak? Até onde eu sei, Rain-Flak (Ruby) é o intérprete original. (Além disso, eu estou trabalhando em uma solução sem comentários)
Jo rei
Na verdade não. Rain-Flak é o intérprete original, mas a sintaxe dos comentários é exclusiva. Escrevemos um padrão Brain-Flak há um tempo, mas não me lembro onde ele acabou.
Assistente de trigo
@CatWizard Terminada a nenhum comentário de versão
Jo rei
2

Japonês, 24 22 bytes

Saídas falsepara verdade e truepara falsey.

&&!!e"(.)%1"PP"1%).("e

Tente

Shaggy
fonte
Would «e"(.)%1 work?
Oliver
@Oliver, that's what I originally had before the source restrictions were brought to my attention. Still trying to figure out a way to get it working with «, though.
Shaggy
@Oliver, it doesn't work, sadly.
Shaggy
I suspect you may have missed the restricted-source/source-layout part of the challenge, @Oliver.
Shaggy
I did...my bad.
Oliver
2

Brain-Flak, 96 bytes

{<<>>(({})<<>>[(([{}<<>>]))]){((<<[[]]>>))}{}{}{}{}<<>>}<<>>{{{}{}{}{}{}}((<<>>){{}{}}){{{}}}}{}

Try it online!

Outputs nothing if the input is perfectly paired, and 0 otherwise.

Non-perfectly paired (original) version:

{<>(({})<>[({}<>)]){((<()>))}{}{}{}<>}<>{((<>))}{}

Try it online!

Nitrodon
fonte
2

Haskell, 66 bytes

null.foldr((%))"";;cc%((r:t))|cc==r=t;;t%s=t:s--s:t=s%=r|t:dlof.un

Try it online!

Cat Wizard saved 6 bytes.

xnor
fonte
1
66 bytes
Wheat Wizard
@CatWizard That's some impressive long-distance collapsing.
xnor
62 bytes
Wheat Wizard
2

Add++, 146 bytes

D,g,@~~,L2_|*;;*|_2L,@,g,D
D,ff,@^^,BG€gBF;;FBg€GB,@D1:?:

xx:?

aa:1
`bb
Bxx;;B
Waa*bb,`yy,$ff>xx,`aa,xx|yy,`bb,Byy,xx:yy

O;;O:,B,`,|,`,>$,`,*W`

Try it online!

Fun fact: This was 272 bytes long before the explanation was started, now it beats Java.

Outputs True for perfectly balanced strings, and False otherwise

To my great satisfaction, this beats the boring palindromize version by 2 bytes, to prevent the result being printed twice. I have also aimed to have as little dead code as possible, nevertheless there are still some commented-out sections, and the code exits with an error code of 1, after printing the correct value.

NB : A bug with the BF commands was fixed while this answer was in development.

How it works

The code starts by defining the two key functions, ff and g. These two functions are used to calculate the next step in the process of removing pairs, and work entirely from ff i.e. only ff is called from the main program, never g. If we define the input string as S, ff(S) modifies S in the following way:

First, identical adjacent characters in S are grouped together. For an example of abbbaabacc, this yields the array [[a],[bbb],[aa],[b],[a],[cc]]. Over each of the sublists (i.e. the identical groups), we run the function g, and replace the sublists with the result of the function.

g starts by unpacking the group, splatting the characters onto the stack. It then pushes the number of characters on the stack and takes the absolute difference with 2 and that number. We'll call this difference x. Lets see how this transforms the respective inputs of [a], [bb] and [ccc]:

[a][a,1]
[bb][b,b,0]
[ccc][c,c,c,1]

As you can see x 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 x2 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.

After g(s) has been mapped over each group s, we splat the array to the stack to get each individual result with 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 g, this essentially removes them, as the empty string concatenated with any string r results in r. Anything after the two ;; 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:

  • xx : The initial input and previous result of applying ff
  • yy : The current result of applying ff
  • aa : The loop condition
  • bb : Whether yy is truthy

As you can see, all variables and functions (aside from g) 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 as , is run over a user defined function abc, the function name needs to be enclosed in {...}, so that the entire name is taken by the operator. If however, the name is a single character, such as g, the {...} can be omitted. In this case, if the function name was gg, the code for ff and g would have to change to

D,gg,@~~,L2_|*;;*|_2L,@D             (NB: -2 bytes)
D,ff,@^^,BG€{gg}BF;;FB}gg{€GB,@D?:   (NB: +6 bytes)

which 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 is x=5, then we can set x=15 by

x+10 ; Explicit argument
+10  ; Implicit argument, as x is active

The active variable is x 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 defining ff and g, we assign the input to xx with xx:?. We then need to manipulate our loop conditions ever so slightly. First, we want to make sure that we enter the while loop, unless xx is empty. Therefore, we assign a truthy value to aa with aa:1, the shortest such value being 1. We then assign the truthiness of xx to bb with the two lines

`bb
Bxx

Which first makes bb 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:

Waa*bb,`yy,$ff>xx,`aa,xx|yy,`bb,Byy,xx:yy

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 condition aa*bb. This means to loop while both aa 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

`yy,$ff>xx

We then activate our loop condition aa. We have two conditions for continued looping:

  • 1) The new value doesn't equal the old value (loop while unique)
  • 2) The new value isn't the empty string

One of Add++'s biggest drawbacks is the lack of compound statements, which necessitates having a second loop variable. We assign our two variables:

aa:=xxyy
bb:=¬¬(yy)

With the code

`aa,xx|yy,`bb,Byy

Where | is the inequality operator, and B converts to boolean. We then update the xx variable to be the yy variable with xx: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 to ff. 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 of aa. 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:

O

The program can now be in one of three states, in all of which the active variable is bb:

  • 1) The input was empty. In this case, the loop didn't run, aa=1 and bb=False. The correct output is False.
  • 2) The input was perfectly balanced. If so, the loop ran, aa=True and bb=False. The correct output is False
  • 3) The input was not perfectly balanced. If so, the loop ran, aa=False and bb=True. The correct output is True

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.

Community
fonte
1

JavaScript (ES6), 76 bytes

Returns a boolean.

ff=ss=>ss==(ss=ss.replace(/(.)\1/,''))?!ss:ff(ss)//)(:!?,/1\).(/(ecalper.=(>

Try it online!

Suggested by @Shaggy: 58 bytes by returning an empty string for perfectly paired or throwing an error otherwise.

Arnauld
fonte
1
If one of the "return values" can be an error (waiting for confirmation on that) then this could be 66 bytes.
Shaggy
Programs can by default output via exit code. In this answer's particular case, the possible outputs would be exit code 0 for perfectly paired strings and exit code 1 for non-perfectly paired strings, which are two distinct values therefore fulfilling the criteria; so the 58 byter must be perfectly valid.
Mr. Xcoder
1

Lua, 178 bytes

p=...S={}for a in p:gmatch"."do E=S[#S]~=a;S[E and#S+1 or#S]=E and a or X end;print(#S==0)--)0S#(tnirp;dne X ro a dna E=]S#ro 1+S#dna E[S;a=~]S#[S=E od"."hctamg:p ni a rof}{=S.=p

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:

p=... -- command-line argument
S={} -- the stack
for c in p:gmatch"." do -- shorter than "for i=1,#p do ..."
    E=S[#S]~=c -- check whether we have the right letter on top of stack
    -- could've saved some bytes by doing == instead of ~=
    -- but the double negation is necessary for ternary operator
    -- to work with nil values
    S[E and #S+1 or #S]=E and c or X -- Lua's awesome "ternary operator"
end
-- i'm sure there is a better way to output this (table indexing?)
print(#S==0)
PhilipRoman
fonte
1

Gol><>, 30 bytes

1ll1**F:}}:{=Q{~~||lzBBzl{Q={F

Try it online!

Everything after the first B is excess code and is not executed. A function that returns the top of stack as 1 if the input is a perfect pairing, 0 otherwise.

Explanation:

1       Push 1 as the end string marker
 ll1**  Push n, where n (len+1)*(len+2), 
        This is larger than the amount of steps needed to determine pairing
      F           |  Repeat that many times
       :}}:{=        Compare the first two characters of the string
             Q   |   If they are equal
              {~~    Pop both of them
        String is also rotated by 1
        If the string becomes empty, the 1 is compared to itself and removed.
                   lzB   Return whether the length of the stack is 0
                      Bzl{Q={F  Excess code to match unpaired symbols
Jo King
fonte
1

Cubix, 30 bytes

1O@;??;@ii??O;>>;;;..1Wcc1??1W

Try it online!

Outputs 1 if the string is perfectly paired and nothing otherwise.

Cubified

      1 O @
      ; ? ?
      ; @ i
i ? ? O ; > > ; ; ; . .
1 W c c 1 ? ? 1 W . . .
. . . . . . . . . . . .
      . . .
      . . .
      . . .

Simplified

      1 O @
      ; ? .
      . @ .
i ? . . . . > ; ; ; . .
. W c . . . ? 1 W . . .
. . . . . . . . . . . .
      . . .
      . . .
      . . .

The logic and general structure are the same as in Mnemonic's answer, but without an explicit check for the empty string.

Nitrodon
fonte
1

Haskell, 92 bytes

gg""

gg((aa:cc:bb))dd|aa==cc=gg bb dd

gg  aa""=""==aa

gg  aa((bb:c))=gg((bb:aa))c--c:=c:|

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.

Wheat Wizard
fonte
0

Python 2, 114 bytes

import re

e=lambda i,nn=1:e(*re.subn('(.)\\1','',i))if nn else''==i##ieslef'1).('(nbus.er*(e:1=,i adbmal=r tropmi

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:

import re;p=lambda s,n=1:p(*re.subn('(.)\\1','',s))if n else''==i

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.)


re.subn is a little-known variant of re.sub that returns a tuple (new_string, number_of_substitutions_made). It's pretty good for finding regex substitution fixpoints!

Lynn
fonte
0

Jelly, 26 24 22 bytes

ẠƬµF€ḂLḣgŒŒgḣLḂ$$€FµƬẠ

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

ŒgḣLḂ$$€FµƬẠ
Œg            Group runs 'abbbcc'->['a','bbb','cc']
       €      For each of these strings:
      $       Monad{
     $            Monad{
   L                  Find the length...
    Ḃ                 ...mod 2. 
                      } -> [1, 1, 0] in this example.
  ḣ               Take this many characters from the string.
                  } -> [['a'], ['b'], []]
        F     Flatten -> ['a', 'b']
          Ƭ   Repeat...
         µ    The last monadic chain until a fixed point is reached.
           Ạ  All. If it is not a perfectly paired string, all elements in the 
              result of Ƭ will be nonempty and 1 is returned.
              If it is perfectly paired, the last element is [] which is falsy
              and 0 is returned.
dylnan
fonte
0

Attache, 82 bytes

{0=#Fixpoint[{Replace[_,/"(.)\\1",""]},_]}??}]_,}],"1).("/,_[ecalpeR{[tniopxiF#=0{

Try it online!

Nothing incredible here. Fixpoints a function which removes consecutive pairs.

Conor O'Brien
fonte
0

Java 8, 158 156 154 bytes

n->{for(;n.matches(".*(.)\\1.*");n=n.replaceAll("(.)\\1",""));return  n.isEmpty();}//};)(ytpmEsi.ruter;,"1).("(Aecalper.n=n;)"*.1).(*."(sehctam.n;(rof{>-n

Returns a boolean (true/false).

-2 bytes thanks to @raznagul.

Try it online.

Explanation:

n->{                              // Method with String parameter and boolean return-type
  for(;n.matches(".*(.)\\1.*");   //  Loop as long as the String still contains pairs
    n=n.replaceAll("(.)\\1","")); //   Remove all pairs
  return  n.isEmpty();}           //  Return whether the String is empty now
//};)(ytpmEsi.ruter;,"1).("(Aecalper.n=n;)"*.1).(*."(sehctam.n;(rof{>-n
                                  // Comment reversed of the source code,
                                  // minus the pairs: '\\';'ll';'\\';'""))';'n  n';'//'
Kevin Cruijssen
fonte
1
By renaming s to n and adding a second space to return s.isEmpty you can remove s n from the comment, saving 2 bytes in total.
raznagul