(Легкий) шлях до коду


30

Вхід:

  • Ціле n , яке гарантовано буде 3 .
  • Ціле число , яке є одним із .d[1,0,1]

Вихід:

Дорога розміром , яка буде в північно-західному напрямку, якщо ; північний напрямок, якщо ; або північно-східний напрямок, якщо . Дорога завжди буде мати три простори (або загалом п'ять, якщо ми включимо зовнішні межі). Крім того, на нижній ділянці буде розташована лінія розділення доріг, а після цього чергування під час руху вгору.nd=1d=0d=1

Деякі приклади:

Вхід: Вихід:n=7,d=1

      / / /
     /   /
    / / /
   /   /
  / / /
 /   /
/ / /

Вхід: Вихід:n=4,d=1

\   \
 \ \ \
  \   \
   \ \ \

Правила виклику:

  • Будь-яка кількість провідних / кінцевих пробілів та / або нових рядків є прийнятною, якщо вона друкує необхідну дорогу десь на екрані.
  • Замість варіантів ви також можете використовувати варіанти або . Крім того, ви можете вибрати, який із трьох варіантів відображати, який із трьох напрямків. (Переконайтеся , кажучи , які опції ви використовували , якщо він відрізняється від для відповідно, використовувані в даному описі виклику!)[1,0,1][0,1,2][1,2,3][1,0,1][north-west, north, north-east]
  • Будь-який розумний вихідний формат є прийнятним. Найпоширенішим є звичайно роздрукувати його в STDOUT, але повернення його як рядкового або двовимірного списку символів також добре.

Загальні правила:

  • Це , тому найкоротша відповідь у байтах виграє.
    Не дозволяйте мовам коду-гольфу відштовхувати вас від публікації відповідей з мов, що не кодують гольф. Спробуйте придумати якомога коротшу відповідь на "будь-яку" мову програмування.
  • Для вашої відповіді застосовуються стандартні правила з правилами вводу / виводу за замовчуванням , тому вам дозволяється використовувати STDIN / STDOUT, функції / метод із відповідними параметрами та повним програмами типу повернення. Твій дзвінок.
  • Лазівки за замовчуванням заборонені.
  • Якщо можливо, додайте посилання з тестом для вашого коду (тобто TIO ).
  • Також настійно рекомендується додавати пояснення до своєї відповіді.

Тестові приклади:

Два вищевказані приклади:

Вхід: Вихід:n=10,d=0

|   |
| | |
|   |
| | |
|   |
| | |
|   |
| | |
|   |
| | |

3
Альтернативна назва: "Mad Max Code Warrior"
akozi

1
Чи не перший приклад невірний? На кожній непарній лінії є середня смуга замість кожної непарної лінії
moonheart08

2
@ moonheart08 Ні. У нижній частині завжди буде лінія розділення доріг, будь то вхід непарний чи парний. Після цього він чергується під час руху вгору. Я трохи змінив текст, щоб сподіватися зробити його більш зрозумілим.
Кевін Кройсейсен

О, так я помиляюся Добре. Дякуємо за уточнення.
moonheart08

Відповіді:


2

Полотно , 23 22 байти

B}⁴H‟m↶⁷?/|∙/╋]\|∙\╋]}

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

Використовує напрями входів 0, 1 і 2.

Пояснення:

...‟    push "--¶¶- ¶¶--"
    m   mold the horizontal length to the 1st input - a horizontal road
     ↶  rotate counter-clockwise - so the separator is on the bottom
        also replaces the dashes with bars

⁷?     ]     ]}  switch over the 2nd input:
                 default case (input 2):
  /                pad with spaces to a "/" diagonal
   |∙/╋            replace "|" with "/"
                 case 0:
        \          pad with spaces to a "\" diagonal
         |∙\╋      replace "|" with ""

case 1 is empty, but because of a bug, the trailing "}" is still required

