Como parte de um projeto de planejamento da cidade, você recebeu a tarefa de criar um programa ou função que exibirá o horizonte da cidade, com algumas informações dos arquitetos. O projeto está apenas na fase de inicialização, portanto, um esboço bastante aproximado é suficiente. A abordagem mais fácil é, obviamente, simplesmente desenhar o horizonte na arte ASCII.
Todos os prédios ficam à beira do rio, portanto, todos estão alinhados. Os arquitetos fornecerão a altura de cada edifício como entrada, e seu código deverá exibir o horizonte.
A entrada dos arquitetos será um inteiro ou um meio inteiro. Se o número for um número inteiro, o edifício terá um telhado plano, enquanto um meio inteiro resultará em um telhado inclinado. Um zero será apenas terreno plano. As paredes de um prédio são separadas por 3 caracteres, enquanto um zero terá um único caractere de largura. Edifícios adjacentes compartilham paredes.
Para detalhes e esclarecimentos sobre a saída, consulte os exemplos abaixo:
N = 3
___
| |
| |
|___|
N = 3.5
_
/ \
| |
| |
|___|
N = 6
___
| |
| |
| |
| |
| |
|___|
n = 0
_
Exemplo de entrada: 3 3.5 0 2
_
___ / \
| | | ___
| | | | |
|___|___|_|___|
Exemplo de entrada: 0 0 2.5 3 0 4 1
___
_ ___ | |
/ \| | | |
| | | | |___
__|___|___|_|___|___|
Louisville ,0 2 1 3.5 0 4 2 4 2 4 6 1 6 0 5 1
___ ___
| | | | ___
_ ___ ___ ___| | | | | |
/ \ | | | | | | | | | | |
___ | | | |___| |___| | | | | | |
| |___| | | | | | | | |___| | | |___
_|___|___|___|_|___|___|___|___|___|___|___|___|_|___|___|
Os caracteres ASCII utilizados são: nova linha, espaço e /\_|
(pontos de código 10, 32, 47, 92, 95, 124).
Regras:
- É opcional criar um programa que aceite apenas números inteiros como entrada, multiplicando todos os números por dois. Então, em vez de tomar
3 3.5 2
, seu programa pode demorar6 7 4
. Se o segundo formato de entrada for escolhido, uma entrada de 6 deve resultar em um prédio de 3 andares, 7 deve ser um prédio de 3 andares com telhados inclinados etc. - A saída deve ser exatamente como descrito acima, mas espaços à direita e novas linhas estão OK.
- O formato exato da entrada é opcional. O que há de melhor no seu idioma.
- O resultado deve ser exibido na tela, para que os arquitetos possam dar uma olhada.
- Você pode assumir que haverá pelo menos um número inteiro fornecido e que somente a entrada válida será fornecida.
Este é um codegolf, então o código mais curto em bytes vence.
Respostas:
Python 2,
199193188185 bytesEste é um programa completo que aceita números inteiros como entrada. Exemplo de entrada .
fonte
MATLAB,
219209203bytesInfelizmente, isso não funciona no Octave . Não sei exatamente por que, parece ter algo a ver com o bit disp / flipud que se quebra.
Além disso, atualmente não há definição de como é a aparência de um edifício de 0,5 altura nem menção a eles; portanto, neste código, presumo que eles não são permitidos.
A seguir, o código de uma maneira um pouco mais legível:
Primeiro, pegamos uma entrada como uma matriz e fazemos alguma inicialização variável.
Como os prédios com altura zero são uma dor - eles basicamente terminam com uma largura que depende do que eles são ao lado (embora o que é impresso não mude), simplificamos as coisas, desenhando terreno suficiente para todos os edifícios. Assumimos que cada edifício terá 4 caracteres de largura (porque os edifícios adjacentes se fundem) - os de altura zero não são, mas o excesso será aparado mais tarde.
Agora, extraímos cada edifício por sua vez.
Primeiro obtemos a parte inteira da altura, pois isso determinará quantos '|' nós precisamos.
Agora desenhe o muro para este edifício - se houver dois edifícios adjacentes, o muro para este novo edifício estará na mesma coluna que o muro do último.
Verifique se este é um edifício de meia altura. Se for, o telhado será diferente. Para as meias alturas, o teto será
/ \
o da altura total___
(o Matlab replicará implicitamente isso a partir de um único sublinhado, portanto, salve alguns bytes lá). Há um pedaço extra de telhado uma linha mais alta para os edifícios de meia altura, de modo que também é adicionado.Desenhe no telhado
Agora vá para o início do próximo edifício e desenhe na parede compartilhada (se a parede for muito curta nesse momento, ela será aumentada quando o próximo edifício for desenhado). Observe que os edifícios com altura zero têm 1 de largura, os edifícios normais têm 4 de largura; portanto, simplificamos o que seria um if-else tratando (a> 0) como um número decimal e não um booleano.
Em seguida, vem um pouco de hackery para trabalhar com edifícios de altura zero. Basicamente, o que isso diz é que se esse prédio tivesse altura zero, e o anterior não, isso significa que o local do prédio seguinte precisa ser incrementado em 1 porque um prédio de altura zero imprensado entre dois outros edifícios tem efetivamente o dobro da largura - isso é responsável pela parede extra que normalmente é compartilhada com um edifício adjacente. Também acompanhamos a altura do edifício para fazer essa verificação na próxima vez.
Depois de concluído, vire a matriz do edifício para a posição correta e exiba-a. Observe que também cortamos qualquer excesso de terra aqui.
Portanto, quando executamos esse script, solicitamos nossa entrada, por exemplo:
Em seguida, gera o edifício e exibe o resultado. Para a entrada acima, é gerado o seguinte:
fonte
Kotlin,
447442 bytesVersão não destruída:
fonte
Python 2,
357306299294287281276 bytesIsso usa a codificação "dobrada", para ser passada para a função como uma lista. Editar: bytes raspados refazendo parte do grande condicional como um seletor de matriz e alternando para a codificação dobrada. Raspou mais bytes reorganizando ainda mais o condicional e convertendo mais lógica em aritmética.
EDIT: xsot é melhor
Explicação:
d
é 1 a mais que o comprimento da matriz, porque adicionaremos zeros em cada extremidade da lista, do segundo elemento até o zero que adicionamos no final.h
é a altura do desenho. (Temos que dividir por 2 neste cálculo porque estamos usando a representação dobrada, que usamos especificamente para evitar a necessidade de lançar flutuadores em ints por todo o lugar. Também adicionamos 1 antes de dividir alturas tão estranhas - edifícios pontudos - obtenha um pouco mais de espaço do que o tipo normal.)o
é a string de saída.Um truque padrão para recolher um loop for duplo em um loop for único. Uma vez que fazemos:
agora realizamos o mesmo que:
mas de uma maneira que nos permita salvar dez bytes (incluindo espaços em branco nas linhas a seguir).
Cole uma parede a qualquer momento que a altura do edifício atual ou do edifício anterior for mais alta que a linha atual, desde que haja pelo menos um limite de edifício aqui. É o equivalente à seguinte condicional:
onde b é a altura atual da varredura, a é a altura atual do edifício e c é a altura anterior do edifício. A última parte do condicional evita colocar paredes entre os espaços do solo.
Esta é a parte que desenha o telhado correto, selecionando as partes do telhado comparando a altura do edifício com a altura atual da varredura. Se um telhado não for aqui, ele imprime um número apropriado de espaços (3 quando é um edifício real, por exemplo, um> 0, caso contrário 1). Observe que, quando estamos no nível do solo, ele nunca tenta desenhar um telhado, o que significa que edifícios de tamanho 0,5 não ficam com telhados pontudos. Ah bem.
Quando estamos no nível do solo, queremos sublinhados em vez de espaços. Acabamos de substituí-los todos de uma vez aqui.
Antes de começarmos a processar a próxima linha, imprima a atual e limpe a linha de saída. Cortamos o último caractere porque é o "_" correspondente ao espaço no solo que adicionamos adicionando um zero no início da função. (Anexamos esse zero para que não precisássemos adicionar um caso especial para inserir uma parede direita, se existir, o que acrescentaria muito mais código do que adicionamos adicionando o 0 e cortando o "_".)
fonte
Python 3
725 bytes608 bytes
Código de golfe:
Aqui está o código não destruído. Existem alguns comentários, mas a idéia básica é criar edifícios com paredes duplas, portanto, a linha de fundo se parece com:
Então, para obter índices dessas paredes duplas e remover essas colunas, obtemos:
Código:
Hora de jogar golfe!
fonte
ru(n):return math.ceil(n)
golfe, mas ainda assim ... Por favor, não tome isso de maneira negativa, eu não sou um bom jogador de golfe e com certeza não um bom programador. Eu sugiro que você tente melhorá-lo um pouco ... Na verdade, é divertido quando você percebe que consegue encurtá-lo. Eu fui de muitos para 120 a 55 alguns dias atrás. Portanto, é possível, mesmo se você é novo nisso.PHP,
307297293 bytesRecebe argumentos * 2 da linha de comando. salve no arquivo, execute com
php <filename> <parameters>
.demolir
fonte
C ++, ungolfed
(ou talvez ingovernável)
Supondo que haja menos de 100 elementos e cada elemento seja menor que 100.
s
é o número de edifícios (exigido na entrada).fonte