Hoje é Purim, cujo costume é distribuir biscoitos em forma de triângulo com recheio chamado hamantaschen (singular: hamantasch ). Outro costume é beber muito.
Eu não sou o padeiro mais perfeito ... Eu tenho tantos hamantaschen de tamanho irregular para dar e tantos amigos para dar! Se eu lhe enviar uma foto dos meus cookies, você pode me dizer quantos eu tenho de que tamanho e tamanho? Mas como é Purim e eu estou bêbado demais para ler muito código, ele precisa ser o menor possível.
Definições
Tamanho
Um hamantasch pode ser de qualquer tamanho . O menor hamantasch é do tamanho 1 e se parece com o seguinte:
/\ --
-- \/
Às vezes, vários hamantaschen podem se sobrepor . A forma abaixo conta como dois hamantaschen (um tamanho 1, um tamanho 2):
/\
/\ \
----
Alguns hamantaschen têm recheio . Isso será indicado preenchendo todo o espaço em branco interno com um caractere. Observe que o tamanho 1 hamantaschen não pode ter enchimento.
Vamos nomear hamantaschen com base no tamanho e preenchimento. Vamos usar o formato <filling> <size>
e, se não estiver preenchido, - <size>
(você pode usar um espaço em vez de a -
, mas a margem não é a mesma).
Aqui estão a . 2
, a . 4
e a - 3
:
/\
/./\
---- /./ \
\../ /./ \
\/ --------
Estes são a @ 3
, a . 2
e a - 4
:
/\
/ /\
/\ / /@@\
/..\ / /@@@@\
---- --------
Aqui está algo mais difícil. Veja como o & 2
recheio tem menos do que você esperava devido à inclinação da sobreposição - 3
? Possui a - 1
, & 2
a - 3
e a & 4
:
--------
\ \/&/
\ /\/
\/&/
\/
Entrada
Você receberá um arquivo de texto ou uma única sequência de hamantaschen (nova linha à direita opcional e espaço em branco à direita opcional para ser par).
Limites
- Você pode esperar que a string seja válida - ou seja, todo caractere que não seja um espaço em branco contribui para um hamantasch deliciosamente doce (por que desperdiçar massa?).
- Você também pode esperar que ele seja devidamente preenchido ou não - ou seja, cada homentasch será totalmente preenchido com um carácter ASCII consistente - ASCII 32 para preencher, ou qualquer coisa 32..127 para cheia (excluindo
/
,\
e-
). - Estes hamantaschen não são empilhados em 3 espaços. Tudo
/
e\
será visível. Tudo o-
que não é bloqueado por/
e\
será visível. O preenchimento vem muito por último. - Todos os hamantaschen terão pelo menos metade da sua linha horizontal (arredondamento para cima) visível.
- Qualquer bloco contíguo de preenchimento preenche apenas o menor hamantasch que o rodeia.
Resultado
Retorne uma lista de "nomes" de todas as hamantaschen que podem ser encontradas atendendo aos critérios acima. A saída pode estar na forma que você desejar (uma string, um hash, stdout, etc).
Casos de teste
Caso de teste nº 1
Entrada nº 1:
/\
/ /\
/\ / /@@\
/..\ / /@@@@\
---- --------
/\
/**\
/*/\*\
/*/..\*\
--------
Saída 1:
. 2
. 2
- 4
@ 3
* 4
Caso de teste nº 2
Entrada nº 2:
/\----
/\/\*\/
/ /\d\/
------
Saída # 2:
- 3
- 2
d 2
- 1
* 2
- 1
Teste # 3
Entrada nº 3:
----
\/\/
/\/\ /\
---- /::\
----
Saída # 3:
- 1
- 1
- 2
- 1
- 1
- 2
: 2
Teste # 4
Entrada nº 4:
/\/\
/ /\$\
-/--/\\
--/--\
/xxx/\
/xxx/##\
---/----\
/ \
--------
Saída 4:
$ 2
x 4
- 3
- 2
- 4
- 1
- 1
# 2
Caso de teste inválido nº 5
Entrada:
/\
\/
Resultado:
Você não precisa lidar com isso.
fonte
/
e\
, e-
será sempre trunfo enchimento.(1,0)
, estão desativadas por+1
. Ainda assim, eu sei o que você quer dizer e discordo. Que indicação existe(2, 2)
no centro superior de um- 2
e não apenas no canto superior direito e esquerdo dos dois lados superiores- 1
? Nada que eu possa ver. E a mesma lógica se aplica a(3, 2)
. A menos que você deseja adicionar uma regra para assumir máxima hamantaschen possível ...Respostas:
C #,
496452 bytesEdit: encontrou um bug com verificação de limites ... mas também distribuiu uma carga de bytes que foi forçada a entender meu próprio código. Desenrolar a função local ajudou um pouco e removeu o código específico do C # 7. Esta pergunta foi muito divertida.
Experimente Online
Programa completo, espera entrada preenchida com espaço para entrada padrão, saídas para saída padrão. A saída é uma entrada por linha, com avanço de linha à direita. Os cookies são gerados em ordem crescente de tamanho, primeiro no canto superior esquerdo. Levei um bom tempo para entender as regras, mas acho que passa em todos os exemplos fornecidos.
Ele funciona pesquisando repetidamente em toda a grade por Hamantaschen válido, aumentando o tamanho 'permitido'. Para cada célula, ele verifica para cima e para baixo, seguindo o
\
e/
em ambos os lados o máximo possível. Se perceber que a próxima linha tem muitas-
, e o tamanho atual é o tamanho 'permitido', determina o preenchimento e imprime a entrada.O preenchimento é encontrado explorando todo o espaço do cookie, procurando uma célula 'não utilizada'. Quando uma célula não utilizada é encontrada, ela é marcada como usada (já que aumentamos o tamanho permitido, sabemos que somos o menor cookie que o contém) e registramos o preenchimento.
Código formatado e comentado:
Saídas para os 4 casos de teste:
fonte