Neste desafio, você recebe um mapa de um terreno bidimensional, visto de lado. Infelizmente, algumas partes do terreno estão flutuando no ar, o que significa que elas cairão. Seu trabalho é prever onde eles pousam.
A entrada
Sua entrada é uma ou mais sequências separadas por nova linha de comprimentos iguais, contendo apenas os caracteres #
(um sinal de número, significando uma rocha) ou .
(um ponto, significando espaço vazio).
A saída
Sua saída tem o mesmo formato que a entrada, mas com a seguinte modificação. Vamos ver a string de entrada como uma grade bidimensional de rochas. Toda rocha na entrada que é conectada ao fundo da grade por um caminho de rochas adjacentes é firme ; outras pedras estão soltas . Rochas diagonalmente adjacentes não são consideradas adjacentes. Todas as pedras soltas caem diretamente e terminam como uma pilha em cima de uma pedra firme ou da linha de baixo. As pedras soltas não são unidas uma à outra, então caem individualmente, não como grandes formações. A saída é a grade resultante.
Exemplos
A entrada
..###. .##.#. .#.... .##.#.
não contém pedras soltas, portanto a saída é idêntica a ela.
A entrada
...#.. .#..#. .#..## .#...# .##### .#...#
contém uma pedra solta no topo, que cai sobre a rocha firme sob ela. A saída é
...... .#..#. .#..## .#.#.# .##### .#...#
A entrada
.#####.... .#....#### ###.###..# #.#...##.. .####..#.# ......###. ..#...#..# ..#...#..#
tem um grande grupo de pedras soltas à esquerda. O grupo se decompõe quando as rochas caem, então a produção é
.......... ....###### ..#.###..# . #...##.. .##....#.. .##...#### ####..#..# #####.#..#
Esclarecimentos
- Você pode pegar a entrada de STDIN e enviar para STDOUT ou escrever uma função.
- Este é o código-golfe, então o programa mais curto (em bytes) é o vencedor.
- As brechas padrão não são permitidas.
Respostas:
CJam,
180 ... 133 101 ... 94 9087 bytesDefinitivamente, há muitas possibilidades de golfe, mas eu queria publicá-lo primeiro depois de fazê-lo funcionar completamente.Pega a grade de rochas (composta
.
e#
sem uma nova linha à direita) de STDIN e imprime a saída em STDOUTATUALIZAÇÃO : Usando um preenchimento parcial ineficiente, mas mais curto, para descobrir rochas firmes.
ATUALIZAÇÃO 2 : Foi alterado o algoritmo para fazer as pedras caírem. Muito mais curto agora!
ATUALIZAÇÃO 3 : Fiz várias otimizações pequenas e, no final, consegui reduzir a contagem de bytes para metade do código original!
Como funciona :
Para o aterro, iteramos durante todo o tempo de comprimento da grade. Em cada iteração, garantimos a conversão de pelo menos 1
#
que está tocando diretamente um espaço em(espaço). O espaço aqui representa um grupo de rock firme. Assim, no final das iterações de comprimento (grade), garantimos que todas as rochas firmes sejam representadas por espaços.
Experimente online aqui
fonte
Perl 5: 98
98, incluindo 2 sinalizadores de linha de comando.
Explicação:
fonte
JavaScript (ES6) 232
Como uma função com um parâmetro de string e retornando uma string.
Inicialmente, adicione uma linha inferior de '1' para identificar a linha de base.
O primeiro loop pesquisa as rochas fixas (que estão próximas de '1') e as marca como '1'. A pesquisa é repetida até que não sejam encontradas mais rochas firmes.
O segundo loop move os caracteres '#' restantes em direção à linha inferior. Novamente, isso é repetido até que nenhuma pedra possa ser movida.
Por fim, substitua o '1' por '#' novamente e corte a linha inferior.
Menos golfe
Teste (você pode ter evidências de quais rochas são firmes e quais caíram)
fonte
APL,
130119Como não é possível (tanto quanto eu saiba) inserir novas linhas quando a entrada é solicitada, este programa usa uma matriz de caracteres como entrada.
O algoritmo usado primeiro é convertido em uma matriz binária (
0
é ar e1
é rocha) e depois é preenchido pela linha inferior para marcar rochas firmes como2
. Em seguida, particione cada coluna em "espaços entre rochas firmes" e classifique cada partição para fazer com que a rocha solta "caia" no ar.Edit1: Jogou golfe usando um algoritmo de preenchimento de inundação diferente
Execuções de teste
Execução 1
Defina uma matriz de caracteres
A
e imprima-a:Em seguida, alimente
A
o programa:Execução 2
fonte
JS - 443 bytes
A inundação preenche as rochas do fundo e depois derruba as rochas não preenchidas. Usa muita recursão com o preenchimento de inundação, para que o seu navegador fique um pouco lento.
É uma função - chame-o com
g("input")
JSFiddle: http://jsfiddle.net/mh66xge6/1/
JSFiddle Ungolfed: http://jsfiddle.net/mh66xge6/
fonte
Python 3, 364 bytes
Tenho certeza de que mais poderia ser extraído disso ... mas nunca competirá com CJam e Perl.
Semelhante a outras respostas. Uma peculiaridade é que ele vira a grade de cabeça para baixo primeiro (para tornar os índices de loop mais convenientes) e adiciona uma linha e coluna extra de
.
(para evitar problemas com os-1
índices de quebra ). Execute chamandoP(string)
.fonte