Escreva um programa que receba um número inteiro N via stdin ou pela linha de comando.
Se N for 0, a letra única O
deverá ser impressa em stdout.
Se N for positivo , essa dupla hélice horizontal ASCII art , desenhada com N segmentos de largura, deve ser impressa.
Se N for 1, a saída é:
/\
O O
\/
Se N for 2, a saída é:
/\ /\
O / O
\/ \/
Se N for 3, a saída é:
/\ /\ /\
O / / O
\/ \/ \/
Se N for 4, a saída é:
/\ /\ /\ /\
O / / / O
\/ \/ \/ \/
O padrão continua exatamente da mesma maneira para N. maior. Observe que a barra ( /
) deve ser usada em todos os lugares em que as hélices se cruzam, exceto nas O
extremidades.
Se N for negativo , essa dupla hélice vertical ASCII art, com segmentos -N altos, deve ser impressa.
Se N for -1, a saída é:
O
/ \
\ /
O
Se N for -2, a saída é:
O
/ \
\ /
\
/ \
\ /
O
Se N for -3, a saída é:
O
/ \
\ /
\
/ \
\ /
\
/ \
\ /
O
Se N for -4, a saída é:
O
/ \
\ /
\
/ \
\ /
\
/ \
\ /
\
/ \
\ /
O
O padrão continua exatamente da mesma maneira para N. menor. Observe que as barras invertidas ( \
) devem ser usadas em todos os lugares em que as hélices se cruzam, exceto nas O
extremidades.
Detalhes
- Em vez de um programa, você pode escrever uma função que recebe N como um número inteiro e imprime o resultado normalmente ou o retorna como uma sequência.
- A saída para qualquer N pode opcionalmente conter uma nova linha à direita.
- Qualquer linha de saída para qualquer N pode opcionalmente conter 4 ou menos espaços à direita.
- Nunca deve haver espaço à esquerda que não faça parte do padrão especificado.
- O código mais curto em bytes vence.
fonte
<spc>O<spc>
ou\nO\n
. É unnecesary líder espaço em branco permitido?print "."
Aumente o zoom para ver a hélice. * nodnod *Respostas:
CJam,
56 55 53 5250 bytesOlhe para esse tamanho! Os principais culpados são
N = 0
casos especiais e, em\
vez de/
na hélice vertical.Aqui está como funciona:
O código é dividido em três partes:
X0>"\/"=" / \\\ / "+
fornece um"/ / \\\ / "
ou o"\ / \\\ / "
que é crucial, pois a hélice é simplesmente composta de suplente"/ \"
e"\ /"
unida por um" / "
ou outro" \ "
. Por exemplo, se você considera que a entrada é2
, sua sequência final repetida seria"/ / \\ / / / \\ / "
(sem escapar). Obviamente, isso tem extra/
no começo e um espaço extra no final.2
, a sequência final desejada sem novas linhas seria" O / \\\ / / / \\\ / O"
, mas após o ponto acima, temos apenas"/ / \\\ / / / \\\ / "
. Então, removemos o primeiro caractere, adicionamos um espaço e'O
no começo e outro'O
no final. Então nós finalmente dividimos em partes de 3'O
(para o caso 0)Experimente online aqui
fonte
JavaScript (ES6), 126
132 133Usando seqüência de modelo, as novas linhas contam.
Mais legível
fonte
n=>(
fazendo? Eu nunca vi nem usei esse operador antes.Pitão, 52 bytes
Demonstração.
Explicação:
A primeira seção
M[Jj"/\\"*hGdjP*G+*2dH*2\O_J)
,, define uma funçãog
, que recebe duas entradas. A primeira entradaG
,, é o número de repetições a serem usadas. Este é o valor absoluto da entrada. A segunda entrada,,H
é o caractere a ser colocado no centro das espirais.A função retorna uma lista de 3 elementos, que consiste nas 3 linhas da espiral positiva e nas 3 colunas da espiral negativa.
O primeiro elemento é definido por
Jj"/\\"*hGd
.*hGd
é a sequência deG+1
espaços.j"/\\"*hGd
une essa string com"/\"
o delimitador. OJ
no início salva o valor resultante para uso futuro.O segundo elemento é
jP*G+*2dH*2\O
. Começamos com+*2dH
. São dois espaços seguidos pelo caractere de entrada. Em seguida, repetimos esseG
tempo de sequência com*G
. Em seguida, removemos seu caractere final comP
. Finalmente, cercamos essa sequência com doisO
caracteres, comj ... *2\O
.O terceiro elemento é gerado com
_J
. Isso é simplesmente o inverso da primeira linha.A última seção
?jb?gQ\/>Q0msdCg_Q\\Q\O
seleciona entre três possibilidades diferentes, positiva, negativa e zero. O primeiro se-então condicionaQ
a entrada. A segunda condição é ativada>Q0
, se a entrada é positiva.Se
Q
for zero,\O
o caractereO
é impresso.Se
Q
for diferente de zero, juntamos o resultado do segundo ternário em novas linhas e o imprimimos comjb
. SeQ
for positivo, a lista se juntou e impresso égQ\/
,g(Q,"/")
.Se
Q
for negativo, a lista unida e impressa émsdCg_Q\\
. Começamos com og_Q\\
que ég(-Q,"\")
. Em seguida, transpomos as linhas e colunas comC
.msd
transforma as tuplas resultantes de caracteres em seqüências de caracteres, prontas para serem unidas em novas linhas e impressas.fonte
Python 2, 118
Cria a hélice dupla vertical a partir de uma lista de seqüências de caracteres e a transpõe para obter a horizontal. Tenho certeza que poderia ser melhorado.
fonte
Java,
500488 bytesMinha primeira tentativa, e infelizmente é 10 * mais longa que o líder atual :(. Alguém tem alguma dica (além de usar um idioma diferente)?
fonte
import System.*
ou algo para economizar escrevendoSystem
cada vez?import static java.lang.System.*;
ou ele pode salvar o fluxo de saída padrão como uma variável (embora eu não saiba se ele salvaria ou dificultaria nesse caso, não foi verificado).sc
variável, pois ela é chamada apenas uma vez. Raspa 14 bytes.class M{public static void main(String[]a){int n=new Integer(new java.util.Scanner(System.in).next()),i=n;if(n>0){for(;i-->0;)o(" /\\");o("\no");for(i=n;i-->1;)o(" /");o(" o\n");for(i=0;i++<n;)o(" \\/");}else if(n<0){o(" o \n");for(i=0;i++<~n;)o("/ \\\n\\ /\n \\ \n");o("/ \\\n\\ /\n o \n");}else o("o\n");}static<T>void o(T s){System.out.print(s);}}
( 352 bytes ) Experimente on-line.n->{int i=n;if(n>0){for(;i-->0;)o(" /\\");o("\no");for(i=n;i-->1;)o(" /");o(" o\n");for(i=0;i++<n;)o(" \\/");}else if(n<0){o(" o \n");for(i=0;i++<~n;)o("/ \\\n\\ /\n \\ \n");o("/ \\\n\\ /\n o \n");}else o("o\n");};<T>void o(T s){System.out.print(s);}
Experimente online.Haskell, 156 bytes
Você pode escrevê-lo como:
fonte
1<2
ou algo assim em vez deTrue
e salvar um byte.C #,
242241238230222219 bytesEstimulada pelo comentário de Martin , aqui está minha primeira tentativa de algo assim:
Mais facilmente:
fonte
C #
199197196 bytesVersão não destruída:
A idéia é criar a exibição horizontal a partir da exibição vertical, renderizando a matriz de caracteres transposta.
fonte
for(;m>0;--m)
parafor(;m-->0;)
em ambos os loops"\n/ \\\n\\ /\n "
também poderia ser reduzido de acordo com os métodos na minha resposta - utilização, ou seja@"..."
, onde cada "\\" se torna "\" e cada "\ n" torna-se uma nova linha realbool u
paravar u
para toda outro byte :)Python 3, 118 bytes
Meu primeiro envio de código de golfe, por isso pode não ser nada impressionante.
Apenas usa o operador ternário do Python ... se ... mais ... para separar os três cenários. Isso fornece uma sequência feita para repetir algumas seqüências menores um certo número de vezes para imprimir.
fonte
Julia, 229 bytes
Oh homem, este é o caminho, caminho muito grande. É a resposta mais longa até agora por uma grande margem. Provavelmente, eu poderia economizar muito retornando a string em vez de imprimi-la ou evitando completamente a abordagem matricial. Vou experimentar isso mais tarde.
Isso cria uma função lambda que pega um único inteiro e imprime a hélice dupla formatada adequadamente. Para chamá-lo, dê um nome, por exemplo
f=n->(...)
.Ungolfed + explicação:
Alguns exemplos:
fonte
Python 3, 135 bytes
Experimente online aqui
fonte
Perl, 91
97A transposição provou ser muito cara no final.
Solução anterior:
Teste- me .
fonte
/^0/?O:etc
com$_?etc:O
$".="\23"^"\\ / \\ \\ / "x abs."O ";print/-/?$":/^0/?O:map{reverse$/,$"=~/(.).{$_}$/mg}0..2
Esquema, 379 bytes
Minha primeira tentativa no código de golfe e, infelizmente, uma das mais longas. :(
Ungolfified:
fonte
Java, 282
Minha primeira abordagem, com nomes de variáveis particularmente agradáveis:
Eu não tenho idéia do por que estou fazendo isso. Deve ser algo recreativo.
fonte
Java, 317
Minha primeira tentativa de código de golfe.
fonte
Python 3, 165 bytes
Experimente online aqui .
fonte
Perl,
193197187180166163BPenalidade de 1 byte para a opção de linha de comando -n. Corra com
echo 1|perl -M5.10.0 -n scratch.pl
:Com espaço em branco:
fonte
-M5.10.0
não contribua para a sua contagem de bytes?say
é útil para o golfe código ...PHP, 341
Versão ungolfed
fonte
JAVA 377
384bytesfonte
C ++
269262258fonte
R,
228201Minha primeira tentativa no código de golfe. Eu acho que funciona, mas não é sutil.
fonte
Groovy,
142134129125120 120118Finalmente amarrado com python 2!
fonte
Carvão ,
282422 bytesExperimente online! Link é a versão detalhada do código. Explicação:
Imprima a parte superior
O
e deixe o cursor um espaço para baixo e para a esquerda.Imprimir as cordas
/
,\
e\
e repita para o valor do número absoluto da entrada.Volte sobre o último
\
.Reflita para criar o lado direito da hélice. Eu faço isso aqui porque, caso contrário
↗
, não seria analisado sem ambiguidade.Substitua o último
\
por umO
.Se a entrada foi positiva, gire a tela.
fonte
Tela ,
333230 bytesExperimente aqui!
Explicação:
fonte
C ++, 352
Não é a resposta mais curta, mas a primeira em C ++ até agora :)
Aqui está no C ++ Shell com espaço em branco para testar
fonte
perl 156
Tentativa bastante direta, meu segundo golfe. Eu acho que as novas linhas contam como 1 byte, certo?
Agora, para descobrir como unir todos esses ternários ... Eu tenho muito espaço para melhorias com aqueles em
:'';
todos os lugares.fonte
C, 189 bytes
Com espaço em branco e novas linhas:
Algumas notas sobre a abordagem:
fonte
Perl, 184 bytes
Eu pensei que isso seria muito mais curto! Provavelmente existem algumas coisas simples que posso fazer para salvar alguns bytes. Faz cinco anos desde que eu programei seriamente em Perl!
fonte
PHP, 155
fonte
J ,
67 59 5551 bytesExperimente online!
fonte