Extender el sol ASCII


43

Escriba un programa que tome (a través de STDIN / línea de comando) un número entero no negativo N.

Cuando N es 0, su programa debería imprimir O(eso es mayúscula Oh, no cero).

Cuando N es 1, su programa debería imprimir

\|/
-O-
/|\

Cuando N es 2, su programa debería imprimir

\ | /
 \|/
--O--
 /|\
/ | \

Cuando N es 3, su programa debería imprimir

\  |  /
 \ | /
  \|/
---O---
  /|\
 / | \
/  |  \

Para N más grande, este patrón continúa de la misma manera. Cada uno de los ocho rayos del "sol" se debe hacer de N de los apropiados -, |, /, o \caracteres.

Detalles

  • En lugar de un programa, puede escribir una función que tome un número entero. La función debe imprimir el diseño del sol normalmente o devolverlo como una cadena.
  • Usted debe

    • no tener espacios finales en absoluto, o
    • solo tiene suficientes espacios finales para que el patrón sea un rectángulo perfecto (2N + 1) * (2N + 1).
  • La salida para cualquiera o todas las N puede tener opcionalmente una nueva línea final.

Tanteo

El código más corto en bytes gana.


¿Se permite una nueva línea líder? Especialmente interesante para N=0.
Jakube

@Jakube No. Solo por detrás.
Aficiones de Calvin

Respuestas:


12

Pyth, 39 38 36 bytes

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

Pruébelo en línea: Pyth Compiler / Executor

Explicación

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"

Otra solución de 36 bytes sería:

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

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

Creo que me estoy acercando bastante a una solución mínima con este enfoque, pero no puedo dejar de sentir que hay un enfoque mucho mejor en 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'
    );
}

77
"c ++" en C ... ¡je!
bjb568

Me alegra que lo hayas dejado sin golf. ¡Esos ternarios si están locos!
señora

Puede guardar 2 bytes más y hacer que sea compatible con vc 2012;)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

Phew - ¡Batí la respuesta de php!

Puntuación + 1 por usar el -rparámetro.

Debido a las limitaciones de sed, tenemos que grabar casi 100 bytes, solo convertir N en una cadena de N espacios. El resto son cosas divertidas.

/^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

Explicación

  • La primera línea es una salida temprana para el caso N = 0.
  • Las siguientes 15 líneas (hasta la :) convierten N en una cadena de N espacios
  • s/ // elimina un espacio
  • s^.*^\\&|&/^;taconvierte espacios N-1 en: \+ espacios N-1 + |+ espacios N-1 +/
  • Iterar, imprimir cada iteración y mover \un espacio a la derecha y /un espacio a la izquierda ...
  • ... hasta que coincidamos \|/, que se reemplaza con -O-y salte a la netiqueta
  • reemplazar con -e imprimir
  • reemplazar -0-con /|\, y reemplazar con -y saltar de nuevo al bucle principal
  • Iterar, imprimir cada iteración y mover \un espacio a la derecha y /un espacio a la izquierda ...
  • ... hasta que coincidamos lo \$que indica que se terminó, y salimos.

Salida

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

16

J, 37 34 40 bytes

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

Uso:

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

Explicación (de izquierda a derecha):

  • i: genera lista -n, -(n-1), ..., n-1, n
  • ( )"*/~@i:crea el producto Descartes de i: consigo mismo en una matriz, por ejemplo, para n = 1crea la siguiente 3-by-3matriz

    ┌─────┬────┬────┐
    │-1 -1│-1 0│-1 1│
    ├─────┼────┼────┤
    │0 -1 │0 0 │0 1 │
    ├─────┼────┼────┤
    │1 -1 │1 0 │1 1 │
    └─────┴────┴────┘
    
  • para cada elemento matriz con enteros x yhacemos lo siguiente

  • +&|,-,+,[,] calcular una lista de propiedades

    • +&| abs(x)+abs(y), es igual a 0iff (si y solo si) x=0yy=0
    • -xy, es igual a 0iff , es x=ydecir, estamos en diagonal
    • +x + y, es igual a 0iff , es x=-ydecir, estamos en el anti-diagonal
    • [x, es igual a 0iff , es x=0decir, estamos en la fila central
    • ]y, es igual a 0iff , es y=0decir, estamos en la columna central
  • 'O\/-|'#~0=compare estos valores de propiedad anteriores 0y tome el icarácter th de la cadena 'O\/-|'si la ipropiedad th es verdadera.

  • el primer carácter en la cadena resultante siempre será el que necesitamos, si la cadena está vacía necesitamos un espacio
  • {. toma el primer carácter de una cadena y, si no hay nadie, devuelve un carácter de espacio como relleno, tal como lo necesitamos
  • ahora tenemos la matriz exacta que necesitamos, así que la imprimimos en stdout una vez con 1:echo

Pruébelo en línea aquí.


55
¡¿Esta es la versión sin golf ?! A veces me siento como un programador bastante promedio, y luego, por alguna razón, termino en codegolf y veo las cosas que ustedes logran y no puedo evitar sentirme como un idiota.
JustSid

@JustSid Bueno, el texto no estaba actualizado con el código, pero técnicamente nunca escribí que el código no esté protegido. :)
randomra