Ви б не хотіли додати пояснення? :)
Кевін Круїссен

1
@KevinCruijssen додано.
dzaima


7

Python 2 , 66 байт

n,d=input()
s=' '+'|\/'[d]
for c in(s*n)[n:]:print' '*n+s,c+s;n+=d

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

Використовує d=-1для NE, d=0для N та d=1NW. Скористайтеся дозволеними провідними пробілами. Правило, згідно з яким на нижньому відрізку дороги є роздільник, було складно отримати правильність паритету; це досягається за допомогою нарізки, що (s*n)[n:]займає другу половину 2nчергувань між простором і дорожнім характером.


6

1. Python 3,5, 122 120 байт

Сценарій приймає два парами: n, d.

d: 0, 1, 2 -> \ | /

tio.run

import sys;(n,d)=[*map(int,sys.argv[1:3])];c="\\|/"[d]
for i in range(n):j=n+~i;print(" "*(i,0,j)[d],c,c*(j%2<1)or" ",c)

вихід:

$ ./script.py 6 2
      /   /
     / / /
    /   /
   / / /
  /   /
 / / /
$ ./script.py 6 1
 |   |
 | | |
 |   |
 | | |
 |   |
 | | |
$ ./script.py 6 0
 \   \
  \ \ \
   \   \
    \ \ \
     \   \
      \ \ \

Пояснення

# parse input params
(n,d)=[*map(int,sys.argv[1:3])]

# select char for "road"
c="\\|/"[d]

# loop n-times
for i in range(n):

    # complement (how many lines to end)
    j=n+~i

    # print
    #   space i or 0 or j times
    #   road, center of road if j is even else space, road
    print(" "*(i,0,j)[d], c, c*(j%2<1) or " ", c)

редагувати: -2 байти завдяки Кевіну Крейсейну


3
Гарна відповідь! :) Дві невеликі речі для гольфу: n-1-iможна n+~i( відповідна порада ) та j%2==0може бути j%2<1. Якщо ви їх ще не бачили, Поради щодо гольфу в Python та Поради щодо гольфу на <всіх мовах> можуть бути цікавими для прочитання.
Kevin Cruijssen

1
Дякую :) Я n+~iще цього не бачив , але виглядає корисною. Також дякую за виділення коду.
Рене

Ласкаво просимо! Насолоджуйтесь своїм перебуванням та гольфом безліч відповідей. :) О, і приємних вихідних.
Кевін Круїссен

j%2*" "or cзберігає ще пару байт.
Ніл

5

PowerShell , 88 82 80 74 71 байт

-8 байт завдяки Mazzy
-6 байт завдяки AdmBorkBork та Mazzy
-3 байти завдяки AdmBorkBork

param($n,$d)$n..1|%{' '*($_,($n-$_))[$d]+($y='/\|'[$d])," $y"[$_%2],$y}

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

Використовує [0,1,2] для NW, NE, N. Використовує dяк індекс списку двічі, щоб спочатку отримати метод інтервалу (Випадає зі списку при використанні 2, який повертає 0), а потім який символ використовувати для малювання ліній. Додає список до рядка пробілів (у яких внутрішньо є пробіли між членами, коли вони додаються як такі), що будує дорогу. Також міняється місцями між відкритою смугою або тире на основі модульної математики.


1
80 байт, якщо використовується [0,1,2] для [NW, NE, N]
маззи

1
@mazzy Smart. Я повністю забув про навмисне падіння списку.
Веська

1
Дивовижна ідея з array.toString від AdmBorkBork! Спасибі. 74 байти
маззи

3
71 байт шляхом індексації середньої частини в рядок, а не в масив.
AdmBorkBork


5

Вугілля , 33 29 23 байт

↷NNη⊘⊕ηUE¹¦¹F⟦²±²⟧«Jι⁰η

Спробуйте в Інтернеті! Посилання на багатослівну версію коду. Тепер, коли всі основні помилки деревного вугілля, здається, виправлені, я можу оголосити оптимальний код. Пояснення:

