Amplie o ASCII Sun

43

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.

Hobbies de Calvin
fonte
É permitida uma nova linha líder? Especialmente interessante para N=0.
Jakube
@Jakube No. Apenas à direita.
Hobbies de Calvin

Respostas:

12

Pitão, 39 38 36 bytes

jbXmXXj\|m*\ Q2d\\_hd\/JhyQQX*\-JQ\O

Experimente online: Pyth Compiler / Executor

Explicação

jbXmXXj\|m*\ Q2d\\_hd\/JhyQQX*\-JQ\O   implicit: Q = input
                       JhyQ            J = 1 + 2*Q
    m                  J               map each d of [0,1,...,2*Q] to:
          *\ Q                           " "*input
         m    2                          list with twice " "*input
      j\|                                join this list by "|"
     X         d\\                       replace the value at d to "\"
    X             _hd\/                  replace the value at -(d+1) to "/"
  X                        Q           replace line Q by:
                             *\-J        "-"*J
                            X    Q\O     replace element at Q with "O"
jb                                     join by "newlines"

Outra solução de 36 bytes seria:

jbmXXj\|m*?\-KqdQ\ Q2d\\_hd?\OK\/hyQ
Jakube
fonte
26

C: 116 102 99 95 92 90

s(n){for(int c=-n,r=c;r<=n;c++)putchar(c>n?c=-c,r++,10:c?r?c-r?c+r?32:47:92:45:r?124:79);}

Acho 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:

void s(int n) {
  for(
    int c = -n, r = c;
    r <= n;
    c++
  )
    putchar(
      c > n
        ? c = -c, r++, '\n'
        : c
          ? r
            ? c - r
              ? c + r
                ? ' '
                : '/'
              : '\\'
            : '-'
          : r
            ? '|'
            : 'O'
    );
}
Para s
fonte
7
"c ++" em C ... heh!
Bjb568 10/05
Estou feliz que você tenha destruído isso. Aqueles ifs ternários são loucos!
Ldam 15/05
Você pode economizar mais 2 bytes e torná-lo vc 2012 compliant;)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);}
Johan du Toit
21

GNU sed, 252 + 1

Ufa - eu venci a resposta php!

Marque + 1 para usar o -rparâmetro

Por 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.

/^0/{y/0/O/;q}
s/./<&/g
s/9/8 /g
s/8/7 /g
s/7/6 /g
s/6/5 /g
s/5/4 /g
s/4/3 /g
s/3/2 /g
s/2/1 /g
s/1/ /g
s/0//g
:t
s/ </<          /g
tt
s/<//g
:
s/ //
s^.*^\\&|&/^;ta
:a
/\\$/q
p
s^\\\|/^-O-^;tn
s^(\\)? (/)?^\2 \1^g;ta
:n
y/ /-/
p
s^-O-^/|\\^
y/-/ /
ta

Explicação

  • A primeira linha é uma saída antecipada para o caso N = 0.
  • As próximas 15 linhas (até :) convertem N em uma sequência de N espaços
  • s/ // remove um espaço
  • s^.*^\\&|&/^;taconverte espaços N-1 em: \+ espaços N-1 + |+ espaços N-1 +/
  • Repita, imprima cada iteração e mova \um espaço para a direita e /um espaço para a esquerda ...
  • ... até combinarmos \|/, que é substituído por -O-e pular para o nrótulo
  • substitua por -e imprima
  • substitua -0-por /|\e substitua por -e volte para o loop principal
  • Repita, imprima cada iteração e mova \um espaço para a direita e /um espaço para a esquerda ...
  • ... até encontrarmos o \$que indica que terminou e sair.

Resultado

 $ for i in {0..3}; do sed -rf asciisun.sed <<< $i ; done
 O
 \|/
 -O-
 /|\
 \ | /
  \|/ 
 --O--
  /|\ 
 / | \
 \  |  /
  \ | / 
   \|/  
 ---O---
   /|\  
  / | \ 
 /  |  \
 $
Trauma Digital
fonte
16

