Nuevamente inspirado por una tarea para la Programación 101, aquí hay otro desafío.
Entrada:
- Un entero positivo
n >= 3
. (tiene que ser extraño)
Salida:
n
líneas de asteriscos, donde la primera línea tienen
asteriscos y cada nueva línea tiene dos asteriscos menos que la línea anterior. Hasta golpear 1 asterisco. A partir de ahí, cada nueva línea tiene dos asteriscos más que la línea anterior hasta volver a losn
asteriscos. Los espacios o algo así como espacios deben usarse para alinear los asteriscos para que realmente se vea como un reloj de arena.
Reglas generales:
- Las nuevas líneas finales están permitidas pero no tienen que usarse.
- sangrado es imprescindible.
- Este es el código de golf, por lo que la respuesta más corta en bytes gana.
- Como el curso se imparte en C ++, estoy ansioso por ver soluciones en C ++.
Caso de prueba (n = 5):
*****
***
*
***
*****
Respuestas:
Carbón de leña , 6 bytes
Muy simple. Dibuje una poli G en de
*
, con longitud lateral tomada desde una entrada N umber, donde los lados bajan-y-derecha, horizontalmente a la izquierda y de arriba a la derecha:Luego autocompletar el contorno y llenarlo.
Pruébalo en línea!
fuente
Python 2, 57 bytes
Un programa completo Va línea por línea, imprimiendo el número correcto de asteriscos centrados.
Una función recursiva era más larga (67 bytes):
o
fuente
max
con unabs
, pero todo lo que obtuve esabs(n-1)+1
, lo que es peor porque la adición requiere paréntesis'*'*-~abs(n-1)
, pero luego tiene la misma longitud que'*'*max(n,2-n)
.def f(n,s=''):r=s+'*'*n+'\n';return 1/n*r or r+f(n-2,s+' ')+r
61 bytes, pero aún es más largo. Incluso con una nueva línea líder,def f(n,s='\n'):r=s+'*'*n;return 1/n*r or r+f(n-2,s+' ')+r
sigue siendo 58 bytes ...center
. Nunca supe que existía hasta ahora.V , 12 bytes
Pruébalo en línea!
Me gustan los desafíos como este porque puedo mostrar las ventajas de la naturaleza 2D de V. Explicación. Primero, necesitamos crear una cadena de n asteriscos. Entonces, hacemos esto:
Como nota al margen, esto es directamente equivalente a
@ai*<esc>
in vim, y el registro@a
se preinicializa a "arg1". Esto hace que la entrada numérica sea mucho más conveniente.Luego, avanzamos el personaje a la derecha con
h
. Aquí está la parte divertida:Ahora técnicamente, esta última parte es
Porque el comando sangría es en realidad
>>
. V asume convenientemente que los comandos incompletos se aplican a la línea actual y también rellena implícitamente el segundoò
carácter para el bucle.fuente
Plantillas de C ++, 186 bytes
¡Con la fórmula explícita de mi respuesta C, las Metatemplates están compitiendo!
Sin golf:
uso:
no competidor
Solo por diversión:
Uso:
fuente
PowerShell v2 +, 54 bytes
Toma información
$n
(se garantiza que es un número entero impar), construye dos rangos con$n..1
y2..$n
y los concatena juntos, luego los usaWhere-Object
para seleccionar solo los impares con|?{$_%2}
. Esos son alimentados en un bucle. En cada iteración, construimos el número apropiado de espacios, concatenado con cadenas con el número apropiado de asteriscos. Esas cadenas se dejan en la tubería y la salida a través deWrite-Output
inserciones implícitas de nuevas líneas entre ellas al finalizar el programa.Ejemplos
fuente
Python, 78 bytes
Entonces solo con sangría:
Uso:
fuente
C,
114109 bytessin golf:
Solución recursiva previa:
fuente
JavaScript (ES6), 66 bytes
La idea aquí es generar cada reloj de arena a partir del anterior: agregue un espacio al comienzo de cada línea, y añada y agregue
n
asteriscos.fuente
05AB1E ,
21201917 bytesAhorro de 2 bytes gracias a carusocomputing
Pruébalo en línea!
Explicación
fuente
Ir"*"×.pRû
- Llegué tan lejos, con la cara palmada cuando me di cuenta de lo lejos que estaba, vi que había respondido, e intentaré aprender la iteración en este idioma ahora usando este ejemplo. ¡Gracias!;ƒ'*¹N·-×Nð×ì})û»
use el nuevo comando palindromize. -2 bytes.ÅÉ
y.c
probablemente aún no estaban disponibles en el momento en que publicaste esto. :)MATL , 12 bytes
Pruébalo en línea!
Explicación
Esto hace uso de la función de rango simétrico recientemente agregada .
fuente
PHP, 95 bytes
En lugar de almacenar las filas en una matriz y luego generar todo, el ciclo for desciende hasta 1 y luego vuelve al número original.
fuente
C ++ 11, 93 bytes
Ligeramente incólume:
Uso:
fuente
'\n'
por10
:)MATL , 20 bytes
Pruébalo en línea!
fuente
R, 77 bytes
Crea una matriz de caracteres, que luego imprime a través de
cat
,fill=n
asegurándose de que las líneas se alineen correctamente. Tenga en cuenta que los elementos se almacenan en una columna de matriz primero (es decir, los dos primeros elementos sonM[1,1]
yM[2,1]
noM[1,2]
).fuente
Java 7
170 165164 bytesGracias a @Hypino por guardar 5 bytes.
Gracias a Kevin por guardar 1 byte.
fuente
s=
des=s+"\n"
y 2 más bytes cambiandoreturn(n=--n-1)
areturn(n=n-2)
un total de 4 bytes.String s="",c="",t="";
aString s,c,t=s=c="";
( -2 bytes ) yreturn(n=n-2)>=0?s+"\n"+c+c(n,++x)+
areturn n-1>0?s+"\n"+c+c(n-2,++x)+
( -2 bytes nuevamente)n=n-2
->n-1>0
porque n debe usarse en otro argumento de una función.n
an-2
esa parte.return(n=n-2)>=0 ... n
ser cambiado areturn n-1>0 ... n-2
es aún más corto. PD: Me has agradecido por guardar bytes, pero no has cambiado tu código en tu edición. ;)String c(int n,int x){String s,c=s="";int i=0;for(;i++<n;s+="*");for(i=x;i-->0;c+=" ");return n>1?s+"\n "+c+c(n-2,x+1)+"\n"+c+s:"*";}
sin lat
( prueba de ideona - 133 bytes )PHP - 95 bytes
Guardado un byte usando una nueva línea real en lugar de un
"\r"
fuente
Pyth, 22 bytes
Un programa que toma la entrada de un número entero en STDIN e imprime el resultado.
Pruébalo en línea
Cómo funciona
fuente
C,
195191 BytesDebería jugar golf un poco más pequeño
Podemos probarlo aquí en ideone
fuente
C, 79 bytes
Divide la variable de cuenta regresiva
k
en índices de fila y columna. Si el índice de la columna es 0 (último carácter en una fila), genera un carácter de nueva línea (10). Luego ajusta los índices de fila y columna para que estén alrededor del asterisco central. Entonces,abs(x) < abs(y)
es una condición corta para generar un espacio.fuente
Ruby,
5554 bytesfuente
?**n
trabajos; No necesitas el espacio allí.Java 7, 156 bytes
Bastante simple. Realiza un seguimiento de las líneas con
n
, estrellas conj
, espacios cons
y dirección cond
. Realmente solo quería una respuesta Java no recursiva en el tablero, pero no duele que también sea un poco más corta :)Con saltos de línea:
fuente
APL, 19 bytes
Prueba:
Explicación:
fuente
1+
y use un APL que tenga⎕IO←0
.Haskell, 84 bytes
fuente
putStr
y usted puede deshacerse de lafromEnum
como este .C (gcc) ,
8074 bytesGracias ceilingcat por 6 bytes
Pruébalo en línea!
fuente
PowerShell ,
5450 bytesPruébalo en línea!
fuente
PHP ,
10488 bytesPruébalo en línea!
Esto no supera los puntajes más bajos para PHP en este desafío, pero es demasiado loco para tirarlo.Bien, ahora lo he jugado para que sea el puntaje más bajo (no por mucho tiempo) para PHP en este desafío, pero no cambia el hecho de que todavía es una locura.
fuente
Groovy, 66 bytes
Pruébelo: https://groovyconsole.appspot.com/script/5145735624392704
Explicado:
((n..1)+(2..n))
- Invertir palindromizar a n[n,..,1,..,n]
.each{if(it%2>0){...}
- Iterar a través de elementos extraños.println(("*"*it).center(n))
- Centre n estrellas e imprima cada una en la nueva línea.fuente
.each
El bloque de código podría ser{it%2&&println(("*"*it).center(n))}
.PHP, 191 bytes
Corre como
php -f golf_hourglass.php 15
La idea detrás de esto es crear la mitad superior (la parte anterior al single
*
), luego hacer eco de la parte superior dos veces, pero la segunda vez en orden inverso.fuente
for(;$i<$a=$argv[1];$i+=2){$t=str_pad(str_pad("",$i+1,"*"),$a," ",2)."\n";$i?$s.=$t:$r=$t;}echo strrev($s)."\n".$r.$s;
for(;$i<$a=$argv[1];$i++){$t=str_pad(str_pad("",$i+1+$i%2,"*"),$a," ",2)."\n";$i%2?$s.=$t:$s=$t.$s;}echo$s;
esto es mejor\n
con una nueva línea real para guardar un byte.Pyke,
2219 bytesPruébalo aquí!
fuente
C, 117 bytes
Sin golf
fuente