Сделай зигзагообразный узор


25

Ваша задача - ввести одно целочисленное значение и распечатать зигзагообразный шаблон, используя косую черту и обратную косую черту.

  • Целочисленный ввод определяет длину каждого зигзага, а также количество зигзагов и зигзагов.
  • Шаблон всегда начинается справа налево

Тестовые случаи

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

3
Можем ли мы вывести массив / список строк для каждой строки? Разрешено ли обучение или ведущие новые строки или пробелы?
Лохматый

2
В порядке ли начальные пробелы, если шаблон не затронут?
Emigna

Ответы:


10

C (gcc) , 108 102 101 98 80 76 72 байта

  • Сохранено шесть байтов благодаря Кевину Круйссену ; удаляя скобки и играя N-n-1в гольфN+~n
  • Сохранение байта путем перемещения Zинкремента в условие цикла
  • Сохранено три байта с использованием printf("%c\n",...)вместо putchar(...)и,puts("")
  • Сохранено восемнадцать (!) Байтов благодаря HatsuPointerKun ; использование printf("%*s",n,"");для печати nпробелов вместо использования цикла j;for(j=n;j--;)putchar(32);и объединения обоих printf(...);вызовов
  • Сохранено четыре байта с использованием printf("%*c",-~n,...);вместоprintf("%*s%c",n,"",...);
  • Сохранено четыре байта благодаря nwellnhof ; перемещая все внутри одной петли вместо двух
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);}

Попробуйте онлайн!


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 байта . Убрал фигурные скобки, поместив все внутри петель; и изменился N-n-1на N+~n.
Кевин Круйссен,

1
@KevinCruijssen Спасибо. Сохранение другого байта путем замены обоих Z%2?...:...и замены Z<N;Z++на Z++<N;.
Джонатан Фрех

1
Вы можете сохранить несколько байтов, используя магию printf, как я сделал в своем ответе . Таким образом вы избавитесь от цикла for, используемого для печати пробелов. Для получения более подробной информации см. Ответ о переполнении стека о
полях

@HatsuPointerKun Спасибо; это действительно короткий способ повторить пробелы в C.
Джонатан Фрех,

4 байт короче: 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);}. Попробуйте онлайн!
nwellnhof

10

Древесный уголь , 16 10 9 байт

FN«↖Iθ→‖T

Попробуйте онлайн! Ссылка на подробную версию кода.


это работает ( InputNumberтоже был сломан в режиме игры в гольф?)
только ASCII,

@ ASCII-only Нет, таким образом, отдельные ссылки на данную краткую версию и приблизительную подробную версию.
Нил

Oh> _> не смотрел, какую ссылку я открывал
только для ASCII

@ ASCII-only Ну, теперь есть только одна ссылка ;-)
Нил

4

MATL , 17 байт

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

Попробуйте онлайн!

объяснение

:         % 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 байт

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

Попробуйте онлайн!


Вы можете сохранить 14 байтов следующим образом: 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 байта Вам не нужны все эти скобки; Вы можете объединить int; и добавить только +"\n"один раз.
Кевин Круйссен


Хм, вы можете сохранить еще 2 байта, печатая напрямую, а не возвращать строку: a=>{for(int z=a+1,e=0;e<a*a;)System.Console.WriteLine(e++/a%2<1?"/".PadLeft(--z):@"\".PadLeft(z++));} 101 байт
Кевин Круйссен,

3

SOGL V0.12 , 13 12 9 байтов

╝F{±↔}P}ø

Попробуй здесь!

может быть 8 байтов, ╝F{±↔}P}если тестовый пример 0 не требуется

Объяснение:

       }   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

Математика, 84 90 байтов

(n=#;Grid@Array[If[Abs[n-(s=Mod[#-1,2n])-.5]==#2-.5,If[s<n,"‌​/","\\"],""]&,{n^2,n‌​}])&
  • Спасибо Jenny_mathy за -6 байт.

Я понятия не имею, почему \явно темнее, чем /.

enter image description here


2
84 байта(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 байт

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

объяснение

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

Пробный прогон

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

Попробуйте онлайн!


3

Java 8, 140 134 116 байт

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 байта благодаря @Nevay .

Объяснение:

Попробуй это здесь.

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
Условие самого внутреннего цикла можно записать в виде c-->f*(b-n-~b)(-6 байт).
Невай,

1
116 байт: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;}
Невай

3

Javascript ES8, 83 79 78 76 75 74 71 байт

* уменьшил 1 байт с ES8 благодаря Shaggy

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

Тест здесь


кто бы ни отрицал мое решение, не могли бы вы объяснить, почему? Я что-то пропустил?
DanielIndie

2
Я не тот, кто отрицательно проголосовал, но я предполагаю, что это потому, что функции должны повторяться, чтобы быть действительными. Ваш может быть легко исправлен путем iустановки параметра по умолчанию. Счетчик байтов также отключен.
Emigna

1
Добавление ссылки TIO всегда приветствуется, так что люди могут легко протестировать ваше решение.
Эминья,

1
@Emigna исправила это (мудрый и Link мудрый) :)
DanielIndie

1
74 байта с некоторым ES8. Кроме того, для JS вы можете просто использовать фрагмент стека, а не TIO.
Лохматый


2

PowerShell , 81 байт

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

Попробуйте онлайн!

Тьфу, это безобразно Так много повторного кода, плюс 7 байтов, необходимых для учета 0особого случая. Предложения по игре в гольф приветствуются.


2

Pyth, 17 байт

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

Попробуйте онлайн: демонстрация

Объяснение:

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 байт 82 байт

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

Спасибо @Jonathan Frech за указание на то, что печать не нужна и что первый зиг был неправильным


] for-> ]for.
Джонатан Фрех

Вам не нужно print(...), функция, возвращающая строку, будет действительной. Кроме того, я думаю, что ваш начальный зиг ориентирован неверно (\, а не /).
Джонатан Фрех

@JonathanFrech Спасибо! Я изменил это
Bassintag

1
(abs(...)-1)-> ~-abs(...).
Джонатан Фрех

2

05AB1E , 17 16 байт

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

Попробуйте онлайн!

объяснение

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

Текущая лучшая попытка с использованием холста:

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



2

Dyalog APL , 39 36 35 34 байта

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

Попробуйте онлайн!

1 байт сохранен благодаря Zacharý


Черт возьми, побей меня одним байтом. Вы можете сделать ⎕IOбыть 0, а затем удалить ¯1+.
Захари

@ Zacharý Я как раз собирался это сделать: p
dzaima

О, еще одна вещь: (⌽,⊢)⍳⍵вместо(⌽⍳⍵),⍳⍵
Zacharý

@ Zacharý Да, мне еще предстоит разобраться в хитросплетениях, молчаливости и прочем, что с этим
связано

Не волнуйтесь, я не совсем понимаю, как работают поезда / вилки / как там их называют.
Захари



1

Excel VBA, 84 83 байта

Функция анонимного непосредственного окна VBE, которая берет входные данные из диапазона [A1]и выводит в непосредственное окно 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 байт

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

Попробуйте онлайн!

Сохранено один байт благодаря Laikoni

Повторите zig ++ zag и возьмите первые n*nстроки.


cycle$ ... instead of cycle( ... ) saves a byte.
Laikoni

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

Try it online!

Lifted from HatsuPointerKun's C++ answer.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.