De todos modos, sigue siendo impresionante
JustSid,

2
@JustSid No es que sea menos impresionante, pero el código J simplemente se ve así, y esto parece un desafío para el que sería un buen lenguaje. Es una respuesta muy impresionante, pero también lo es todo lo demás en J :)
undergroundmonorail

11

PHP, 182 bytes

Esto pareció una actividad divertida para mi primera respuesta. Los comentarios sobre mi código son bienvenidos.

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

Aquí está el código sin golf con comentarios:

<?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 con código por Royhowie


3
Hola :-) Buen primer esfuerzo. Sin embargo, puede reducir su código en bastantes lugares. Por ejemplo, if(($y-$h)==($x-$h))hace lo mismo que if(($y==$x). Puedes guardar otro personaje reemplazándolo if($x==y$)foo();else bar();con if($x^$y)bar();else foo();. También debe intentar usar operadores ternarios en lugar de if .. elsedeclaraciones.
aprensivo ossifrage

operadores ternarios es un buen consejo
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. no hay necesidad de $r; simplemente use echo( $r.=es la misma cantidad de bytes que echo). 2. operador ternario utilizado (guarda muchos caracteres). 3. $hfue inútil ya que igualó $n. 4. No era necesario usar floorpara $x = floor($i%$e);, ya que un módulo en un número entero no necesitará redondearse hacia abajo.
royhowie

@squeamishossifrage Nunca pensé en eso. ¡Gracias por los consejos!
Kodos Johnson,

9

Pitón 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)

Imprime línea por línea, creando cada línea comprobando si la coordenada (i,j)(centrada a (0,0)) satisface j==-i, j==0, j==i, o ninguno, con un truco para hacer que el trabajo de la línea central.


Creo que puede usar en Rlugar de .5guardar 1 byte.
randomra

@randomra Eso es inteligente, gracias. ¡A dos dígitos!
xnor


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"

Esto imprime las barras y guiones en un bucle, y luego coloca la "O" en el medio.

Salida usando 1, 2 y 9

ingrese la descripción de la imagen aquí


Un usuario anónimo sugirió cambiar "-": NEXT y: PRINT AT s,s;"O"a "-";AT s,s;"O": NEXT ypara guardar dos bytes.
Martin Ender

7

JavaScript (ES6) 97 98

Esto parece lo suficientemente diferente ...

// 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>


Hermosa. Debería haber pensado en un cierre para usar lo normal para los bucles.
nderscore

Me gusta este. Intenté escribir uno usando una cadena y acceder a un índice específico, pero el tuyo es mucho más corto.
royhowie

6

OS / 2 Classic Rexx, 102 ... o 14 para "versión del tramposo"

Saque los avances de línea para "jugar al golf".

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

Versión de Cheater, asigne al script el nombre del código fuente que desee con menos de 255 caracteres (requiere disco HPFS):

interpret '%0'

EDITAR: Para ser claros, ¡la versión del tramposo no tiene la intención de contar! Es solo ser tonto y mostrar que un perro viejo todavía puede hacer trucos. :)

Por ejemplo, para juegos y diversión real, una implementación de expresiones "lambda" estilo Java-8 / C11 en un iterador de lista. No probado, pero debería ejecutarse en un mainframe de 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

- El código de llamada asume que ya ha creado una raíz (matriz), naturalmente.


