Descrição do Desafio
Vamos chamar uma matriz retangular bidimensional (ou seja, cada subarray tem o mesmo comprimento), uma grade . Cada unidade de uma grade é um espaço vazio ou uma borda . Em uma grade de caracteres, o espaço vazio é representado por um único espaço em branco; qualquer outro caractere é tratado como uma borda. Grelhas de amostra ( +
', |
' e -
'adicionadas para facilitar a leitura - elas não fazem parte da grade ):
+----+
| |
| |
| |
| |
| |
+----+ an empty 4x5 grid
+------+
| |
| # |
| # |
+------+ a 6x3 grid with 2 borders
+----------+
| |
| |
| ##### |
| # # |
| ## # <------ enclosed area
| # # |
| ###### |
| |
+----------+ a 10x8 grid with an enclosed area
Dada uma grade 2D e um par de coordenadas, preencha a área fechada ao redor do ponto representado pelas coordenadas.
Amostras de entradas / saídas
1)
0 0
+----------+ +----------+
| | |XXXXXXXXXX|
| | -> |XXXXXXXXXX|
| | |XXXXXXXXXX|
+----------+ +----------+
2)
6 5
+-----------------+ +-----------------+
| | | |
| | | |
| ######## | | ######## |
| # # | | #XXXXXXX# |
| # #### | | #XXXX#### |
| # # | | #XXXX# |
| # # | -> | #XXXX# |
| # # | | #XXXX# |
| #### | | #### |
| | | |
| | | |
+-----------------+ +-----------------+
3)
4 6
+-----------------+ +-----------------+
| | |XXXXXXXXXXXXXXXXX|
| #### | |XXXX####XXXXXXXXX|
| # # | -> |XXX# #XXXXXXXX|
| #### | |XXXX####XXXXXXXXX|
| | |XXXXXXXXXXXXXXXXX|
+-----------------+ +-----------------+
4)
4 5
+-----------------+ +-----------------+ +-----------------+
| | | | | |
| | | | | |
| #### | | #### | | XXXX |
| #### | -> | #### | or | XXXX |
| #### | | #### | | XXXX |
| | | | | |
+-----------------+ +-----------------+ +-----------------+
5)
2 6
+----------------+ +----------------+
| | |XXXXXXXXXXXXXXXX|
| | |XXXXXXXXXXXXXXXX|
| | |XXXXXXXXXXXXXXXX|
| | -> |XXXXXXXXXXXXXXXX|
| | |XXXXXXXXXXXXXXXX|
|BBBBBBBBBBBBBBBB| |BBBBBBBBBBBBBBBB|
| | | |
| | | |
+----------------+ +----------------+
Notas
Uma grade vazia é considerada fechada, ou seja, as bordas também estão localizadas implicitamente ao longo das bordas da grade (ver exemplos 1. e 5.),
Um canto de uma área fechada não precisa ser em forma de L. As duas áreas a seguir são, portanto, equivalentes:
#### ##
# # # #
# # == # #
# # # #
#### ##
Se uma unidade sob as coordenadas for uma borda, você poderá deixar a grade inalterada (como no exemplo 4.) ou tratá-la como um espaço vazio,
Você pode escolher qualquer caractere para preenchimento / espaço vazio, desde que inclua essas informações no envio,
Se o uso de um tipo que não seja mais
char
adequado aos seus objetivos, você poderá usarints
(0
para espaço vazio,1
para borda) oubooleans
(true
efalse
respectivamente) ou qualquer outro tipo - apenas inclua essas informações em seu envio,As coordenadas usadas nos exemplos acima são
(row, column)
coordenadas com índice 0 , pois é mais conveniente para uma matriz bidimensional. Se você deseja usar o(column, row)
sistema (cartesiano) e / ou coordenadas não indexadas a 0, especifique-o no seu envio.Se você não sabe por onde começar, consulte o artigo da Wikipedia sobre preenchimento de inundação
Lembre-se de que este é um desafio do código-golfe , portanto, faça o seu código o mais curto possível!
fonte
Respostas:
MATLAB,
307 bytesComo podemos usar entradas lógicas em vez de strings, podemos usar a função bare, como é:
Esta é uma função anônima. Para o uso, temos que assumir um nome, por exemplo
f=@
imfill
. Então podemos apenas avaliar comof(input,point)
, ondeinput
é uma matriz lógica, por exemplo[0,0;0,1]
, epoint
é um vetor 2d com coordenadas baseadas em 1, por exemplo[1,2]
.Versão antiga trabalhando em strings:
Esta função anônima aceita a entrada e também um vetor com as coordenadas (índice baseado em 1). A função
imfill
faz exatamente o que precisamos, mas opera apenas em imagens binárias. É por isso que convertemos a matriz de entrada em uma matriz lógica (onde#
estão os limites e(os espaços) são nulos), executamos o preenchimento e depois convertemos de volta. (novamente
#
é preenchido, o espaço não é preenchido).Obrigado @LuisMendo por -
1byte.fonte
~=32
por>32
C, 162 bytes
Recebe entrada de argumentos (
./floodfill X Y grid
). A grade deve conter\n
ou\r\n
entre cada linha, a nova linha final é opcional. Maneira mais simples que eu encontrei para invocar a partir do shell:Saídas para stdout, usando
!
o caractere de preenchimento. Se a posição inicial coincidir com a#
, não fará alterações.Demolir:
Observe que isso depende da modificação da sequência de argumentos de entrada, que é proibida, portanto, isso pode não funcionar em todas as plataformas (declarações implícitas também tornam isso não-padrão).
fonte
int w, l;
simplesmentew, l;
- defaults gcc-lo paraint
digitarC -
263247240238 bytesEsta é
primeirasegundaterceira versão, eu acredito que o código pode ser shrinked também.E versão legível:
Compile e execute:
gcc -o flood floodgolf.c && cat 1.txt | ./flood
Recursos:
Nota: estou trabalhando em
int
valores. Cada(32) é tratado como espaço vazio. Qualquer outro valor é tratado como borda. As coordenadas estão no formato
(row, column)
fonte
for
(scanf
aqui), e usar o primeiro parâmetro de main como uma declaração int barata funcionará na maioria dos compiladores. Além disso, você pode ser capaz de guardar um pouco por achatamento sua matriz (certamente deve ajudar o ciclo de impressão)Python 2, 158 bytes
Experimente online . Solução recursiva simples
Indexado a 0 em ordem de coluna de linha
1 - espaço vazio, 0 - espaço preenchido
Recebe entrada como matriz de matrizes de 1 e 0 e dois números
fonte
Perl 5 , 129 + 1 (-a) = 130 bytes
Experimente online!
Como?
fonte