↶N

Поверніть напрямок курсору проти годинникової стрілки згідно першого вводу, щоб 1 став північним сходом, 2 північним і 3 північним заходом.

Nη

Введіть довжину дороги.

⊘⊕ηUE¹¦¹

Надрукуйте половину довжини дороги, а потім розтягніть її, даючи роздільник дороги.

F⟦²±²⟧«Jι⁰η

Роздрукуйте сторони дороги.

@KevinCruijssen згодом подав більш складну версію цього питання, яке було видалено, але користувачі, які мають достатньо репліку, можуть бачити його тут: (Важка дорога до коду ) Напруга, який я використовував у цій відповіді, не застосовується до цього питання, тому замість цього я написав наступну 47 -байтну програму:

F³«J×ι⊘⊕θ⁰≔…⟦¹ ⟧⊕﹪ι²ιFη«↶§κ⁰F⊖§κ¹§ιⅉP§ιⅉ↑↷§κ⁰

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

F³«

Петлю за боки і роздільник.

J×ι⊘⊕θ⁰

Перейти до початку сторони.

≔…⟦¹ ⟧⊕﹪ι²ι

Створіть масив, що містить a 1і пробіл, але знову видаліть пробіл, якщо ми малюємо сторони, а не роздільник.

Fη«

Петля на кожній ділянці дороги.

↶§κ⁰

Відповідно оберніть напрямок курсору.

F⊖§κ¹

Петля на одну менше довжини ділянки дороги ...

§ιⅉ

... та друкувати чергуючі елементи масиву. Чергування досягається циклічним індексуванням масиву з Y-координатою курсору.

P§ιⅉ

Роздрукуйте останній рядок цієї ділянки дороги, але не рухаючи курсор ...

... так що курсор можна перемістити вгору готовим до наступного розділу.

↷§κ⁰

Поверніть напрямок курсору назад, готовий до наступного розділу.


4

Котлін , 96 92 байт

{n,d->val c="\\|/"[d];(0..n-1).map{println(" ".repeat(n-it*(d-1))+ "$c ${" $c"[it%2]} $c")}}

Приймає [0, 1, 2] замість [-1, 0, 1]

Це працює аналогічно рішенням інших мов, але, на жаль, Котлін насправді не світить у цій.

val c=“\\|/“; отримує знаки для використання в будівництві доріг, скориставшись тим, що Котлін трактує струни як масив символів (як слід, дивлячись на вас Java)

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


Привіт, Ласкаво просимо до PPCG! У ваших результатах є незначна проблема. Лінії, що змінюються в центрі дороги, повинні починатися з лінії внизу для рівних входів, а не з верху. Ви можете порівняти свій результат 4з моїм прикладом, 4щоб побачити різницю, яку я маю на увазі. Я не знаю Котліна так добре, але, думаю, ви можете вирішити це (і гольф 4 байти одночасно), змінивши [(it+1)%2]на [it%2]. :) Крім того, це приємна відповідь, тому +1 від мене.
Кевін Кройсейсен

Дивовижне, велике спасибі за привітання та допомогу! Я його зміню
Адам,

4

TSQL-код, 171 117 байт

Я зрозумів, що це може бути написано набагато коротше як код.

DECLARE @n INT=7,@d INT=0

,@ INT=0a:PRINT
space(@n-@*@d)+stuff(replicate(substring('\|/',@d+2,1)+' ',3),3,@%2,space(@%2))SET
@+=1IF @n>@ GOTO a

Запит TSQL, 137 байт

USE master
DECLARE @n INT=6,@ INT=-1

SELECT space(@n-y*@)+z+iif(y%2=1,z,'  ')+z 
FROM(SELECT top(@n)row_number()over(order
by @)y,' '+substring('\|/',@+2,1)z FROM spt_values)x

