Zrób zygzakowaty wzór


25

Twoim zadaniem jest przyjęcie jednej liczby całkowitej i wydrukowanie wzoru zygzakowatego za pomocą ukośników i odwrotnych ukośników.

  • Liczba całkowita określa długość każdego zygzaka i zag, a także liczbę zygzaków i zag
  • Wzór zawsze zaczyna się od prawej do lewej

Przypadki testowe

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

3
Czy możemy wypisać tablicę / listę ciągów dla każdej linii? Czy dozwolone są szkolenia lub prowadzenie nowych linii lub miejsc?
Shaggy

2
Czy wiodące białe znaki są w porządku, dopóki wzór nie zostanie zmieniony?
Emigna

Odpowiedzi:


10

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

  • Zaoszczędził sześć bajtów dzięki Kevinowi Cruijssenowi ; usuwanie nawiasów i gra N-n-1w golfaN+~n
  • Zapisano bajt, przesuwając Zinkrementację w warunek pętli
  • Zaoszczędzono trzy bajty, używając printf("%c\n",...)zamiast putchar(...)i,puts("")
  • Zaoszczędzono osiemnaście (!) Bajtów dzięki HatsuPointerKun ; używanie printf("%*s",n,"");do drukowania nspacji zamiast używania pętli j;for(j=n;j--;)putchar(32);i łączenie obu printf(...);wywołań
  • Zaoszczędzono cztery bajty, używając printf("%*c",-~n,...);zamiastprintf("%*s%c",n,"",...);
  • Zaoszczędzone cztery bajty dzięki nwellnhof ; przenoszenie wszystkiego w jednej pętli zamiast dwóch
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);}

Wypróbuj 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 bajty . Usunięto nawiasy klamrowe, wkładając wszystko do pętli; i zmieniłem N-n-1na N+~n.
Kevin Cruijssen

1
@KevinCruijssen Thanks. Zapisane kolejny bajt poprzez zamianę zarówno Z%2?...:...i zastępowanie Z<N;Z++z Z++<N;.
Jonathan Frech,

1
Możesz zapisać kilka bajtów, używając magii printf, tak jak zrobiłem to w mojej odpowiedzi . W ten sposób pozbędziesz się pętli for używanej do drukowania spacji. Aby uzyskać więcej informacji, zobacz odpowiedź dotyczącą przepełnienia stosu o lewe spacje z printf
HatsuPointerKun

@HatsuPointerKun Dzięki; to naprawdę krótki sposób na powtórzenie spacji w C.
Jonathan Frech

4 bajty krócej: 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);}. Wypróbuj online!
nwellnhof


4

MATL , 17 bajtów

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

Wypróbuj online!

Wyjaśnienie

:         % 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 bajtów

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

Wypróbuj online!


Możesz zapisać 14 bajtów w ten sposób: 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 bajty Nie potrzebujesz wszystkich tych nawiasów; możesz połączyć int; i dodaj tylko +"\n"raz.
Kevin Cruijssen

Och, wow, dzięki!
mój zaimek to monicareinstate

Hmm, możesz zapisać jeszcze 2 bajty, drukując bezpośrednio, zamiast zwracać ciąg: a=>{for(int z=a+1,e=0;e<a*a;)System.Console.WriteLine(e++/a%2<1?"/".PadLeft(--z):@"\".PadLeft(z++));} 101 bajtów
Kevin Cruijssen

3

SOGL V0.12 , 13 12 9 bajtów

╝F{±↔}P}ø

Wypróbuj tutaj!

może być 8 bajtów, ╝F{±↔}P}jeśli 0 przypadków testowych nie jest wymagane

Wyjaśnienie:

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

