Дорожній розпис попереду


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.logJavaScript тощо)
  • Вміти друкувати 1 - 9 смуг із 0 - 10 медіанами
  • Вміти друкувати до 50 км проїжджої частини (50 ліній випуску)
  • Не використовуйте стандартних лазівки
  • Недопустимий пробіл білого кольору не є винятком, за винятком необов'язкового \nв кінці виводу

Найбільший можливий вихід: 3700 байт (74 символи * 50 рядків).

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

Припущення

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

Це , тому найкоротший код (у байтах) виграє!


Відповіді:


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 потужніше заглушити і розділити масиви ефективно.

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.