Escreva um programa que capte (via STDIN / linha de comando) um número inteiro não negativo N.
Quando N é 0, seu programa deve imprimir O
(isso é maiúsculo, não zero).
Quando N é 1, seu programa deve imprimir
\|/
-O-
/|\
Quando N é 2, seu programa deve imprimir
\ | /
\|/
--O--
/|\
/ | \
Quando N é 3, seu programa deve imprimir
\ | /
\ | /
\|/
---O---
/|\
/ | \
/ | \
Para N maior, esse padrão continua da mesma maneira exata. Cada um dos oito raios do "Sol" deve ser feita de N dos apropriadas -
, |
, /
, ou \
caracteres.
Detalhes
- Em vez de um programa, você pode escrever uma função que aceita um número inteiro. A função deve imprimir o design do sol normalmente ou retorná-lo como uma string.
Você deve
- não tem espaços à direita, ou
- possui apenas espaços à direita suficientes para que o padrão seja um retângulo perfeito (2N + 1) * (2N + 1).
A saída para qualquer um ou todos os N pode opcionalmente ter uma nova linha à direita.
Pontuação
O código mais curto em bytes vence.
code-golf
ascii-art
kolmogorov-complexity
Hobbies de Calvin
fonte
fonte
N=0
.Respostas:
Pitão,
393836 bytesExperimente online: Pyth Compiler / Executor
Explicação
Outra solução de 36 bytes seria:
fonte
C:
11610299959290Acho que estou chegando perto de uma solução mínima usando essa abordagem, mas não consigo parar de sentir que há uma abordagem muito melhor no C. Ungolfed:
fonte
c,r;s(n){for(r=c=-n;r<=n;c++)putchar(c>n?c=-c,r++,10:c?r?c-r?c+r?32:47:92:45:r?124:79);}
GNU sed, 252 + 1
Ufa - eu venci a resposta php!
Marque + 1 para usar o
-r
parâmetroPor causa das limitações do sed, temos que gravar quase 100 bytes, apenas converter N em uma sequência de N espaços. O resto é divertido.
Explicação
:
) convertem N em uma sequência de N espaçoss/ //
remove um espaços^.*^\\&|&/^;ta
converte espaços N-1 em:\
+ espaços N-1 +|
+ espaços N-1 +/
\
um espaço para a direita e/
um espaço para a esquerda ...\|/
, que é substituído por-O-
e pular para on
rótulopor
-
e imprima-0-
por/|\
e substituapor
-
e volte para o loop principal\
um espaço para a direita e/
um espaço para a esquerda ...\$
que indica que terminou e sair.Resultado
fonte
J,
373440 bytesUso:
Explicação (da esquerda para a direita):
i:
gera lista-n, -(n-1), ..., n-1, n
( )"*/~@i:
cria o produto Descartes de i: consigo mesmo em um arranjo de matriz, por exemplo, paran = 1
cria a seguinte3-by-3
matrizpara cada elemento da matriz com números inteiros
x y
, fazemos o seguinte+&|,-,+,[,]
calcular uma lista de propriedades+&|
abs(x)+abs(y)
, é igual a0
iff (se e somente se)x=0
ey=0
-
xy é igual a0
iff,x=y
ou seja, estamos na diagonal+
x + y é igual a0
iff,x=-y
ou seja, estamos no sentido anti-diagonal[
x é igual a0
iff,x=0
ou seja, estamos na linha do meio]
y é igual a0
iff,y=0
ou seja, estamos na coluna do meio'O\/-|'#~0=
compare esses valores de propriedade acima com0
oi
caractere th da string,'O\/-|'
se ai
propriedade th for verdadeira.{.
pega o primeiro caractere de uma string e, se não houver ninguém, ele retorna um caractere de espaço como preenchimento, conforme necessário1:echo
Experimente online aqui.
fonte
PHP, 182 bytes
Pareceu uma atividade divertida para minha primeira resposta. Comentários sobre o meu código são bem-vindos.
Aqui está o código não golfe com comentários:
Editado com código por royhowie
fonte
if(($y-$h)==($x-$h))
faz o mesmo queif(($y==$x)
. Você pode salvar outro personagem substituindoif($x==y$)foo();else bar();
porif($x^$y)bar();else foo();
. Você também deve tentar usar operadores ternários em vez deif .. else
instruções.function s($n){$e=2*$n+1;for($i=0;$i<$e*$e;$i++){$x=$i%$e;$y=floor($i/$e);echo$y==$x?($x==$n?"O":"\\"):($e-1==$x+$y?"/":($y==$n?"-":($x==$n?"|":" ")));echo$x==$e-1?"\n":"";}}
$r
; basta usarecho
($r.=
é a mesma quantidade de bytes queecho
). 2. operador ternário usado (salva muitos caracteres). 3.$h
era inútil, pois era igual$n
. 4. Você não precisou usáfloor
-lo$x = floor($i%$e);
, pois um módulo em um número inteiro não precisará ser arredondado para baixo.Python 2, 99
Prints linha por linha, criando cada linha, verificando se a coordenada
(i,j)
(centrado em(0,0)
) satisfazj==-i
,j==0
,j==i
, ou nenhum, com um hack para fazer o trabalho de linha central.fonte
R
vez de.5
salvar 1 byte.CJam,
48 45 43 4138 bytesIsso ainda é muito longo e ainda estou fazendo algumas coisas redundantes, mas aqui vai:
Experimente online aqui
fonte
SpecBAS - 117 bytes
Isso imprime as barras e os traços em um loop e depois aperta o "O" no meio.
Saída usando 1, 2 e 9
fonte
"-": NEXT y: PRINT AT s,s;"O"
para"-";AT s,s;"O": NEXT y
salvar dois bytes.JavaScript (ES6) 97
98Isso parece diferente o suficiente ...
fonte
OS / 2 Classic Rexx, 102 ... ou 14 para "versão do trapaceiro"
Retire os feeds de linha para "jogar golfe" nele.
Versão do trapaceiro, nomeie o script como o código-fonte desejado com 255 caracteres (requer disco HPFS):
EDIT: Apenas para ficar claro, a versão do trapaceiro não tem a intenção de contar! É só para ser bobo e mostrar que um cachorro velho ainda pode fazer truques. :)
Por exemplo, para diversão e jogos reais, uma implementação de expressões "lambda" no estilo Java-8 / C11 em um iterador de lista. Não testado, mas deve rodar em um mainframe IBM de 1979. ;)
- O código de chamada assume que você já criou um tronco (matriz), naturalmente.
fonte
Haskell,
1099896 bytesObrigado a nimi e Mauris por sua ajuda!
Explicação:
O operador
#
especifica qual caractere aparece nas coordenadas (i, j), com o sol centralizado em (0,0). A funçãof
constrói a String resultante, mapeando#
todos os pares de coordenadas que variam de -n a n.Uso:
fonte
s
, por exemplo0#0='O'
,0#_='-'
, etc, e1<2
em vez deTrue
.map(i#)[-n..n]
para salvar dois bytes.R,
177149 bytesMickey T. é o homem! Ele me ajudou a consertar minha solução originalmente incorreta e economizar 28 bytes. Obrigado, Mickey!
Ungolfed + explicação:
Mais sugestões são bem-vindas!
fonte
scan
realmente não precisa dow=
. Também pode ser deslocado mais profundamente nos comandos. Oif
pode ser descartado se você alterar a maneira como a matriz é tratada em algumas instâncias. Aplicando estes eu recebom=matrix(" ",(w=2*(n=scan()+1)-1),w);m[row(m)-rev(col(m))==0]='/';diag(m)="\\";m[,n]='|';m[n,]="-";m[n,n]="O";m[,w]=paste0(m[,w],'\n');cat(t(m),sep='')
. Mais golfe possível, eu acho.C #,
230226 bytesConforme solicitado, a versão não destruída: string ug (int n) {
Este é o meu primeiro post, então peço desculpas se eu fiz algo errado. Quaisquer comentários e correções são bem-vindos.
fonte
s=2*n+1
ao invés des=(n*2)+1
ew==s-h-1
ao invés dew==(s-h)-1
tornar isso mais curto.Ruby:
9892 caracteresProc que retorna uma sequência com o sol.
Exemplo de execução:
fonte
Ferrugem, 215 caracteres
Tentei usar um método de fatia de string (criando uma string de
n-1
espaços e fatiando de e para um índice) da seguinte maneira:Mas na verdade são 3 caracteres a mais.
Código não destruído:
A parte que eu gosto é de como raspar alguns caracteres nas strings de formatação. Por exemplo,
é equivalente a
porque o "incrementador automático" para a posição do argumento da seqüência de caracteres de formato não é afetado pela especificação manual do número e atua de forma completamente independente.
fonte
Oitava 85
Matrizes Bulding, como sempre =)
eye
produz uma matriz de identidade, o resto é auto-explicativo, eu acho.fonte
IDL 8.3, 135 bytes
Não sei se isso pode ser jogado mais ... É muito simples. Primeiro, criamos um
m x m
array (m=2n+1
) de strings vazias; em seguida, vamos chamar os caracteres em linhas (y=x
,y=-x
,y=n
, ex=n
). Em seguida, soltamos o O no ponto(n, n)
e imprimimos a coisa toda, formatada comom
cadeias de comprimento 1 em cada linha, para que não haja espaço extra na impressão nativa da matriz.Teste:
fonte
Matlab,
9387 bytesInfelizmente, o cabeçalho da função tem que ser tão grande ... Além disso, acho que é muito bem jogado. Gostaria de saber se poderia ser feito melhor com algumas das diferenças de sintaxe no Octave.
fonte
N=input('')
para salvar 2 caracteres. Fora isso, você pode escrever[E V D;H 79 H;D V E '']
para converter toda a matriz em uma matriz de caracteres, o que poupará mais um byte ou dois. (Eu só apresentou um programa Octave com uma abordagem um pouco diferente, mas antes que eu encontrei o seu =)Javascript ( ES7 rascunho ) 115
fonte
Pitão - 52 bytes
A parte difícil foi descobrir como mudar as barras para cada lado. Eu decidi definir um lambda que leva os símbolos para usar.
Provavelmente pode ser jogado mais, explicação em breve.
Experimente online aqui .
fonte
Perl, 94
Existem muitos operadores ternários aninhados aqui, mas acho que o código é razoavelmente direto.
Experimente aqui: ideone.com/E8MC1d
fonte
for$x(-($n=<>)..$n){map{print$x^$_?$x+$_?$x?$_?$":'|':'-':'/':$x?'\\':O}-$n..$n;print$/}
- Alguns ajustes: converta interno para para mapear e altere $ y para $ _; inline($n=<>)
.C # - 291 (programa completo)
fonte
JavaScript (ES6),
139135140 + 1 bytes(+1 é para
-p
sinalizador com nó no console)fixo:
uso:
ungolfed:
fonte
(A=Array).from(A(m))
Python 3,
193186 bytesGolfe
Resultado
Ungolfed
fonte
s=' ',b='\\',f='/',d='|',g='-'
é muito longo, é melhor movê-lo adicionandos,b,f,d,g=" \/|-"
à segunda linha." \/|-"
como uma única sequência, em vez de dividi-la em caracteres individuais. Você pode descompactar a partir de uma string comox,y,z="123"
, o que fazx="1"
,y="2"
ez="3"
.CJam,
5955 bytesIsso não ganhará nenhum prêmio como está, mas fiquei feliz o suficiente por ter funcionado!
Agradecimentos ao Sp3000 pelas dicas de golfe.
fonte
S
em vez da'
versão para o espaço e 2) Por'-A*'O'-A
que você pode fazer'-A*_'O\
em vez porque gerá-la duas vezes é longoPython,
175 129 127125 BytesExperimente online aqui .
fonte
Ruby - 130 bytes
uso:
fonte
f=->n{a=(0...n).map{|i|(s=' ')*i+?\\+s*(m=n-1-i)+?|+s*(m)+?/+s*i};puts(a+[?-*n+'O'+?-*n]+a.reverse.map(&:reverse))}
(Veja dicas para jogar golfe em Ruby para um pouco mais.)Perl
8591908986BUngolfed:
fonte
Prolog, 219 bytes
Não, não é muito uma linguagem de golfe. Mas acho que este site precisa de mais prólogo.
Testado com
swipl
no Linux. Invocar assim:swipl -s asciiSun.prolog
; Em seguida, consulte o tamanho desejado do sol:Ungolfed:
fonte
JavaScript (ES6),
142140134117 bytesTente
fonte