Користувач USE не потрібен, якщо ваша база даних вже є master. Однак деякі користувачі мають іншу базу даних за замовчуванням.

Сценарій при спробі його дещо відрізняється. Мені довелося замінити простір ascii-32 на ascii-160, пробіли не показувалися.

Спробуй

Зробив декілька перетворень і зрозумів, що можу замінити

замовлення до 1/0

з

Сортувати по @


2
Чому order by 1/0так не викликає помилки поділу на нуль?
HoneyBadger

тому що 1/0 не обчислюється. там, де існує (виберіть 1/0) матиме такий же ефект
t-clausen.dk


3

JavaScript (ES8),  90 87  85 байт

Вводиться як " (direction)(length). Очікує0 для Північного Заходу, 1 для Півночі або 2 для Північного Сходу.

d=>g=(n,w=n)=>n?(c='/|\\'[d]).padStart([n--,,w-n][d])+` ${n&1?' ':c} ${c}
`+g(n,w):''

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


JavaScript (ES6), 90 байт

Цей малює символу виводу за символом трохи більше математики замість .padStart()методу.

Вводиться як " (direction)(length). Очікує1 для Північного Заходу, 2 для Півночі або 3 для Північного Сходу.

d=>n=>(g=x=>y?` /|\\
`[x+5?17+y%2*4>>--x+5-[,n+1-y,n,y][d]&1&&d:(x=n,y--,4)]+g(x):'')(y=n)

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


3

Желе ,  31  30 байт

⁶ẋẋƤḂ};€ị“\/|”ẋ3KƊ}Ṛ⁹¡⁶-2¦€ÐeṚ

Діадичне посилання, що приймає довжину зліва та напрямок із запереченням * праворуч, що дає 2d масив символів.
*[north-west, north, north-east]=[1, 0, -1]

Спробуйте в Інтернеті! (нижній колонтитул викликає Посилання, з'єднується з символами нового рядка та друкує результат)

Як?

⁶ẋẋƤḂ};€ị“\/|”ẋ3KƊ}Ṛ⁹¡⁶-2¦€ÐeṚ - Link: integer, L; integer, D
⁶                              - space character
 ẋ                             - repeat L times
     }                         - using the right argument (D):
    Ḃ                          -   mod 2 (0 if D = 0, 1 otherwise ...A would work too)
   Ƥ                           - for each prefix (of the list of spaces):
  ẋ                            -   repeat (D mod 2 times)
                  }            - using the right argument (D):
                 Ɗ             -   last three links as a monad:
        ị“\/|”                 -     index into "\/|" (1-indexed & modular)
              ẋ3               -     repeat three times - e.g. "\\\"
                K              -     join with spaces          "\ \ \"
      ;€                       - concatenate €ach (altered prefix with that list)
                     ¡         - repeat action...
                    ⁹          - ...number of times: right argument (-1 repeats 0 times)
                   Ṛ           - ...action: reverse (i.e. reverse if north-west)
                           Ðe  - for even indexes:
                         ¦€    -   sparse application for €ach...
                       -2      -   ...to indices: [-2] (the middle of the road)
                      ⁶        -   ...action: a space character
                             Ṛ - reverse

2

Python 2, 127 байт

n,d=input()
c='|/\\'[d]
for i in range(n):t=0if d==0else(i if d<0else n-i);print(' '*t+'{} {} {}'.format(c,' 'if i%2==0else c,c))

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

Перші два рядки, взяті з @TFeld.


1
Привіт, ласкаво просимо до PPCG! Я боюсь, що в поданні повинні бути або функції, що приймають параметри, або повна програма, яка бере аргументи або вводиться з STDIN. Боюсь, заборонені фрагменти, як ти зараз використовуєш, боюся. Ви можете додати ведучий D,N=input()(а використовувати Python 2 замість 3), щоб виправити це. Або ви можете змінити його на лямбда-функцію, приймаючи ці два параметри.
Кевін Круїссен

