Flechas de impresión simple

23

Para practicar golf, he estado haciendo las tareas en la clase de Introducción a Python de mi novia. Descubrí que para esta tarea, había múltiples estrategias que se acercaban mucho en el recuento de personajes, y estoy seguro de que las personas aquí pueden encontrar formas aún mejores. Aunque estoy más interesado en las formas de hacer esto en Python, me gustaría saber lo más golfizado que puede obtener este programa, por lo tanto, este es el código de golf y gana la respuesta más corta.

Las normas:

La tarea se describe a continuación. Se le debe pedir al usuario que ingrese dos veces, aunque las indicaciones no tienen que decir nada, y pueden estar en un orden diferente.

Se aplican lagunas estándar.


Tarea 3: Flechas

Escriba un programa que solicite al usuario una cantidad de columnas e imprima el patrón como se ve a continuación. Puede suponer que el usuario proporcionará números positivos. Su programa debe manejar las flechas izquierda y derecha. Aquí hay algunos ejemplos de ejecuciones:

How many columns? 3
Direction? (l)eft or (r)ight: r
*
 *
  *
 *
*
How many columns? 5
Direction? (l)eft or (r)ight: l
    *
   *
  *
 *
*
 *
  *
   *
    *
aks.
fuente
23
Esto se parece a homewo ... oh, no importa.
TessellatingHeckler
¿Se permiten espacios finales en cada línea?
lirtosiast
@ThomasKwa sí.
aks.
¿Podemos usar caracteres de control para mover el cursor, como en esta pregunta ?
lirtosiast
@ThomasKwa Claro ... aunque honestamente no estoy seguro de lo que eso significa y estoy interesado en verlo en acción.
aks.

Respuestas:

8

Pyth, 23 bytes

Puede o no ser válido, según la respuesta a este comentario . De todos modos, encontré esto ordenado y, si no es válido, las otras respuestas de Pyth también son inválidas. ;) Bueno, es válido , porque aparentemente eché de menos lo obvio. : /

EDITAR: ¡GANÉ! ¡¡¡YESSS !!!! ¡Primera vez en la historia! :RE

j+_J_Wqz\r.e+*dkb*\*QtJ

Demo en vivo.

kirbyfan64sos
fuente
1
m+*\ d\*Qen lugar de eso enumerar cosita. Guarda 2 bytes.
Jakube
7

Pyth, 27

j<tQ_Wqz\l++Jm+*\ d\*Q_PJtJ

Pruébalo en línea

La idea básica aquí es construir una cadena que, por ejemplo, 5, se vea así:

*
 *
  *
   *
    *
   *
  *
 *
*
 *
  *
   *
    *

Y luego voltéalo al revés si obtenemos lnuestra entrada. Luego tomamos todas las input-1líneas excepto esta última y las imprimimos.

FryAmTheEggman
fuente
7

Python 2, 81 79 bytes

c=input()
r=1
l=0
exec"print' '*(%sabs(c-r))+'*';r+=1;"%("c+~"*input())*(2*c-1)

Todavía podría ser golfable, pero ya veremos :)

Sp3000
fuente
2
Buena idea con tener las entradas ser variables ly r. No me había dado cuenta de que la entrada se evaledita en el mismo entorno que el código.
xnor
4

Pyth, 30 28 27 bytes

VtyQ+*+*tQJqz\r_WJ.a-hNQd\*

Pruébalo en línea.

Al parecer, actualmente estoy atado con FryAmTheEggman con un enfoque completamente diferente. (Creo que ese es ingenioso).

Ejemplo

$ python pyth.py spa.p
r
3
*
 *
  *
 *
*

$ python pyth.py spa.p
l
5
    *
   *
  *
 *
*
 *
  *
   *
    *

Explicación

 tyQ                              (columns * 2) - 1
V                               loop N through range(the above)
        tQ                                columns - 1 (maximum number of spaces)
       *                                multiplied by
           qz\r                           1 if direction == "r" else 0
          J                               also save that 1 or 0 to J
      +                               plus
                  .a-hNQ                    abs(N - columns + 1)
               _WJ                      negate that if direction == "r"
     *                  d           that many spaces
    +                    \*       add the star and print
PurkkaKoodari
fuente
@ Pietu1998 Todavía estoy interesado en una descripción básica de lo que estás haciendo. Veo que solo tienes 1 bucle y no hay mapa ni lambda ...
aks.
@aks. Agregué una explicación.
PurkkaKoodari
4