(n=#;Grid@Array[If[Abs[n-(s=Mod[#-1,2n])-.5]==#2-.5,If[s<n,"‌​/","\\"],""]&,{n^2,n‌​}])&
  • Dziękujemy Jenny_mathy za -6 bajtów.

Nie mam pojęcia, dlaczego \jest oczywiście ciemniejszy niż /.

enter image description here


2
84 bajtów(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 bajtów

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

Wyjaśnienie

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

Przykładowy przebieg

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

Wypróbuj online!


3

Java 8, 140 134 116 bajtów

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 bajty dzięki @Nevay .

Wyjaśnienie:

Wypróbuj tutaj.

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
Warunek najbardziej wewnętrznej pętli można zapisać jako c-->f*(b-n-~b)(-6 bajtów).
Nevay

1
116 bajtów: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 bajtów

* zmniejszono 1 bajt dzięki ES8 dzięki Shaggy

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

Przetestuj tutaj


ktokolwiek ocenił moje rozwiązanie, czy mógłbyś wyjaśnić dlaczego? Czy coś mi brakuje?
DanielIndie

2
Nie jestem tym, który przegłosował, ale zakładam, że dzieje się tak, ponieważ funkcje muszą być powtarzalne, aby były poprawne. Twoje można łatwo naprawić, ustawiając iparametr domyślny. Liczba bajtów również wydaje się wyłączona.
Emigna

1
Dodanie linku TIO jest zawsze mile widziane, aby ludzie mogli łatwo przetestować twoje rozwiązanie.
Emigna

1
@Emigna naprawił to (char mądry i link mądry) :)
DanielIndie

1
74 bajty z niektórymi ES8. Ponadto w przypadku JS można po prostu użyć fragmentu stosu zamiast TIO.
Shaggy


2

PowerShell , 81 bajtów

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

Wypróbuj online!

Ugh, to jest brzydkie. Tyle powtarzającego się kodu plus 7 bajtów wymaganych do uwzględnienia 0specjalnego przypadku. Sugestie dotyczące gry w golfa mile widziane.


2

Pyth, 17 bajtów

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

Wypróbuj online: demonstracja

Wyjaśnienie:

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 bajtów 82 bajtów

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

Dzięki @Jonathan Frech za zwrócenie uwagi, że wydruk nie był potrzebny i że pierwszy zygzak był niewłaściwy


] for-> ]for.
Jonathan Frech,

Nie potrzebujesz print(...), funkcja zwracająca ciąg znaków byłaby poprawna. Myślę też, że twój początkowy zig jest źle ustawiony (\ zamiast /).
Jonathan Frech,

@JonathanFrech Thanks! Zmieniłem to
Bassintag

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

2

05AB1E , 17 16 bajtów

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

Wypróbuj online!

Wyjaśnienie

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

Bieżąca najlepsza próba użycia płótna:

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


2

Java (OpenJDK 8) , 131 106 98 96 94 91 bajtów

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

Wypróbuj online!


1
Możesz usunąć kilka nawiasów: 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 bajtów).
Nevay

2

Dyalog APL , 39 36 35 34 bajtów

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

Wypróbuj online!

1 bajt zapisany dzięki Zacharýmu


Cholera, pokonaj mnie jednym bajtem. Można dokonać ⎕IOsię 0, a następnie usunąć ¯1+.
Zacharý

@ Zacharý Właśnie miałem to zrobić: p
dzaima

Och, jeszcze jedno: (⌽,⊢)⍳⍵zamiast(⌽⍳⍵),⍳⍵
Zacharý

@ Zacharý Tak, jeszcze nie rozumiem halsów, milczenia i tego, co się z tym wiąże: /
dzaima

Nie martw się, nie do końca rozumiem, jak działają pociągi / widelce / jakkolwiek to się nazywa.
Zacharý 24.09.17



1

Excel VBA, 84 83 bajtów

Anonimowa funkcja bezpośredniego okna VBE, która przenosi dane wejściowe z zakresu [A1]i wyjścia do bezpośredniego okna 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 bajtów

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

Wypróbuj online!

Oszczędność jednego bajtu dzięki Laikoni

Powtórz zig ++ a zag i weź pierwsze n*nlinie.


cycle$ ...zamiast cycle( ... )zapisuje bajt.
Laikoni

@Laikoni dzięki!
jferard



0

D , 105 bajtów

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

Wypróbuj online!

Usunięto z odpowiedzi C ++ HatsuPointerKun.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.