En una pregunta de stackoverflow ahora eliminada, alguien publicó lo siguiente:
Escriba un programa o función para imprimir patrones alternos *
y #
basados en un número entero dado n
. Algunos ejemplos:
Entrada: n=1
Salida:
*
Entrada n=5
Salida:
*####
###**
***##
###**
*####
Entrada: n=8
Salida:
*#######
######**
***#####
####****
****####
#####***
**######
#######*
Como parecía un desafío de golf de código bastante bueno, aquí está.
¿Cómo se construyen estos patrones?
La primera línea comienza con un solo *
, seguido de la n-1
cantidad de seguimiento #
.
La segunda línea contiene dos *
, con una n-2
cantidad de plomo #
.
La tercera línea comienza con tres *
, seguida de la n-3
cantidad de seguimiento #
.
etc.
Una vez que hemos alcanzado el medio ( n/2
), contamos nuevamente con la cantidad de *
, que se puede ver en los ejemplos anteriores.
TENGA EN CUENTA que para números de entrada impares, el par de líneas invertidas (primero y último; segundo y próximo al último; etc.) son exactamente iguales. En el n=5
ejemplo, la primera y la última línea son *####
; la segunda y la penúltima línea son ###**
.
Sin embargo, para números de entrada pares, el par de líneas invertidas se invierte. En el n=8
ejemplo, la primera y la última línea son *#######
y #######*
; la segunda y próxima a las últimas líneas son ######**
y **######
; etc.
Reglas de desafío:
- Puede usar dos caracteres imprimibles distintos en lugar de
*
y#
. Puedes usarA
yB
;3
y7
;<
y>
; etc. Indique en sus respuestas lo que ha utilizado. - Puede suponer
n
que será un entero positivo (>= 1
) - Se le permite generar una lista / matriz de cadenas para cada línea o una matriz 2D de caracteres, en lugar de imprimirlos en STDOUT.
Reglas generales:
- Este es el código de golf , por lo que la respuesta más corta en bytes gana.
No permita que los lenguajes de code-golf lo desanimen a publicar respuestas con lenguajes que no sean codegolf. Trate de encontrar una respuesta lo más breve posible para 'cualquier' lenguaje de programación. - Se aplican reglas estándar para su respuesta, por lo que puede usar STDIN / STDOUT, funciones / método con los parámetros adecuados y programas completos de tipo retorno. Tu llamada.
- Las lagunas predeterminadas están prohibidas.
- Si es posible, agregue un enlace con una prueba para su código.
- Además, se recomienda agregar una explicación para su respuesta.
Casos de prueba (primero a n=1
través n=10
)
*
*#
#*
*##
#**
*##
*###
##**
**##
###*
*####
###**
***##
###**
*####
*#####
####**
***###
###***
**####
#####*
*######
#####**
***####
###****
***####
#####**
*######
*#######
######**
***#####
####****
****####
#####***
**######
#######*
*########
#######**
***######
#####****
*****####
#####****
***######
#######**
*########
*#########
########**
***#######
######****
*****#####
#####*****
****######
#######***
**########
#########*
Respuestas:
Jalea , 9 bytes
Pruébalo en línea!
Explicación
fuente
Python 2 , 62 bytes
Pruébalo en línea!
Usos
x
y espacio.Las filas se calculan así:
Usando el
%*s
especificador para elegir entren
y-n
.fuente
Perl 6 , 57 bytes
Pruébalo en línea!
Utiliza el mismo método que la respuesta Python de Lynn . Salidas utilizando
*
y espacio.fuente
MATL,
343118 bytesPruébalo en MATL Online
Utiliza 0 para * y 1 para #. Basado en la respuesta de Lynn's Jelly .
Respuesta anterior, 31 bytes:
Pruébalo en MATL Online
Utiliza 1 para * y 0 para #.
fuente
APL (Dyalog Classic) , 18 bytes
Pruébalo en línea!
salidas en
AB
lugar de*#
⎕
entrada evaluada⍳⎕
el vector0 1 ... n-1
⊢⌊⌽
min (⌊
) entre ellos (⊢
) y su reverso (⌽
) - ver trenes⊂>⊢⌊⌽
dónde está el⍳
vector como un todo (⊂
) menor que cada uno de sus⊢⌊⌽
- devuelve un vector de vectores booleanos (0/1)⊢∘⌽\
revertir cualquier otro vector↑
mezclar en una matriz⎕a
el alfabeto en mayúscula,'AB
...Z'
⎕a[
]
reemplazar0
1
con'A'
'B'
fuente
⎕a[...}
convertirlos enA
yB
sin espacios es más corto que mantenerlos como0
y1
sin espacios, teniendo en cuenta que lo ha usado, pero tengo curiosidad por saber si hay mucha diferencia en bytes si los mantiene como0
y1
.⎕d[
...]
o⊃¨⍕¨
... En la última expresión⍕¨
es "formatear cada uno", convierte cada número en un carácter anidado vector de caracteres , por lo que necesitamos "primero cada uno "(⊃¨
) para obtener solo escalares de caracteres (y, por lo tanto, sin espacios en blanco al imprimir).Carbón , 21 bytes
Pruébalo en línea! Usos
0
y1
. El enlace es una versión detallada del código e incluye el§*#
que traduce el resultado al*
y#
en la pregunta. Explicación:fuente
Jalea ,
1215 bytes+3 arreglando el
n=1
error del caso de borde :(Un programa completo que acepta un número entero que imprime la salida como se define en el OP usando
0
y1
para*
y#
respectivamente.Pruébalo en línea!
¿Cómo?
fuente
Jalea , 15 bytes
Pruébalo en línea!
Programa completo
*
=1
#
=0
fuente
Java 10, 145 bytes
Todo el ternario lo hace un poco desordenado, pero funciona bien. Intenté aplanar el bucle anidado y varias otras cosas, pero solo aumentaron el recuento de bytes. Pruébelo en línea aquí .
Sin golf:
Java
811,179bytesPruébalo en línea aquí (TIO todavía no tiene Java 11, por lo que utiliza un método personalizado que produce el mismo recuento de bytes que
String#repeat()
).Gracias a Kevin Cruijssen por jugar al golf la friolera de 52 bytes!
Sin golf:
fuente
"*".repeat(...)
y"#".repeat(...)
(así como el retorno de una cadena en lugar de directamente y jugar al golfn-j-1
an+~j
):n->{String r="",a,b;for(int j=0;j<n;b="#".repeat(j<n/2?n+~j:j),r+=(j++%2<1?a+b:b+a)+"\n")a="*".repeat(j<n/2?j+1:n-j);return r;}
repeat()
método es realmente bueno para jugar al golf.Lua ,
148133bytesPruébalo en línea!
-15 bytes gracias a @KevinCruijssen y @JoKing.
fuente
(n+1)/2
para-~n/2
;or n-i+1
aor-~n-i
;i%2==0
ai%2<1
; yreverse() or
areverse()or
. Además, su versión de TIO y el número de bytes contienen un punto y coma final que no parece ser necesario. Buena primera respuesta, sin embargo. +1 de mi parte Y bienvenido a PPCG! :)-~n
está haciendo en sus sugerencias? Definitivamente funciona, pero no entiendo por qué.~
es un operador unario de negación bit a bit. Sin embargo, lo importante para codegolfing es que~i
tiene el mismo valor que-i-1
. Por tanto, podemos usar en-~i
lugar dei+1
y en~-i
lugar dei-1
. Esto es útil en dos casos, que podría utilizar en su respuesta: deshacerse del paréntesis, porque-
y~
tiene prioridad de operador sobre otras operaciones matemáticas, por lo que(n+1)/2
puede ser-~n/2
. Y la otra parte útil es deshacerse de los espacios en algunos casos, como hice conor-~n-i
.~
parax+1
yx-1
y Use unary~
paraa-b-1
ya+b+1
. Todos los consejos generales, así como los consejos específicos del idioma ( consejos para jugar al golf en Lua en este caso), pueden ser interesantes de leer. :)Kotlin , 86 bytes
Pruébalo en línea!
Usos
x
y espacio como símbolos de salida. Derivados de Lynn Answerfuente
Perl 5 +
-pa -MPOSIX -M5.010
, 58 bytesPruébalo en línea!
fuente
C (gcc) ,
10499 bytesPruébalo en línea!
fuente
C (gcc) ,
118bytesEste no va a ganar, pero es un enfoque diferente (¡o al menos eso creo!) En lugar de hacer manipulaciones de cuerdas, aprovecho el hecho de que10X- 1 terminado [ 1 .. n ] = { 9 , 99 , 999 , . . . } , que luego se puede multiplicar para obtener el patrón apropiado;
printf()
luego hace el relleno de cero para la justificación correcta.Lamentablemente,
int
solo tiene un rango suficiente para hacer hasta 9 dígitos (en plataformas de 32 bits), por lo que debe buscarlong
patrones más grandes; un lenguaje que nativamente hace aritmética MP podría usar esto para algo.Gracias a ceilingcat por la sugerencia.
Pruébalo en línea!
Prueba de concepto de que esto funciona con aritmética MP:
C # (compilador Mono C #) ,
187165 bytes(143 bytes + 22 bytes para
using System.Numerics;
el encabezado)Pruébalo en línea!
fuente
Vim, 99 pulsaciones de teclas
Siempre es interesante intentar hacer vim con argumentos de entrada. Es muy poco natural, por lo que no va a ser sorprendentemente corto. Probablemente hay otros buenos enfoques para esto.
Se supone que la entrada está sola en un búfer. Se supone que los registros están vacíos. Se supone que el editor es lo suficientemente alto como para contener el resultado sin desplazamiento (técnicamente esto podría evitarse a costa de algunas pulsaciones de teclas).
Explicación
Y en base64, con caracteres reales (ingrese la entrada en
input
y las teclaskeys
y ejecute usandovim -u NONE -s keys input
)fuente
R , 75 bytes
Pruébalo en línea!
n
como parámetro y devolviendo una matriz de0/1
donde0
corresponde'*'
y1
corresponde a'#'
fuente
K (ngn / k) , 22 bytes
Pruébalo en línea!
{
}
funcionar con argumentox
!x
la lista(0;1;
...;x-1)
i:
asignar ai
i&|i
mínimos (&
) dei
y su reverso (|
)i>/:
compare con mayor que (>
)i
contra cada elemento de la lista de la derecha (/:
) - devuelva una matriz booleana (lista de listas)i|:/'
para cada ('
) j eni
, reversa (|:
- necesitamos que la:
fuerza|
sea unaria) el elemento correspondiente j veces (sen f/ x
aplicaf
n
vecesx
). Efectivamente, invierta cada dos filas."*#"
usar elementos matriciales como índices en la cadena"*#"
fuente