Escriba un programa o función que tome un entero positivo N e imprima o devuelva una cadena de arte ASCII N × N cuya mitad superior es un semicírculo hecho de (
'sy cuya mitad inferior es un triángulo apuntando hacia abajo hecho de V
' s, con espacios utilizados como relleno.
En otras palabras, haga un cono de helado ASCII: (salida para N = 17)
(((((
(((((((((
(((((((((((((
(((((((((((((
(((((((((((((((
(((((((((((((((
(((((((((((((((((
(((((((((((((((((
VVVVVVVVVVVVVVVVV
VVVVVVVVVVVVVVV
VVVVVVVVVVVVV
VVVVVVVVVVV
VVVVVVVVV
VVVVVVV
VVVVV
VVV
V
Ejemplos
Aquí están las salidas para N = 1 a 5. Tenga en cuenta que para N impar, el triángulo siempre debe ser la mitad más grande.
V
((
VV
(((
VVV
V
((
((((
VVVV
VV
(((
(((((
VVVVV
VVV
V
Aquí hay una N = 101 pastebin.
Y aquí hay una implementación de referencia de Python 3 sin golf:
N = int(input())
ic = [[' '] * N for _ in range(N)]
for y in range(N//2):
for x in range(N):
if (x - (N - 1) / 2)**2 + (y - (N - 1) / 2)**2 < (N / 2)**2:
ic[y][x] = '('
for y in range(N//2, N):
for x in range(y - N//2, N - (y - N//2)):
ic[y][x] = 'V'
for line in ic:
print(''.join(line))
Detalles
- Tome la entrada de stdin, línea de comando o como argumento de función. Salida a stdout o similar, o puede devolver la cadena si escribe una función.
- La porción del cono debe coincidir exactamente con la implementación de referencia para todos los N.
- La porción de helado no necesita coincidir exactamente con la implementación de referencia, siempre y cuando tenga claramente la forma de un semicírculo para todo N. (Esto es para que no tenga que preocuparse por pequeñas diferencias en el semicírculo debido a errores de redondeo .)
- No debe haber espacios iniciales innecesarios, pero puede haber espacios finales superfluos.
- La salida puede contener opcionalmente una nueva línea final.
- Opcionalmente, puedes usar cualquier otro 3 distintas ASCII imprimibles caracteres en lugar de
(
,V
y espacio.
Puntuación
La presentación más corta en bytes gana. Tiebreaker va a la presentación más antigua.
Respuestas:
CJam, 46 bytes
Pruébalo en línea.
Creo que actualmente imita exactamente la especificación original, que era necesaria cuando comencé a producir esta respuesta. Puede existir la posibilidad de ahorrar algunos bytes haciendo que las matemáticas sean menos precisas para la especificación original, pero hasta que vea una manera de guardar más de uno o dos bytes, lo dejaré tal cual.
Explicación
fuente
2
'sy1
' en lugar de(
'syV
' s?inca2
129 129123121111107Esto usa principalmente las fórmulas del ejemplo de Python, pero usa jot-dots e iotas en lugar de doble bucle. La
i
función realiza la prueba circular para laj
función que invoca jot-dot sobre ella. Y lak
función realiza la prueba de triángulo para lal
función. Lac
función clasifica los resultados dej
yl
y los rediseña a N × N.editar: -6 combinar 2 mapas en 1.
editar: -2 eliminar enredos inútiles.
editar: mejor mecanografiado.
editar: -10 aplica expresiones repetidas en forma de matriz.
editar: -4 factorizar la expresión repetida como una función.
editar: comentario línea por línea.
Más detalladamente, el punto de entrada es la
c
función que toma un argumento implícitamente nombradoy
.La
j
función recibe el mismo valor de entrada que suy
parámetro.El punto jot aquí hace el doble bucle. Llama a la
i
función con cada combinación de elementos de las matrices izquierda y derecha (0..n / 2 y 0..n). Entonces eli
función recibe comox
el índice y de la tabla, y recibe comoy
el índice x . Los nombres se pusieron un poco al revés aquí :).donde
q
hacede regreso
i
El piso no debería ser necesario. Pero aparentemente hay un error en el intérprete.
La
l
función funciona de manera similar a laj
función, utilizando un punto de jot.La
k
función produce un valor booleano escalado en 2 para que los valores se puedan distinguir de los valores de helado más adelante, en el mapeo.En acción (canalizando
tr
para eliminar los caracteres de tabulación que son la solicitud de REPL):fuente
Pitón 2,
193192No usa cadenas, solo matemáticas
s(L,U)
devuelve un número de la forma "U
-dígitos con losL
ceros más a la derecha y los restantes"f(N,m)
devuelve un número de N dígitos con la sección interna de2
y un borde de ancho m de1
cada ladog(N,m)
hace lo mismo, pero usando7
para el 'color' de la sección interior, ya que coincide más con la textura del conoSalida
fuente
Perl 6, 175
Implementación bastante sencilla sin mucho golf, solo espacios en blanco extraños / eliminación de puntuación:
fuente