Uma atividade que às vezes faço quando estou entediada é escrever alguns caracteres em pares correspondentes. Em seguida, traço linhas (por cima, nunca abaixo) para conectar esses caracteres. Por exemplo, eu poderia escrever e depois desenhar as linhas como:
Ou eu poderia escrever
Depois de desenhar essas linhas, tento desenhar loops fechados em torno dos pedaços, para que meu loop não cruze nenhuma das linhas que acabei de desenhar. Por exemplo, no primeiro, o único loop que podemos desenhar é em torno da coisa toda, mas no segundo, podemos desenhar um loop em torno dos s (ou de todo o resto)
Se brincarmos com isso por um tempo, descobriremos que algumas cordas só podem ser desenhadas, de modo que os loops fechados contenham todas ou nenhuma das letras (como nosso primeiro exemplo). Vamos chamar essas cadeias de caracteres bem ligadas.
Observe que algumas seqüências de caracteres podem ser desenhadas de várias maneiras. Por exemplo, pode ser desenhado das duas maneiras a seguir (e uma terceira não incluída):
Se uma dessas maneiras puder ser desenhada de forma que um loop fechado possa ser feito para conter alguns dos caracteres sem cruzar nenhuma das linhas, a sequência não estará bem vinculada. (então não está bem vinculado)
Tarefa
Sua tarefa é escrever um programa para identificar cadeias que estão bem vinculadas. Sua entrada será composta por uma sequência em que cada caractere aparece um número par de vezes, e sua saída deve ser um dos dois valores consistentes distintos, um se as sequências estiverem bem vinculadas e a outra, caso contrário.
Além disso o programa deve ser uma cadeia bem ligado significado
Cada personagem aparece um número par de vezes no seu programa.
Ele deve gerar o valor de verdade quando aprovado.
Seu programa deve ser capaz de produzir a saída correta para qualquer sequência que consiste em caracteres de ASCII imprimível ou no seu próprio programa. Com cada personagem aparecendo um número par de vezes.
As respostas serão pontuadas em comprimentos em bytes, com menos bytes sendo uma pontuação melhor.
Sugestão
Uma cadeia de caracteres não está bem vinculada se existir uma substring estrita não-vazia contígua, de modo que cada caractere apareça um número par de vezes nessa substring.
Casos de teste
abcbac -> True
abbcac -> False
bbbb -> False
abacbc -> True
abcbabcb -> True
abcbca -> False
fonte
abcbca -> False
.there
.Respostas:
Regex (ECMAScript 2018 ou .NET),
1401261181009882 bytes^(?!(^.*)(.+)(.*$)(?<!^\2|^\1(?=(|(<?(|(?!\8).)*(\8|\3$){1}){2})*$).*(.)+\3$)!?=*)
Isso é muito mais lento que a versão de 98 bytes, porque
^\1
resta da lookahead e, portanto, é avaliada depois dela. Veja abaixo um switcheroo simples que recupera a velocidade. Mas, devido a isso, os dois TIOs abaixo estão limitados a concluir um conjunto de casos de teste menor do que antes, e o .NET é muito lento para verificar seu próprio regex.Experimente online! (ECMAScript 2018)
Experimente online! (.LÍQUIDO)
Para eliminar 18 bytes (118 → 100), roubei descaradamente uma otimização muito boa do regex de Neil, que evita a necessidade de colocar um lookahead dentro do lookbehind negativo (produzindo um regex irrestrito de 80 bytes). Obrigado Neil!
Isso se tornou obsoleto quando ele lançou mais 16 bytes (98 → 82) incríveis, graças às idéias de jaytea , que levaram a um regex irrestrito de 69 bytes! É muito mais lento, mas isso é golfe!
Observe que as
(|(
no-ops para tornar o regex bem vinculado resultam em uma avaliação muito lenta no .NET. Eles não têm esse efeito no ECMAScript porque correspondências opcionais de largura zero são tratadas como não correspondências .O ECMAScript proíbe quantificadores em asserções, o que dificulta os requisitos de fontes restritas para o golfe . No entanto, neste ponto, é tão bem jogado que não acho que o levantamento dessa restrição em particular abriria outras possibilidades de golfe.
Sem os caracteres extras necessários para fazer passar as restrições (
10169 bytes):^(?!(.*)(.+)(.*$)(?<!^\2|^\1(?=((((?!\8).)*(\8|\3$)){2})*$).*(.)+\3))
É lento, mas essa edição simples (por apenas 2 bytes extras) recupera toda a velocidade perdida e muito mais:
^(?!(.*)(.+)(.*$)(?<!^\2|(?=\1((((?!\8).)*(\8|\3$)){2})*$)^\1.*(.)+\3))
Eu escrevi usando lookahead molecular (
10369 bytes) antes de convertê-lo em lookbehind de comprimento variável:^(?!.*(?*(.+)(.*$))(?!^\1$|(?*(.)+.*\2$)((((?!\3).)*(\3|\2$)){2})*$))
E para ajudar a tornar meu regex em si bem vinculado, tenho usado uma variação do regex acima:
(?*(.+)(.*$))(?!^\1$|(?*(.)+.*\2$)((((?!\3).)*(\3|\2$)){2})*$)\1
Quando usado com
regex -xml,rs -o
, isso identifica uma substring estrita da entrada que contém um número par de cada caractere (se houver). Claro, eu poderia ter escrito um programa não regular para fazer isso por mim, mas onde seria a diversão nisso?fonte
Gelatina, 20 bytes
Experimente online!
A primeira linha é ignorada. Está lá apenas para satisfazer a condição de que cada personagem apareça um número par de vezes.
A próxima linha primeiro
Ġ
rouba os índices pelo seu valor. Se considerarmos o comprimento de cada sub-lista na lista resultante (Ẉ
), obtemos o número de vezes que cada caractere aparece. Para verificar se algum deles é impar, obtemos o últimoḂ
de cada contagem e perguntamos se existeẸ
um valor verdadeiro (diferente de zero).Portanto, esse link auxiliar retorna se uma substring não pode ser circulada.
No link principal, pegamos todas as substrings da entrada (
Ẇ
),Ṗ
desativamos a última (para que não verifiquemos se toda a cadeia pode ser circulada) e executamos o link auxiliar (Ç
) em uma€
substring. O resultado é então seẠ
ll substrings não podem ser circulados.fonte
J , 34 bytes
Experimente online!
-8 bytes graças ao FrownyFrog
original
J , 42 bytes
Experimente online!
explicação
fonte
abc
, apenas a entrada Perl não "falha" nela. (Mas tem outros problemas.)1:@':.,02|~*'=1(#.,)*/@(0=2|#/.~)\.\
2:@':.,|~*'>1(#.,)*/@(1>2|#/.~)\.\
também parece válidoPython 3.8 (pré-lançamento) , 66 bytes
Experimente online!
A era das expressões de atribuição está sobre nós. Com o PEP 572 incluído no Python 3.8, o golfe nunca mais será o mesmo. Você pode instalar a visualização antecipada do desenvolvedor 3.8.0a1 aqui .
As expressões de atribuição permitem usar
:=
para atribuir a uma variável embutida enquanto avalia esse valor. Por exemplo,(a:=2, a+1)
dá(2, 3)
. Obviamente, isso pode ser usado para armazenar variáveis para reutilização, mas aqui vamos um passo adiante e as usamos como um acumulador em uma compreensão.Por exemplo, esse código calcula as somas cumulativas
[1, 3, 6]
Observe como a cada passagem pela compreensão da lista, a soma acumulada
t
é aumentadax
e o novo valor é armazenado na lista produzida pela compreensão.Da mesma forma,
b:=b^{c}
atualiza o conjunto de caracteresb
para alternar se inclui caracteresc
e é avaliado para o novo valor deb
. Assim, o código[b:=b^{c}for c in l]
itera sobre caracteresc
eml
e acumula o conjunto de caracteres visto um número ímpar de vezes em cada prefixo não vazio.Essa lista é verificada quanto a duplicatas, tornando-a uma compreensão de conjunto e ver se seu comprimento é menor que o de
s
, o que significa que algumas repetições foram recolhidas. Nesse caso, a repetição significa que, na partes
visualizada entre esses momentos, todos os caracteres encontraram um número par de números, tornando a sequência não bem vinculada. O Python não permite que conjuntos de conjuntos sejam laváveis, então os conjuntos internos são convertidos em strings.O conjunto
b
é inicializado como um argumento opcional e é modificado com êxito no escopo da função. Eu estava preocupado que isso tornasse a função não reutilizável, mas parece ser redefinida entre as execuções.Para a restrição de origem, caracteres não emparelhados são colocados em um comentário no final. Escrever em
for(c)in l
vez defor c in l
cancelar os parênteses extras gratuitamente. Colocamosid
no conjunto inicialb
, o que é inofensivo, pois pode ser iniciado como qualquer conjunto, mas o conjunto vazio não pode ser escrito,{}
porque o Python criará um dicionário vazio. Desde as letrasi
ed
estão entre aqueles que necessitam de emparelhamento, podemos colocar a funçãoid
lá.Observe que o código gera booleanos negados, portanto ele se dará corretamente
False
.fonte
Python 2 , 74 bytes
Experimente online!
Repete a sequência, mantendo o controle
P
do conjunto de caracteres visto um número ímpar de vezes até agora. A listad
armazena todos os valores passadosP
e, se a correnteP
já estiverd
presente, isso significa que, nos caracteres vistos desde aquela época, cada caractere apareceu várias vezes. Nesse caso, verifique se passamos por toda a entrada: se tivermos, aceite porque toda a cadeia está emparelhada como esperado e, caso contrário, rejeite.Agora sobre a restrição de origem. Os personagens que precisam de emparelhamento são colocados em vários locais inofensivos, sublinhados abaixo:
Ele
f<s
avalia como0
emparelhar umf
, aproveitando o nome da função tambémf
para que seja definido (no momento em que a função é chamada). O elemento0^0
absorve um^
símbolo.O
0
inP={0}
é lamentável: no Python é{}
avaliado como um ditado vazio, e não como um conjunto vazio, como queremos, e aqui podemos inserir qualquer elemento que não seja de caractere e será inofensivo. No entanto, não vejo nada de sobra para colocar, e o coloquei0
e o duplicadobmn0
, custando 2 bytes. Observe que os argumentos iniciais são avaliados quando a função é definida; portanto, as variáveis que definimos a nós mesmos não podem ser colocadas aqui.fonte
Perl 6 , 76 bytes
Experimente online!
R Qualquer lambda que retorne uma Junção Nenhuma de Nenhuma Junção que possa ser boolificada para um valor de verdade / falsey. Eu recomendaria não remover o
?
que boolifica o resultado do retorno, caso contrário, a saída fica bastante grande .Esta solução é um pouco mais complexo do que o necessário, devido a várias funções envolvidas sendo desassociado, por exemplo
..
,all
,>>
,%%
etc. Sem restrição a fonte, este pode ser 43 bytes:Experimente online!
Explicação:
fonte
Perl 5
-p
,94,86,78 bytessaída 0 se estiver bem vinculado 1 caso contrário.
78 bytes
86 bytes
94 bytes
Como funciona
-p
com}{
truque final para saída$\
no finalm-.+(?{
..})(?!)-
, para executar o código em toda a substring não vazia (.+
coincide com toda a cadeia de caracteres primeiro e depois de executar o código entre as(?{
..})
backtracks devido a falha forçada(?!)
$Q|=@q&grp,
lixo por causa da restrição de origem$\|=
número inteiro bit a bit ou atribuição, se houver quase um 1,$\
será 1 (verdadeiro), por padrão está vazio (falso)$&eq$_
o caso em que sbustring é a string inteira é armazenado bit a bit^
com "sem ocorrência de caracteres ímpares"($g=$&)=~/./g
para copiar a substring correspondente$g
(porque será exagerada após a próxima correspondência de regex) e retorne a matriz de caracteres da substring./^/
lixo que avalia para 1grep
1&(@m=$g=~/\Q$_/g),
para cada caractere na subsequência de caracteres, obtém a matriz de caracteres$g
correspondente, a matriz em escalar avalia seu tamanho egrep
filtrar os caracteres com ocorrência ímpar1&x
equivale ax%2==1
fonte
Retina ,
15096 bytesExperimente online! O link inclui casos de teste, incluindo ele próprio. Edit: reduziu bastante o regex original com a ajuda do @Deadcode e depois voltou um pouco menos extravagante para manter o layout de origem. Explicação:
Afirme que não
\3
existe substring que corresponda às seguintes restrições.Afirme que a substring não é a sequência original inteira.
Afirme que não existe um personagem
\6
que:Para passar a restrição de layout de origem, substituí
((((
por(?:(^?(?:(
e((
por(|(
. Eu ainda tinha uma restrição de origem))
e os caracteres!()1<{}
restantes, então mudei um+
para{1,}
e inseri o inútil(?!,<)?
para consumir o resto.fonte
C # (Compilador interativo do Visual C #) ,
208206200198 bytesExperimente online!
-2 bytes graças a @KevinCruijssen!
Finalmente cheguei abaixo de 200, para que eu possa jogar golfe por agora :) Acabei criando um segundo TIO para testar as coisas com base em uma resposta anterior.
Experimente online!
Coisas que complicaram essa tarefa:
==
não foi permitido++
não foi permitidoAll()
função Linq não foi permitidaCódigo comentado abaixo:
fonte
Python 2 , 108 bytes
Experimente online!
-2 graças a Ørjan Johansen .
fonte
Braquilog , 16 bytes
Experimente online!
Imprime
false.
para instânciastrue.
verdadeiras e falsas. A versão do TIO é muito lenta para lidar com ela mesma, mas está claramente bem vinculada, pois é uma sequência com caracteres únicos repetidos duas vezes.Explicação
fonte
05AB1E ,
2220 bytesProduz
1
se a sequência está bem vinculada e0
se a sequência não está bem vinculada.Experimente online ou verifique todos os casos de teste .
Explicação:
O programa base é
ŒsKεsS¢ÈP}à
( 11 bytes ), que sai0
se estiver bem vinculado e1
se não estiver bem vinculado. O finalÈ
(is_even) é um semi-no-op que inverte a saída, portanto,1
para cadeias bem vinculadas e0
para cadeias não bem vinculadas. As outras partes não são operacionais para cumprir as regras de desafio.fonte