Machen Sie ein Zick-Zack-Muster


25

Ihre Aufgabe ist es, eine Ganzzahleingabe aufzunehmen und ein Zick-Zack-Muster mit Schrägstrichen und Backslashes zu drucken.

  • Die Ganzzahleingabe bestimmt die Länge jedes Zicks und Zacks sowie die Anzahl der Zicks und Zacks
  • Das Muster beginnt immer von rechts nach links

Testfälle

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

3
Können wir für jede Zeile ein Array / eine Liste von Strings ausgeben? Sind Schulungen oder das Führen von Zeilenumbrüchen oder Leerzeichen zulässig?
Shaggy

2
Ist führendes Leerzeichen in Ordnung, solange das Muster nicht beeinflusst wird?
Emigna

Antworten:


10

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

  • Dank Kevin Cruijssen sechs Bytes gespart ; Entfernen von Klammern und Golf spielen N-n-1aufN+~n
  • Ein Byte wurde gespeichert, indem Zdie Inkrementierung in die Schleifenbedingung verschoben wurde
  • Gespeichert drei Bytes unter Verwendung printf("%c\n",...)statt putchar(...)und,puts("")
  • Dank HatsuPointerKun wurden achtzehn (!) Bytes gespeichert . Verwenden Sie printf("%*s",n,"");, um nLeerzeichen zu drucken , anstatt eine Schleife zu verwenden j;for(j=n;j--;)putchar(32);und beide printf(...);Aufrufe zu kombinieren
  • Vier Bytes mit printf("%*c",-~n,...);anstelle von gespeichertprintf("%*s%c",n,"",...);
  • Dank nwellnhof vier Bytes gespart ; Bewegen Sie alles in einer Schleife statt in zwei
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);}

Probieren Sie es online!


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 . Entfernen Sie die geschweiften Klammern, indem Sie alles in die Schlaufen stecken. und geändert N-n-1zu N+~n.
Kevin Cruijssen

1
@ KevinCruijssen Danke. Gespeichert ein weiteres Byte durch beide tauschen Z%2?...:...und ersetzen Z<N;Z++mit Z++<N;.
Jonathan Frech

1
Sie können mehrere Bytes sparen, indem Sie die printf-Magie verwenden, wie ich es in meiner Antwort getan habe . Auf diese Weise entfernen Sie die for-Schleife, die zum Drucken von Leerzeichen verwendet wird. Weitere Einzelheiten dieses Stapelüberlauf Antwort über links padding Räume mit printf
HatsuPointerKun

@HatsuPointerKun Danke; Das ist ein sehr kurzer Weg, um Leerzeichen in C zu wiederholen.
Jonathan Frech

4 Bytes kürzer: 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);}. Probieren Sie es online!
Nwellnhof

10

Holzkohle , 16 10 9 Bytes

FN«↖Iθ→‖T

Probieren Sie es online! Link ist eine ausführliche Version des Codes.


das funktioniert (War das auch InputNumberim Golf-Modus kaputt?)
Nur ASCII

@ Nur ASCII Nein, daher die separaten Links zur angegebenen prägnanten Version und der ungefähren ausführlichen Version.
Neil

Oh> _> habe nicht nachgeschaut, welchen Link ich gerade öffne
ASCII

@ Nur ASCII Nun, es gibt jetzt nur einen Link ;-)
Neil

4

MATL , 17 Bytes

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

Probieren Sie es online!

Erläuterung

:         % 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++));}

Probieren Sie es online!


Sie können 14 Bytes wie folgt speichern: 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 Sie benötigen nicht alle diese Klammern; Sie können das kombinieren int; und nur +"\n"einmal hinzufügen .
Kevin Cruijssen


Hmm, Sie können 2 weitere Bytes sparen, indem Sie direkt drucken, anstatt eine Zeichenfolge zurückzugeben: 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}ø

Probieren Sie es hier aus!

könnte 8 Bytes sein, ╝F{±↔}P}wenn der 0-Testfall nicht erforderlich wäre

