Dado um número inteiro, produza uma barraca de cabeça para baixo.
A entrada determina o tamanho da barraca (valor absoluto) e se a entrada está no lado esquerdo (números negativos) ou no lado direito (números positivos).
If input = -1:
____
\/_/
If input = -2:
________
\ / /
\/___/
If input = -3:
____________
\ / /
\ / /
\/_____/
If input = 1:
____
\_\/
If input = 2:
________
\ \ /
\___\/
If input = 3:
____________
\ \ /
\ \ /
\_____\/
et cetera
Observe que o topo da barraca (ou seja, a última linha) tem 2 * abs(input) - 1
sublinhados.
Não pode haver nenhum espaços à esquerda, de modo que a primeira linha começa diretamente com um sublinhado.
Suponha que a entrada nunca será 0
.
Seu código deve ser o mais curto possível.
Esse desafio é baseado em um mini desafio de bate - papo da Helka Homba , que pode ser usado em desafios reais sob as condições da Licença pública de hobby da Calvin .
3
por exemplo?Respostas:
MATL ,
55535251 bytesExperimente online!
Explicação
Vamos
N
denotar a entrada. O código continua em três etapas.Primeiro , a primeira linha de
4*N
sublinhados é criada como uma sequência e é exibida (o que a remove da pilha).Segundo , a "estrutura" da barraca é construída usando os dois tipos de barras. Para isso, é criada uma matriz 2D numérica que contém
1
e2
corresponde aos dois tipos de barras e0
para espaço.Isso é feito concatenando quatro matrizes:
abs (N)
;2
no antidiagonal;Concatenar essas quatro matrizes verticalmente fornece, usando
N=3
como exemplo, a seguinte4*N × N
matriz:(que, transposto, começa a parecer com a tenda).
Agora cuidamos do sinal da entrada. Se for positivo, simplesmente transporemos a matriz acima e indexaremos na string
'\/ '
. A indexação é baseada em 1 e modular,1
tornando - se'\'
,2
tornando'/'
-0
se e tornando - se' '
, produzindo a matriz de caracteres 2DPor outro lado, se a entrada é negativa, invertemos verticalmente e negamos aritmeticamente a
4*N × N
matriz, produzindoO índice
-1
agora se refere a'/'
e-2
para'\'
. Ou seja, os dois tipos de barras foram trocados, conforme necessário. Mais uma vez, a transposição e indexação para a cadeia de caracteres'\/ '
fornece a barraca invertida:Terceiro , os sublinhados precisam ser preenchidos em parte da última linha da matriz de caracteres 2D. A posição horizontal desta linha depende do sinal da entrada e seu comprimento é
abs(N)
.Depois que os espaços correspondentes forem substituídos por sublinhados, o resultado será exibido implicitamente, abaixo da linha inicial de sublinhados que já foi exibida na primeira etapa.
fonte
Javascript (ES6), 139 bytes
Constrói a barraca recursivamente:
Ungolfed e comentou
Exemplos
fonte
Python 2,
143 141 139 138137 bytes-2 bytes graças a @ Sp3000 (sem necessidade de parênteses ao exec em Python 2)
-1 byte graças a @ Sp3000 (use
cmp
)Teste em ideone
Primeiro vemos se
n
é negativo e fazemosd
+1
se é e-1
se não é.Em seguida, selecionamos as duas barras
a
eb
, usando ded
modo quea='\', b='/'
quandon
é positivo ea='/', b='\'
quandon
é negativo.Em seguida, definimos o
s=abs(n)
que pode ser alcançado pors=n*d
.Em seguida, calculamos o número de
_
na parte superior (parte inferior da imagem), que também é o número dena lateral da barraca como
x=2*s-1
.Em seguida, calculamos o número de
_
na base da barraca (parte superior da imagem) e armazenamos comoy=4*s
uma vez que será usada no loop para criar o restante da barraca.Agora, imprimimos a base da barraca usando
print'_'*y
.Em seguida, imprimimos o restante da tenda executando
s
instruções print com uma variável em loopi
inicializada na0
qual incrementa1
para cada instrução print.O restante da barraca tem
y-3-x-i-i
espaços na porta ex
espaços no corpo até que o topo seja atingido, quando fors-i>1
avaliado como Falso, escolhendo a_
partir de'_ '
.Para uma tenda positiva da porta esquerda, a tenda inteira, excluindo os espaços à esquerda, fica de trás para frente, de modo que é revertida enquanto a tenda positiva da porta direita não está
[::d]
.fonte
cmp(0,0)
retorna0
Python 2, 121 bytes
Apenas muita formatação de string.
fonte
C #,
215214 bytesExiste a possibilidade de salvar alguns bytes ao usar com
using s=string;
antecedência.que seria 15 (usando) + 184 (método) = 199 bytes.
fonte
var
dentro do loop for parastring
, poderá remover o segundovar
(incluindo espaço para salvar o byte). Entãovar f
se tornastring f
, e;var p=
se torna,p=
.TSQL, 195 bytes
Golfe:
Ungolfed:
Violino
fonte
V , 66 bytes
Experimente online!
Essa é uma abordagem bastante ingênua, então tentarei jogar mais tarde hoje. Esta solução contém caracteres não imprimíveis, então aqui está um hexdump:
fonte
05AB1E , 52 bytes
Explicação
Experimente online!
fonte
PowerShell v2 +,
217205190187184 bytesRecebe a entrada
$b
como um número inteiro. Observe que, se$b
for negativo, é necessário cercá-lo explicitamente com parênteses para convertê-lo adequadamente (veja exemplos); caso contrário, o PowerShell achará que é uma sequência.Independentemente de qual direção a tenda está voltada, a primeira linha é a mesma, um monte de sublinhados; exatamente
4*abs(input)
muitos deles, na verdade. Esse número também é armazenado$a
para uso posterior. Além disso, agora que temos o valor absoluto de$b
armazenado em$a
, transformamos$b
em um booleano para seu sinal e escolhemos nossas barras armazenadas em$y
e$z
.A próxima linha está construindo e formulando a saída, e é uma bagunça, então vamos detalhar.
Estamos essencialmente indexando em uma matriz de dois elementos,
(big long calculations saved into $x)
ou com$x
base em$b
.Os cálculos são onde o corpo da barraca é construído. Nós fazemos um loop
1..$a|%{...}
. A cada iteração, estamos construindo uma linha do corpo da barraca. Começamos com um número de espaços igual à linha em que estamos-1
, para que fique alinhado à esquerda. Isso é armazenado$w
para mais tarde e concatenado com a barra apropriada ($ z, com base em$b
), o número de espaços do doorframe, a outra barra$y
e os sublinhados ou espaços, dependendo se estamos no resultado final ou não, depois outra barra$y
e, finalmente, o número apropriado de espaços à direita ($w
) para construir uma sequência retangular. Essa matriz resultante de strings é armazenada$x
.Se a metade esquerda da matriz é seleccionado (ou seja,
$b
éFalse
uma vez que a entrada foi positiva), em seguida, temos de percorrer$x
e reverso cada item de linha - isto é, onde os espaços à direita entram em jogo; permite simplesmente reverter as linhas em vez de recalcular as distâncias.Se
$b
forTrue
, a metade direita da matriz$x
é selecionada.Em qualquer um dos casos, o pipeline agora contém uma matriz de seqüências de caracteres. Saída implícita via
Write-Output
acontece na conclusão do programa, com nova linha padrão entre os elementos.Exemplos
fonte
Haskell,
187184183 bytesEu sinto que essa não é uma ótima nota para Haskell, então qualquer idéia de melhoria é bem-vinda.
Ungolfed
fonte
main
para que ele aceitestdin
como entrada?:
. ou seja, mude"\\" ++ entrance...
para'\\':entrance
.|1>0=(2*(n-i-1))%' '
para|q<-2*(n-i-1)=q%' '
.C,
240207193 bytesDessa vez, otimizei a função g (...) para usar um único loop for.
Desta vez, a macro X é melhor como uma função g (...) e, como y e z são parâmetros em um novo escopo, posso apenas diminuí-los no escopo de g.
Teste com esta função principal; Isso deve diminuir muito mais.
fonte
C #
241231 bytesGuardado 10 bytes graças a @Kevin Cruijssen
Versão antiga:
Originalmente tinha a
new string(...)
como umFunc<char,int,string>
, mas salvou um byte usando o construtor. Eu queriaint
->char
estava implícitoTenho certeza de que minha matemática também pode ser corrigida de alguma forma, mas não consigo vê-la
fonte
int
antesz=
, adicionando-o ao lacete for-:int j=0,z
. E uma vez que você usastring
bastante, você pode apelido de TI comusing s=System.String;
isso o total se torna:using s=System.String;s f(int N){var f=N<0;N=N>0?N:-N;var o=new s('_',N*4);for(int j=0,z;j<N;){z=-2*j+2*N-2;var O=j>N-2?'_':' ';o+='\n'+new s(' ',j)+'\\'+new s(' ',z)+(f?'/':O)+new s(O,j++*2)+(f?O:'\\')+new s(' ',z)+'/';}return o;}
( 231 bytes )Swift 2.2 421 bytes
Bem ... Esta foi uma tentativa.
Golfe:
UnGolfed:
fonte
PHP, 143 bytes
correr com
php -r '<code>' <parameter>
demolir
fonte
Lote, 289 bytes
Recebe entrada em STDIN. Começa criando uma sequência de
2*(abs(n)-1)
sublinhados. Isso é repetido mais 4 sublinhados adicionais para a base da barraca. O restante da barraca consiste em um recuo (que aumenta em 1 em cada linha), a\
, o meio da barraca e a/
. O meio da barraca começa como2*(abs(n)-1)
espaços, mais um\
ou/
mais um espaço (que não posso representar no Markdown), além de outros2*(abs(n)-1)
espaços. Eu reutilizo a sequência de sublinhado e as altero para espaços por conveniência, mas depois altero os espaços de volta para sublinhados para a última linha. Cada linha remove dois espaços de um lado do meio da barraca, embora seja um pouco mais golfista mover os dois espaços para o início da corda primeiro, se necessário.fonte
Tela , 25 bytes
Experimente aqui!
fonte