(Inspirado ao desenhar em uma placa de apagamento a seco)
Desafio:
Dada uma sequência de entrada contendo caracteres que representam cores diferentes de marcadores de apagamento a seco em um quadro branco, imprima a ordem em que foram desenhados, do primeiro ao último.
Entrada:
Uma sequência que contém cores de marcador de apagamento a seco, representadas por letras alfabéticas (as maiúsculas são diferentes das minúsculas, você pode substituir qualquer caractere usado nos meus exemplos, desde que cada cor tenha uma letra distinta). O restante do quadro branco terá espaço em branco. Haverá apenas uma linha de cada cor por cartão. Não haverá entradas nas quais todas as linhas se sobreponham (consulte o caso de teste 4
). Todas as linhas serão retas e horizontais ou verticais.
Resultado:
A ordem em que as linhas foram desenhadas no quadro, desde a primeira até a última. Se houver várias soluções para qualquer entrada, você poderá produzir qualquer uma delas. A saída pode ser formatada da maneira que você preferir: sequência única de caracteres ou separada por espaços, novas linhas, etc., desde que os caracteres usados correspondam aos usados na sua entrada.
Casos de teste:
Entrada 1:
R
R
BBRBB
R
Saída 1:
BR
Entrada 2:
GY
GY
RRRRGYRRR
GY
GY
BBBBBBBB
GY
GY
Saída 2:
RGYB // or RYGB
Entrada 3:
R P
R P
AAAARAAAAPA
R P
R P
GGGGRGGG P
R
Saída 3:
AGPR // or APGR
Entrada 4:
O Y
RRRYR
O Y
GOGGG
O Y
Saída 4:
// Undefined, does not need to be handled by your program
Entrada 5:
YYYB
B
B
Saída 5:
// YB or BY
Regras:
Isso é código-golfe , então o código mais curto em bytes vence.
Respostas:
Perl, 103 + 2 = 105 bytes
Corra com
-n0
(penalidade de 2 bytes).Explicação:
Uma ligeira sutileza aqui vem com entradas como estas:
Veja a quarta linha aqui. Se a ordem de escrita fosse BACBD, realmente poderia haver uma linha horizontal de
B
s por lá sem violar nenhuma das suposições do problema (exceto que só existe uma linha de cada cor, algo que não verificamos). Para contornar isso, garantimos no último regex que cada linha começa com uma letra (ou dígito ou sublinhado, mas são impossíveis) e confiamos no fato de que linhas paralelas serão encontradas da esquerda para a direita e superior -to-bottom (porque o regex encontrará a primeira correspondência dentro da string). Dessa forma, o primeiro caractere de cada linha ambígua aqui é sobrescrito antes que a própria linha seja vista como uma correspondência, e isso impede a correspondência da expressão regular.fonte
perl -n0E '/.*/;for$i(/(\S)(?=(?:(?:.{@{+}})?(?:\1| ))*(?!.*\1))/gs){/.*/;unless(/$i+[^$i\s]+$i/||/$i(.{@{+}}[^$i ])+.{@{+}}$i/s){$r="$i$r";s/$i/ /g;last}}/\S/?redo:say$r'
(o que requer as linhas de entrada para ser preenchido com o botão direito com espaços de ser todas do mesmo tamanho))Python 2, 199 bytes
Isso acabou muito mais do que eu pensava inicialmente. Além do que
rindex
eu pude ver, esse é um programa muito bom para se traduzir em Pyth.Pega uma lista de linhas e gera uma lista de caracteres. O código gera permutações recursivamente, certificando-se de que nenhuma das linhas desenhadas deva ser desenhada no topo da linha atual.
O código abusa de muitos recursos do Python, por exemplo, levando
w
ao poder de um booleano, testando conjuntos vazios verificando subconjuntos de{0}
(já que meus conjuntos nunca contêm não-strings) e o meu favorito, distinguindo qualquer listaNone
verificando se representação é maior queZ
.Código explicado
fonte