PowerShell, 91 85 102 Bytes

$c=(Read-Host)-1;if(!$c){"*";exit}(@(0..$c+($c-1)..0),@($c..0+1..$c))[(Read-Host)-eq'l']|%{" "*$_+"*"}
  • Obtiene las columnas, las almacena en $c . Restamos uno porque cada columna también tiene un *y solo nos interesa cuántos espacios se requieren.
  • Si el valor ingresado fue a 1, imprimir *y salir, el resto del script no hace la diferencia.+
  • La siguiente sección primero obtiene la dirección y prueba si es -eqnormal l, luego crea una matriz basada en la indexación en una matriz de matrices generadas dinámicamente en función del valor de $c. Mágico. Esencialmente, esta es la cantidad de espacios por línea que necesitamos.
  • Por ejemplo, para 5 resta colección se mantendría (0,1,2,3,4,3,2,1,0).
  • Toma la matriz y la canaliza en un %bucle Foreach-Object , donde sacamos una cadena de X número de espacios, luego el*

Ejemplo de uso:

PS C:\Tools\Scripts\golfing> .\simple-printing-arrows.ps1
6
r
*
 *
  *
   *
    *
     *
    *
   *
  *
 *
*

Editar: variable eliminada $ecanalizando la colección directamente
Editar2: representa correctamente 1 columna, ahora

+ Si todavía es obligatorio tomar la entrada para la dirección de las flechas de 1 columna (afirmo que no lo es), podemos intercambiar el posicionamiento de Read-Hosty perder un par de bytes más reintroduciendo la $dvariable, para 106 :

$c=(Read-Host)-1;$d=Read-Host;if(!$c){"*";exit}(@(0..$c+($c-1)..0),@($c..0+1..$c))[$d-eq'l']|%{" "*$_+"*"}
AdmBorkBork
fuente
Intente colocar 1 columna y hacia la izquierda; obtendrá una flecha hacia la derecha de 2 columnas. Intente poner 1 columna a la derecha: obtendrá un error 'Argumento especificado fuera del rango de valores válidos'. Pensé que tu 85 sería posible superar evitando los rangos duplicados. Pero ni siquiera puedo acercarme. Contando con una flecha de 1 columna, actualmente estoy en 112 caracteres. > _ <
TessellatingHeckler
1
@TessellatingHeckler Gracias - corregido.
AdmBorkBork
1
Eso elevó el tuyo a 102 y el mío bajó a 102. No puedo soportar mirar esto por más tiempo, pero debe haber uno más que pueda eliminar ...: D
TessellatingHeckler
4

TI-BASIC, 75 65 57 54 50 47 Bytes

Gracias a @ThomasKwa por el cálculo correcto de bytes y el golf de 10 bytes .

Probado en mi TI-84 + Silver Edition.

Primera presentación de TI-BASIC, sugerencias de golf bienvenidas (todavía no conozco muchos trucos). Si el nombre juega un factor en la memoria que se muestra, este tiene 3 caracteres en lugar de 1 (miré el recuento de bytes en mi calculadora). Este programa está limitado por las outputrestricciones de la función (creo que con flechas de longitud 4), pero probablemente podría cambiar a text, que se muestra gráficamente si es una longitud demasiado baja.

