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

Jonathan Frech
la source
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.

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

mon pronom est monicareinstate
la source
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
Oh wow, merci!
mon pronom est monicareinstate
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
dzaima
la source
3

Python 2 , 69 68 62 octets

-1 octet grâce à Jonathan Frech

lambda n:[[~i,i][i/n%2]%n*' '+'/\\'[i/n%2]for i in range(n*n)]

Essayez-le en ligne!

Barre
la source
68 octets .
Jonathan Frech
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

Keyu Gan
la source
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!

jq170727
la source
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
Kevin Cruijssen
la source
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

DanielIndie
la source
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.

AdmBorkBork
la source
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
Jakube
la source
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

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

C ++, 92 91 octets

-1 octets grâce à 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);}

Grâce au pouvoir de la magie printf

HatsuPointerKun
la source
Vous pouvez mettre le int i=0,jdans la boucle for for(int i=0,j;i<n;++i)pour enregistrer un octet.
Kevin Cruijssen
88 octets
plafondcat
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!

Roberto Graham
la source
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ý

dzaima
la source
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

Kotlin , 102 octets

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

Essayez-le en ligne!

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

jferard
la source
cycle$ ...au lieu d' cycle( ... )enregistrer un octet.
Laikoni
@Laikoni merci!
jferard
0

Dyalog APL, 41 40 octets

⎕IO doit être 0 .

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

Essayez-le en ligne!

Zacharý
la source
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.

Zacharý
la source