Para su versión de tramposo: si el nombre de archivo de un programa no es arbitrario, debe incluirse en el recuento de bytes .
Martin Ender

Lo suficientemente justo. ¡La versión de Cheater no fue tan seria! :) ... por eso publiqué la respuesta "real" en 102. Fue solo por el bien de la novedad.
Lisa

@lisa excepto que no es novedoso en absoluto;). Además, rompería el guión de la tabla de clasificación si se usa en este desafío.
Optimizador

6

Haskell, 109 98 96 bytes

¡Gracias a nimi y Mauris por su ayuda!

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

Explicación:

El operador #especifica qué carácter aparece en las coordenadas (i, j), con el sol centrado en (0,0). La función fconstruye la Cadena de resultados al mapear #sobre todos los pares de coordenadas que van desde -n hasta n.

Uso:

ghci> putStr $ f 2
\ | /
 \|/ 
--O--
 /|\ 
/ | \

Usted puede ahorrar unos pocos bytes mediante el uso de un operador infijo en lugar de s, por ejemplo 0#0='O', 0#_='-', etc, y 1<2en lugar de True.
nimi

Tal vez map(i#)[-n..n]para guardar dos bytes.
Lynn

4

R, 177 149 bytes

Mickey T. es el hombre! Me ayudó a arreglar mi solución originalmente incorrecta y a guardar 28 bytes. Gracias 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 + explicación:

# 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 = "")

¡Cualquier sugerencia adicional es bienvenida!


1
Lo siento Alex, te perdiste los rayos verticales. Hay algunas cosas que podrían cambiarse para acortar esto sin cambiar el proceso general. El scanrealmente no necesita el w=. También se puede desplazar más profundamente en los comandos. Se ifpuede abandonar si cambia la forma en que se maneja la matriz en un par de casos. Aplicando estos me sale 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=''). Más golf posible, creo.
MickyT

@MickyT: Eso es fantástico. ¡Muchas gracias por notar mi error y probar una solución mucho mejor! Edité la respuesta.
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;}

Como se solicitó, la versión sin golf: 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; 
    }

Esta es mi primera publicación, así que disculpen si he hecho algo mal. Cualquier comentario y corrección son bienvenidos.


Además, en s=2*n+1lugar de s=(n*2)+1y en w==s-h-1lugar de w==(s-h)-1hacerlo, esto será un poco más corto.
Alex A.

bueno, puede robar tu método de construcción de cuerdas. me molesta que linq sea más largo que para los bucles :(
Ewan

He agregado la versión sin golf :)
Transmisión

4

Ruby: 98 92 caracteres

Proceso que devuelve una cadena con el 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}

Ejecución de muestra:

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

4

Moho, 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()}

Traté de usar un método de corte de cadena (creando una cadena de n-1espacios y cortando hacia y desde un índice) de esta manera:

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..])}}

Pero en realidad son 3 caracteres más.

Código sin golf:

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() }

La parte que me gusta es cómo elimino algunos caracteres en las cadenas de formato. Por ejemplo,

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

es equivalente a

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

porque el "autoincrementador" para la posición del argumento de cadena de formato no se ve afectado al especificar manualmente el número y actúa de forma completamente independiente.


4

Octava 85

Las matrices de relleno como siempre =) eyeproducen una matriz de identidad, el resto se explica por sí mismo, creo.

m=(e=eye(2*(k=input('')+1)-1))*92+rot90(e)*47;m(:,k)='|';m(k,:)=45;m(k,k)='o';[m,'']

Todavía dos bytes mejor que el mío :( Realmente intenté algo similar a esto inicialmente, pero no pude hacerlo lo suficientemente pequeño - No me di cuenta de que podía hacer "m (:, k) = '|'". ¡Buena presentación!
Oebele

4

IDL 8.3, 135 bytes

No sé si esto se puede jugar más golf ... Es muy sencillo. Primero creamos una m x mmatriz ( m=2n+1) de cadenas vacías; a continuación, dibujamos los caracteres en las líneas ( y=x, y=-x, y=n, y x=n). Luego colocamos la O en el punto (n, n), e imprimimos todo, formateado como mcadenas de longitud 1 en cada línea para que no haya espacio adicional al imprimir la matriz de forma nativa.

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

Prueba:

IDL> s,4
\   |   /
 \  |  / 
  \ | /  
   \|/   
----O----
   /|\   
  / | \  
 /  |  \ 
/   |   \

"En lugar de un programa, puede escribir una función que tome un número entero. La función debe imprimir el diseño del sol normalmente o devolverlo como una cadena".
sirpercival

jajaja no te preocupes :)
sirpercival

