Нарисуйте S-цепь


27

Задний план

Когда я был моложе, меня учили методу рисования странной буквы "S", который я (вместе со своими одноклассниками) нашел захватывающим. Сегодня я заново открыл для себя и, благодаря его формальному подходу к рисованию, подумал, что это может привести к интересной проблеме: P

Рисунок "S"

S можно нарисовать, выполнив следующие простые шаги:

Сначала нарисуйте 2 ряда из трех вертикальных линий примерно так:

| | |

| | |

Затем соедините верхнюю левую линию с нижней средней линией и верхнюю среднюю с нижней правой линией, чтобы получить

| | |
 \ \
| | |

Наконец, нарисуйте верх и низ на текущем нарисованном изображении, чтобы оно выглядело как

  ^
 / \
| | |
 \ \
| | |
 \ /
  v

Как вы можете видеть, это приводит к форме "S". Однако при расширении (рисуя его более чем на 2 строки) получается очень интересный шаблон. Ваша задача воспроизвести этот интересный образец.

задача

Учитывая целое число где n >= 2, выведите S со nстроками, которые будут из него сделаны. Выходные данные могут быть возвращены из функции, а входные данные могут быть получены стандартными методами. Конечный / ведущий пробел как для общего изображения, так и для каждой строки, в порядке. Тем не менее, пробелы в начале строки должны быть согласованы, чтобы "не прерывался. Вы можете вывести в виде списка строк.

Контрольные примеры

input
output
---

2

  ^
 / \
| | |
 \ \
| | |
 \ /
  v

---

8
  ^
 / \
| | |
 \ \
| | |
 \ \
| | |
 \ \
| | |
 \ \
| | |
 \ \
| | |
 \ \
| | |
 \ \
| | |
 \ /
  v

---

10

  ^
 / \
| | |
 \ \
| | |
 \ \
| | |
 \ \
| | |
 \ \
| | |
 \ \
| | |
 \ \
| | |
 \ \
| | |
 \ \
| | |
 \ \
| | |
 \ /
  v

Это поэтому выигрывает самый короткий код! Удачи,


13
Википедия называет Sв Прохладный S и вызывает бесконечную версию апS Chain
Стивен

Можем ли мы вывести в виде списка строк?
г-н Xcoder

@ Mr.Xcoder вы можете
Caird Coneheringaahing

@ Стефан 10 минут погуглил, и это не подошло. Я отредактирую название вопроса
caird coinheringaahing

@cairdcoinheringaahing Я искал изображения, которые могли бы быть: P
Стивен

Ответы:



10

C # (.NET Core) , 73 69 66 64 62 байта

Благодаря Barodus на два байта меньше и похожий на Perl внешний вид. Не думал об использовании int? для нулей.

n=>$@"  ^
 / {string.Join(@"\
| | |
 \ ",new int?[++n])}/
  v"

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


1
Если бы это был гольф существующего ответа C #, я бы никогда не смог сказать. Хорошо сделано :-)
ETHproductions

Можете ли вы объяснить, что new string[n+1]делает? Я никогда не видел это раньше.
Ян Х.

Создает массив пустых строк AFAIK. Я использовал хак с string.Join, aka join {"", "", "", ""} с разделителем "\ \ n | | | \ n \"
мое местоимение monicareinstate

@ Кое-кто Воу, я никогда не признавал этот трюк раньше. Очень круто! (Также мой плохой, хотя я new string[n+1]был неким хитрым конструктором строк, а не объявлением массива -.-)
Ян Х.

6

Python 3 , 48  56 59 61  байт

lambda k:'  ^\n / %s/\n  v'%('\\\n| | |\n \ '*k)

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


Вы можете сэкономить 2 байта, удаляя одиночные обратные слеши.
L3viathan

@ L3viathan Просто обновляю
г-н Xcoder


@ L3viathan Это не правильно. Экстра \ \.
г-н Xcoder

На ТИО: да. В моем терминале: нет.
L3viathan

6

05AB1E , 27 26 байт

…^
/ð"\
| | |
\ "I×…/
vJ.c

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

Альтернативная 27-байтовая версия

'^…/ \©IF…| |û…\ \}\®R'v».c

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

объяснение

'^                             # push "^"
  …/ \©                        # push "/ \" and store a copy in register
       IF                      # input times do:
         …| |û                 # push "| | |"
              …\ \             # push "\ \"
                  }            # end loop
                   \           # discard top of stack (the extra "\ \")
                    ®R         # push "/ \" reversed = "\ /"
                      'v       # push "v"
                        »      # join stack on newlines
                         .c    # center each row

5
Ваш код выглядит как слон для меня :)
Wojowu