1
Приємне рішення. Здобув це 122, використовуючи " ".join(..)досить побіг.format
akozi

1
i%2*c or' 'економить ще кілька байтів, хоча я помітив, що роздільник неправильний для дорог непарної довжини.
Ніл






1

Швидкий 4.2 , 112 108 байт

-4 байти завдяки сріотчілізму О'Заїку

let c=["\\","|","/"][d];(0..<n).map{print((0..<n-$0*(d-1)).map{_ in" "}.joined()+c+" \($0%2==0 ?c:" ") "+c)}

[0,1,2] замість [-1,0,1].

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

Пояснення

let c=["\\","|","/"][d]

Визначає дорожній знак для використання. (Б'юсь об заклад, це можна якось скоротити)

(0..<n).map{

Ітератує по довжині вулиці.

(0..<n-$0*(d-1)).map{_ in" "}.joined()

Додає пробіли навпроти вулиці.

\($0%2==0 ?c:" ")"

Додає середній знак до кожного іншого рядка.

Перший мій ☝️, я радий будь-яким порадам щодо оптимізації. В основному з цієї теми: Навчання для гольфу в Свіфті .


1
Ласкаво просимо на сайт! Схоже, ви забули видалити простір між кодом inі " "в коді, навіть якщо ви його видалили у своїх прикладах.
Пшеничний майстер

1
Я не знаю швидкого, але це схоже на ваші інтерполяції на кінцях рядків ( \(c)в обох випадках). Ви б зберегли байти, просто з'єднавши cрядок у рядок. Спробуйте в Інтернеті!
Пшеничний майстер

1
Спасибі, ви праві! врятувало нас 3 байти 🚀
пальма

1

Perl 6 , 66 байт

->\n,\d{{(' 'x--$ *d%-+^n~(' ',<\ | />[d+1])[1,(n+$++)%2,1])xx n}}

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

Повертає список рядків.

Пояснення

->\n,\d{                                                         }  # Block taking n, d
        {                                                       }   # Reset $ variables
         (                                                 )xx n    # Repeat n times
          ' 'x  # Space times
              --$ *d  # (-1,-2,-3,...) if d=1
                      # (0,0,0,...) if d=0
                      # (1,2,3,...) if d=-1
                    %-+^n  # modulo -~n = n+1
                         ~  # Concat
                          (' ',<\ | />[d+1])  # Space or line
                                            [1,(n+$++)%2,1]  # Alternate middle char

1

Рубін , 90 байт

n,a=*$*.map{|i|-i.to_i}
c='|\/'[a]
n.upto(-1){|i|puts' '*(i*a-n)+c+' '+[' ',c][i%2]+' '+c}

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

ОНОВЛЕННЯ: Дякую, Кевін, за те, що я вказав, що в моєму первісному документі відсутні місця між краями дороги та маркерами (тобто дороги шириною 3 ширини замість 5 ширини.) c+' '+...+' '+c .

Інформація про напрямок: -1, 0, 1карти до{ north-west, north, north-east }

Аргументи: це читає такі аргументи командного рядка, як 4 -1(чотирирядна дорога, нахилена на північний захід).

Додаткова примітка. Це було протестовано локально за допомогою Ruby v2.6.1, і, схоже, Try it Online використовує Ruby v2.5.3. У мене немає підстав вважати, що це не буде працювати з усіма іншими версіями Ruby.


Привіт, ласкаво просимо до PPCG! Вказівки та зміна доріг правильні у вашому висновку, так що добре зроблено. Існує тільки одна незначна помилка в вихідний струм: дорога повинна бути три простору шириною замість 1. В даний час ваша дорога |||або |<sp>|, але воно повинно бути |<sp>|<sp>|або |<sp><sp><sp>|(там , де <sp>це простір). Я не знаю Рубі, але, здається, ви можете вирішити це, змінивши c+[' ',c][i%2]+cна c+' '+[' ',c][i%2]+' '+c. :)
Кевін Круїссен

Ах хороший улов! Дякуємо, що вказали на це, @KevinCruijssen.
Спенсер Д


1

Japt -R , 40 байт

Æ=Vg"|\\/";²i1S+iX%2?S:U)iSp[TZÊ-YY]gVÃw

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

