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->
       /
      /
     /
    /
   /
  /
 /
/
\
 \
  \
   \
    \
     \
      \
       \
       /
      /
     /
    /
   /
  /
 /
/
\
 \
  \
   \
    \
     \
      \
       \
       /
      /
     /
    /
   /
  /
 /
/
\
 \
  \
   \
    \
     \
      \
       \
       /
      /
     /
    /
   /
  /
 /
/
\
 \
  \
   \
    \
     \
      \
       \
Romulus3799
fuente
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!

Jonathan Frech
fuente
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.

Neil
fuente
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
Luis Mendo
fuente
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!

mi pronombre es monicareinstate
fuente
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
Oh wow, gracias!
mi pronombre es monicareinstate
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
dzaima
fuente
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í

Keyu Gan
fuente
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!

jq170727
fuente
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
Kevin Cruijssen
fuente
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í

DanielIndie
fuente
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.

AdmBorkBork
fuente
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
Jakube
fuente
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

Bassintag
fuente
] 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Λ
Emigna
fuente
2

C ++, 92 91 bytes

-1 bytes gracias a Kevin Cruijssen

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

Gracias al poder de la magia. printf

HatsuPointerKun
fuente
Puede poner el int i=0,jbucle for for(int i=0,j;i<n;++i)para guardar un byte.
Kevin Cruijssen
88 bytes
ceilingcat
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!

Roberto Graham
fuente
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ý

dzaima
fuente
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

Kotlin , 102 bytes

(0..q-1).map{r->if(r%2<1)q-1 downTo 0 else{0..q-1}.map{(1..it).map{print(' ')};println('/'+45*(r%2))}}

Pruébalo en línea!

jrtapsell
fuente
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
Taylor Scott
fuente
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.

jferard
fuente
cycle$ ...en lugar de cycle( ... )guardar un byte.
Laikoni
@Laikoni gracias!
jferard
0

Dyalog APL, 41 40 bytes

⎕IOdebe ser 0.

{⍪/((⌽⍵ ⍵⍴S↑'/')(⍵ ⍵⍴'\'↑⍨S←⍵+1))[2|⍳⍵]}

Pruébalo en línea!

Zacharý
fuente
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.

Zacharý
fuente