Намалюйте S-ланцюг


27

Фон

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

Малювання "S"

S можна скласти, виконавши наступні прості дії:

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

| | |

| | |

Далі з'єднайте верхню ліву лінію з нижньою середньою лінією та верхню середню з нижньою правою лінією, щоб отримати

| | |
 \ \
| | |

Нарешті, намалюйте верх і низ на намальованому в даний час зображення так, щоб воно виглядало так, як виглядає

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

Як бачите, це призводить до форми "S". Однак, якщо його розширити (намалювавши його більш ніж двома рядами), він створить дуже цікавий візерунок. Ваше завдання - відтворити цю цікаву схему.

Завдання

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

Тестові справи

input
output
---

2

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

---

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

---

10

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

Це тому найкоротший виграш коду! Удачі,


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

Чи можемо ми вивести у вигляді списку рядків?
Містер Xcoder

@ Mr.Xcoder you may
caird coinheringaahing

@Stephen 10 хвилин гугли, і це не вийшло. Я відредагую назву питання
caird coinheringaahing

@cairdcoinheringaahing Я шукав зображення, це могло бути: P
Стівен

Відповіді:



10

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

На два менше байтів та перламутровий вигляд завдяки Бародусу. Не думали використовувати int? для нулів.

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

Спробуйте в Інтернеті!


1
Якби це був гольф існуючої відповіді C #, я ніколи не зміг би сказати. Молодці :-)
ETHproductions

Чи можете ви пояснити, що new string[n+1]робить? Я ніколи цього не бачив.
Ян Х.

Створює масив порожніх рядків AFAIK. Я використовував хак зі string.Join, він же приєднався {"", "", "", ""} з роздільником "\ \ n | | | \ n \"
мій займенник monicareinstate

@someone Woah, я ніколи раніше не визнавав цього фокусу. Дійсно здорово! (Також моє погано, я хоч і new string[n+1]був якийсь складний конструктор рядків, а не декларація масиву -.-)
Ян Х.

6

Пітон 3 , 48  56 59 61  байт

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

Спробуйте в Інтернеті!


Ви можете зберегти 2 байти, не змінюючи масштаб одиночної скісної риски.
L3viathan

@ L3viathan Просто оновлення
Містер Xcoder


@ L3viathan Це невірно. Extra \ \.
Містер Xcoder

У TIO: так. У моєму терміналі: ні.
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не дивлячись.
Magic Octopus Urn

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"

Побиття деревного вугілля та зв’язування SOGL? Відмінна робота!
Кудлатий

Ви можете вивести масив рядків, до речі, щоб ви могли викопати останні два символи.
Кудлатий

@Shaggy Це чудово, зараз ми перемагаємо!
ETHproductions

У нас останнім часом добре:
Шагі

6

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

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

Спробуйте тут!

Використовується та ж стратегія, що і відповідь 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 - це насправді два вбудовані модулі, але я з'єднав їх разом (як це роблю з іншими речами), тому що я не думаю, що не потрібно відокремлювати речі, які швидко звикають разом
dzaima

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

Спробуйте в Інтернеті! Посилання на багатослівну версію. # деревне вугілля-багатослів’я-обфукація


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

Ах ... я повинен запам’ятати \rяк спосіб отримання новинок здоровим шляхом. Спасибі!
повністюлюдський


@ ASCII only: P -
totalhuman


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 everytim !
Збережено 4 байти завдяки Kevin Cruijssen !

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";щоб зберегти деякі байти.
Kevin Cruijssen

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

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

Спробуйте в Інтернеті!

Пояснення

Код насправді простий, хоча нові рядки ускладнюють читання. Ось кращий спосіб переглянути структуру:

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

Повторний елемент у S-ланцюзі є

   \
| | |
 \

Прийміть це як буквальний рядок і повторіть його aраз (де aперший аргумент командного рядка). Потім додайте префікс:

  ^
 /

і додайте суфікс:

   /
  v

і друкувати.

(Мені подобається, як це виглядало начебто як на <<> програмі.)


Це схоже на кохану космічну принцесу з Adventure Time :)
YSC




1

PowerShell , 83 , 57 байт

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

Спробуйте в Інтернеті!

За пропозиціями @ AdmBorkBork,

  • Спрощено forза допомогою діапазону чисел.
  • Замінено ;рядки і комбіновані.
  • Видалено зайве визначення змінної.

Ви можете багато гольфу в forпетлі, використовуючи 1..--$args[0]|%{ }.
AdmBorkBork

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

Гладкий. Мені подобається збереження нового рядка. Смішно, що я пропустив 1..$argsнагоду. Я не впевнений, який правильний етикет на цьому сайті. Чи я вноситиму зміни у свою відповідь і зачитаю вас, чи ви публікуєте рішення як окрему відповідь?
корінь

Редагування змін та надання кредитів - це правильний етикет. Ласкаво просимо до PPCG.
AdmBorkBork


1

Желе , 32 байти

Нудний порт рішення Lynn 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
Erik the Outgolfer

1

Вугілля деревне , 25 байт

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

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


Смішно, як інша відповідь Вугільного вугілля - це той самий підрахунок байтів, використовуючи зовсім інший підхід. Мені більше подобається ваша. Інший близький до жорсткого кодування, але ваш насправді використовує сили Вугілля.
Kevin Cruijssen

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