Vamos ter uma função que pega uma string e remove todos os pares de caracteres idênticos adjacentes. Por exemplo
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 não está perfeitamente emparelhada porque, se aplicarmos novamente, ainda obteremos . No entanto, uma string como está perfeitamente emparelhada porque, se aplicarmos três vezes, obteremos a string vazia
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 código-golfe, para que as respostas sejam pontuadas pelo tamanho em bytes de sua origem, com menos bytes sendo melhores.
Casos de teste
fonte
Respostas:
Haskell,
146124 bytesSem comentários. Retorna
True
ouFalse
.Experimente online!
Edit: -22 bytes graças ao @Cat Wizard
fonte
Python 2 , 94 bytes
Experimente online!
A etapa inteira da atualização é
ss=[cc+ss,ss[1:]][cc==ss[:1]]
cancelada para apenas=[+,[
.fonte
05AB1E ,
26 24 22 2018 bytes-2 bytes graças a ovs . Emite 0 se a sequência estiver perfeitamente emparelhada, 1 caso contrário.
Experimente online!
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:
E a versão de 22 bytes, explicada, que é exatamente a UB acima, mas sem abusar, e produzindo valores sensatos .
fonte
Cubix , 54 bytes
Não produz nada se a sequência estiver perfeitamente emparelhada e
1
não.Experimente aqui
Cubificado
Explicação
A maioria dos caracteres é necessária para preencher perfeitamente o código. Substituindo aqueles com
.
(no-op), obtemosIsso pode ser dividido em três etapas:
i
e a?
).fonte
V ,
20, 18 bytesExperimente online!
Hexdump:
Saídas 0 para verdade, 1 para falsidade. Obrigado ao nmjcman101 por salvar indiretamente 2 bytes.
fonte
^$
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.R ,
142126 bytesLógica mais rigorosa e alguns bytes de comentário publicados por @Giuseppe
Experimente online!
Original:
Experimente online!
Função detector recursiva seguida de comentário com todos os caracteres da função na ordem inversa.
fonte
APL (Dyalog) , 38 bytes
Experimente online!
fonte
Retina ,
2826 bytesExperimente online!
Saídas
`C1\).(`+0`C1\).(`+
para casos falsos e verdadeiros`C1\).(`+1`C1\).(`+
.fonte
Flak cerebral ,
228200 bytesExperimente online!
Esta é uma prova de conceito. Provavelmente poderia ser mais curto. No entanto, ele não usa nenhum comentário.
Saída
0,0
se a entrada estiver perfeitamente emparelhada e0,1
se a entrada não estiver.fonte
sed 4.2.2 , 34 bytes
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 abusavac
menos, edit: yay agora só há 1 caractere depoisc
: D)(observe que
;
é o separador de instruções):
declara um rótulo vazio:t
declara o rótulot
ss((..??\??))\1ss1
é uma substituição, no sed, você pode alterar o delimitador para uma substituição, e foi isso que fiz ao alterá-los
; portanto, o que isso faz é substituir o primeiro (como indicado1
no final)partida de
((..??\??))\1
.
qualquer personagem.??
seguido por um caractere opcional opcional\??
e um opcional?
com nada
Agora, essa substituição está emparelhada com ela mesma, então o
;
s antes e depois também são canceladost
e volte ao rótulo até que não haja mais substituições bem-sucedidas/..?/
se.
(curinga) seguido por.?
um caractere opcional for correspondidocc
altere o buffer parac
fonte
Brain-Flak ,
112 110108 bytesExperimente 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
1
ou1,0
se a entrada for um emparelhamento perfeito,0,0
se 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.fonte
Japonês,
2422 bytesSaídas
false
para verdade etrue
para falsey.Tente
fonte
«e"(.)%1
work?«
, though.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!
fonte
Haskell, 66 bytes
Try it online!
Cat Wizard saved 6 bytes.
fonte
Add++, 146 bytes
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, andFalse
otherwiseTo 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 inS 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.
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.
fonte
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.
fonte
Wolfram Language (Mathematica),
7064 bytesTry it online!
Without comments, 92 bytes
Try it online!
fonte
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:
fonte
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:
fonte
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.
fonte
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.
fonte
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.)fonte
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:
fonte
Attache, 82 bytes
Try it online!
Nothing incredible here.
Fixpoint
s a function which removes consecutive pairs.fonte
Java 8,
158156154 bytesReturns a boolean (
true
/false
).-2 bytes thanks to @raznagul.
Try it online.
Explanation:
fonte
s
ton
and adding a second space toreturn s.isEmpty
you can removes n
from the comment, saving 2 bytes in total.