Haz un patrón en zigzag


25

Su tarea es tomar una entrada entera e imprimir un patrón de zigzag usando barras y barras invertidas.

  • La entrada entera determina la longitud de cada zig y zag, así como la cantidad de zigs y zags
  • El patrón siempre comienza de derecha a izquierda.

Casos de prueba

4->
   /
  /
 /
/
\
 \
  \
   \
   /
  /
 /
/
\
 \
  \
   \
2->
 /
/
\
 \
0->
1->
/
8->
       /
      /
     /
    /
   /
  /
 /
/
\
 \
  \
   \
    \
     \
      \
       \
       /
      /
     /
    /
   /
  /
 /
/
\
 \
  \
   \
    \
     \
      \
       \
       /
      /
     /
    /
   /
  /
 /
/
\
 \
  \
   \
    \
     \
      \
       \
       /
      /
     /
    /
   /
  /
 /
/
\
 \
  \
   \
    \
     \
      \
       \

3
¿Podemos generar una matriz / lista de cadenas para cada línea? ¿Se permiten capacitaciones o nuevas líneas o espacios?
Shaggy

2
¿Está bien el espacio en blanco inicial siempre que el patrón no se vea afectado?
Emigna

Respuestas:


10

C (gcc) , 108 102 101 98 80 76 72 bytes

  • Guardado seis bytes gracias a Kevin Cruijssen ; eliminando paréntesis y jugando golf N-n-1aN+~n
  • Guardado un byte moviendo Zel incremento en la condición de bucle
  • Guardado tres bytes usando en printf("%c\n",...)lugar de putchar(...)y,puts("")
  • Ahorró dieciocho (!) Bytes gracias a HatsuPointerKun ; usando printf("%*s",n,"");para imprimir nespacios en lugar de usar un bucle j;for(j=n;j--;)putchar(32);y combinando ambas printf(...);llamadas
  • Guardado cuatro bytes al usar en printf("%*c",-~n,...);lugar deprintf("%*s%c",n,"",...);
  • Guardado cuatro bytes gracias a nwellnhof ; moviendo todo dentro de un bucle en lugar de dos
j;f(k){for(j=0;j<k*k;j++)printf("%*c\n",j/k%2?j%k+1:k-j%k,j/k%2?92:47);}

Pruébalo en línea!


Z,n,j;f(N){for(Z=0;Z<N;Z++)for(n=N;n--;putchar(Z%2?92:47),puts(""))for(j=Z%2?N+~n:n;j--;)putchar(32);} 102 bytes . Se eliminaron los corchetes poniendo todo dentro de los bucles; y cambiado N-n-1a N+~n.
Kevin Cruijssen

1
@KevinCruijssen Gracias. Se guardó otro byte intercambiando ambos Z%2?...:...y reemplazando Z<N;Z++con Z++<N;.
Jonathan Frech

1
Puede guardar varios bytes utilizando la magia printf como lo hice en mi respuesta . De esa forma, se eliminará el bucle for utilizado para imprimir espacios. Para obtener más detalles, consulte esta respuesta de desbordamiento de pila sobre espacios de relleno izquierdo con printf
HatsuPointerKun

@HatsuPointerKun Gracias; esa es una forma muy corta de repetir espacios en C.
Jonathan Frech

4 bytes más corto: i;f(N){for(i=0;i<N*N;i++)printf("%*c\n",i/N%2?i%N+1:N-i%N,i/N%2?92:47);}. Pruébalo en línea!
nwellnhof

10

Carbón , 16 10 9 bytes

FN«↖Iθ→‖T

Pruébalo en línea! El enlace es a la versión detallada del código.


esto funciona (¿también se InputNumberrompió en el modo de golf?)
Solo ASCII

@ Solo ASCII No, por lo tanto, los enlaces separados a la versión sucinta dada y la versión detallada aproximada.
Neil

Oh> _> no miró para ver qué enlace estaba abriendo
solo ASCII

@ Solo ASCII Bueno, ahora solo hay un enlace ;-)
Neil

4

MATL , 17 bytes

:"GXy@o?P47}92]*c

Pruébalo en línea!

Explicación

:         % Implicit input, n. Push range [1 2 ... n]
"         % For each k in that range
  G       %   Push n again
  Xy      %   Identity matrix of that size
  @       %   Push k
  o?      %   If it's odd
    P     %     Flip the matrix upside down
    47    %     Push 47 (ASCII for '/')
  }       %   Else
    92    %     Push 92 (ASCII for '\')
  ]       %   End
  *       %   Multiply each entry of the matrix by that number
  c       %   Convert to char. Char 0 is shown as space
          % Implicit end. Implicit display

4

C # (.NET Core) , 117 103 101 bytes

