Todos nós vimos as imagens com a legenda "Quantos quadrados há nesta imagem? 98% não entenderão isso direito!" Bem, aqui está sua chance de rir desses 98%.
Entrada
Um bloco retangular feito de apenas 2 caracteres. De uma forma geral, isso é definido por m linhas, cada uma contendo n caracteres.
Exemplo:
0000xxx
00x00xx
00000xx
xxxxx0x
Isso pode ser representado como uma sequência separada por nova linha, uma matriz de cadeias ou uma matriz de caracteres 2D. Quaisquer outros tipos de entrada devem ser sugeridos nos comentários.
Resultado
A saída será um número inteiro representando a quantidade total de quadrados representados individualmente pelos dois caracteres (em pseudocódigo, num_squares (char1) + num_squares (char2))
Um quadrado é definido como um conjunto de instâncias do mesmo caractere que descrevem completamente um quadrado geométrico de comprimento lateral de pelo menos 2 . Esses quadrados não precisam ser preenchidos pelo personagem que o descreve. Os exemplos a seguir ilustram esse conceito:
x0
0x // no squares
xxx
x0x
xxx // 1 square of side length 3
0000
0xx0
0xx0
0000 // 1 square of side length 2, 1 square of side length 4
Pontuação
Seu programa será pontuado por 2 critérios, em ordem decrescente de importância:
- Número de caracteres no seu bloco de código que não fazem parte de um quadrado, como definido acima (você deve minimizar isso!) (Nota: os caracteres dentro de um quadrado não são automaticamente considerados parte desse quadrado) (Nota 2: novas linhas não contam para essa pontuação)
- Número de bytes (você deve tentar minimizar isso!)
O segundo critério atuará como desempate para o primeiro.
Regras do Desafio
- Por uma questão de flexibilidade, você pode optar por usar quaisquer 2 caracteres alfanuméricos para substituir o 0 e x dos meus exemplos, desde que eles não sejam o mesmo caractere.
- Cada linha no retângulo de entrada deve ter o mesmo comprimento e não deve conter nenhum caractere além dos 2 especificados para sua resposta ao desafio (além do caractere de nova linha, se aplicável)
- Quadrados triviais (quadrados 1x1 indicados por um único caractere) não contam para a saída. Eles são péssimos.
- Seu programa não precisa manipular entrada vazia, mas deve tratar casos em que nenhum quadrado é possível (quando uma das dimensões do retângulo de entrada é 1)
- Você também pode optar por especificar que está lidando com quadrados alinhados na diagonal se gostar do desafio. Isso seria adicionado à saída especificada nas especificações do desafio.
Exemplo deste conceito:
Input:
00x00
0x0x0
x000x
0x0x0
00x00
Output: 6 (1 diagonally aligned square of side length 3, 5 diagonally aligned squares of side length 2)
Casos de teste
A seguir estão alguns casos de teste básicos que seu programa deve corresponder. O valor entre parênteses é a saída, caso você queira contar quadrados alinhados na diagonal.
Input:
xxxx
x00x
x0xx
xxxx
Output: 2 (2)
Input:
x00000xxx0
Output: 0 (0)
Input:
xxx0x0x000xx0xx0
0x000x00x0x0xx00
00xx0xx00xx0000x
x0x0x0x0x00x0xxx
00xx0xxx00xxx0x0
Output: 0 (5)
Input:
0000
0000
0000
0000
0000
0000
Output: 26 (34)
Input:
xxx00
xx000
Output: 2 (2)
Regras gerais
- As regras padrão se aplicam à sua resposta, para que você possa usar STDIN / STDOUT, funções / método com os parâmetros adequados e programas completos do tipo retorno. Sua chamada.
- As brechas padrão são proibidas.
- Se possível, adicione um link com um teste para o seu código.
- É altamente recomendável adicionar uma explicação para sua resposta.
- Alguma pergunta / correção / conselho para mim? Comente abaixo! Esta é a minha primeira pergunta, por isso estou animado para aprender o máximo possível.
fonte
Respostas:
Perl, 0 caracteres fora dos quadrados (25430 bytes)
Como você pode ver, cada caractere faz parte de um quadrado. A metade superior de cada quadrado grande é comentada por comentários de linha e a metade inferior (incluindo a segunda linha não comentada) é escapada por um grande documento aqui começando no meio do quadrado (
<<'';#
) e terminando na linha vazia depois da grande praça.Este programa foi gerado automaticamente a partir do seguinte programa:
Que é um programa para resolver o mesmo desafio, mas (levianamente) joga golfe por bytes e comprimentos de linha curtos, não por pontuação.
Toma como entradas primeiro a altura e a largura do retângulo, depois os caracteres individuais do retângulo separados por espaços. Exemplo de uso: para resolver o retângulo
você chama o programa assim:
perl theprogram.pl 3 5 x x x y y x x y y y x y y x x
De qualquer forma, ao quadrar o código dessa maneira, é possível obter 0 ou 2 com qualquer linguagem de programação que tenha uma solução de uma linha e um caractere de comentário de linha, transformando a linha única
como isso:
Os únicos caracteres que não fazem parte de um quadrado são os dois espaços. Dependendo do idioma, também pode haver maneiras de usar strings ou comentários inteligentes de várias linhas (como os documentos aqui do Perl) ou algum tipo de código redundante para transformar esses dois caracteres de espaço em um quadrado.
Quanto à redução da contagem de bytes, minha solução tem várias melhorias imediatas e tenho certeza de que há também outras maneiras de refinar essa técnica, mas não tenho paciência para isso; Eu só queria fazer uma demonstração para que vocês possam ir à loucura com isso.
fonte
MATL ,
18161410 caracteres fora dos quadrados (92103111127 bytes)Entrada é uma matriz de caracteres com caracteres
+
e-
. Não conta quadrados na diagonal.Experimente online!
Ou verifique todos os exemplos e casos de teste .
fonte
Geléia ,
20 1917 19081905 bytes , Pontuação200Um programa completo com uma lista de listas
.
e+
caracteres. (Funciona para qualquer personagem, até mais de 2).Experimente online!
Qualquer tentativa de reduzir a pontuação introduzindo personagens parece apenas aumentar mais a pontuação. Acho que a maneira de vencer esse desafio é encontrar o idioma certo !Mas Jelly não tem caráter de comentário, por isso é necessário um pouco de criatividade extra ...
Os programas Jelly consistem em "Links" - código separado por caracteres de nova linha, caracteres de pilcrow (
¶
- interpretados como o mesmo byte de novas linhas) ou caracteres válidos da página de códigos sem um comportamento definido (atualmenteq
é um exemplo). Na verdade, estes últimos contam como um link cada um, e não como um separador puro. A execução do programa começa no link no canto inferior direito, o "Link principal" (aqui⁽⁽ĿĿ
).Ŀ
⁽⁽ĿĿ
⁽⁽Ŀ
⁽⁽ĿĿ
q
ẆZṡLƊ€ẎṖƇZU$ƬḢ€ẎEƲ€S
q
fonte
¶
é realmente apenas um proxy para uma nova linha. O programa realmente se parece mais com isso¶
s podem ser substituídos por 9q
s ou(
s ou o que for (como eu disse na sinopse).q
como eu pensava que seria: /⁽⁽ĿĿ
avaliaq
ocorre porque é um byte não utilizado? Ele funciona comu
muito o que também não é utilizada </ s> Nevermind.