O videogame Minecraft é sobre colocar e remover diferentes tipos de blocos na rede inteira 3D que compõe o mundo virtual. Cada ponto de rede pode conter exatamente um bloco ou estar vazio (um bloco " aéreo " oficialmente). Neste desafio, nos preocuparemos apenas com um plano 2D horizontal do mundo 3D e um tipo de bloco: baús .
Baús permitem que os jogadores armazenem itens. Quando dois baús são ortogonais adjacentes no mesmo plano horizontal, suas texturas se ligam e um baú duplo com o dobro da capacidade. Nada maior que um baú duplo pode ser feito; não há baús triplos nem quádruplos.
Um bloqueio torácico só pode ser colocado em um ponto de treliça vazio se seus quatro pontos ortogonais adjacentes estiverem todos vazios ou se exatamente um contiver um bloqueio torácico que ainda não faz parte de um baú duplo. Essas regras de posicionamento garantem que nunca haja ambiguidade sobre quais blocos de peito estão vinculados para formar baús duplos.
Por exemplo, suponha que .
haja espaço vazio e C
um baú: (os números também são espaço vazio e apenas para fins de identificação).
.......C..
.1.C2.C3..
........5C
.CC4..CC..
..........
- Um baú pode ser colocado no ponto 1 porque seus 4 vizinhos estão vazios.
- Um baú pode ser colocado no ponto 2 porque o baú vizinho ainda não faz parte de um baú duplo.
- Um baú não pode ser colocado no ponto 3 porque haveria ambiguidade sobre como o baú duplo se forma.
- Um baú não pode ser colocado no ponto 4 porque o baú vizinho já faz parte de um baú duplo.
- Um baú pode ser colocado no ponto 5. O baú duplo na diagonal não afeta nada.
Assumindo que a área além da grade está vazia, alterar cada uma .
da grade para a *
se um baú puder ser colocado lá resulta:
******.C**
***C**C.**
*..***..*C
.CC.*.CC.*
*..***..**
Nem todos os *
espaços podem ser ocupados com baús ao mesmo tempo, é claro, mas se você tivesse apenas um baú, ele poderia ser colocado em qualquer um deles.
Desafio
Escreva um programa ou função que leva em um .
e C
grade, e muda a cada .
um *
se um peito poderia ser colocado lá, imprimir ou retornar a grade resultante.
A entrada pode ser de stdin ou um arquivo ou como um argumento de string para uma função.
Você pode presumir que a entrada está bem formada - ou seja, uma grade de texto perfeitamente retangular, com pelo menos 1 caractere de largura e altura, contendo apenas
.
eC
Opcionalmente, você pode assumir que há uma nova linha à direita após a última linha (e pode haver uma na saída )Você pode assumir que o arranjo de baús na entrada é consistente com as regras acima. Nunca haverá ambiguidades sobre quais baús formam baús duplos.
Se desejar, você pode usar qualquer uma das três distintas ASCII imprimíveis caracteres no lugar de
.
,C
e*
. Você não pode usar outra coisa no lugar de novas linhas.Todos os baús são baús normais. Baús não presos ou baús ender .
Pontuação
O envio com o menor número de bytes vence.
Para um desafio relacionado ao Minecraft um pouco mais desafiador, tente o Nether Portal Detection .
Respostas:
CJam,
82 76 66 62 5854 bytesO formato de entrada espera
0
para célula de ar e8
para uma célula torácica. A saída contém1
todas as células que podem ser colocadas com um baú.UPDATE :
Corrigido um erro. Aumentado em 3 bytes :(golfed more :). 4 bytes salvos graças ao @ Sp3000Exemplo de entrada:
Saída:
Acho que já terminei de jogar golfe ...
Explicação
Experimente online aqui
fonte
Regex do .NET ( Retina ),
434416310 + 1 = 311 bytesApós o último desafio que respondi na regex (o Desafio do Portal Nether vinculado a este desafio), finalmente decidi escrever uma ferramenta de linha de comando, que atua como intérprete para expressões regulares no estilo .NET, para poder responder perguntas com regex sem ser desafiado por não ser um idioma independente. Eu chamei de Retina.
Agora, esse desafio não se presta muito bem a um envio de regex, mas eu só precisava usar o Retina agora. ;) (Além disso, o Sp3000 me desafiou a fazê-lo no chat.) Então, aqui está:
Arquivo Regex
Arquivo de substituição
O arquivo regex é basicamente apenas o regex, exceto que
`
permite colocar algumas opções no arquivo, neste caso, simplesmente no modo multilinha. Quando são fornecidos dois arquivos, o Retina assume automaticamente o modo substituir tudo. Esses dois arquivos definem um programa que lê a entrada de STDIN e imprime o resultado em STDOUT.Você também pode testá-lo no RegexHero e RegexStorm . O regex funciona com e sem nova linha à direita e usa
_
no lugar de.
. (Aparentemente, o RegexStorm ocasionalmente tem problemas se não houver uma nova linha à direita, mas o RegexHero parece lidar bem com ambos os casos.)Há uma quantidade horrível de duplicação no regex, e eu tenho algumas idéias para reduzi-lo significativamente ... Vou tentar mais tarde e depois adicionar uma explicação. Enquanto isso, deixe-me saber se você pode encontrar alguma entrada que produza um resultado errado.
fonte
J,
7573 bytesUsa o formato da pergunta, usando
.
/*
/C
for space / usable space / chest, respectivamente.Editar: corrige um pequeno erro (acidentalmente usei um toro em vez de tratar adequadamente o ambiente como um espaço vazio).
Explicação
fonte
C, 193
2 novas linhas desnecessárias para maior clareza. As alterações em relação ao código não-destrutivo incluem: caracteres como códigos ASCII, em vez de caracteres literais; rearranjo de v = 0, strlen e strchr para salvar caracteres (strchr é o mais feio, pois significa que um cálculo que, de outra forma, seria realizado apenas uma vez, é realizado 5 vezes por célula!)
As funções C não aceitam seqüências de caracteres como argumentos ou as retornam como valores; portanto, o melhor que posso fazer é o seguinte:
q
é um ponteiro para a sequência de entrada. A função modifica a cadeia e, quando a função retorna, a saída é encontrada na cadeia original.Para resumir as regras:
um quadrado em branco (que não contém C ou nova linha) pode ser convertido se tiver no máximo 1 vizinho com um C
... E esse vizinho não tem vizinhos com um C.
A função g contém uma função f que se repete da profundidade 1 à profundidade 0. Com apenas 2 níveis de recursão, uma
f(r,0)
chamada recursiva simples será executada, não sendo necessáriof(r,d-1)
!Código não jogado no programa de teste
A sequência de teste de entrada é codificada.
gets
escanf
não aceitará uma sequência de entrada com novas linhas; eles cortam em pedaços a cada nova linha.Saída com base no exemplo de pergunta
fonte
JavaScript (ES6) 124
129Usando caracteres 0 (*), 6 (C), 7 (.)
Ungolfed e explicou
Teste no console Firefox / FireBug
Saída
fonte
Perl, 66
Os conflitos no peito correspondentes à regexp terminaram no lado comprido, então não competimos com CJam neste momento.
Usa 0 e 2 para espaços vazios e de peito na entrada, 1 para marcar os pontos na saída.
Experimente aqui .
fonte
Python 2 - 281 bytes
(As linhas 8 e 9 são planejadas com um único caractere de tabulação, que o SE converte em 4 espaços. Cada linha deste programa possui 0 ou 1 bytes de espaço em branco à esquerda.)
Entrada:
0
para não peito,2
para peitoOuput:
0
para não peito,2
para peito existente,1
para possível novo peitoDeus, isso é horrível. Eu devo estar seriamente sem prática. Eu joguei todos os truques que conheço e ele saiu ... bem, saiu como 281 bytes, perdendo para todas as respostas, exceto a do regex , haha. Sinceramente, sinto que joguei um pouco bem, então acho que meu algoritmo não foi o ideal.
Ungolfed:
fonte