Aquecimento: Regex, Papel, Tesoura
Esse é o desafio que eu originalmente queria postar, antes de perceber que existe uma solução muito curta. No entanto, pode ser um problema interessante de se pensar na preparação para o desafio real abaixo.
Escreva três expressões regulares R , P e S de forma que elas se combinem de uma maneira cíclica de Pedra, Papel e Tesoura. Em particular, R corresponde a S , S corresponde P e P corresponde ao R , mas R não coincidir com P , S não coincidir com R e P não coincide com S . Aqui está uma tabela útil:
Regex Matches Doesn't match
R S P
P R S
S P R
Não importa o que R , P e S façam em outras entradas, inclusive elas mesmas.
Aqui, match significa apenas que alguma substring (possivelmente vazia) da entrada é correspondida. A correspondência não precisa cobrir toda a entrada.
O desafio: Regex, Papel, Tesoura, Lagarto, Spock
Para esse desafio, você resolverá uma versão mais difícil do problema acima, com base na variante RPS Rock, Paper, Scissors, Lizard, Spock (conforme popularizado pela The Big Bang Theory ). No RPSLV, existem cinco símbolos diferentes, que se superam em dois ciclos:
- Pedra → Tesoura → Lagarto → Papel → Spock → Pedra
- Rocha → Lagarto → Spock → Tesoura → Papel → Rocha
Você deve escrever cinco regexes R , P , S , L e V que imitam essa estrutura quando dados um ao outro como entrada. Aqui está a tabela correspondente:
Regex Matches Doesn't match
R L, S V, P
L V, P S, R
V S, R P, L
S P, L R, V
P R, V L, S
Só para ficar claro, você deve não correspondem à cadeia R
, P
, etc, mas as outras expressões regulares. Por exemplo, se o seu regex R for, ^\w$
por exemplo, P e V devem corresponder à string ^\w$
, enquanto S e L não devem.
Novamente, match significa apenas que pelo menos uma substring (possivelmente vazia) da entrada é correspondida. A correspondência não precisa cobrir toda a entrada. Por exemplo \b
(limite de palavras) corresponde hello
(no início e no final), mas não corresponde (^,^)
.
Você pode usar qualquer sabor regex, mas indique a opção na sua resposta e, se possível, forneça um link para um testador on-line para o sabor escolhido. Você não pode usar nenhum recurso de regex que permita chamar código no idioma do host do sabor (como o e
modificador do sabor Perl ).
Delimitadores (como /regex/
) não são incluídos no regex quando fornecidos como entrada para outro e você não pode usar modificadores que estão fora do regex. Alguns tipos ainda permitem o uso de modificadores com sintaxe embutida (?s)
.
Sua pontuação é a soma dos comprimentos das cinco expressões regulares em bytes. Menor é melhor.
Parece muito mais simples encontrar uma solução funcional para esse problema do que pode parecer à primeira vista, mas espero que encontrar uma solução ótima seja bastante complicado.
fonte
\b
(limite de palavras) correspondehello
(no início e no final), mas não corresponde(^,^)
".Respostas:
PCRE.NET,3532 bytes-3 bytes graças a Martin Ender
Rocha:
Papel:
Tesouras:
Lagarto:
Spock:
A idéia aqui é combinar caracteres no final de outras regexes que são reservadas, mas deixar de ser tratado como tal quando estiver dentro de uma classe de caracteres.
fonte
PCRE,
1514 bytesRocha:
B
Papel:
\b$
Tesouras:
b|B.
Lagarto:
\B.
Spock:
^\w
fonte
Q
(existe uma solução 14b com Lizard = `\ Q \`, depois o restante é semelhante ao seu), mas sem sucesso.sem recursos sofisticados,
3530 bytes5 bytes salvos pela idéia de Neil, que usa o que
]
não precisa\
.Isso funciona, por exemplo, com o
re
módulo python .Ele procura um
]
precedido por uma letra que indique qual é a regra.Versão anterior usada
R='\[[RSL]'
etc.Uma tentativa anterior com pontuação 40 estava usando
R='[SL]x|Rx'
etc.fonte
R='[LSR]]'
etc.This works with python's re
bem, Python provavelmente deve ser o cabeçalho, em seguidaPCRE,
2019Rocha
Papel
Tesouras
Spock
Lagarto
fonte
20 bytes
fonte
JavaScript, 45 bytes
Outra solução trivial.
fonte
POSIX,
5045 bytesPoderia ser feito mais curto, mas o truque (ocultar partidas depois de $) se acostumou, então estou procurando outra maneira
Os 5 primeiros caracteres de cada string são ignorados ao fazer a correspondência. Portanto, a cadeia de destino efetiva simplifica para apenas X? Y ?. Nenhum deles tem letras duplas porque "?" é um caractere comum, portanto, os quatro últimos caracteres quando usados como regex precisam corresponder (sequência nula). Portanto, os padrões são reduzidos a "contém 5 caracteres seguidos pela letra de destino": o que significa que os caracteres de 6 a 9 do destino devem conter a letra de destino (o 5º de cada sequência)
Atualização: versão de 35 bytes abaixo, agora!
fonte
PCRE, 65 bytes
Esta é uma solução realmente trivial - e não muito inteligente -, mas tentarei jogar com ela.
V:
EU:
S:
P:
R:
Essencialmente, cada regex possui um 'identificador', na forma de um comentário, que informa aos outros regexes se deve ser correspondido ou não.
fonte
.NET, 50 bytes
Em ordem eles são
R, P, S, L, V
.Trabalha procurando o grupo identificador (por exemplo
[^R]
) em cada uma das outras expressões.Alterar as expressões para
^R|\^[SL]
, ou similar, parece funcionar, mas é um pouco parecido com a resposta do @ dzaima, apesar de chegar a 45 bytes.fonte
Vanilla RE, 40 caracteres
Não é a solução mais concisa ou elegante, mas possui uma estrutura visual quase semântica agradável!
Pedra bate Tesoura ou Lagarto
Papel bate Vulcan ou Pedra
Tesoura bate Lagarto ou
Lagarto de papel bate Papel ou Vulcano
Vulcano bate Pedra ou Tesoura
fonte
POSIX, 35 bytes
Uma maneira completamente diferente de "esconder" atrás de um símbolo de início / fim, então eu me sinto bem com isso :) Estou combinando para começar porque "?" sempre teria que ir entre letra e final / $ se feito de outra maneira.
10 bytes a menos que a minha primeira solução e conceitualmente simples, que é um bônus que eu gosto.
fonte