Дорожная живопись впереди


12

Учитывая два параметра полосы движения и длины дороги , выведите ASCII-представление разметки полосы движения для службы дорог и дорожного движения, чтобы раскрасить дороги.

Пример ввода / вывода

Вход: BTHMLRPHU 21

Мне все равно, если вы берете два параметра или объединяете число в конце строки, это однозначно.

Входные данные могут быть взяты из STDIN, как аргумент функции, переменные окружения, все, что имеет смысл в вашем языке.

Выход:

!   |      x      ##      |      |      x      x      !
! B |  /\  x HOV3 ##  <-  |  ->  |  ^^  x HOV3 x      !
! B |  \/  x HOV3 ##   |  |  |   |  ^^  x HOV3 x      !
!   |      x      ##      |      |      x      x      !
!   |      x      ##      |      |      x      x      !
!   |      |      ##      |      |      |      |      !
!   |      |      ##      |      |      |      |      !
!   |      |      ##      |      |      |      |      !
! B |  /\  | HOV3 ##  <-  |  ->  |  ^^  | HOV3 |      !
! B |  \/  | HOV3 ##   |  |  |   |  ^^  | HOV3 |      !
!   |      x      ##      |      |      x      x      !
! B |  /\  x HOV3 ##  <-  |  ->  |  ^^  x HOV3 x      !
! B |  \/  x HOV3 ##   |  |  |   |  ^^  x HOV3 x      !
!   |      x      ##      |      |      x      x      !
!   |      x      ##      |      |      x      x      !
!   |      |      ##      |      |      |      |      !
!   |      |      ##      |      |      |      |      !
!   |      |      ##      |      |      |      |      !
! B |  /\  | HOV3 ##  <-  |  ->  |  ^^  | HOV3 |      !
! B |  \/  | HOV3 ##   |  |  |   |  ^^  | HOV3 |      !
!   |      x      ##      |      |      x      x      !

Каждый символ обозначает 0,5 метра в ширину и один километр в длину.

Спецификация

Лейн разметка

На каждые 10 км отрезка дороги разметка наносится на километрах 2, 3, 9 и 10 (от «верха» выхода). Маркировка сосредоточена в переулке. За исключением велосипедной дорожки и медианы, все дорожки имеют ширину 3 метра (6 знаков).

ASCII алмазов и стрелка символов не допускается вместо маркировки , как указано в примере вывода.

  • B: Велосипедная дорожка. Bмаркировка. 1,5 метра (3 символа) в ширину.
  • T: Транзит. Алмазная маркировка
  • H: Переулок с большой вместимостью. HOV3маркировка
  • Lи R: поворотная полоса. Маркировка стрелок
  • PПроходная полоса. Каретная маркировка
  • U: Неограниченный переулок. Нет маркировки

Разделители (в порядке приоритета)

  • Медиана: ##(обозначается Mво входной строке, заменяет любой другой разделитель, включая канаву)
  • Кювет (крайний левый и крайний правый): !восклицательный знак
  • HOV полосы чередуются между xи |каждые 5 км
  • Обычный: |

Ограничения

Ваша функция или программа должна:

  • Печать в STDOUT (это означает эквиваленты System.out.printдля Java, console.logдля JavaScript и т. Д.)
  • Уметь печатать 1 - 9 дорожек с 0 - 10 медианами
  • Уметь печатать до 50 км проезжей части (50 строк выхода)
  • Не используйте какие-либо стандартные лазейки
  • Конечный пробел недопустим, за исключением необязательного \nв конце вывода

Максимально возможный вывод: 3700 байт (74 символа * 50 строк).

Наименьший возможный вывод: 5 байтов (с входом B, 1)

Предположения

  • Нет смежных медиан (подстрока MMне встречается)
  • Вторая линия маркировки может быть обрезана (например, если длина составляет 9 или 12 км)
  • Дорожки могут не иметь логического смысла (возможен любой порядок, например, полоса поворота направо слева от дороги)

Это , поэтому выигрывает самый короткий код (в байтах)!


1
И там, вы любите моноширинные шрифты
WayToDoor

Ответы:


4

Рубин, 245

Распечатайте разделительные полосы, если необходимо, затем напечатайте полосу.

Я не ожидаю победы.