3

Matlab, 93 87 bytes

Lamentablemente, el encabezado de la función tiene que ser tan grande ... Aparte de eso, creo que se juega bastante bien. Me pregunto si podría hacerse mejor con algunas de las diferencias de sintaxis en 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 '']

Simplemente puede hacer un programa N=input('')para guardar 2 caracteres. Aparte de eso, puede escribir [E V D;H 79 H;D V E '']para convertir toda la matriz en una matriz de caracteres, lo que le ahorrará otro byte o dos. (Acabo de enviar un programa Octave con un enfoque ligeramente diferente, pero antes de encontrar el suyo =)
error

De hecho, tuve la línea de entrada primero, pero por alguna razón pensé por error que no estaba permitido ... ¡Gracias por el otro consejo!
Oebele

3

Javascript ( borrador ES7 ) 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 />');


2

Pyth - 52 bytes

La parte difícil fue descubrir cómo cambiar las barras para cada lado. Me decidí por definir una lambda que tomara los símbolos para usar.

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

Es probable que se pueda jugar más, la explicación estará disponible próximamente.

Pruébelo en línea aquí .


2

Perl, 94

Aquí hay muchos operadores ternarios anidados, pero creo que el código es razonablemente sencillo.

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

Pruébelo aquí: ideone.com/E8MC1d


1
88B: for$x(-($n=<>)..$n){map{print$x^$_?$x+$_?$x?$_?$":'|':'-':'/':$x?'\\':O}-$n..$n;print$/}- Un par de ajustes: convertir interno para al mapa y cambiar $ y a $ _; 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());}}

¡¡trabajando en ello!!
Ewan

1

JavaScript (ES6), 139 135 140 + 1 bytes

(+1 es para -pbandera con nodo en la consola)

fijo:

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---
  /|\  
 / | \ 
/  |  \
*/

sin golf:

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");
}

2
Parece que le faltan dos rayos.

Oh, maldito, se me olvidó añadir que, ya en ...
royhowie

(A=Array).from(A(m))
Shmiddty

@MichaelT Lo arreglé, pero creo que puedo
jugarlo un

@Shmiddty gracias por la sugerencia! que salvó un montón de personajes
royhowie

1

Python 3, 193 186 bytes

Golfed

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

Salida

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

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

Sin golf

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

1
Hay algunas cosas para jugar golf aquí, pero la más importante son sus argumentos predeterminados. s=' ',b='\\',f='/',d='|',g='-'es muy largo, por lo que sería mejor moverlo agregando s,b,f,d,g=" \/|-"a la segunda línea.
Sp3000

Me refería a " \/|-"una sola cadena, en lugar de dividirla en caracteres individuales. Puede descomprimir de una cadena como x,y,z="123", que hace x="1", y="2"y z="3".
Sp3000

Editado de nuevo. Gracias @ Sp3000
Zach Gates

1

CJam, 59 55 bytes

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

¡Esto no ganará ningún premio tal como está, pero estaba lo suficientemente feliz de que funcionó!

Gracias a Sp3000 por los consejos de golf.


1
¡Buen trabajo! Aquí hay algunos consejos: 1) Puede usar en Slugar de la 'versión para el espacio y 2) Porque '-A*'O'-Apuede hacerlo en su '-A*_'O\lugar porque generarlo dos veces es largo
Sp3000

1

Python, 175129127125 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])

Pruébelo en línea aquí .


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---
  /|\
 / | \
/  |  \

1
Apliqué un par de trucos antiguos: 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))}(Ver Consejos para jugar golf en Ruby para más información)
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

Sin golf:

# 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

1

Prólogo, 219 bytes

No, no es un gran lenguaje de golf. Pero creo que este sitio necesita más Prolog.

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

Probado con swiplen Linux. Invocar este modo: swipl -s asciiSun.prolog; luego pregunte por el tamaño deseado de sol:

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

Sin golf:

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

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``

Intentalo

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>

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.