Это буквально страшно, насколько близок был мой ответ к вашему: '^…/ \©IF„| ûû„\ û}\®R'v).Cне глядя.
Волшебная Урна Осьминога

6

Japt , 34 25 23 байта

" ^ /{ç'\²i|³1}/ v"¬¸ò5

Проверьте это онлайн! Выходы в виде массива строк; -Rдобавлен флаг, чтобы присоединиться к новым строкам. (Спасибо @Shaggy)

Первая вторая попытка, может быть, это невозможно ...

Как это работает

" ^ /{ ç'\²  i |³  1}/ v"¬ ¸  ò5
" ^ /{Uç'\p2 i'|p3 1}/ v"q qS ò5   Ungolfed
                                   Implicit: U = input number
        '\p2                       Repeat a backslash twice, giving "\\".
             i     1               Insert at index 1
              '|p3                   3 vertical bars. This gives "\|||\".
      Uç                           Make U copies of this string. U = 2: "\|||\\|||\"
" ^ /{              }/ v"          Insert this into this string.    " ^ /\|||\\|||\/ v"
                         q qS      Split into chars; join on spaces."  ^   / \ | | | \ \ | | | \ /   v"
                              ò5   Split into rows of length 5.    ["  ^  "," / \ ","| | |"," \ \ ","| | |"," \ / ","  v"]
                                   Joining on newlines gives "  ^  
                                                               / \ 
                                                              | | |
                                                               \ \
                                                              | | |
                                                               \ /
                                                                v"

Бить уголь и связывать СОГЛ? Превосходная работа!
Лохматый

Кстати, вы можете вывести массив строк, чтобы вы могли отбросить последние 2 символа.
Лохматый

@ Шэгги Отлично, теперь мы побеждаем!
ETHproductions

У нас все хорошо в последнее время :)
Shaggy

6

SOGL V0.12 , 26 25 18 байтов

°I-‘*"∑ūCƨΩ)¹‘@∑5n

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

Использует ту же стратегию, что и ответ ETHproductions на Japt

Объяснение:

..‘           push "\|||\"
   *          repeat input times
    "..‘      push " ^ /ŗ/ v ", with ŗ replaced with POP. The reason why there's a trailing
              space is because otherwise it didn't have enough repeating characters to compress
        @∑    join with spaces
          5n  split to line lengths of 5

2
push "|" and " "
Стивен Х.

1
@StevenHewitt это на самом деле две встроенные функции, но я объединил их вместе (как и с другими вещами), потому что я не думаю, что нет необходимости отделять вещи, которые скоро
будут

5

JavaScript (ES6), 60 байт

n=>`  ^
 / \\
${`| | |
 \\ \\
`.repeat(n-1)}| | |
 \\ /
  v`

Тестовый фрагмент


1
57: n=>' ^\n /${' \\ \\\n| | |\n'.repeat(n).slice(2)} \\ /\n v'(с использованием обратных
кавычек

5

Древесный уголь , 27 26 25 байт

-1 байт благодаря Карлосу Алехо. -1 байт благодаря ASCII-только.

  ^⸿ / ×\⸿| | |⸿ \ N/⸿  v

Попробуйте онлайн! Ссылка на подробную версию. # угольно-многословный-obfucation


1
Вы можете сохранить 1 байт, просто вызвав Print (вместо добавления строк) и используя \r: `^ ⸿ / × \ ⸿ | | | ⸿ \ Iθ / ⸿ v`. Подробная версия .
Чарли

Ах ... я должен буду помнить \rкак способ получить новые строки в здравом уме. Благодарность!
полностью человек


@ Только для ASCII: P -
полностью человек


3

На самом деле , 49 байтов

"| | |"@α;lD" \ \"@α@Z♂ii"  v"" \ /"))" / \""  ^"

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

Объяснение:

"| | |"@α;lD" \ \"@α@Z♂ii"  v"" \ /"))" / \""  ^"
"| | |"@α                                          push a list containing n copies of the vertical lines
         ;lD" \ \"@α                               push a list containing n-1 copies of the diagonal connections
                    @Z♂i                           interleave
                        i                          flatten
                         "  v"" \ /"))             make the bottom
                                      " / \""  ^"  make the top

3

05AB1E , 38 байт

…| |ûU"  ^
 / \"XI<F„ \2×X}" \ /
  v"»

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

…| |                         # Push "| |"
    û                        # Palindromize
     U                       # Store in X
      "..."X                 # Push the top three rows
            I<F      }       # One less than input times do:
               „ \           #   Push " \"
                  2×         #   Concatenate that with itself
                    X        #   Push "| | |"
                      "..."  # Push the last two rows
                           » # Join stack with newlines


