Escreva um programa ou função que receba um número inteiro positivo (via stdin, linha de comando ou função arg) e imprima ou retorne uma sequência desses muitos pequenos triângulos lado a lado, alternando para onde apontam:
/\
/__\
Este único triângulo é a saída se a entrada for 1
.
Se a entrada for 2
, a saída será
____
/\ /
/__\/
Se a entrada for 3
, a saída será
____
/\ /\
/__\/__\
Se a entrada for 4
, a saída será
________
/\ /\ /
/__\/__\/
E assim por diante. Seu programa deve suportar entradas de até 2 16 - 1 = 65535.
Detalhes
- O triângulo mais à esquerda sempre aponta para cima.
- Pode haver espaços à direita, mas pode não haver espaços à esquerda desnecessários.
- Pode haver uma nova linha opcional à direita.
- Observe que
1
a saída tem duas linhas, mas, caso contrário, são três. Isso é necessário. - O menor envio em bytes vence.
SQL,
182175173187 bytesNão que isso nunca seja o mais curto, mas ainda assim é divertido tentar minimizar o sql;) lol, eu fiz isso no Oracle 11; no entanto, esses devem ser SQL básicos. [edit] como apontado, eu não apliquei a regra when input = 1 - apenas mostre 2 linhas. não consigo pensar em uma maneira melhor de fazê-lo, no entanto, salvei alguns bytes modificando a lógica v;) adicionar 2 antecipadamente economiza alguns bytes por não precisar repeti-lo mais tarde [/ edit]
[edit1] removeu alguns espaços desnecessários [/ edit1] [edit2] alterou && i para apenas & i. Ele reduz 2 caracteres, mas força o usuário a inserir o número de triângulos duas vezes ...: O PI percebeu meus "bons hábitos de codificação" usando & & i; estavam custando 2 bytes !! O horror!! [/ edit2]
Explicação (observação: eu uso && 1 nesta explicação, portanto, ele solicita apenas uma vez, o & 1 acima economiza espaço no código, mas solicita várias vezes;))
Resultado
fonte
from
? Nesse caso, você economizará um byte.Python 2,
8988878583 nomeado / 81 sem nome(Obrigado a @orlp por um byte e @xnor por mais três)
Esta é uma função que recebe um int
n
e retorna os triângulos como uma string usando a abordagem linha por linha.por exemplo,
print f(10)
dáPara a primeira linha, em vez de
(n>1)*
usar1%n*
, pois1%n
é 0 sen == 1
e 1 sen > 1
.fonte
" /\\ "
-o" /\ "
."\n".join()
3 itens, mesmo que a lista seja usada para remover condicionalmente o primeiro elemento. Talvez algo comob*(x+"\n")+y+"\n"+z
seja mais curto?JavaScript (ES6), 101
109Muito longo
Explicação
Usando seta gorda para definição de função. Além disso, nenhum
{}
bloco: o corpo da função é uma expressão única que é o valor de retorno.f=(a,b,c)=>expr
é equivalente aDentro de uma única expressão, você não pode usar instruções como
if
orvar
, mas?:
funcionam bem em vez deif else
w
é o segundo parâmetro (não utilizado) da funçãoz
Podemos reescrever a
f
função comoTeste no console Firefox / FireBug
Resultado
fonte
w
n=>(n>1?' '+'____'.repeat(n/2)+'\n':'')+' /\\ '.repeat(n).slice(0,n*2+2-n%2)+'\n'+'/__\\'.repeat(n).slice(0,n*2+1+n%2)
119 (deliberadamente não usando seqüências de caracteres de modelo etc. para corresponder à sua resposta).CJam,
555351 bytesTentei portar minha resposta em Python e ela acabou sendo mais curta que os outros CJams.
Permalink .
fonte
Haskell
155153139131 BytesEu encontrei uma abordagem um pouco diferente que acabou sendo mais curta que o meu método original. Minha tentativa original é preservada abaixo. Como antes, as dicas de golfe são apreciadas.
Obrigado a Nimi pelas dicas de golfe.
Tentativa anterior
197179 Bytesfonte
(mod n 2)==0
éeven n
ou utilização melhorodd n
e trocar othen
eelse
parte.concat.take(div n 2).repeat
étake(4*div n 2).cycle
porque todos os elementos da lista são de comprimento 4. Atribua nomes abreviados a funções com nomes longos, por exemploz=zipWith
- e usez
. Você pode expulsar alguns espaços...repeat""else[...
.foldr z["","",""]
éfoldr1 z
, porque a lista a dobrar nunca está vazia. Em vez deall(==' ')
você pode usar==" "
(<- dois espaços no meio), porque é usado para remover a linha vazia no caso de n = 1 e aqui está a primeira linha" "
. A primeira definição det
podem ser escritos em uma única linha:t n|odd...
.CJam,
7368636260 bytesDefinitivamente, isso precisa de golfe ...
Teste aqui.
Explicação
fonte
Julia, 115 bytes
Isso cria uma função sem nome que aceita um número inteiro e imprime os triângulos. Para chamá-lo, dê um nome, por exemplo
f=n->(...)
.Ungolfed + explicação:
Exemplo de saída:
Estou muito chateado que isso seja tão longo. Tenho certeza de que existem muitas oportunidades de golfe, mas elas não estão claras para mim no momento. Deixe-me saber se você tem alguma sugestão ou se você gostaria de alguma explicação adicional!
fonte
CJam,
68 6260 bytesTanto quanto posso ver, essa é uma abordagem completamente diferente da outra solução CJam. Isso pode ser muito praticado.
Experimente online aqui
fonte
C # 190
Ungolfed
fonte
while
loop, use umfor
loop. Nesse caso, você pode salvar 2 bytes, incluindo a definição dem
na inicialização do loop for e,b=!b
finalmente, como quer que seja chamado. Você também pode economizar ao substituirstring
ebool
porvar
. Você também não precisa dasn>1
cláusulas "()" , e nas+=
cláusula você pode usar o não-curto-circuito em&
vez de&&
não haver efeitos colaterais ou desreferências para dar errado. Por fim,1>0
é mais curto quetrue
;)C #,
257183 bytesEditar: Graças às dicas do @VisualMelon, foram salvos 74 bytes.
Sei que está longe de ser o melhor idioma para jogar golfe, mas estou mais interessado em aprender sobre as várias nuances do C #, em vez de vencer a competição. Esta é basicamente uma porta desta resposta Pyth.
Eu estou pensando que os loops for poderiam ser ainda mais jogados, mas não sei bem como, dadas as declarações terciárias incorporadas neles.
Exemplo (1, 2, 3, 10):
Ungolfed:
fonte
s+=
é seu amigo. Na verdade, você pode fazer loops um pouco mais compactos. A alegria / horror dos operadores++
e--
significa que você pode fazer a maior parte do trabalho na verificação condicionalfor(i=0;i++<=t;)
(isso verifica sei
é menor ou igual at
então o incrementa). Você faria bem em definir oint i
lado de fora do loop for e reutilizá-lo, e como você pode garantir quei
nunca será negativo,i%2==0
pode ser trocadoi%2<1
. Com essas alterações, uma pontuação de sub 200 bytes é facilmente alcançada.Enumerable
geralmente requer umausing System.Linq
diretiva e acho que geralmente se pretende que essas cláusulas sejam incluídas. No entanto , nesse caso, o único LINQ pode ser substituído pelovar s=" "+string.Join("____",new string[1+t/2])+n;
que não contém LINQ e é mais curto que o código atual;) Ele une muitas seqüências nulas junto com o que realmente interessamos, "____" (o 1 + t / 2 porque precisamos de outra string nula para ajustar outro "____" antes). A variáveln
é declarada como "\ r \ n".Console.Write
em vez deConsole.WriteLine
Java, 185
Explicação
fonte
C # -
151146141138Inspirado pela resposta de @ bacchusbeale
Ungolfed
fonte
new String
é uma nova para mim! Você parece ter perdido o seut=""
da versão golfed, embora uma coisa melhor a fazer seria inicializart
como "\ n". Você pode salvar um par de bytes anexando parat
onde virarb
, salvando o "{}" no para-loop:t+=(b=!b)?"/":"__\\"
.t
antess
e adicionart
para a cadeia em vez de"\n"
;)Ir,
156144Ungolfed:
O único truque real aqui (e nem sequer é bom) é usar 3 acumuladores para que eu possa condensar a solução em até 1 loop.
O código pode ser executado aqui: http://play.golang.org/p/urEO1kIjKv
fonte
c += `__\`
vez doif i<n{c+="_"}
> <> (Peixe) ,
215183156 bytesEdit: O Notepad ++ estava me fornecendo 5 bytes extras devido ao CR, então a contagem modificada de acordo
Um pouco mais jogado, mas é o meu primeiro programa de pesca até agora> _ <O requisito de não ter uma primeira linha em branco para 1 triângulo dobrou o tamanho do programa.
Pode testar em http://fishlanguage.com/ (Int na pilha inicial para o comprimento)
Explicação:
fonte
perl
109108106Acho que está tudo bem no meu primeiro golfe, usei a seção de Vynce para a primeira linha, com o restante do meu código para superar o problema da nova linha com 1 triângulo.
Agora, para ver se consigo diminuí-lo :)
Editar : espaço em branco
Edição 2 : substituído
"\n"
por$/
fonte
C89, 150
Uma versão não destruída:
A saída:
A pilha transborda se eu entrar
65535
(mas não se você compilar com-O3
!), Mas teoricamente deve funcionar ;-)edit: o programa agora preenche o requisito de que somente duas linhas devem ser exibidas se
1
for passada para o programa edit 2: use emint*
vez dechar*
fonte
main
comomain(c,v)**v;
se isso funcionasse.c
oun
como uma variável global, para que você não precise passar esse parâmetro parar()
. Eu não acho que sua resposta está em conformidadeNote that for 1 the output is two lines long but otherwise it's three. This is required.
error: expected declaration specifiers before ‘*’ token main(c,v)**v;{
n
ouc
mais curta.int**
?C ++ stdlib, 194 bytes
Programa de teste:
fonte
Bash,
166127125119105 bytesEm uma função:
Com algumas apresentações:
Pode renderizar (se você tiver o figlet instalado):
Salve 2 caracteres se a entrada for variável em vez de
$1
: 103No loop:
Renderizará (aproximadamente) o mesmo:
fonte
Carvão , 27 bytes (não competitivo)
Não-concorrente porque o idioma pós-desafio.
Experimente online! Link é a versão detalhada do código. Explicação:
Gere uma lista de bits alternados de comprimento
n
e faça um loop sobre eles.Desenhe
____
sem mover o cursor.No primeiro e em qualquer outro triângulo, desenhe o
/
lado esquerdo .Desenhe o
\
lado sem mover o cursor.No segundo e em qualquer outro triângulo, desenhe o
\
lado esquerdo novamente para mover o cursor.No segundo e em qualquer outro triângulo, desenhe o
/
lado direito , sem mover o cursor.fonte
PowerShell ,
11695 bytesMuito obrigado a Mazzy e ASCII-Only por economizar 21 bytes
Experimente online!
Não permitir que uma linha vazia para n = 1 comeu como
1410 bytes. Essa solução está comuma morte cerebral bastanteagora muito mais inteligente com uma quantidade mínima de código repetido. O arredondamento dos banqueiros ainda é o diabo.fonte
C, 368 bytes
É mais se você contar as
#include
instruções, mas compilou no gcc, embora com avisos, sem elas. Sei que não é o mais curto de longe, mas ainda gosto de fazê-lo em C.fonte
#define p(c)printf(c)
é mais curta que a sua função. Você pode omitir tipos de retorno em funções (eles assumem o padrãoint
). Você também pode definir a função em umC89
estilo como estemain(c,v)char**v;{}
. Isso é curto paraint main(int c, char** v){}
Perl (simples)
131125120primeiro passe bastante simples:
oh quem precisa de int explícito?
fonte
Prolog, 126 bytes
Invocar como
$3
.Mais legível:
Exemplo:
fonte
C #: LINQ de 1 linha, 198 bytes
fonte
Retina , 88 bytes (não competitivo)
Não-concorrente porque o idioma pós-desafio.
Experimente online! Explicação:
Substitua a entrada por um par de triângulos.
Multiplique os triângulos pela entrada original.
Divida os triângulos por 2.
Remova o meio triângulo da esquerda.
Remova a primeira linha se ela estiver em branco agora.
fonte
Perl 6 , 83 bytes
Experimente online!
Bloco de código anônimo que pega um número e retorna uma string.
fonte
C (gcc) ,
117115 bytes-2 graças a ceilingcat.
Todos esses parênteses sugerem que algo menos desajeitado é certamente possível.
Experimente online!
fonte
05AB1E , 37 bytes
Experimente online ou verifique as 10 primeiras saídas .
Explicação:
fonte
Java 11, 122 bytes
Experimente online.
Explicação:
fonte