(Легкая) дорога к коду


30

Входные данные:

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

Выход:

Дорога размером , которая будет в северо-западном направлении, если ; направление на север, если ; или северо-восточное направление, если d = 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»
акози

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 добавил.
Дзайма

16

Python 2 , 79 78 73 72 байта

n,d=input()
c='|\/'[d]
i=n
while i:print' '*(n-i*d)+c,i%2*c or' ',c;i-=1

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

Принимает [1,0,-1]за[north-west, north, north-east]

-1 байт, спасибо Нейлу


3
Боже, чего бы я не дал за Python-подобную нарезку в Котлине
Адам

i%2*c or' 'сохраняет байт.
Нейл

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=1для NW. Использует преимущество ведущих пробелов. Правило, согласно которому нижний участок дороги имеет разделитель, усложняет задачу определения четности; это достигается тем, что нарезка (s*n)[n:]занимает вторую половину 2nчередования между пробелом и символом дороги.


6

1. Python 3.5, 122 120 байт

Скрипт принимает два параметра: n, 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» и « Советы по игре в гольф на <все языки>» .
Кевин Круйссен

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 байт, если для [NW, NE, N] используется [0,1,2]
mazzy

1
@mazzy Smart. Я полностью забыл о намеренном падении списка.
Веска

1
Отличная идея с array.toString от AdmBorkBork! Спасибо. 74 байта
mazzy

3
71 байт путем индексации средней части в строку, а не в массив.
AdmBorkBork


5

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

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

Попробуйте онлайн! Ссылка на подробную версию кода. Теперь, когда все базовые ошибки в Charcoal кажутся исправленными, я могу объявить оптимальный код. Объяснение:

↶N

Поверните направление курсора против часовой стрелки в соответствии с первым вводом, чтобы 1 стало северо-восточным, 2 северным и 3 северо-западным.

Nη

Введите длину дороги.

⊘⊕ηUE¹¦¹

Напечатайте половину длины дороги, а затем растяните ее, отделяя дорогу.

F⟦²±²⟧«Jι⁰η

Распечатайте стороны дороги.

@KevinCruijssen впоследствии представил более сложную версию этого вопроса, которая с тех пор была удалена, но пользователи с достаточным количеством повторений могут увидеть ее здесь: (Трудный) путь к коду. Метод растяжения, который я использовал в этом ответе, не применим к этому вопросу, поэтому вместо этого я написал следующую 47 45-байтовую программу:

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]

Он работает аналогично решениям на других языках, но, к сожалению, Kotlin в этом не очень хорош.

val c=“\\|/“; извлекает символ для использования в дорожном строительстве, используя тот факт, что Kotlin рассматривает строки как массив символов (как и положено при просмотре Java)

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


Привет, добро пожаловать в PPCG! В вашем выводе есть небольшая проблема. Изменяющиеся линии в центре дороги должны начинаться с линии внизу для четных входов, а не сверху. Вы можете сравнить свои результаты 4с моим примером, 4чтобы увидеть разницу, которую я имею в виду. Я не очень хорошо знаю Kotlin, но я думаю, что вы можете решить эту проблему (и гольф 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

ИСПОЛЬЗОВАТЬ master не обязательно, если ваша база данных уже master. Однако некоторые пользователи имеют другую базу данных по умолчанию.

Сценарий при попытке это немного отличается. Я должен был заменить космос ascii-32 на ascii-160, пробелы не были показаны.

Попробуйте это

Сделал несколько твиков и понял, что могу заменить

заказать на 1/0

с

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


2
Почему order by 1/0это не приводит к ошибке деления на ноль?
HoneyBadger

потому что 1/0 не рассчитывается. где существует (выберите 1/0) будет иметь тот же эффект
t-clausen.dk

Перенес мой вопрос в StackOverflow
HoneyBadger

3

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

(direction)(length)012

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)123

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Ṛ

Диадическая ссылка, принимающая длину слева и отрицательное направление * справа, что дает двумерный массив символов.
*[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
побег

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






1

Swift 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:" ")"

Добавляет средний знак к каждой второй строке.

Мой самый первый I'm, я рад любым советам по оптимизации. Учился в основном из этой темы: Советы для игры в гольф в Swift .


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

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

@KevinCruijssen Ах, спасибо, что поймали это. Прежде чем я обновлю свой ответ, можете ли вы подтвердить, что это решение в порядке?
Оливер

Да, это выглядит совершенно правильно. :)
Кевин Круйссен

1
@KevinCruijssen Добавлено объяснение, так как я знаю, что вы такие, как они: P
Оливер

Спасибо, оценили. :) Мне действительно всегда нравится объяснение языкам игры в гольф. Иногда мне уже трудно понять ответы на JavaScript, не говоря уже о языке игры в гольф JS. ;)
Кевин Круйссен

1

Stax , 23 байта

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

Запустите и отладьте его

Ввод - это два целых числа, разделенных пробелом.
Первый есть d. -1 указывает на северо-восток. 0 на север. 1 для северо-запада. Второй параметр есть n. Эти два значения будут неявно проанализированы из ввода и помещены в стек ввода nсверху. Дополнительно dбудет доступно из регистра stax, 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 -Mfeature = подписи, 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.