Um conjunto de pontos satisfeito de forma arborizada é um conjunto de pontos 2D de modo que, para qualquer retângulo alinhado ao eixo que possa ser formado usando dois pontos no conjunto como cantos opostos, esse retângulo contenha ou toque em pelo menos um outro ponto. Aqui está uma definição equivalente da Wikipedia:
Diz-se que um conjunto de pontos é satisfeito de forma arborizada se a seguinte propriedade for válida: para qualquer par de pontos que não estejam na mesma linha horizontal ou vertical, existe um terceiro ponto que fica no retângulo estendido pelos dois primeiros pontos ( dentro ou no limite).
A imagem a seguir ilustra como os retângulos são formados. Esse conjunto de pontos NÃO é satisfeito de forma arborizada porque esse retângulo precisa conter pelo menos mais um ponto.
Na arte ASCII, esse conjunto de pontos pode ser representado como:
......
....O.
......
.O....
......
Uma leve modificação pode fazer com que isso seja satisfeito de forma arborizada:
......
....O.
......
.O..O.
......
Acima, você pode ver que todos os retângulos (dos quais existe apenas um) contêm pelo menos três pontos.
Aqui está outro exemplo de um conjunto de pontos mais complexo que é satisfeito de forma arborizada:
Para qualquer retângulo que possa ser desenhado com dois pontos, esse retângulo contém pelo menos um outro ponto.
O desafio
Dada uma grade retangular de pontos (que represento com O
) e do espaço vazio (que represento com .
), a saída de um truthy valor se for arborally satisfeito, ou um Falsey valor se ele não é. Isso é código-golfe.
Regras adicionais:
- Você pode optar por ter os caracteres
O
e.
trocá-los por qualquer outro par de caracteres ASCII imprimíveis. Simplesmente especifique qual mapeamento de caracteres seu programa usa. - A grade sempre será retangular. Uma nova linha à direita é permitida.
Mais exemplos
Arborally satisfeito:
.OOO.
OO...
.O.OO
.O..O
....O
..O..
OOOO.
...O.
.O.O.
...OO
O.O.
..O.
OOOO
.O.O
OO..
...
...
...
...
..O
...
O.....
O.O..O
.....O
OOO.OO
Não está satisfeito de forma arborizada:
..O..
O....
...O.
.O...
....O
..O..
O.OO.
...O.
.O.O.
...OO
O.....
..O...
.....O
Respostas:
Caracóis , 29
30 39bytesEle funciona traçando dois lados do retângulo e, em seguida, verificando se existe algum quadrado contendo um O tal que viajar em uma linha reta a partir do quadrado em 2 das direções cardinais resultaria em acertar um lado do retângulo.
Imprime o máximo de 1 e a área da grade se a entrada for "satisfeita de forma arborizada"; caso contrário, 0.
fonte
Oracle SQL 11.2,
364344 bytes: g é a grade como uma string
: w é a largura da grade
Retorna nenhuma linha como verdade, retorna os retângulos que não correspondem aos critérios como falso
Sem golfe
A vista v calcula as coordenadas de cada ponto O.
A primeira parte do menos retorna todos os retângulos, a cláusula where garante que um ponto não possa ser emparelhado com ele mesmo.
A segunda parte procura um terceiro ponto em cada retângulo. Esse ponto precisa ter uma coordenada, x ou y, igual à coordenada de um dos dois pontos que definem o retângulo. A outra coordenada desse terceiro ponto precisa estar no intervalo delimitado por essa coordenada para cada um dos pontos que definem o retângulo.
A última parte da cláusula where garante que o terceiro ponto não seja um dos dois pontos que definem o retângulo.
Se todos os retângulos tiverem pelo menos um terceiro ponto, a primeira parte do sinal de menos será igual à segunda parte e a consulta não retornará nada.
fonte
MATL , 38 bytes
Isso usa uma matriz de caracteres 2D como entrada, com linhas separadas por
;
. Então o primeiro exemplo éO restante dos casos de teste neste formato são os seguintes.
Arborally satisfeito:
Não está satisfeito de forma arborizada:
Experimente online! Você também pode verificar todos os casos de teste de uma só vez .
Explicação
O código primeiro obtém as coordenadas dos caracteres
O
na entrada. Em seguida, ele usa dois loops aninhados. O loop externo seleciona cada ponto P (2-tupla de suas coordenadas), compara com todos os pontos e mantém pontos que diferem de P nas duas coordenadas. Esses são os pontos que podem formar um retângulo com P. Chame-os de conjunto R.O loop interno seleciona cada ponto T de R e verifica se o retângulo definido por P e T inclui pelo menos 3 pontos. Para fazer isso, subtrai P de todos os pontos; isto é, move a origem das coordenadas para P. Um ponto está no retângulo se cada uma de suas coordenadas divididas pela coordenada correspondente de T estiver no intervalo fechado [0, 1].
fonte
PHP,
1123 bytes,851 bytes, 657 bytes(php novato)
explicação (código comentado):
fonte
C, 289 bytes
Requer nova linha à direita, o que é permitido (sem a nova linha, o código seria dois bytes maior). Saídas 0 (não satisfeito arboralmente) ou 1 (satisfeito arboralmente).
fonte