Prompt L,Str1
Str1="R
For(I,1,2L-1
Output(I,(1-2Ans)abs(I-L)+AnsL+1,"*
End

Tenga en cuenta que esto tampoco borra la pantalla ni la detiene.

Realmente siento que la ecuación que estoy usando se puede jugar más. También se siente tan mal excluir las comillas finales.

col
fuente
@ThomasKwa ¡Gracias! Lo haré ahora.
cole
2
Segundo: Anses gratis, porque no lo usas como entrada y Output(no lo modifica Ans. Úselo y elimine la variable A. Puedes asignar usando -2(Str1="R; No hay necesidad de un condicional.
lirtosiast
1
@ThomasKwa gracias por los consejos, parece que tengo un camino por recorrer en TI-BASIC.
cole
3
Tercero: realmente no hay necesidad de multiplicar el valor por -2. Solo hazlo Str1="Rpor la segunda línea. Eso hace la cuarta línea Output(I,(1-2Ans)abs(I-L)+AL+1,"*, que le da 4 bytes más. Pero espere, hay un modismo para (1-2Ans)... ¡ cos(πAns)eso es , que ahorra un byte, más uno más porque obtenemos el paréntesis abierto gratis!
lirtosiast
1
Ser competente en el golf en cualquier idioma requiere solo práctica; llegarás ahi.
lirtosiast
2

Python 2, 89 bytes

c=input()-1
d=raw_input()>'l'
for j in range(2*c+1):print' '*(d*c-(2*d-1)*abs(c-j))+'*'

Funciona casi de manera idéntica a mi respuesta de Pyth, solo calculando el número correcto de espacios sobre la marcha.

PurkkaKoodari
fuente
2

PowerShell, 104 102 97 bytes

# 97 version:
$o=@(($c=(read-host)-1))[(read-host)-eq'l'];($j=2*$c)..0|%{' '*[Math]::Abs($o++%($j+!$j)-$c)+'*'}

3
r
*
 *
  *
 *
*

# Previous 102 version:
$o=@(($c=(read-host)-1))[(read-host)-eq'l'];(2*$c)..0|%{
' '*[Math]::Abs($o++%(2*($c+(!$c+0)))-$c)+'*'}

NÓTESE BIEN. si desea ejecutarlo nuevamente, abra un nuevo PowerShell o rv orestablezca el estado variable.

En comparación con lo tersos que son los demás, esto duele. [Duele menos en 97 que en 122]. Dos partes, ninguna de ellas muy sorprendente; lee varias columnas, utiliza un sustituto de operador de índice de matriz para obtener un desplazamiento y ejecuta una función de onda que comienza en el desplazamiento (y un ajuste para que no se caiga mod 0).

(Y qué pasa, pasé años en esa función de onda, incapaz de detectar mi malentendido y escribiendo todos los parentes honestos, no es LISP).

TessellatingHeckler
fuente
2
Eso es jodidamente brillante.
AdmBorkBork
2

Python 2, 98 89 bytes

f=[' '*n+'*'for n in range(input())]
if'l'==input():f=f[::-1]
print'\n'.join(f+f[-2::-1])

Un poco más largo.


Uso

$ python2 test.py
3
"l"
  *
 *
*
 *
  *
Puertas de Zach
fuente
También aparentemente roto. NameError: name 'l' is not defined, NameError: name 'd' is not defined.
TessellatingHeckler
Verifica el uso. @TessellatingHeckler
Zach Gates
Ahh, listo. Pero tus flechas de 1 columna tienen dos puntas de flecha. (Creo que podría jugar más al golf al no almacenar iy den absoluto, simplemente usando range(P())y if P()=='l'...)
TessellatingHeckler
Gracias por las sugerencias! También arreglé las puntas de doble flecha. @TessellatingHeckler
Zach Gates
No puedo probar el f=[...][::2*('r'>input())-1]
cajero automático
2

Perl, 85 bytes

($-,$_)=<>;$,=$/;@}=map$"x$_.'*',0..--$-;@}=reverse@}if/l/;print@},map$}[$--$_],1..$-

Uso:

perl 59874.pl <<< '6
r'
Dom Hastings
fuente
44
Me gusta cómo
nombras
@ mbomb007 jaja! Sabes, en realidad no nombro mis scripts, pero pensé que era mejor nombrar algo simple para las instrucciones de uso ... ¡ simplearrows2.plno parece tan bueno! : P
Dom Hastings
2

PHP, 156 bytes

<?for($c=1+fgets(STDIN);--$c;$s[-$c]=$t[]=sprintf("%{$c}s","*"));arsort($s);$a=fgetc(STDIN)==r?$s+$t:$t+$s;array_splice($a,count($a)/2,1)?><?=join("
",$a);

Crea dos matrices, así:

$t = [
    0 => "  *"
    1 => " *"
    2 => "*"
]
$s = [
    -1 => "*"
    -2 => " *"
    -3 => "  *"
]

luego usa la unión de matriz $s+$to$t+$s para combinarlos y array_spliceeliminar el elemento en el medio. Finalmente salida usando<?=join()

Fabian Schmengler
fuente
con argumentos CLI en lugar de STDIN, mi código sería 8 bytes más corto;)
Fabian Schmengler
2

Pitón 2, 111 109 104 bytes

Solución bastante simple. Estoy seguro de que se puede jugar más al golf. Para los que no saben~x+n es lo mismo que n-1-x.

n=input()
r=range(n)
r+=r[-2::-1]
for i in[r,[~x+n for x in r]]['r'>raw_input()]:print"*".rjust(i+1," ")

Pruébalo en línea

Editar : Esto se convirtió en golf en la última línea:

if'r'>d:r=[~x+n for x in r]
for i in r:print"*".rjust(i+1," ")
mbomb007
fuente
2

Matlab, 109 105 96 bytes

Gracias a @beaker por salvarme 9 bytes .

x=eye(input(''));if(input('','s')<114),x=fliplr(x);end
x=x*10+32;disp(char([x;x(end-1:-1:1,:)]))
Luis Mendo
fuente
Puede guardar 9 bytes si reemplaza las dos líneas que insertan los códigos ASCII conx=x*10+32;
beaker
@beaker Muy inteligente, gracias!
Luis Mendo
1

Ruby, 118 bytes

2.times{l,d=gets.split;l=l.to_i;a=(d=="r"?(0..l-1):(l-1).downto(0)).to_a;(a+a[0..-2].reverse).each{|x| puts "#{' '*x}*"}}

2.times{ - dos veces, por supuesto ...

l,d=gets.split; - obtener la entrada

l=l.to_i; - cambiar la longitud a un entero

a=(d=="r"?(0..l-1):(l-1).downto(0)).to_a; - crear una matriz desde el rango de 0 a la longitud

(a+a[0..-2].reverse).each{|x| puts "#{' '*x}*"} - iterar, convertir en las cuerdas para hacer las flechas

No es exactamente el mejor golf de la historia, pero bueno.

PatataOmeletteSandwich
fuente
1

PowerShell, 98 94 Bytes

$c=(Read-Host)-1;$d=Read-Host;if($c){$c..0+1..$c|%{if($d-eq'r'){$_=$c-$_}' '*$_+'*'}}else{'*'}

Si pudiera encontrar una manera de poner el Host de lectura para la dirección dentro del bucle foreach-object pero solo solicitarlo una vez, podría guardar algunos bytes.

Editar: 94 bytes. En lugar de probar a la izquierda, pruebe a la derecha (simplifica el bucle).

98 bytes originales:

$c=(Read-Host)-1;$d=Read-Host;if($c){0..$c+($c-1)..0|%{if($d-eq'l'){$_=$c-$_}' '*$_+'*'}}else{'*'}
Jonathan Leech-Pepin
fuente
Restableciendo la $_variable - Hobbit engañoso. Muy inteligente, y aprendí algo hoy.
AdmBorkBork
@TimmyD Muy engañoso. Y luego cambie la instrucción if para ahorrar aún más.
Jonathan Leech-Pepin
0

> <> , 60 bytes

i"1l"i=&-:&*&:?!\:1-:}c0.
~/?:<-$?&::&;!?l<oao"*"
1/  \o" "-

2 bytes desperdiciados en la línea de fondo, ¡qué irritante!

Debido a cómo funciona la entrada en> <>, no es posible 'esperar' la entrada: el icomando verifica si un carácter de entrada está disponible en STDIN. Si lo hay, empuja el valor ASCII de ese carácter y empuja -1 si no.

Esto significa que, para usar este programa, el número y la dirección ya deben estar listos en STDIN, p. Ej. 3r para una flecha de tamaño 3 que apunta hacia la derecha. No estoy seguro de si eso descalifica esta entrada, hágame saber sus pensamientos: o)

También escribiré una descripción si alguien quiere una.

Sok
fuente
En cierto sentido, espera la entrada si intentas ejecutarlo en un shell, así que creo que está bien. Sin embargo, estoy más preocupado por el hecho de que esto espera que la entrada sea de un solo dígito (a menos que esté destinado a ingresar :10?)
Sp3000
Un punto excelente, no había pensado en la entrada sobre 9. ¡De vuelta al tablero de dibujo!
Sok
1
He dejado un comentario sobre la pregunta principal para una aclaración, por si acaso
Sp3000
0

PHP, 154 bytes

Parece realmente repetitivo, pero hace lo deseado:

$c=$argv[1];$b=l==$argv[2]?1:0;$a=$b?$c:-1;function a($a){echo strrev(str_pad('*',$a))."\n";}while($b?--$a:++$a<$c)a($a+1);while($b?++$a<=$c:1<$a--)a($a);

Se ejecuta desde la línea de comandos como:

php arrow.php 5 l
php arrow.php 5 r
insertusernamehere
fuente
-1

Python, 88 bytes

Editado

n=input()-1
x=raw_input()>'l'
for i in range(2*n+1):print" "*(n*x+(-1)**x*abs(n-i))+"*"
orgesleka
fuente