Пояснення:

Æ=Vg"|\\/";²i1S+iX%2?S:U)iSp[TZÊ-YY]gVÃw
                                            // U = road size
                                            // V = direction
Æ                                     Ã     // Loop X through [0...U]
 =        ;                                 //   Set U to:
    "|\\/"                                  //       "|\/"
  Vg                                        //            [V]
           ²                                //  Double U
            i1          )                   //  Insert at index 1:
              S+                            //    " " +
                 X%2?S:U                    //         X%2?" ":U
                i                           //                  + " "
                         i                  //  Insert at index 0:
                          Sp                //    " " repeated this many times:
                            [TZÊ-YY]        //      [0,U.length - X,X]
                                    gV      //                        [V]
                                        w   // Reverse output

Здається, є незначна помилка у виході. Наразі роздільник доріг для рівних входів починається вгорі, а не знизу. Все інше виглядає нормально, тож сподіваюся, що це не надто важко виправити.
Kevin Cruijssen

@KevinCruijssen Ах, спасибі за те, що це зробив. Перш ніж я оновлюю свою відповідь, чи можете ви підтвердити, що це рішення добре?
Олівер

Так, це виглядає цілком правильно. :)
Кевін Круїссен

1
@KevinCruijssen Додав пояснення, оскільки я знаю, що тобі подобається: P
Олівер,

Дякую, цінуємо. :) Я дійсно завжди люблю мати пояснення щодо мов гольфу. У мене іноді вже виникають проблеми з розумінням відповідей на JavaScript, не кажучи вже про мову для гольфу JS. ;)
Кевін Круїссен

1

Стакс , 23 байти

ù╒←∩♂2Ωⁿ¡├∩22♀Ç○=÷â╧δÖ↑

Запустіть і налагоджуйте його

Вхід - це два цілі числа, розділені пробілом.
Перший є d. -1 вказує на північний схід. 0 для півночі. 1 на північний захід. Другий параметр - n. Ці два значення будуть неявно проаналізовані від введення та розміщені у вхідному стеку з nзверху. Додатковоd будуть доступні зі стаксx реєстру оскільки це перше імпліцитно проаналізоване значення.

Наприклад, введення "1 7"

            Main stack      Explanation
            ----------      -----------
;           [7]             peek from input stack
m                           map over integers [1..n] using the rest of the program
                            output each produced value implicitly
  ;         [1 7]           peek from input stack
  +         [8]             add
  .*"       [8 [42 34]]     2 character string literal with codepoints 42 and 34
  @         [42]            get the element at the specified modular index (8)
  0         [42 0]          literal zero
  "|\/"x@   [42 0 92]       get codepoint from string literal at input d (from x register)
  \         [42 [0 92]]     make pair
  :B        ['\ \ \ ']      encode in custom base; it's binary with custom codepoints
  _x*       ['\ \ \ ' 1]    (loop variable) * (input d)
  ;^        ['\ \ \ ' 1 8]  peek from input stack and increment
  %         ['\ \ \ ' 1]    modulus
  6+        ['\ \ \ ' 7]    add 6
  )         [' \ \ \ ']     left-pad to length

Виконати цей


Ви б не хотіли додати пояснення? :)
Кевін Круїссен

1
@KevinCruijssen: Зовсім не.
рекурсивна

0

perl -M5.010 -Matature = підписи, 97 байт

sub f($n,$d){$x=qw[| / \\][$d];say" "x($d<1?$_*-$d:$n-$_),$x,$",($n-$_)%2?$":$x,$",$x for 1..$n;}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.