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->
       /
      /
     /
    /
   /
  /
 /
/
\
 \
  \
   \
    \
     \
      \
       \
       /
      /
     /
    /
   /
  /
 /
/
\
 \
  \
   \
    \
     \
      \
       \
       /
      /
     /
    /
   /
  /
 /
/
\
 \
  \
   \
    \
     \
      \
       \
       /
      /
     /
    /
   /
  /
 /
/
\
 \
  \
   \
    \
     \
      \
       \
Romulus3799
źródło
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!

Jonathan Frech
źródło
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
10

Węgiel drzewny , 16 10 9 bajtów

FN«↖Iθ→‖T

Wypróbuj online! Link jest do pełnej wersji kodu.

Neil
źródło
to działa (został InputNumberzepsuty również w trybie golfowym?)
tylko ASCII
@ Tylko ASCII Nie, więc osobne linki do podanej zwięzłej wersji i przybliżonej pełnej wersji.
Neil
Och> _> nie szukałem, który link otwieram
tylko ASCII
@ Tylko ASCII Cóż, teraz jest tylko jeden link ;-)
Neil
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
Luis Mendo
źródło
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!

mój zaimek to monicareinstate
źródło
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
dzaima
źródło
3

Python 2 , 69 68 62 bajtów

-1 bajt dzięki Jonathan Frech

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

Wypróbuj online!

Pręt
źródło
68 bajtów .
Jonathan Frech,
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

Keyu Gan
źródło
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!

jq170727
źródło
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
Kevin Cruijssen
źródło
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

DanielIndie
źródło
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.

AdmBorkBork
źródło
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
Jakube
źródło
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

Bassintag
źródło
] 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Λ
Emigna
źródło
2

C ++, 92 91 bajtów

-1 bajty dzięki 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);}

Dzięki mocy magii printf

HatsuPointerKun
źródło
Możesz umieścić int i=0,jpętlę for, for(int i=0,j;i<n;++i)aby zapisać bajt.
Kevin Cruijssen
88 bajtów
pułapkot
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!

Roberto Graham
źródło
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

dzaima
źródło
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

Kotlin , 102 bajty

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

Wypróbuj online!

jrtapsell
źródło
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
Taylor Scott
źródło
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.

Jferard
źródło
cycle$ ...zamiast cycle( ... )zapisuje bajt.
Laikoni
@Laikoni dzięki!
jferard
0

Dyalog APL, 41 40 bajtów

⎕IOmusi być 0.

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

Wypróbuj online!

Zacharý
źródło
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.

Zacharý
źródło