Faire un motif en zigzag


25

Votre tâche consiste à saisir une entrée entière et à imprimer un motif en zigzag à l'aide de barres obliques et de barres obliques inverses.

  • L'entrée entière détermine la longueur de chaque zig et zag, ainsi que le nombre de zig et de zags
  • Le motif commence toujours de droite à gauche

Cas de test

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

3
Pouvons-nous produire un tableau / une liste de chaînes pour chaque ligne? La formation ou la conduite de nouvelles lignes ou d'espaces sont-elles autorisées?
Shaggy

2
L'espace de début est-il correct tant que le motif n'est pas affecté?
Emigna

Réponses:


10

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

  • Enregistré six octets grâce à Kevin Cruijssen ; supprimer les parenthèses et jouer N-n-1au golfN+~n
  • Enregistrement d'un octet en déplaçant Zl'incrémentation dans la condition de boucle
  • Enregistré trois octets en utilisant printf("%c\n",...)au lieu de putchar(...)et,puts("")
  • Dix-huit (!) Octets enregistrés grâce à HatsuPointerKun ; utiliser printf("%*s",n,"");pour imprimer des nespaces au lieu d'utiliser une boucle j;for(j=n;j--;)putchar(32);et de combiner les deux printf(...);appels
  • Quatre octets enregistrés en utilisant printf("%*c",-~n,...);au lieu deprintf("%*s%c",n,"",...);
  • Enregistré quatre octets grâce à nwellnhof ; déplacer tout à l'intérieur d'une boucle au lieu de deux
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);}

Essayez-le en ligne!


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 octets . Supprimé les accolades en mettant tout à l'intérieur des boucles; et changé N-n-1en N+~n.
Kevin Cruijssen

1
@KevinCruijssen Merci. Un autre octet a été enregistré en échangeant les deux Z%2?...:...et en les remplaçant Z<N;Z++par Z++<N;.
Jonathan Frech

1
Vous pouvez enregistrer plusieurs octets en utilisant la magie printf comme je l'ai fait dans ma réponse . De cette façon, vous vous débarrasserez de la boucle for utilisée pour imprimer les espaces. Pour plus de détails, voir cette réponse de débordement de pile sur les espaces de remplissage gauche avec printf
HatsuPointerKun

@HatsuPointerKun Merci; c'est un moyen très court de répéter les espaces en C.
Jonathan Frech

4 octets plus court: 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);}. Essayez-le en ligne!
nwellnhof

10

Fusain , 16 10 9 octets

FN«↖Iθ→‖T

Essayez-le en ligne! Le lien est vers la version détaillée du code.


cela fonctionne (était également InputNumbercassé en mode golfy?)
ASCII uniquement

@ ASCII uniquement Non, donc les liens séparés vers la version succincte donnée et la version verbeuse approximative.
Neil

Oh> _> n'a pas cherché à voir quel lien j'ouvrais
ASCII uniquement

@ ASCII uniquement Eh bien, il n'y a qu'un seul lien maintenant ;-)
Neil

4

MATL , 17 octets

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

Essayez-le en ligne!

Explication

:         % 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 de base) , 117 103 101 octets

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

Essayez-le en ligne!


Vous pouvez enregistrer 14 octets comme ceci: 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 octets Vous n'avez pas besoin de toutes ces parenthèses; vous pouvez combiner le int; et ajoutez seulement +"\n"une fois.
Kevin Cruijssen


Hmm, vous pouvez économiser 2 octets supplémentaires en imprimant directement, au lieu de renvoyer une chaîne: a=>{for(int z=a+1,e=0;e<a*a;)System.Console.WriteLine(e++/a%2<1?"/".PadLeft(--z):@"\".PadLeft(z++));} 101 octets
Kevin Cruijssen

3

SOGL V0.12 , 13 12 9 octets

╝F{±↔}P}ø

Essayez-le ici!

pourrait être de 8 octets ╝F{±↔}P}si le cas de test 0 n'était pas requis

