Desafio
Você receberá uma tabela como entrada, desenhada com ASCII |
e _
. Sua tarefa é colocar as cadeiras em torno dele.
Exemplo
Entrada:
____
| |
| |
| |
| |
|____|
Saída:
_^_^_
< >
| |
< >
| |
<_ _ _>
v v
Essas cadeiras são feitas de <>
e v^
.
Outro exemplo:
A linha deve ter o máximo de cadeiras possível.
_____
| |_____
| |
| |
| |
| _____|
|_____|
_^_^_
< |_^_^_
| >
< |
| |
< _ _ _>
|_ _ _| v v
v v
Deve haver espaços entre todas as cadeiras. E >_^_^_<
é inválido, deveria ser |_^_^_|
.
_____ _____
| |_____| |
| |
| |
| |
| ___________|
|_____|
_^_^_ _^_^_
< |_^_^_| >
| |
< >
| |
< _ _ _ _ _ _>
|_ _ _| v v v v v
v v
Nenhuma cadeira pode estar dentro de uma "rosquinha".
_________________
| _____ |
| | | |
| | | |
| |_____| |
|_________________|
_^_^_^_^_^_^_^_^_
< _____ >
| | | |
< | | >
| |_____| |
<_ _ _ _ _ _ _ _ _>
v v v v v v v v
^
e v
priorizar <
e >
. Nenhuma cadeira por si só (precisa ter pelo menos uma |
ou _
na fila).
_________________
| _____ |
| | | |
| | |_____|
| |_____
|___________|
_^_^_^_^_^_^_^_^_
< _ _ _ >
| | v v | |
< > <_ _ _>
| |_^_^_ v v
<_ _ _ _ _ _|
v v v v v
Isso é código de golfe, então o código mais curto vence.
Respostas:
Python 2,
10331007924879829787713699692691688687672670664659654648643642630625623620570560554545518514513510505492476454451443 bytes6 bytes salvos graças a Riley
6 bytes salvos graças a Adnan
Como essa pergunta tem mais de um ano e ainda não tem respostas, pensei em tentar.
Experimente online!
O programa lê na tabela um arquivo nomeado
I
e imprime a tabela com suas cadeirasstd::out
. Eu não tinha certeza de muitos dos casos extremos, por isso tomei meu melhor julgamento (o que foi menos trabalhoso), mas parece passar em todos os casos de teste. Algumas das saídas não correspondem exatamente, mas todas têm o mesmo número de cadeiras.Explicação
A primeira linha simplesmente configura algumas definições que nos economizarão bytes no futuro:
(Vou descompactar essas macros para facilitar a leitura em linhas futuras)
Em seguida, abriremos um arquivo nomeado
I
porque já temos uma variável que é curta para isso, e salva alguns bytes.Dividimos ao longo de novas linhas para criar uma lista de strings (As linhas da imagem)
Em seguida, encontro o comprimento da linha mais longa para poder preencher todas as linhas nesse comprimento. (Também adiciono 3 porque precisamos de um pouco de preenchimento adicional)
Em seguida, executamos o preenchimento real e criamos uma borda de
I
caracteres ao redor da borda. Isso ocorre porque precisaremos distinguir a diferença entre o interior e o exterior da forma mais tarde. Também mudaremos o tipo de dados de uma lista de strings para uma lista de caracteres (comprimento 1).A próxima linha é apenas outra definição de economia de bytes.
(Eu também vou descompactar este)
Agora, queremos espalhar
I
caracteres para todos os lugares fora da forma. Podemos fazer isso com um autômato pseudo-celular. Cada umI
se espalhará para qualquercaractere adjacente . Poderíamos fazer loop até que o autômato se estabilize, no entanto, isso não pode levar mais iterações do que os caracteres
b
.Para cada iteração, queremos passar sobre cada caractere da lista 2D (excluindo o preenchimento mais externo)
Para cada posição, executamos o seguinte código:
Vamos quebrar isso.
Temos um if com duas condições separadas por um
&
(bit a bitand
)A primeira simplesmente verifica se existe uma
I
em qualquer uma das células adjacentes e a segunda apenas verifica se a célula atual é a" "
. Se passarmos por essas condições, definimos a célula atual como umI
.Agora que determinamos o exterior e o interior da forma, podemos começar a colocar as cadeiras ao redor da mesa.
Mais uma vez, percorremos todas as células (e definimos mais algumas abreviações)
Agora, aqui está a minha parte favorita. Se você se intrometeu no meu golfe chato, principalmente baseado em definições, até agora, vou recompensá-lo com um bom petisco de golfe inteligente (se é o que digo).
Um pouco de fundo em python:
No Python, se você tentar atribuir uma chave de dicionário duas vezes, ela atribui a última. Por exemplo
Abusaremos essa propriedade para atribuir a célula atual a um caractere específico.
A primeira condição é
Se a célula estiver no meio de uma aresta de 3
_
caracteres, reatribuiremos a célula atual e a célula abaixo dela. Nós o atribuiremos ao resultado da indexação de um dicionário sobrecarregado porI
. Primeiro, definimos nosso padrão com o par."I":"_"+a[x+1][y]
Isso significa que, se não houver alteração, atribuiremos as duas células aos seus valores originais. Em seguida, adicionamos o para[x-1][y]:"^ "
. Isso não fará nada (importante), a menos que a célula acima da atual (a[x-1][y]
) seja preenchida com umI
. Se houver umI
, ele substituirá o padrão, dizendo para colocar uma cadeira na célula atual. Em seguida, passamos para a célula abaixo da célula atual, se essa célula forI
novamente substituída para colocar uma cadeira voltada para cima abaixo do local atual.A próxima condição é um pouco mais simples
Verificamos se a célula atual e a célula acima são ambas
|
. Nesse caso, criamos um dicionário.O primeiro par no dicionário
"I":"|"
define o padrão. Como vamos acessar a chave,I
seI
não for reatribuída, ela retornará ao padrão|
(o caractere que já é) e não fará nada.Nós adicionamos as duas teclas
A[y+1]:">",A[y-1]:"<"
Se qualquer uma das duas células à esquerda e à direita estiverI
, ela reatribuirá a célula atual a uma cadeira apontando na direção do lado de fora.Agora nós apenas temos que produzir. No entanto, não podemos apenas imprimir, há algumas coisas de limpeza que precisamos fazer primeiro. Temos que converter novamente em uma string e remover todos os
I
s que criamos. Isso é feito em uma linha.fonte
i,o="I "
vez dei="I";o=" "
trabalhar?n
custos 4 bytes e me poupar 6. Embora eu não o use frequentemente, ele economiza 2 bytes.