3

C # (.NET Core) , 101 77 73 байта

Сохранено 24 байта благодаря i cri alltim !
Сохранено 4 байта благодаря Кевину Круйссену !

n=>{var s="  ^\n / ";for(;n-->0;s+="\\\n| | |\n \\ ");return s+"/\n  v";}

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

Как обычно, повторение строки в C # - это боль.



@icrieverytim Ааа, конечно, лучше.
Ян Х.

Вы можете изменить , --n>=0чтобы n-->0и s+="/\n v";return s;для того return s+"/\n v";чтобы сохранить некоторые байты.
Кевин Круйссен

1
@KevinCruijssen Спасибо, исправлено!
Ян Х.

3

Сетчатка , 38 байт

.+
$*
1
¶|||¶x\\
^
 ^¶x/\
.$
/¶ v
x?
 

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

Печатает столбец с начальными и последующими пробелами в каждой строке.

объяснение

Основная экономия байтов достигается за счет исключения пробелов во всех буквенных частях и вставки их в конце. Фигура построена так, что никогда не бывает двух непространственных символов рядом друг с другом, поэтому, если мы просто удалим их все, мы можем почти исправить фигуру, вставив пробел в каждую позицию в конце:

^
/\
|||
\\
|||
\/
v

будет выглядеть так:

 ^ 
 / \ 
 | | | 
 \ \ 
 | | | 
 \ / 
 v 

Это почти правильно, за исключением отступа. В ^и vотсутствуют два пробела. Это на самом деле легче исправить, потому что если мы просто вставим явный пробел перед каждым из них, это приведет к двум дополнительным пробелам в конце. Строки с косой чертой сложнее, потому что они требуют только одного дополнительного пробела. Чтобы это исправить, мы вставляем туда символ-заполнитель ( x). Когда мы вставляем пробелы в конце, мы не просто вставляем их для каждого пустого совпадения, но мы необязательно сопоставляем это x. Это означает, что вместо вставки пробела перед x, xсам заменяется. И тогда все равно будет пустое совпадение сразу после добавления ровно одного пробела без изменения чего-либо еще. Итак, что мы хотим настроить это:x . Это означает, что каждыйx

 ^
x/\
|||
x\\
|||
x\/
 v

что даст нам желаемый результат. Итак, вот код:

.+
$*

Преобразовать ввод в унарный.

1
¶|||¶x\\

Преобразуйте каждую 1в две строки с помощью |||и x\\(и ведущего перевода строки).

^
 ^¶x/\

Вставьте первые две строки с ^и x/\.

.$
/¶ v

Исправьте финал x\\, превратив последний \в /и добавив строку с v.

x?
 

Замените каждое xили пустое совпадение пробелом.


Аккуратный подход. Я пытался найти способ использовать объединение на пробелах для моего решения Pip, но оно не вполне сработало из-за разного количества начальных пробелов в разных строках.
DLosc


2

Pyth, 40 байт

K" / \ ""  ^"Kj+b+*2+d\\b*Q]*3"| "_K"  v

Довольно похоже на Стивена Хьюитта, но разработано независимо.

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

объяснение

K" / \ ""  ^"Kj+b+*2+d\\b*Q]*3"| "_K"  v
K" / \ ""                                 Set K = " / \ "
        "  ^"                       "  v  Draw the end points.
             K                    _K      Draw the slants.
                         *Q]*3"| "        Draw the vertical bars...
              j+b+*2+d\\b                 ... interspersed with slants.


2

Сетчатка , 45 байт

Это довольно простое решение.

.+
$*
^1
  ^¶ /x
$
 \ /¶  v
1
 \x
x
 \¶| | |¶

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

Если бы вместо этого искусство могло быть проиндексировано 1, оно было бы немного короче (44 байта):

.+
  ^¶ /x$0$*1
$
 \ /¶  v
1
 \x
x
 \¶| | |¶

2

Пип , 45 42 33 байта

"  ^
 / "."\
| | |
 \ "Xa."/
  v"

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

объяснение

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

"prefix" . "repeated" X a . "suffix"

Повторяющийся элемент в S-цепи

   \
| | |
 \

Возьмите это как буквальную строку и повторите это aраз (где aпервый аргумент командной строки). Затем добавьте префикс:

  ^
 /

и добавьте суффикс:

   /
  v

и распечатать.

(Мне нравится, как это выглядело как программа>>.)


Это похоже на Lumpy Space Princess из Adventure Time :)
YSC




1

PowerShell , 83 , 57 байт

"  ^
 / \"