Explication:

       }   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 octets

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

Je n'ai aucune idée pourquoi \est évidemment plus sombre que /.

enter image description here


2
84 octets(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 octets

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

Explication

  ["/","\\"][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

Sample Run

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

Essayez-le en ligne!


3

Java 8, 140 134 116 116 octets

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 octets grâce à @Nevay .

Explication:

Essayez-le ici.

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 condition de la boucle la plus intérieure peut être écrite comme c-->f*(b-n-~b)(-6 octets).
Nevay

1
116 octets: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 octets

* réduit 1 octet avec ES8 grâce à Shaggy

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

Testez ici


celui qui a rejeté ma solution, pourriez-vous expliquer pourquoi? Suis-je en train de manquer quelque chose?
DanielIndie

2
Ce n'est pas moi qui ai rétrogradé, mais je suppose que c'est parce que les fonctions doivent être répétables pour être valides. Le vôtre pourrait être corrigé assez facilement en créant iun paramètre par défaut. Le nombre d'octets semble également désactivé.
Emigna

1
L'ajout d'un lien TIO est également toujours apprécié, afin que les gens puissent facilement tester votre solution.
Emigna

1
@Emigna l'a corrigé (sage et lien) :)
DanielIndie

1
74 octets avec certains ES8. De plus, pour JS, vous pouvez simplement utiliser un extrait de pile plutôt que TIO.
Shaggy


2

PowerShell , 81 octets

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

Essayez-le en ligne!

Ugh, c'est moche. Tant de code répété, plus 7 octets requis pour tenir compte du 0cas spécial. Suggestions de golf bienvenues.


2

Pyth, 17 octets

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

Essayez-le en ligne: Démonstration

Explication:

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 octets 82 octets

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

Merci à @Jonathan Frech d'avoir souligné que l'impression n'était pas nécessaire et que le premier zig était dans le mauvais sens


] for-> ]for.
Jonathan Frech

Vous n'avez pas besoin de la print(...), une fonction renvoyant une chaîne serait valide. De plus, je pense que votre zig initial est mal orienté (\ plutôt que /).
Jonathan Frech

@JonathanFrech Merci! Je l'ai changé
Bassintag

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

2

05AB1E , 17 16 octets

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

Essayez-le en ligne!

Explication

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

Meilleure tentative actuelle d'utilisation du canevas:

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


2

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

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)));}

Essayez-le en ligne!


1
Vous pouvez supprimer plusieurs parenthèses: 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 octets).
Nevay

2

Dyalog APL , 39 36 35 34 octets

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

Essayez-le en ligne!

1 octet économisé grâce à Zacharý


Dang it, me battre d'un octet. Vous pouvez faire ⎕IOêtre 0, puis supprimer ¯1+.
Zacharý

@ Zacharý J'étais sur le point de le faire: p
dzaima

Oh, encore une chose: (⌽,⊢)⍳⍵au lieu de(⌽⍳⍵),⍳⍵
Zacharý

@ Zacharý Ouais, je n'ai pas encore compris les punaises, la tacitness et les trucs qui vont avec: /
dzaima

Ne vous inquiétez pas, je ne comprends pas non plus comment fonctionnent les trains / fourches / quoi que ce soit.
Zacharý



1

Excel VBA, 84 83 octets

Fonction de fenêtre immédiate VBE anonyme qui prend les entrées de la plage [A1]et les sorties vers la fenêtre immédiate 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 octets

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

Essayez-le en ligne!

Un octet enregistré grâce à Laikoni

Répétez un zig ++ un zag et prenez les premières n*nlignes.


cycle$ ...au lieu d' cycle( ... )enregistrer un octet.
Laikoni

@Laikoni merci!
jferard



0

D , 105 octets

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);}

Essayez-le en ligne!

Tiré de la réponse C ++ de HatsuPointerKun.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.