a=>{for(int z=a+1,e=0;e<a*a;)System.Console.WriteLine(e++/a%2<1?"/".PadLeft(--z):@"\".PadLeft(z++));}

Pruébalo en línea!


Puede guardar 14 bytes de esta manera: a=>{var o="";for(int z=a+1,e=0;e<a*a;)o+=(e++/a%2<1?"/".PadLeft(--z):@"\".PadLeft(z++))+"\n";return o;} 103 bytes No necesita todos esos paréntesis; puedes combinar el int; y solo agregue +"\n"una vez.
Kevin Cruijssen


Hmm, puede guardar 2 bytes más imprimiendo directamente, en lugar de devolver una cadena: a=>{for(int z=a+1,e=0;e<a*a;)System.Console.WriteLine(e++/a%2<1?"/".PadLeft(--z):@"\".PadLeft(z++));} 101 bytes
Kevin Cruijssen

3

SOGL V0.12 , 13 12 9 bytes

╝F{±↔}P}ø

Pruébalo aquí!

podría ser de 8 bytes ╝F{±↔}P} si no se requiere el caso de prueba 0

Explicación:

       }   implicitly started loop repeated input times
╝            create a down-right diagonal of the input
 F           get the current looping index, 1-indexed
  {  }       that many times
   ±↔          reverse the diagonal horizontally
      P      print that
        ø  push an empty string - something to implicitly print if the loop wasn't executed


3

Mathematica, 84 90 bytes

(n=#;Grid@Array[If[Abs[n-(s=Mod[#-1,2n])-.5]==#2-.5,If[s<n,"‌​/","\\"],""]&,{n^2,n‌​}])&
  • Gracias Jenny_mathy por -6 bytes.

No tengo idea de por qué \es obviamente más oscuro que /.

ingrese la descripción de la imagen aquí


2
84 bytes(n=#;Grid@Array[If[Abs[n-(s=Mod[#-1,2n])-.5]==#2-.5,If[s<n,"/","\\"],""]&,{n^2,n}])&
J42161217

3

Jq 1.5 , 94 89 bytes

["/","\\"][range($n)%2]as$s|range($n)|[(range(if$s=="/"then$n-.-1 else. end)|" "),$s]|add

Explicación

  ["/","\\"][range($n)%2] as $s                         # for $s= / \ / \ $n times 
| range($n)                                             # for .=0 to $n-1
| [(range(if $s=="/" then $n-.-1 else . end)|" "), $s]  # form list of spaces ending with $s
| add                                                   # concatenate

Ejecución de muestra

$ jq -Mnr --argjson n 5 '["/","\\"][range($n)%2]as$s|range($n)|[(range(if$s=="/"then$n-.-1 else. end)|" "),$s]|add'
    /
   /
  /
 /
/
\
 \
  \
   \
    \
    /
   /
  /
 /
/
\
 \
  \
   \
    \
    /
   /
  /
 /
/

Pruébalo en línea!


3

Java 8, 140 134 116 bytes

n->{String r="";for(int a=0,b,c;a++<n;)for(b=n;b-->0;r+=a%2>0?"/\n":"\\\n")for(c=b-n+b|-a%2;++c<b;r+=" ");return r;}

-24 bytes gracias a @Nevay .

Explicación:

Pruébalo aquí.

n->{                // Method with integer parameter and String return-type
  String r="";      //  Result-String
  for(int a=0,b,c;  //  Index integers
      a++<n;)       //  Loop (1) from 0 to the input (exclusive)
    for(b=n;        //   Reset `b` to the input
        b-->0;      //   Inner loop (2) from the input to 0 (exclusive)
                    //     After every iteration: 
        r+=a%2>0?"/\n":"\\\n") 
                    //      Append either of the slashes + a new-line
      for(c=b-n+b|-a%2;++c<b;r+=" ");
                    //    Append the correct amount of spaces
                    //   End of inner loop (2) (implicit / single-line body)
                    //  End of loop (1) (implicit / single-line body)
  return r;         //  Return the result-String
}                   // End of method

1
La condición del bucle más interno se puede escribir como c-->f*(b-n-~b)(-6 bytes).
Nevay

1
116 bytes:n->{String r="";for(int a=0,b,c;a++<n;)for(b=n;b-->0;r+=a%2>0?"/\n":"\\\n")for(c=b-n+b|-a%2;++c<b;r+=" ");return r;}
Nevay

3

Javascript ES8, 83 79 78 76 75 74 71 bytes

* reducido 1 byte con ES8 gracias a Shaggy

A=(m,i=0)=>i<m*m?`/\\`[x=i/m&1].padStart(x?i%m+1:m-i%m)+`
`+A(m,++i):""

Prueba aquí


quien rechazó mi solución, ¿podría explicar por qué? ¿Me estoy perdiendo de algo?
DanielIndie

2
No soy yo quien votó en contra, pero supongo que es porque las funciones deben ser repetibles para ser válidas. El tuyo podría repararse con bastante facilidad haciendo iun parámetro predeterminado. El recuento de bytes también parece estar apagado.
Emigna

1
Siempre se agradece agregar un enlace TIO , para que las personas puedan probar fácilmente su solución.
Emigna

1
@Emigna lo arregló (char wise y Link wise) :)
DanielIndie

1
74 bytes con algunos ES8. Además, para JS puede usar un fragmento de pila en lugar de TIO.
Shaggy


2

PowerShell , 81 bytes

param($a)if($a){1..$a|%{((1..$a|%{" "*--$_+'\'}),($a..1|%{" "*--$_+'/'}))[$_%2]}}

Pruébalo en línea!

Ugh, esto es feo. Se requiere tanto código repetido, más 7 bytes para dar cuenta de 0un caso especial. Sugerencias de golf bienvenidas.


2

Pyth, 17 bytes

js<*_+RV"\/"_B*L;

Pruébelo en línea: demostración

Explicación:

js<*_+RV"\/"_B*L;QQQ   implicit Qs at the end
              *L;Q     list with ["", " ", "  ", ..., " "*(input-1)]
            _B         bifurcate with reverse: [["" to "   "], ["   " to ""]]
     +RV"\/"           append to each one either "\" or "/": 
                       [["\", to "   \"], ["   /" to "/"]]
    _                  reverse
   *              Q    repeat input times
  <                Q   but only take the first input many
 s                     flatten the list of lists
j                      print on each line

2

Python 3: 90 bytes 82 bytes

lambda n:"\n".join(" "*(abs(i%(n*2)-n+i//n%2)-1)+"/\\"[i//n%2]for i in range(n*n))

Gracias a @Jonathan Frech por señalar que la impresión no era necesaria y que el primer zig era incorrecto


] for-> ]for.
Jonathan Frech

No necesita el print(...), una función que devuelve una cadena sería válida. Además, creo que su zig inicial está orientado de manera incorrecta (\ en lugar de /).
Jonathan Frech

@ JonathanFrech Gracias! Lo cambié
Bassintag

1
(abs(...)-1)-> ~-abs(...).
Jonathan Frech

2

05AB1E , 17 16 bytes

F<„/\Nèú.sNƒR}»,

Pruébalo en línea!

Explicación

F                  # for N in [0 ... input-1] do
  „/\              # push the string "/\"
     Nè            # cyclically index into this string with N
 <     ú           # prepend input-1 spaces to this string
        .s         # get suffixes
          NƒR}     # reverse the list of suffixes input+1 times
              »,   # join on newline and print

Mejor intento actual con lienzo:

F„/\Nè©53NèΛ2®ð«4Λ


2

Java (OpenJDK 8) , 131 106 98 96 94 91 bytes

i->{for(int j=0;j<i*i;System.out.printf("%"+(j/i%2<1?i-j%i:j%i+1)+"c\n",47+45*(j++/i%2)));}

Pruébalo en línea!


1
Puede eliminar bastantes paréntesis: i->{for(int j=0;j<i*i;System.out.printf("%"+(j/i%2<1?i-j%i+1:j%i+2)+"s",j++/i%2<1?"/\n":"\\\n"));}(98 bytes).
Nevay

2

Dyalog APL , 39 36 35 34 bytes

{↑((,⍵ ⍵⍴(⌽,⊢)⍳⍵)/¨' '),¨⍵/⍵⍴'/\'}

Pruébalo en línea!

1 byte guardado gracias a Zacharý


Maldita sea, golpéame por un byte. Puede hacer ⎕IOser 0, y luego eliminar ¯1+.
Zacharý

@ Zacharý Estaba a punto de hacer eso: p
dzaima

Oh, una cosa más: en (⌽,⊢)⍳⍵lugar de(⌽⍳⍵),⍳⍵
Zacharý

@ Zacharý Sí, todavía tengo que entender las tachuelas, la tacitness y las cosas que vienen con eso: /
dzaima

No se preocupe, tampoco entiendo completamente cómo funcionan los trenes / horquillas / como se llamen.
Zacharý



1

Excel VBA, 84 83 Bytes

Función de ventana inmediata anónima de VBE que toma la entrada del rango [A1]y las salidas a la ventana inmediata de VBE

For i=1To[A1]:For j=1To[A1]:?IIf(i mod 2,Space([A1]-j)&"/",Space(j-1)&"\"):Next j,i


0

Haskell , 86 85 bytes

f n=take(n*n)$cycle$[(' '<$[x..n-1])++"/"|x<-[1..n]]++[(' '<$[2..x])++"\\"|x<-[1..n]]

Pruébalo en línea!

Guardado un byte gracias a Laikoni

Repite un zig ++ un zag y toma las primeras n*nlíneas.


cycle$ ...en lugar de cycle( ... )guardar un byte.
Laikoni

@Laikoni gracias!
jferard



0

D , 105 bytes

import std.stdio;void m(T)(T n){for(T i,j;i<n;++i)for(j=0;j<n;++j)printf("%*c\n",i%2?j+1:n-j,i%2?92:47);}

Pruébalo en línea!

Levantado de la respuesta C ++ de HatsuPointerKun.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.