->(n,i){i.times{|d,t|*e=''
g=e+%w{HOV3 ^^ B}
n.chars{|c|$><<(c==?M?'##':!t ??!:(t+c)[?H]&&d%10<5??x:?|)if(M=t!=?M)
$><<((e+[(%w{/\\ <- ->}+g)[v='TLRUHPB'.index(c)],(%w{\\/ \ | |\ }+g)[v]]+e*4)*2)[d%10].center(v>5?3:6)if(t=c)!=?M}
puts M ? e:?!}}

Изменения

245 дросселей Stderr и эффективно разделить массивы.

263 лучший способ индексировать массив

268 просто напечатайте каждую строку, не рассчитывайте каноническую версию.

330 начальных коммитов


Я бы не ожидал, что Ruby также выиграет, но если в течение следующей недели не будет других ответов, то я думаю, что вы выиграете :-P Во-вторых, есть ли где-нибудь, где я могу проверить это, не устанавливая Ruby на свой компьютер?
rink.attendant.6


2

JavaScript (ES6), 316 байт

f=(x,n)=>{for(i=0;n>i++;){b=!(r=i%10)|r==3;y=[...`! ${[...x].join` | `} !`[o='replace'](/[\W] ?M [\W]?/g,'##')].map(c=>~(q='LPRTU'.indexOf(c))?` ${'<- |^^^^->| /\\\\/    '.substr(4*q+2*b,2)} `:c=='H'?'HOV3':c).join``;y=r&&r<6?y[o](/\| H/g,'x H')[o](/3 \|/g,'3 x'):y;console.log(b|r==2|r==9?y:y[o](/[^!\|x#]/g,' '))}}

демонстрация

Он должен работать в Firefox и Edge на момент написания статьи, Chrome / Opera требует включения экспериментальных функций.

console.log = x => O.innerHTML += x + '\n';

f = (x, n) => {
  for (i = 0; n > i++;) {
    b = !(r = i % 10) | r == 3;
    y = [...
      `! ${[...x].join` | `} !` [o = 'replace'](/[\W] ?M [\W]?/g, '##')
    ].map(c => ~(q = 'LPRTU'.indexOf(c)) ? ` ${'<- |^^^^->| /\\\\/    '.substr(4*q+2*b,2)} ` : c == 'H' ? 'HOV3' : c).join ``;
    y = r && r < 6 ? y[o](/\| H/g, 'x H')[o](/3 \|/g, '3 x') : y;
    console.log(b | r == 2 | r == 9 ? y : y[o](/[^!\|x#]/g, ' '))
  }
}

// Snippet stuff
var demo = () => {
  O.innerHTML = '';
  document.forms[0].checkValidity() && f(document.getElementById('P').value, document.getElementById('N').valueAsNumber);
};

document.getElementById('P').addEventListener('change', demo);
document.getElementById('N').addEventListener('change', demo);

demo();
<form action='#'>
  <p>
    <label>Lane pattern:
      <input type=text pattern=^M?([BHLPRTU]M?)+$ maxlength=19 required id=P value=MLTPUMHUTBR>
    </label>
  </p>
  <p>
    <label>Kilometres:
      <input type=number id=N min=1 value=21 max=50 step=1 required>
    </label>
  </p>
  <pre><output id=O></output></pre>
</form>


1

05AB1E , 175 174 175 байтов

ðTиDU'|TиX'BŽ5ES©ǝX„\/TbSDVè®ǝ€ºX4×"HOV3"®ǝX'<18SǝX„|-Yè®ǝøJDí'<'>:X'^®ǝ2×'#Tи2×'x5и'|5и«'!Tи)I.•o¤[‹‡•uŽDýSтì€ûŽe1ª904ûª8ª₄«ª‡•δ~¬]•2ôDí«Ž
ÿT∍S:ð.ø8ðì‚8:1ðì‚ð:SðT:èεI∍}øJ»

Довольно плохой подход, но это работает и было весело сделать. Хотя определенно можно играть в гольф еще.

+1 байт в качестве исправления ошибки для двух соседних HHдорожек.

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

Объяснение:

Шаг 1: Создайте все возможные полосы движения с размером 10:

ðTи               # Push a space character, repeated 10 times as list
   DU             # And store a copy in variable `X`
'|Tи             '# Push "|", repeated 10 times as list
X                 # Push the list of spaces of variable `X`
 'B              '# Push a "B"
   Ž5E            # Push compressed integer 1289
      S           # Converted to a list of digits: [1,2,8,9]
       ©          # Store it in variable `®` (without popping)
        ǝ         # Replace the spaces in the pushed `X` with the "B" at these (0-based)
                  # indices
X                 # Push `X` again
 \/              # Push string "\/"
    TbS           # Push 10, converted to binary, as list: [1,0,1,0]
       DV         # Store a copy in variable `Y`
         è        # Index each into this string: ["/","\","/","\"]
          ®       # Push list `®` again ([1,2,8,9])
           ǝ      # And replace the spaces with these characters
            €º    # And then mirror each line (" "→"  "; "/"→"/\"; "\"→"\/")
X                 # Push `X` again
 4×               # Extend each space to four spaces
   "HOV3"         # Push string "HOV3"
         ®ǝ       # And replace the spaces with this string at the indices of `®` again
X                 # Push `X` again
 '<              '# Push string "<"
   18S            # Push 18 as list: [1,8]
      ǝ           # Replace the spaces with "<" at those indices
       X          # Push `X` yet again
        „-|       # Push string "-|"
           Yè     # Use list `Y` ([1,0,1,0]) to index into this string: ["-","|","-","|"]
             ®ǝ   # And replace the spaces at the indices of `®` again
               ø  # Then zip-pair the two lists together
                J # And join each pair of characters to a string
Dí                # Create a copy and reverse each string
  '<'>:           # And replace all "<" with ">"
X'^®ǝ            '# Push `X` with the spaces at indices `®` replaced with "^" 
     2×           # Extend each character to size 2
'#Tи             '# Push "#", repeated 10 times as list
    2×            # And extend each character to size 2
'x5и             '# Push "x" repeated 5 times as list
    '|5и         '# Push "|" repeated 5 times as list
        «         # And merge the lists together
'!Tи             '# Push "!", repeated 10 times as list
)                 # And finally wrap all lists of the stack into one big list of lanes

Шаг 2. Преобразуйте входную строку в индексы (которые мы будем использовать для индексации в список, который мы создали на шаге 1):

I                 # Push the input-string
 .•o¤[‹‡•         # Push compressed string "tlrpbhmu"
         u        # And uppercase it
ŽDý               # Push compressed integer 3567
   S              # Converted to a list of digits: [3,5,6,7]
    тì            # Prepend each with "100": ["1003","1005","1006","1007"]
      €û          # And palindromize each: ["1003001","1005001","1006001","1007001"]
Že1               # Push compressed integer 10201
   ª              # And append it to the list
904ûª             # Push 904 palindromized to "90409", and also append it to the list
8ª                # Append 8 to the list
₄Â                # Push 1000, and bifurcate it (short for Duplicate & Reverse copy)
  «               # Merge them together: "10000001"
   ª              # And also append it to the list
                 # Now transliterate all uppercase characters in the input to these numbers
•δ~¬]•            # Push compressed integer 1119188999
      2ô          # Split into parts of size 2: [11,19,18,89,99]
        Dí        # Create a copy, and reverse each item: [11,91,81,98,99]
          «       # And merge the lists together: [11,19,18,89,99,11,91,81,98,99]
Ž\nÿ              # Push compressed integer 19889
    T            # Extended to size 10: 1988919889
      S           # As a list of digits: [1,9,8,8,9,1,9,8,8,9]
:                 # Replace all [11,19,18,89,99,11,91,81,98,99] with [1,9,8,8,9,1,9,8,8,9]
                  # in the converted string
ð.ø               # Surround the string with spaces
8ðì               # Push 8 with a prepended space: " 8"
   ‚             # Bifurcate and pair: [" 8","8 "]
     8:           # And replace all those for 8 in the string
1ðì‚ð:           # Do the same for [" 1","1 "] → " "
S                 # Convert the string to a list of characters (digits and space)
 ðT:              # Replace the spaces for 10

Шаг 3: мы используем эти индексы для индексации в списке дорожек. И затем мы конвертируем этот список дорожек в правильный вывод, включая расширение / сокращение их до размера целочисленного ввода:

è                 # Index the indices in the integer-list into the lanes-list
 ε                # Map over each lane
  I               #  Push the second integer-input
                 #  Extend/shorten each 10-sized lane to this input-size
                # After the map: zip/transpose; swapping rows/columns
   J              # Join inner list together to a single string
    »             # And then join each string by newlines
                  # (after which the result is output implicitly)

Смотрите этот 05AB1E наконечника шахты (разделы Как сжать строки не часть словаря? И Как сжать большие целые числа? ) , Чтобы понять , почему Ž5Eэто 1289; .•o¤[‹‡•есть "tlrpbhmu"; ŽDýесть 10201; •δ~¬]•есть 1119188999; Ž\nÿесть 19889.

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