J, 37 34 40 bytes

1:echo('O\/-|'{.@#~0=+&|,-,+,[,])"*/~@i:

Uso:

   (1:echo('O\/-|'{.@#~0=+&|,-,+,[,])"*/~@i:) 2  NB. prints to stdout:
\ | /
 \|/ 
--O--
 /|\ 
/ | \

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, para n = 1cria a seguinte 3-by-3matriz

    ┌─────┬────┬────┐
    │-1 -1│-1 0│-1 1│
    ├─────┼────┼────┤
    │0 -1 │0 0 │0 1 │
    ├─────┼────┼────┤
    │1 -1 │1 0 │1 1 │
    └─────┴────┴────┘
    
  • para cada elemento da matriz com números inteiros x y, fazemos o seguinte

  • +&|,-,+,[,] calcular uma lista de propriedades

    • +&| abs(x)+abs(y), é igual a 0iff (se e somente se) x=0ey=0
    • -xy é igual a 0iff, x=you seja, estamos na diagonal
    • +x + y é igual a 0iff, x=-you seja, estamos no sentido anti-diagonal
    • [x é igual a 0iff, x=0ou seja, estamos na linha do meio
    • ]y é igual a 0iff, y=0ou seja, estamos na coluna do meio
  • 'O\/-|'#~0=compare esses valores de propriedade acima com 0o icaractere th da string, 'O\/-|'se a ipropriedade th for verdadeira.

  • o primeiro caractere na sequência resultante será sempre o que precisamos, se houver uma sequência vazia, precisamos de um espaço
  • {. 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ário
  • agora temos a matriz exata que precisamos, por isso a imprimimos no stdout uma vez com 1:echo

Experimente online aqui.

randomra
fonte
5
Esta é a versão ungolfed ?! Eu me sinto um programador bastante comum às vezes, e então, por algum motivo, acabo no codegolf e vejo as coisas que vocês fazem e não conseguem deixar de me sentir um idiota.
JustSid
@JustSid Bem, o texto não estava atualizado com o código, mas tecnicamente eu nunca escrevi que o código não fosse destruído. :)
randomra
É ainda poderosa forma impressionante ou
JustSid
2
@JustSid Não que seja menos impressionante, mas o código J se parece com isso, e isso parece um desafio para o qual seria uma boa linguagem. É uma resposta muito impressionante, mas por isso é tudo em J :)
undergroundmonorail
11

PHP, 182 bytes

Pareceu uma atividade divertida para minha primeira resposta. Comentários sobre o meu código são bem-vindos.

<?php 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":"";}}?>

Aqui está o código não golfe com comentários:

<?php
function s($n) {
    $e=2*$n+1; //edge length
    for($i=0;$i<$e*$e;$i++) {
        $x = $i%$e; // current x coordinate
        $y = floor($i/$e); // current y coordinate

        if ($y==$n&&$x==$n) {
            // center of square
            echo'O';
        }
        else if ($y==$n) {
            // horizontal line
            echo'-';
        }
        else if ($x==$n) {
            // vertical line
            echo'|';
        }
        else if ($y==$x) {
            // diagonal line from top-left to bottom right
            echo'\\';
        }
        else if (($y-$n)==($n-$x)) {
            // diagonal line from bottom-left to top-right
            echo'/';
        }
        else {
            // empty space
            echo' ';
        }
        if ($x==$e-1) {
            // add new line for the end of the row
            echo"\n";
        }
    }
}?>
<pre>
<?php s(10); ?>
</pre>

Editado com código por royhowie

Kodos Johnson
fonte
3
Oi :-) Bom primeiro esforço. Você pode reduzir seu código em alguns lugares. Por exemplo, if(($y-$h)==($x-$h))faz o mesmo que if(($y==$x). Você pode salvar outro personagem substituindo if($x==y$)foo();else bar();por if($x^$y)bar();else foo();. Você também deve tentar usar operadores ternários em vez de if .. elseinstruções.
Ossifrage melindroso
operadores ternários é uma boa dica
nick
174 bytes: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":"";}}
royhowie
1. não há necessidade $r; basta usar echo( $r.=é a mesma quantidade de bytes que echo). 2. operador ternário usado (salva muitos caracteres). 3. $hera 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.
Royhowie
@squeamishossifrage Eu nunca pensei nisso. Obrigado pelas dicas!
Kodos Johnson
9

Python 2, 99

n=input()
R=range(-n,n+1)
for i in R:print''.join("O\|/ -"[[R,i,0,-i,j].index(j)^(i==0)]for j in R)

Prints linha por linha, criando cada linha, verificando se a coordenada (i,j)(centrado em (0,0)) satisfaz j==-i, j==0, j==i, ou nenhum, com um hack para fazer o trabalho de linha central.

xnor
fonte
Eu acho que você pode usar em Rvez de .5salvar 1 byte.
Random #
@randomra Isso é inteligente, obrigado. Abaixo de dois dígitos!
xnor 10/05
8

CJam, 48 45 43 41 38 bytes

Isso ainda é muito longo e ainda estou fazendo algumas coisas redundantes, mas aqui vai:

ri:R{_S*"\|/"@R-~S**1$N}%'-R*'O1$W$sW%

Experimente online aqui

Optimizer
fonte
7

SpecBAS - 117 bytes

1 INPUT s: LET t=s*2: FOR y=0 TO t: PRINT AT y,y;"\";AT y,t/2;"|";AT t-y,y;"/";AT t/2,y;"-": NEXT y: PRINT AT s,s;"O"

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

insira a descrição da imagem aqui

Brian
fonte
Um usuário anônimo sugeriu a mudança "-": NEXT y: PRINT AT s,s;"O"para "-";AT s,s;"O": NEXT ysalvar dois bytes.
Martin Ender
7

JavaScript (ES6) 97 98

Isso parece diferente o suficiente ...

// GOLFED
f=n=>(y=>{for(t='';++y<n;t+='\n')for(x=-n;++x<n;)t+='-O /\\|'[y?x?x-y?x+y?2:3:4:5:+!x]})(-++n)||t

// Ungolfed

F=n=>{
  ++n;
  t = '';
  for (y = -n; ++y < n; t += '\n')
    for (x = -n; ++x < n; )
      if (y != 0)
        if (x != 0)
          if (x != y)
            if (x != -y)
              t += ' '
            else
              t += '/'
          else
            t += '\\'
        else
          t += '|'
      else
        if (x != 0)
          t += '-'
        else 
          t += 'O'
  return t;
}
    
// TEST
function test(){ OUT.innerHTML = f(N.value|0); }
test()
input { width: 4em }
N: <input id=N value=5><button onclick="test()">Go</button>
<pre id="OUT"></pre>

edc65
fonte
Bela. Eu deveria ter pensado em um fechamento para usar normal para loops.
Ndscore # 8/15
Eu gosto deste. Eu tentei escrever um usando uma string e acessar um índice específico, mas o seu é muito menor.
Royhowie
6

OS / 2 Classic Rexx, 102 ... ou 14 para "versão do trapaceiro"

Retire os feeds de linha para "jogar golfe" nele.

w='%1'
o=center('O',w,'-')
m='center(space("\|/",w),%1)'
do w
  w=w-1
  interpret "o="m"|o|"m
end l
say o

Versão do trapaceiro, nomeie o script como o código-fonte desejado com 255 caracteres (requer disco HPFS):

interpret '%0'

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. ;)

ForEachInList( 'Months.January.Days', 'Day' -> 'SAY "You have an appointment with" Day.Appointment.Name "on" Day.Appointment.Date' )
EXIT

ForEachInList: 
    SIGNAL ON SYNTAX
    PARSE ARG MyList "," MyVar "->" MyCommand
    INTERPRET ' MyListCount = ' || MyList || '.Count'
    DO ListIndex = 1 TO MyListCount
       INTERPRET MyVar || ' = ' || MyList || '.' || ListIndex
       INTERPRET MyCommand
    END
    RETURN
SYNTAX:
    SAY MyCommand ' is not a valid expression. '
    EXIT

- O código de chamada assume que você já criou um tronco (matriz), naturalmente.

lisa
fonte
Para sua versão de trapaceiro: se o nome do arquivo de um programa não for arbitrário, ele deverá ser incluído na contagem de bytes .
Martin Ender
Justo. A versão do trapaceiro não era nada séria! :) ... foi por isso que postei a resposta "real" em 102. Foi apenas por uma questão de novidade.
lisa
@ Lisa, exceto que não é novidade;). Além disso, ele quebraria o script da tabela de classificação se usado neste desafio.
Optimizer
6

Haskell, 109 98 96 bytes

Obrigado a nimi e Mauris por sua ajuda!

0#0='O'
0#_='-'
_#0='|'
i#j|i==j='\\'|i== -j='/'|1<2=' '
f n=unlines[map(i#)[-n..n]|i<-[-n..n]]

Explicação:

O operador #especifica qual caractere aparece nas coordenadas (i, j), com o sol centralizado em (0,0). A função fconstrói a String resultante, mapeando #todos os pares de coordenadas que variam de -n a n.

Uso:

ghci> putStr $ f 2
\ | /
 \|/ 
--O--
 /|\ 
/ | \
user40671
fonte
Você pode economizar alguns bytes usando um operador infixo em vez de s, por exemplo 0#0='O', 0#_='-', etc, e 1<2em vez de True.
nimi
Talvez map(i#)[-n..n]para salvar dois bytes.
Lynn
4

R, 177 149 bytes

Mickey T. é o homem! Ele me ajudou a consertar minha solução originalmente incorreta e economizar 28 bytes. Obrigado, Mickey!

m=matrix(" ",(w=2*(n=scan()+1)-1),w);m[row(m)==rev(col(m))]="/";diag(m)="\\";m[,n]="|";m[n,]="-";m[n,n]="O";m[,w]=paste0(m[,w],"\n");cat(t(m),sep="")

Ungolfed + explicação:

# Create a matrix of spaces, read n from stdin, assign w=2n+1
m <- matrix(" ", (w <- 2*(n <- scan() + 1) - 1), w)

# Replace the opposite diagonal with forward slashes
m[row(m) == rev(col(m))] <- "/"

# Replace the diagonal with backslashes
diag(m) <- "\\"

# Replace the vertical center line with pipes
m[, n] <- "|"

# Replace the horizontal center line with dashes
m[n, ] <- "-"

# Put an O in the middle
m[n, n] <- "O"

# Collapse the columns into single strings
m[, w] <- paste0(m[, w], "\n")

# Print the transposed matrix
cat(t(m), sep = "")

Mais sugestões são bem-vindas!

Alex A.
fonte
1
Desculpe Alex, você perdeu os raios verticais. Há algumas coisas que podem ser alteradas para encurtar isso sem alterar o processo geral. O scanrealmente não precisa do w=. Também pode ser deslocado mais profundamente nos comandos. O ifpode ser descartado se você alterar a maneira como a matriz é tratada em algumas instâncias. Aplicando estes eu recebo m=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.
MickyT
@MickyT: Isso é fantástico. Muito obrigado por perceber meu erro e provar uma solução muito melhor! Eu editei a resposta.
Alex A.
4

C #, 230 226 bytes

string g(int n){string r="";int s=n*2+1;for(int h=0;h<s;h++){for(int w=0;w<s;w++){if(h==w){if(w==n){r+="O";}else{r+="\\";}}else if(w==s-h-1){r+="/";}else if(w==n){r+="|";}else if(h==n){r+="-";}else{r+=" ";}}r+="\n";}return r;}

Conforme solicitado, a versão não destruída: string ug (int n) {

        // The sting we'll be returning
        string ret = ""; 

        // The width and height of the output
        int s = n * 2 + 1; 

        // for loop for width and height
        for (int height = 0; height < s; height++) 
        {
            for (int width = 0; width < s; width++) 
            {
                // Matches on top-left to bottom-right diagonal line
                if (height == width) 
                {
                    // If this is the center, write the 'sun'
                    if (width == n) 
                    {
                        ret += "O"; 
                    }
                    // If this is not the center, add the diagonal line character
                    else 
                    {
                        ret += "\\"; 
                    }
                }
                // Matches on top-right to bottom-left diagonal line
                else if (width == s - height - 1) 
                { 
                    ret += "/";
                }
                // Matches to add the center line
                else if (width == n) 
                { 
                    ret += "|";
                }
                // Matches to add the horizontal line
                else if (height == n) 
                { 
                    ret += "-";
                }
                // Matches all others
                else 
                { 
                    ret += " "; 
                } 
            } 
            // Add a newline to separate each line
            ret += "\n"; 
        } 
        return ret; 
    }

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.

Transmissão
fonte
Além disso, s=2*n+1ao invés de s=(n*2)+1e w==s-h-1ao invés de w==(s-h)-1tornar isso mais curto.
Alex A.
bom, pode roubar seu método de construção de strings. isso me irrita que LINQ é mais do que loops :(
Ewan
Eu adicionei a versão ungolfed :)
Transmission
4

Ruby: 98 92 caracteres

Proc que retorna uma sequência com o sol.

f=->n{x=(0..m=n*2).map{|i|s=?|.center m+1
s[i]=?\\
s[m-i]=?/
s}
x[n]=?O.center m+1,?-
x*?\n}

Exemplo de execução:

irb(main):001:0> f=->n{x=(0..m=n*2).map{|i|s=?|.center m+1;s[i]=?\\;s[m-i]=?/;s};x[n]=?O.center m+1,?-;x*?\n}
=> #<Proc:0x000000020dea60@(irb):1 (lambda)>
irb(main):002:0> (0..3).each {|i| puts f[i]}
O
\|/
-O-
/|\
\ | /
 \|/ 
--O--
 /|\ 
/ | \
\  |  /
 \ | / 
  \|/  
---O---
  /|\  
 / | \ 
/  |  \
=> 0..3
homem a trabalhar
fonte
4

Ferrugem, 215 caracteres

fn a(n:usize){for i in 0..n{println!("{}\\{}|{1}/{0}",s(i),s(n-i-1))}println!("{}O{0}",vec!["-";n].concat());for i in(0..n).rev(){println!("{}/{}|{1}\\{0}",s(i),s(n-i-1))}}fn s(n:usize)->String{vec![" ";n].concat()}

Tentei usar um método de fatia de string (criando uma string de n-1espaços e fatiando de e para um índice) da seguinte maneira:

fn a(n:usize){let s=vec![" ";n-(n>0)as usize].concat();for i in 0..n{println!("{}\\{}|{1}/{0}",&s[..i],&s[i..])}println!("{}O{0}",vec!["-";n].concat());for i in(0..n).rev(){println!("{}/{}|{1}\\{0}",&s[..i],&s[i..])}}

Mas na verdade são 3 caracteres a mais.

Código não destruído:

fn asciisun_ungolfed(n: usize) {
    for i in 0..n {
        println!("{0}\\{1}|{1}/{0}", spaces(i), spaces(n-i-1))
    }
    println!("{0}O{0}", vec!["-"; n].concat());
    for i in (0..n).rev() {
        println!("{0}/{1}|{1}\\{0}", spaces(i), spaces(n-i-1))
    }
}
fn spaces(n: usize) -> String { vec![" "; n].concat() }

A parte que eu gosto é de como raspar alguns caracteres nas strings de formatação. Por exemplo,

f{0}o{1}o{1}b{0}ar

é equivalente a

f{}o{}o{1}b{0}ar

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.

Maçaneta da porta
fonte
4

Oitava 85

Matrizes Bulding, como sempre =) eyeproduz uma matriz de identidade, o resto é auto-explicativo, eu acho.

m=(e=eye(2*(k=input('')+1)-1))*92+rot90(e)*47;m(:,k)='|';m(k,:)=45;m(k,k)='o';[m,'']
flawr
fonte
Ainda com dois bytes melhores que o meu :( Na verdade, tentei algo semelhante a isso inicialmente, mas não consegui reduzi-lo o suficiente - não sabia que poderia fazer "m (:, k) = '|'". Bom envio!
Oebele
4

IDL 8.3, 135 bytes

Não sei se isso pode ser jogado mais ... É muito simples. Primeiro, criamos um m x marray ( m=2n+1) de strings vazias; em seguida, vamos chamar os caracteres em linhas ( y=x, y=-x, y=n, e x=n). Em seguida, soltamos o O no ponto (n, n)e imprimimos a coisa toda, formatada como mcadeias de comprimento 1 em cada linha, para que não haja espaço extra na impressão nativa da matriz.

pro s,n
m=2*n+1
v=strarr(m,m)
x=[0:m-1]
v[x,x]='\'
v[x,m-x-1]='/'
v[n,x]='|'
v[x,n]='-'
v[n,n]='O'
print,v,f='('+strtrim(m,2)+'A1)'
end

Teste:

IDL> s,4
\   |   /
 \  |  / 
  \ | /  
   \|/   
----O----
   /|\   
  / | \  
 /  |  \ 
/   |   \
sirpercival
fonte
"Em vez de um programa, você pode escrever uma função que use um número inteiro. A função deve imprimir o design do sol normalmente ou retorná-lo como uma string."
Sirpercival 8/15
hahaha não se preocupe :)
sirpercival 8/15
3

Matlab, 93 87 bytes

Infelizmente, 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.

N=input('');E=eye(N)*92;D=rot90(E)*.52;H=ones(1,N)*45;V=H'*2.76;[E V D;H 79 H;D V E '']
Oebele
fonte
Você pode apenas criar um programa 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 =)
flawr
Na verdade, eu tinha a linha de entrada primeiro, mas por algum motivo, pensei erroneamente que não era permitido ... Obrigado pela outra dica!
Oebele
3

Javascript ( ES7 rascunho ) 115

f=l=>[['O |/\\-'[y^x?z+~x^y?y^l?x^l?1:2:5:3:x^l&&4]for(x in _)].join('')for(y in _=[...Array(z=2*l+1)])].join('\n')


// Snippet demo: (Firefox only)
for(var X of [0,1,2,3,4,5])
    document.write('<pre>' + f(X) + '</pre><br />');

nderscore
fonte
2

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.

KdMms[*Kt-QdG*Kd\|*KdH)_UQjbg\\\/p\O*Q\-*\-Qjb_g\/\\

Provavelmente pode ser jogado mais, explicação em breve.

Experimente online aqui .

Maltysen
fonte
2

Perl, 94

Existem muitos operadores ternários aninhados aqui, mas acho que o código é razoavelmente direto.

$n=<>;for$x(-$n..$n){for$y(-$n..$n){print$x^$y?$x+$y?$x?$y?$":'|':'-':'/':$x?'\\':'O'}print$/}

Experimente aqui: ideone.com/E8MC1d

ossifrage melindroso
fonte
1
88B: 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=<>).
Alexander-brett
2

C # - 291 (programa completo)

using System;using System.Linq;class P{static void Main(string[] a){Func<int,int,int,char>C=(s,x,i)=>x==(2*s+1)?'\n':i==s?x==s?'O':'-':x==s?'|':x==i?'\\':x==2*s-i?'/':' ';int S=int.Parse(a[0])*2;Console.Write(Enumerable.Range(0,(S+1)*(S+1)+S).Select(z=>C(S/2,z%(S+2),z/(S+2))).ToArray());}}
Ewan
fonte
trabalhando nisso!!
Ewan
1

JavaScript (ES6), 139 135 140 + 1 bytes

(+1 é para -psinalizador com nó no console)

fixo:

t=(n,m)=>(m=2*n+1,(A=Array).from(A(m),(d,i)=>A.from(A(m),(e,j)=>i==j?j==n?"O":"\\":m-1==j+i?"/":i==n?"-":j==n?"|":" ").join("")).join("\n"))

uso:

t(3)
/*
\  |  /
 \ | / 
  \|/  
---O---
  /|\  
 / | \ 
/  |  \
*/

ungolfed:

var makeSun = function (n, m) {
    m = 2 * n + 1;    // there are 2*n+1 in each row/column
    return Array.from(Array(m), function (d, i) {
        return Array.from(Array(m), function (e, j) {
            // if i is j, we want to return a \
            // unless we're at the middle element
            // in which case we return the sun ("O")
            if (i == j) {
                return j == n ? "O" : "\\";
            // the other diagonal is when m-1 is j+i
            // so return a forward slash, /
            } else if (m - 1 == j + i) {
                return "/";
            // the middle row is all dashes
            } else if (i == n) {
                return "-";
            // the middle column is all pipes
            } else if (j == n) {
                return "|";
            // everything else is a space
            } else {
                return " ";
            }
        }).join("");
    }).join("\n");
}
royhowie
fonte
2
Parece que faltam dois raios.
Oh, maldito, eu esqueci de acrescentar que volta ...
royhowie
(A=Array).from(A(m))
Shmiddty
@MichaelT I fixa-lo, mas eu acho que posso golf um pouco mais
royhowie
@ Shmiddty obrigado pela sugestão! que salvou um monte de personagens
royhowie
1

Python 3, 193 186 bytes

Golfe

def f(n):
 s,b,e,d,g=' \\/|-';p,r,i='',int(n),0
 while r:print(s*i+b+s*(r-1)+d+s*(r-1)+e);r-=1;i+=1
 print(g*n+'O'+g*n);r+=1;i=n-1
 while r<n+1:print(s*i+e+s*(r-1)+d+s*(r-1)+b);r+=1;i-=1

Resultado

>>> f(3)
\  |  /
 \ | /
  \|/
---O---
  /|\
 / | \
/  |  \

>>> f(5)
\    |    /
 \   |   /
  \  |  /
   \ | /
    \|/
-----O-----
    /|\
   / | \
  /  |  \
 /   |   \
/    |    \

Ungolfed

def f(n):
    s, b, e, d, g = ' \\/|-'
    p, r, i = '', int(n), 0
    while r:
        print(s*i + b + s*(r-1) + d + s*(r-1) + e)
        r -= 1
        i += 1
    print(g*n + 'O' + g*n)
    r += 1
    i = n-1
    while r < n+1:
        print(s*i + e + s*(r-1) + d + s*(r-1) + b)
        r += 1
        i -= 1
Zach Gates
fonte
1
Há algumas coisas a serem jogadas aqui, mas a maior delas são os argumentos padrão. s=' ',b='\\',f='/',d='|',g='-'é muito longo, é melhor movê-lo adicionando s,b,f,d,g=" \/|-"à segunda linha.
Sp3000
Eu quis dizer " \/|-"como uma única sequência, em vez de dividi-la em caracteres individuais. Você pode descompactar a partir de uma string como x,y,z="123", o que faz x="1", y="2"e z="3".
Sp3000
Editado novamente. Obrigado @ Sp3000
Zach Gates
1

CJam, 59 55 bytes

ri:A,W%{_S*"\|/"\*\A\-(S*_@@++}%_Wf%W%['-A*_'O\++]\++N*

Isso não ganhará nenhum prêmio como está, mas fiquei feliz o suficiente por ter funcionado!

Agradecimentos ao Sp3000 pelas dicas de golfe.

Claudiu
fonte
1
Bom trabalho! Eis algumas dicas: 1) Você pode usar Sem vez da 'versão para o espaço e 2) Por '-A*'O'-Aque você pode fazer '-A*_'O\em vez porque gerá-la duas vezes é longo
SP3000
1

Python, 175 129 127 125 Bytes

s,q,x=' ','',int(input())
for i in range(x):d=(x-i-1);q+=(s*i+'\\'+s*d+'|'+s*d+'/'+s*i+'\n')
print(q+'-'*x+'O'+'-'*x+q[::-1])

Experimente online aqui .

Tim
fonte
1

Ruby - 130 bytes

def f(n);a=(0...n).map{|i|' '*i+"\\"+' '*(n-1-i)+'|'+' '*(n-1-i)+'/'+' '*i};puts(a+['-'*n+'O'+'-'*n]+a.reverse.map(&:reverse));end

uso:

irb(main):002:0> f(3)
\  |  /
 \ | /
  \|/
---O---
  /|\
 / | \
/  |  \
Tomáš Dundáček
fonte
1
Aplicado um par de velho truque: 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.)
manatwork
1

Perl 85 91 90 89 86B

map{$_=$r||O;s/^|$/ /mg;s/ (-*O-*) /-$1-/;$r="\\$s|$s/
$_
/$s|$s\\";$s.=$"}1..<>;say$r

Ungolfed:

# usage: echo 1|perl sun.pl

map {
    $_ = $r || O;  # no strict: o is "o". On the first run $r is not defined
    s/^|$/ /mg;    # overwriting $_ saves characters on these regexes
    s/ (-*O-*) /-$1-/;
    $r = "\\$s|$s/
$_
/$s|$s\\";         # Embedded newlines save 1B vs \n. On the first run $s is not defined.
    $s .= $"
} 1..<>;
say $r
alexander-brett
fonte
1

Prolog, 219 bytes

Não, não é muito uma linguagem de golfe. Mas acho que este site precisa de mais prólogo.

s(N,N,N,79).
s(R,R,_,92).
s(R,C,N,47):-R+C=:=2*N.
s(N,_,N,45).
s(_,N,N,124).
s(_,_,_,32).
c(_,C,N):-C>2*N,nl.
c(R,C,N):-s(R,C,N,S),put(S),X is C+1,c(R,X,N).
r(R,N):-R>2*N.
r(R,N):-c(R,0,N),X is R+1,r(X,N).
g(N):-r(0,N).

Testado com swiplno Linux. Invocar assim: swipl -s asciiSun.prolog; Em seguida, consulte o tamanho desejado do sol:

?- g(3).
\  |  /
 \ | /
  \|/
---O---
  /|\
 / | \
/  |  \
true .

Ungolfed:

 % Args to sym/4 are row, column, N and the character code to be output at that location.
sym(N,N,N,79).
sym(R,R,_,'\\').
sym(R,C,N,'/') :- R+C =:= 2*N.
sym(N,_,N,'-').
sym(_,N,N,'|').
sym(_,_,_,' ').

 % Args to putCols/3 are row, column, and N.
 % Recursively outputs the characters in row from col onward.
putCols(_,C,N) :- C > 2*N, nl.
putCols(R,C,N) :- sym(R,C,N,S), put_code(S), NextC is C+1, putCols(R,NextC,N).

 % Args to putRows/2 are row and N.
 % Recursively outputs the grid from row downward.
putRows(R,N) :- R > 2*N.
putRows(R,N) :- putCols(R,0,N), NextR is R+1, putRows(NextR,N).

putGrid(N) :- putRows(0,N).
DLosc
fonte
1

JavaScript (ES6), 142 140 134 117 bytes

n=>(g=x=>x?`${t=` `[r=`repeat`](n-x--)}\\${s=` `[r](x)}|${s}/${t}
`+g(x):`-`[r](n))(n)+`O`+[...g(n)].reverse().join``

Tente

f=
n=>(g=x=>x?`${t=` `[r=`repeat`](n-x--)}\\${s=` `[r](x)}|${s}/${t}
`+g(x):`-`[r](n))(n)+`O`+[...g(n)].reverse().join``
i.addEventListener("input",_=>o.innerText=f(+i.value))
o.innerText=f(i.value=1)
<input id=i type=number><pre id=o>

Shaggy
fonte