Introdução
Existem 3 pregos na parede. Você tem um pedaço de barbante fixo na moldura das duas extremidades. Para pendurar a foto, você emaranhou a corda com as unhas. Porém, antes de deixar a foto passar: Você pode prever se a imagem vai cair apenas olhando como o barbante está enrolado nas unhas?
No primeiro exemplo, a imagem não cairá. No segundo exemplo, a imagem vai cair.
Desafio
Dado o caminho da corda ao redor das N
unhas, determine se a imagem vai cair ou não. Retorne um valor verdadeiro se a imagem cair, e um valor falso caso contrário.
Detalhes
- Você pode supor que as unhas e a imagem estão dispostas em um
N+1
ângulo regular , com a imagem na parte inferior. - Você pode supor que não há nós na corda, ou seja, a corda pode ser continuamente enrolada em uma das duas extremidades.
- Cada unha é enumerada no sentido horário com uma letra do alfabeto. Você pode assumir que existem no máximo 26 unhas (AZ).
- Um envoltório no sentido horário em torno de uma unha é indicado com a letra minúscula, e um envoltório no sentido anti-horário é indicado com uma letra maiúscula.
O primeiro exemplo de cima será codificado como BcA
, o segundo exemplo é codificado como CAbBac
.
Para o leitor inclinado: Esse problema é equivalente a determinar se um elemento do grupo livre - gerado pelo conjunto de unhas - é a identidade ou não. Isso significa que é suficiente cancelar repetidamente substrings como aA
ou Aa
até você atingir um ponto fixo. Se o ponto fixo for uma sequência vazia, este é o elemento neutro, caso contrário, não é.
Exemplos
Picture will fall:
Aa
CAbBac
aBbA
DAacAaCdCaAcBCBbcaAb
ARrQqRrUuVHhvTtYyDdYyEKRrkeUWwua
AKkQqEeVvBESWwseYQqyXBbxVvPpWwTtKkVHLlWwNBbAanYYyyhWwEJZUuNnzjYyBLQqQqlEGgebeEPLlTtZzpUuevZzSsbXSGgsUuLlHhUQquPpHUuFfhTZzIitGgFAaBRrBbbYXxOoDZTDdtzVvXxUudHhOVvoUuXKkxyBEeLlbFfKkHhfVAaQqHAaJjODdoVvhSsZzMZzmPpXNBbnxBbUuSSsUuDRrdNnUusJDIiUuIidCEGgeMmcLlDPOopdTEeQqCAETtNnYyeGUuPEFfSsWwHheAaBbpgCcOHUuhAaCcoEFBbfeaFHhfcCFFffNncGFfgtjMVUuKAakvKkXxLlTMmtmOFfoUuXSsYZzLXxlyxUuRPZzTtprSsWwRrPLlpGgMmKRrDHhdRCcUurYNnKCckykXJjxWwUSsJjKkLlKkuBbBbOoWwWwIiUuPDdBbCcWHBbCFfcDdYBbLlyVvSsWGgEewCchDdYywAaJjEepPpPpQXxZzFfLGXxglNnZzYDdyqCcKWXxwXxQqXTtxkFfBSSAasTFftZzsXGgxSsLlLlbZzAaCCccXVvYyxTIiOoBbFftCVQqDdBbGgAavQqKkDPpKTCctRrkdcvAaQWOowLOolqVMmvZAaHCBbcPphIiRKkrLlzFMOomDIiXJjIixMmdNnMHhmfNTtIiKkSDdTtsVvHhnAaNSVvTUutNnXxsGIiXxPpPHhUupgNnAaAAOoaaIiHJjhVvLlnYyXxQqSsTtKJjkBbNnVvEYCcFfMHGghBbmNnEeJTtjJjWYywyeNWwDIiZYyzOodnMQqmVvCcQqxVvGNnEeNBbngVvUGgYyBbDdVvIiAAaauPpQKDdEekNnVLlvHhGSDIidPZzpsPCcpgQqKkQqNOonLlIiLlJjqPAaPXxTtppYyCPpHhCIicARBbracXxWwXEVUuUuGgZHhzBSsbvGgFfeVvxLlNKknWwBLlIibWOowNnRSsrSEeKAakOosLZzZRrHhzTtTFfUuNnOKkotXxTtla
Picture will not fall:
A
BcA
ABCD
aBaA
bAaBcbBCBcAaCdCaAcaCAD
ARrQqRrUatuVHhvTYyDdYyEKRrkeUAua
AEEeQqNneHhLlAIiGgaECXxcJjZzeJFfVWwDdKkvYWwyTJjtCXxANIinaXWwxcTWwtUuWwMmTBbVWIiFLlWwZzfwPLlEepvWZzwKkEYEeWXxwySXTtEexRIiNBbnWAaTtQqNnBMSsWwOombwWwPVPpGPpgYyvDdpBbrQqHhUusKRrDAVvadLlWwOZzokGJCXSSssXxxJPpGIigZzjJjLlOoNRrnPpcMZzmjgJjNDEeQqWKkNTtnSswIidCcnYBGgbyJSsjPpIiMmMmMmSNnWVvwZzIQqLXHhxTPptlisOoeTtTtYMmVvPpyKNnMFfmkXxSVvsCGJjXxgXYJPpjWwQIiXxqyDdxFfDdAaRNnJjrctHBbZzhEQqMmeCcRBbrGgAaAaJNnRrYyWwSDdVvsJOojQGgWWwIBbiwRrqJjjWwOoFPMmDdRrQOoqNnRrDPJjpMmdPpGFfVvWUuwgpWCcNnPpwfUXCcZzJjUSsuXxxUuuRGgHhrSQqJjOosMMTtmHhmKkXxDdLlWwjSUuAaMmKYyksZzVvPZzVEeVvvHhZZOozBbzMmZCczYyGgISsiQqpXxMmXxEMmeRrAGgaGgMOGgomZFfDdzSSssBGPpgbTtBbOoRWWwGgLJjlEeGgLDdRrUulNnZzJjJjUKkuXxFfwATtaZzLVvlWwSsMmrBAaELleGBLFflbgHhbIFfiBbPpTWZzwKkKLASsaTJYyjtBbBbWwIiZCcWwzIiZLlUTtuBbYyBbIizTJjtLTtDOOoBbodBbllSsUGgLlAKkauYykUuUNnPpuDFfAaLNVvnVvlHhdMmBAaBbIiVRrGWOoPpwgWXwKkvJjOoTtYCUucVGgYyLlVvFfvRrMmySsDdbtICZzcNnINSOosDQAaXoxRGgKkrqdZznDdXxZzMGgmiJjNnACcMQqmaNnWZzUOuwTVvAJjSsaRrGgSsTtOMmRroVvRrtAVGgvMmaINniDGCcOogRrWwMVvYFfyTtmTtVvOoOIiodRrGgAxaSsGgiJja
Respostas:
Retina , 21 bytes
Experimente online!
Como a solução da flawr, isso exclui repetidamente os pares maiúsculos / minúsculos adjacentes e depois verifica se o resultado está vazio ou não.
Quanto à forma como se combina um par maiúsculo / minúsculo:
fonte
MATLAB, 76 bytes
Octave,827977 bytesEsta pode ser a primeira vez que eu vejo onde o MATLAB é realmente menor que o Octave (por um byte inteiro)!
Nova resposta no MATLAB:
Resposta na oitava:
Economizou
trêscinco bytes graças ao flawr.~nnz(c)
é menor queisempty(c)
e'Aa'
é dois bytes menor que[0,32]
.Experimente a versão Octave online!
Explicação:
c=input('')
solicita a entrada do usuário. Definimosk='Aa'
como uma matriz de caracteres.while k++<1e5
: Enquanto circuito fechado onde ambos os elementosk
são incrementados cada iteração,Aa
,Bb
,Cc
e assim por diante. O loop continuará até que seja o elemento maior1e5
, que deve ser suficientemente alto para a maioria das strings. Pode ser aumentado para9e9
sem aumentar a contagem de bytes.Tomaremos a
strrep
função em etapas, começando do meio.Ao usar
mod(k,64)
, obteremos o seguinte quando chegarmos ao final do alfabeto (se convertermosk
novamente em caracteres):Como você pode ver, haverá alguns símbolos no meio, mas depois eles serão contidos e começarão com o alfabeto novamente, mas agora com as letras minúsculas primeiro. Esta é uma maneira muito curta de verificar ambos
Aa
eaA
.['',65+mod(k,64)]
concatena os valores numéricos damod
chamada, com uma sequência vazia, convertendo os números em caracteres.strrep
é usado para remover elementos da stringc
e retorná-la. Ele procurará todas as ocorrências dek
na sequência e a substituirá por uma sequência vazia.Após as
1e5
iterações, teremos uma sequência vazia ou uma sequência não vazia. Verificamos se há algum elemento emc
usonnz(c)
. Retornamosnot(nnz(c))
, portanto,1
se estiver vazio, e0
se houver caracteres restantes emc
fonte
Minkolang 0.15 , 30 bytes
Experimente aqui!
Explicação
A natureza toroidal de Minkolang é aproveitada aqui para eliminar a necessidade de um loop externo. A idéia geral aqui é verificar se os dois principais elementos da pilha estão separados por 32 unidades (o que significa que eles são um par maiúsculo / minúsculo) e, se estiverem, destacam os dois. Como isso é feito "em tempo real", por assim dizer, o aninhamento de pares é tratado adequadamente.
fonte
Haskell, 62 bytes
Experimente online
Crédito para flawr para o
abs
e Laikoni para ofromEnum
mapa .A função auxiliar
%
pega uma sequência já simplificadal
e precede o símboloa
antes de simplificar o resultado. Sel
começar com o caractere inverso paraa
, eles serão cancelados. Caso contrário,a
é simplesmente anexado. Observe que nenhuma outra simplificação é necessária nesta fase.A função principal
f
precede e simplifica cada caracter por vez, através de afoldr
. Em seguida, verifica se o resultado está vazio.Para verificar se dois caracteres são casos opostos e, portanto, deve cancelar, veja se os valores ASCII diferem em 32. Cada elemento é processado
fromEnum
antes de ser passado para%
.fonte
05AB1E , 17 bytes
Experimente online!
Explicação
fonte
Haskell ,
98 97 8581 bytesEsta é apenas uma implementação ingênua que tenta repetidamente cancelar cartas adjecentes até que não haja mais alterações e, em seguida, determina o resultado disso.
Obrigado @nimi por -12 bytes e @xnor por mais -4 bytes!
Experimente online! ou Verifique todos os exemplos!
fonte
f=null.until(\a->r a==a)r.map fromEnum
deve salvar dois bytes.(\a->r a==a)
pode ser((==)=<<r)
.=r l
paral
, sendo a ideia suficiente fazer apenas uma substituição por execução.=<<
, parece que XD mágica=<<
é como,>>=
mas com os argumentos trocados. A expressão geralmente surge como na forma((==)=<<r)
que significa "é invariável emr
".Mathematica, 102 bytes
Função sem nome, recebendo uma sequência alfabética como entrada e retornando
True
ouFalse
.O coração da implementação é criar uma função que exclui qualquer par de cancelamento, como
"Pp"
ou"gG"
, de uma sequência. A expressão{Join[a=Alphabet[],A=ToUpperCase@a],A~Join~a}
produz um par ordenado de listas de caracteres, sendo a primeira{"a","b",...,"Z"}
e a segunda{"A","B",...,"z"}
. Em seguida,#<>#2&~MapThread~
produz uma lista em que os elementos correspondentes dessas duas listas foram concatenados, ou seja{"aA","bB",...,"Zz"}
,. A expressão divertida""|##&@@
então (através da mágica da sequência de argumentos##
) produz uma lista de alternativas"" | "aA" | "bB" | ... | "Zz"
; finalmente,StringDelete[...]
é uma função que exclui qualquer ocorrência de qualquer uma dessas alternativas de uma string.Agora basta aplicar repetidamente essa função à sequência de entrada até que o resultado não seja alterado, o que é realizado por
~FixedPoint~#
e, em seguida, testar se o resultado é a sequência vazia""==
.fonte
JavaScript (ES6), 73 bytes
Diferentemente do .NET, o JavaScript não tem como desativar a distinção entre maiúsculas e minúsculas no meio de uma correspondência. Em vez disso, precisamos encontrar todas as substrings de letras repetidas sem maiúsculas e minúsculas e excluir qualquer par incompatível de caracteres adjacentes, que neste momento deve ser um par em maiúsculas / minúsculas.
fonte
Perl, 28 bytes
Explicação:
O Perl permite incluir uma expressão regular gerada dinamicamente dentro de uma expressão regular padrão.
A
.
combina com qualquer coisa.O
(??{
é o início do regex gerado.A
$&
variável conterá toda a cadeia correspondente até agora, que neste caso é exatamente a que.
corresponder.O
^
operador executa xor numérico ou string xor, dependendo dos valores dos operandos. Nesse caso, será a string xor.O
' '
é apenas uma string que contém um espaço, que convenientemente possui o valor ascii (ou unicode!) De 32. Quando um espaço é xor-ed com um caractere no intervalo az ou AZ, ele muda de maiúsculas para minúsculas ou de torno versa.O
})
é o fim do regex gerado.1 while s/whatever//
procurará repetidamente um padrão e o substituirá pela sequência vazia.$_
é a variável padrão. Essa variável é o que o perl faz coisas divertidas e emocionantes quando você não especifica outra variável. Aqui, estou usando-o para retornar um valor verdadeiro ou falso, pois uma string de comprimento zero é falsa e uma string de comprimento diferente de zero que não é igual a"0"
verdadeira. Também estou assumindo que a string de entrada foi originalmente colocada nela.Experimente aqui
fonte
!
antes da final$_
. Se mantê-lo assim, você pode salvar 4 bytes alterando-o paras/.(??{$&^' '})//&&redo
+1 byte para o-p
sinalizador. Ele não funcionará em uma sub-rotina do jeito que você a possui agora, porque na{ code }
verdade não é um loop (portanto&&redo
, não funcionará), mas o-p
coloca dentro de umwhile
loop.' '
por$"
. Dê uma olhada nisso para ver como é o código.Prolog (SWI) , 151 bytes
Demora muito tempo para ser executado nos casos falsos mais longos devido ao retorno.
Experimente online!
Ungolfed
fonte
MATL , 20 bytes
Experimente online! Ou verifique todos os casos de teste (demora um pouco).
Explicação
fonte
Mathematica, 65 bytes
fonte
JavaScript (Node.js) , 47 bytes
Experimente online!
fonte
Python 3 , 71 bytes
Experimente online!
fonte