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.
code-golf
ascii-art
kolmogorov-complexity
Pasatiempos de Calvin
fuente
fuente
N=0
.Respuestas:
Pyth,
393836 bytesPruébelo en línea: Pyth Compiler / Executor
Explicación
Otra solución de 36 bytes sería:
fuente
C:
11610299959290Creo 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:
fuente
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
Phew - ¡Batí la respuesta de php!
Puntuación + 1 por usar el
-r
pará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.
Explicación
:
) convierten N en una cadena de N espacioss/ //
elimina un espacios^.*^\\&|&/^;ta
convierte espacios N-1 en:\
+ espacios N-1 +|
+ espacios N-1 +/
\
un espacio a la derecha y/
un espacio a la izquierda ...\|/
, que se reemplaza con-O-
y salte a lan
etiquetacon
-
e imprimir-0-
con/|\
, y reemplazarcon
-
y saltar de nuevo al bucle principal\
un espacio a la derecha y/
un espacio a la izquierda ...\$
que indica que se terminó, y salimos.Salida
fuente
J,
373440 bytesUso:
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, paran = 1
crea la siguiente3-by-3
matrizpara cada elemento matriz con enteros
x y
hacemos lo siguiente+&|,-,+,[,]
calcular una lista de propiedades+&|
abs(x)+abs(y)
, es igual a0
iff (si y solo si)x=0
yy=0
-
xy, es igual a0
iff , esx=y
decir, estamos en diagonal+
x + y, es igual a0
iff , esx=-y
decir, estamos en el anti-diagonal[
x, es igual a0
iff , esx=0
decir, estamos en la fila central]
y, es igual a0
iff , esy=0
decir, estamos en la columna central'O\/-|'#~0=
compare estos valores de propiedad anteriores0
y tome eli
carácter th de la cadena'O\/-|'
si lai
propiedad th es verdadera.{.
toma el primer carácter de una cadena y, si no hay nadie, devuelve un carácter de espacio como relleno, tal como lo necesitamos1:echo
Pruébelo en línea aquí.
fuente
PHP, 182 bytes
Esto pareció una actividad divertida para mi primera respuesta. Los comentarios sobre mi código son bienvenidos.
Aquí está el código sin golf con comentarios:
Editado con código por Royhowie
fuente
if(($y-$h)==($x-$h))
hace lo mismo queif(($y==$x)
. Puedes guardar otro personaje reemplazándoloif($x==y$)foo();else bar();
conif($x^$y)bar();else foo();
. También debe intentar usar operadores ternarios en lugar deif .. else
declaraciones.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
; simplemente useecho
($r.=
es la misma cantidad de bytes queecho
). 2. operador ternario utilizado (guarda muchos caracteres). 3.$h
fue inútil ya que igualó$n
. 4. No era necesario usarfloor
para$x = floor($i%$e);
, ya que un módulo en un número entero no necesitará redondearse hacia abajo.Pitón 2, 99
Imprime línea por línea, creando cada línea comprobando si la coordenada
(i,j)
(centrada a(0,0)
) satisfacej==-i
,j==0
,j==i
, o ninguno, con un truco para hacer que el trabajo de la línea central.fuente
R
lugar de.5
guardar 1 byte.CJam,
48 45 43 4138 bytesEsto todavía es demasiado largo y todavía estoy haciendo algunas cosas redundantes, pero aquí va:
Pruébalo en línea aquí
fuente
SpecBAS - 117 bytes
Esto imprime las barras y guiones en un bucle, y luego coloca la "O" en el medio.
Salida usando 1, 2 y 9
fuente
"-": NEXT y: PRINT AT s,s;"O"
a"-";AT s,s;"O": NEXT y
para guardar dos bytes.JavaScript (ES6) 97
98Esto parece lo suficientemente diferente ...
fuente
OS / 2 Classic Rexx, 102 ... o 14 para "versión del tramposo"
Saque los avances de línea para "jugar al golf".
Versión de Cheater, asigne al script el nombre del código fuente que desee con menos de 255 caracteres (requiere disco HPFS):
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. ;)
- El código de llamada asume que ya ha creado una raíz (matriz), naturalmente.
fuente
Haskell,
1099896 bytes¡Gracias a nimi y Mauris por su ayuda!
Explicación:
El operador
#
especifica qué carácter aparece en las coordenadas (i, j), con el sol centrado en (0,0). La funciónf
construye la Cadena de resultados al mapear#
sobre todos los pares de coordenadas que van desde -n hasta n.Uso:
fuente
s
, por ejemplo0#0='O'
,0#_='-'
, etc, y1<2
en lugar deTrue
.map(i#)[-n..n]
para guardar dos bytes.R,
177149 bytesMickey T. es el hombre! Me ayudó a arreglar mi solución originalmente incorrecta y a guardar 28 bytes. Gracias Mickey!
Ungolfed + explicación:
¡Cualquier sugerencia adicional es bienvenida!
fuente
scan
realmente no necesita elw=
. También se puede desplazar más profundamente en los comandos. Seif
puede abandonar si cambia la forma en que se maneja la matriz en un par de casos. Aplicando estos me salem=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.C #,
230226 bytesComo se solicitó, la versión sin golf: string ug (int n) {
Esta es mi primera publicación, así que disculpen si he hecho algo mal. Cualquier comentario y corrección son bienvenidos.
fuente
s=2*n+1
lugar des=(n*2)+1
y enw==s-h-1
lugar dew==(s-h)-1
hacerlo, esto será un poco más corto.Ruby:
9892 caracteresProceso que devuelve una cadena con el sol.
Ejecución de muestra:
fuente
Moho, 215 caracteres
Traté de usar un método de corte de cadena (creando una cadena de
n-1
espacios y cortando hacia y desde un índice) de esta manera:Pero en realidad son 3 caracteres más.
Código sin golf:
La parte que me gusta es cómo elimino algunos caracteres en las cadenas de formato. Por ejemplo,
es equivalente a
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.
fuente
Octava 85
Las matrices de relleno como siempre =)
eye
producen una matriz de identidad, el resto se explica por sí mismo, creo.fuente
IDL 8.3, 135 bytes
No sé si esto se puede jugar más golf ... Es muy sencillo. Primero creamos una
m x m
matriz (m=2n+1
) de cadenas vacías; a continuación, dibujamos los caracteres en las líneas (y=x
,y=-x
,y=n
, yx=n
). Luego colocamos la O en el punto(n, n)
, e imprimimos todo, formateado comom
cadenas de longitud 1 en cada línea para que no haya espacio adicional al imprimir la matriz de forma nativa.Prueba:
fuente
Matlab,
9387 bytesLamentablemente, 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.
fuente
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 =)Javascript ( borrador ES7 ) 115
fuente
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.
Es probable que se pueda jugar más, la explicación estará disponible próximamente.
Pruébelo en línea aquí .
fuente
Perl, 94
Aquí hay muchos operadores ternarios anidados, pero creo que el código es razonablemente sencillo.
Pruébelo aquí: ideone.com/E8MC1d
fuente
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=<>)
.C # - 291 (programa completo)
fuente
JavaScript (ES6),
139135140 + 1 bytes(+1 es para
-p
bandera con nodo en la consola)fijo:
uso:
sin golf:
fuente
(A=Array).from(A(m))
Python 3,
193186 bytesGolfed
Salida
Sin golf
fuente
s=' ',b='\\',f='/',d='|',g='-'
es muy largo, por lo que sería mejor moverlo agregandos,b,f,d,g=" \/|-"
a la segunda línea." \/|-"
una sola cadena, en lugar de dividirla en caracteres individuales. Puede descomprimir de una cadena comox,y,z="123"
, que hacex="1"
,y="2"
yz="3"
.CJam,
5955 bytes¡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.
fuente
S
lugar de la'
versión para el espacio y 2) Porque'-A*'O'-A
puede hacerlo en su'-A*_'O\
lugar porque generarlo dos veces es largoPython,
175129127125BytesPruébelo en línea aquí .
fuente
Ruby - 130 bytes
uso:
fuente
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)Perl
8591908986BSin golf:
fuente
Prólogo, 219 bytes
No, no es un gran lenguaje de golf. Pero creo que este sitio necesita más Prolog.
Probado con
swipl
en Linux. Invocar este modo:swipl -s asciiSun.prolog
; luego pregunte por el tamaño deseado de sol:Sin golf:
fuente
JavaScript (ES6),
142140134117 bytesIntentalo
fuente