1..--$args[0]|%{"| | |
 \ \"}
"| | |
 \ /
  v"

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

За @ AdmBorkBork предложения,

  • Упрощенный for с помощью диапазона номеров.
  • Заменены ; и комбинированные строки.
  • Удалено ненужное определение переменной.

Вы можете играть в гольф forмного, используя 1..--$args[0]|%{ }.
AdmBorkBork

Кроме того, вы можете использовать буквальные переводы строк между смежными строками, чтобы сэкономить, ";"и дешевле избавиться от них $sполностью. 57 байт
AdmBorkBork

Slick. Мне нравится перевод строки. Забавно, что я упустил 1..$argsвозможность. Я не уверен, что правильный этикет на этом сайте. Вносить ли я изменения в свой ответ и кредитовать вас, или вы публикуете свое решение как отдельный ответ?
корень

Редактирование в изменениях и предоставление кредита - надлежащий этикет. Добро пожаловать в PPCG.
AdmBorkBork


1

Желе , 32 байта

Скучный порт решения Lynn's Python .

“\¶| | |¶ \ ”ẋṭ“  ^¶ / ”;“/¶  v”

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

Объяснение:

“\¶| | |¶ \ ”ẋṭ“  ^¶ / ”;“/¶  v”    Example input: 5
“\¶| | |¶ \ ”                       Literal string "\¶| | |¶ \ " (¶ = newline). Result: "\¶| | |¶ \ "
             ẋ                      Repeat as many times as the (implicit) input. Result: "\¶| | |¶ \ \¶| | |¶ \ \¶| | |¶ \ \¶| | |¶ \ \¶| | |¶ \ "
              ṭ                     Tack that on the end of...
               “  ^¶ / ”            ...the string "  ^¶ / ". Result: "  ^¶ / \¶| | |¶ \ \¶| | |¶ \ \¶| | |¶ \ \¶| | |¶ \ \¶| | |¶ \ "
                        ;           Append...
                         “/¶  v”    The string "/¶  v". Result: "  ^¶ / \¶| | |¶ \ \¶| | |¶ \ \¶| | |¶ \ \¶| | |¶ \ \¶| | |¶ \ /¶  v"
                                    Implicit print

1

На самом деле , 30 байтов

Это работает по тому же принципу, что и ответ Japt от ETHproductions , где дополнительные пробелы добавляются позже, и вся строка разбивается на строки по 5 для неявной печати. Попробуйте онлайн!

"\|||\"*" ^ /"+"/ v"@+#' j5@╪i

Ungolfing

            Implicit input.
"\|||\"*    Add the middle portion and multiply that by the input.
" ^ /"+     Append the top.
"/ v"@+     Append the bottom.
#           Convert into a list of strings
' j         Join with spaces.
5@╪         Split into a list of length-5 strings.
i           Flatten list onto the stack for implicit printing with newlines.

Отличная работа, переигравшая Мего на его родном языке!
caird coinheringaahing

1

Желе , 25 23 байта

Это работает по тому же принципу, что и ответ Japt ETHproductions , где дополнительные пробелы добавляются позже, и вся строка разбивается на строки длиной 5 перед печатью. Попробуйте онлайн!

Редактировать: я знал, что есть способ соединить верх и низ S-цепи в гольф. Спасибо Эрику Аутгольферу за -2 байта.

“\|||\”ẋ“ ^ /“/ v”jKs5Y

Ungolfing

                Left argument: n
“\|||\”ẋ        Repeat the middle portion n times.
“ ^ /“/ v”j     Append the top and bottom.
K               Join with spaces.
s5              Split into a list of length-5 strings.
Y               Print the strings with linefeeds.

“\|||\”ẋ“ ^ /“/ v”jKs5Y
Эрик Outgolfer

1

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

↘^\¶/¶G→⁵↓⊕⊗N←⁵|¶ \↗¶\¶v/

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


Забавно, что другой ответ Charcoal - это тот же подсчет байтов, если использовать совершенно другой подход. Мне нравится ваш больше, хотя. Другой близок к жестко закодированному, но ваш на самом деле использует силу древесного угля.
Кевин Круйссен

@KevinCruijssen Вы говорите, сила, но это действительно должно быть печать по диагонали; к сожалению, лучшее, что я мог сделать, было 29 байтов:↘^\|¶/|\|¶|F⊖N↘\|\|¶|↘\|/¶|\v
Нил


0

Java 8, 93 76 байт

n->{String r="  ^\n / ";for(;n-->0;r+="\\\n| | |\n \\ ");return r+"/\n  v";}

Порт @IanH. ответ на C # .NET после того, как я играю в гольф немного больше.

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


Это забавно , как это почти точно идентично ожидать для stringпротив varчасти.
Ян Х.

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