Erläuterung:

       }   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‌​}])&
  • Danke Jenny_mathy für -6 Bytes.

Ich habe keine Ahnung warum \das offensichtlich dunkler ist als /.

Bildbeschreibung hier eingeben


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

Erläuterung

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

Probelauf

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

Probieren Sie es online!


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 dank @Nevay .

Erläuterung:

Probieren Sie es hier aus.

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
Der Zustand der innersten Schleife kann als c-->f*(b-n-~b)(-6 Bytes) geschrieben werden.
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

* 1 Byte mit ES8 dank Shaggy reduziert

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

Hier testen


Wer auch immer meine Lösung herabgestimmt hat, können Sie erklären, warum? Vermisse ich etwas?
DanielIndie

2
Ich bin nicht derjenige, der das Abstimmen abgelehnt hat, aber ich gehe davon aus, dass Funktionen wiederholbar sein müssen, um gültig zu sein. Ihr Problem kann ganz einfach behoben werden, indem Sie ieinen Standardparameter festlegen. Die Byteanzahl scheint ebenfalls aus zu sein.
Emigna

1
Das Hinzufügen eines TIO-Links ist auch immer willkommen, damit die Benutzer Ihre Lösung problemlos testen können.
Emigna

1
@Emigna behoben (char weise und Link weise) :)
DanielIndie

1
74 Bytes mit etwas ES8. Für JS können Sie statt TIO auch nur ein Stack-Snippet verwenden.
Shaggy


2

Power Shell , 81 Byte

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

Probieren Sie es online!

Ugh, das ist hässlich. So viel wiederholter Code, plus 7 Bytes, um den 0Sonderfall zu berücksichtigen . Golfvorschläge sind willkommen.


2

Pyth, 17 Bytes

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

Probieren Sie es online aus: Demonstration

Erläuterung:

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

Vielen Dank an Jonathan Frech, der darauf hingewiesen hat, dass der Ausdruck nicht erforderlich war und dass das erste Zickzack der falsche Weg war


] for-> ]for.
Jonathan Frech

Sie brauchen das nicht print(...), eine Funktion, die einen String zurückgibt, wäre gültig. Ich denke auch, dass Ihr anfängliches Zickzack falsch ausgerichtet ist (\ statt /).
Jonathan Frech

@ JonathanFrech Danke! Ich habe es geändert
Bassintag

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

2

05AB1E , 17 16 Bytes

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

Probieren Sie es online!

Erläuterung

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

Derzeit bester Versuch mit Canvas:

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

Probieren Sie es online!


1
Sie können einige Klammern entfernen: 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 Byte).
Nevay

2

Dyalog APL , 39 36 35 34 Bytes

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

Probieren Sie es online!

Dank Zacharý 1 Byte gespart


Verdammt, schlag mich um ein Byte. Sie können machen ⎕IOsein 0, und dann entfernen ¯1+.
Zacharý

@ Zacharý Ich wollte das gerade machen: p
dzaima

Oh, noch eine Sache: (⌽,⊢)⍳⍵Statt(⌽⍳⍵),⍳⍵
Zacharý

@ Zacharý Ja, ich bin noch zu verstehen, die Reißzwecken, Beweismittel und Sachen, die damit einhergehen: /
Dzaima

Keine Sorge, ich verstehe auch nicht ganz, wie Züge / Gabeln / was auch immer sie heißen funktionieren.
Zacharý



1

Excel VBA, 84 83 Bytes

Anonyme VBE-Direktfensterfunktion, die Eingaben aus dem Bereich [A1]und Ausgaben in das VBE-Direktfenster übernimmt

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]]

Probieren Sie es online!

Dank Laikoni ein Byte gespart

Wiederhole ein Zick-Zack und nimm die ersten n*nZeilen.


cycle$ ...statt cycle( ... )speichert ein Byte.
Laikoni

@Laikoni danke!
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);}

Probieren Sie es online!

Aufgehoben aus der C ++ - Antwort von HatsuPointerKun.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.