Malowanie dróg przed nami

12

Biorąc pod uwagę dwa parametry wzoru pasa i długości drogi , wydrukuj reprezentację ASCII oznaczeń pasa dla Roads and Traffic Service, aby pomalować drogi.

Przykładowe wejście / wyjście

Wejście:, BTHMLRPHU 21

Nie obchodzi mnie, jeśli weźmiesz dwa parametry lub połączysz liczbę na końcu łańcucha, to jest jednoznaczne.

Dane wejściowe mogą być pobierane z STDIN, jako argument funkcji, zmienne środowiskowe, cokolwiek ma sens w twoim języku.

Wynik:

!   |      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      !

Każdy znak oznacza 0,5 metra szerokości i 1 kilometr długości.

Specyfikacja

Oznaczenia pasa ruchu

Dla każdego 10-kilometrowego odcinka drogi oznaczenia są malowane na kilometrach 2, 3, 9 i 10 (od „szczytu” wyjścia). Oznaczenia są wyśrodkowane na linii. Z wyjątkiem pasa rowerowego i środkowej, wszystkie pasy mają szerokość 3 metrów (6 znaków).

Diamentowe i strzałkowe znaki ASCII nie są dozwolone zamiast oznaczeń, jak wskazano w przykładowym wyjściu.

  • B: Droga rowerowa. Bcechowanie. 1,5 metra (3 znaki).
  • T: Tranzyt. Diamentowe oznakowanie
  • H: Pas samochodowy o wysokim obłożeniu. HOV3cechowanie
  • Li R: Zakręt. Oznakowanie strzałek
  • P: Pas mijania. Oznaczenia Caret
  • U: Nieograniczony pas. Brak oznaczeń

Separatory (w kolejności pierwszeństwa)

  • Mediana: ##(oznaczony przez Mw ciągu wejściowym, zastępuje dowolny inny separator, w tym rów)
  • Rów (skrajna lewa i skrajna prawa): !wykrzyknik
  • HOV pasy na przemian xi |każde 5 km
  • Normalna: |

Ograniczenia

Twoja funkcja lub program musi:

  • Drukuj do STDOUT (oznacza to odpowiedniki System.out.printJava, console.logJavaScript itp.)
  • Być w stanie wydrukować 1 - 9 pasów z 0 - 10 medianami
  • Być w stanie wydrukować do 50 km jezdni (50 linii wyjściowych)
  • Nie używaj żadnych standardowych luk
  • Końcowe białe znaki są niedopuszczalne, z wyjątkiem opcjonalnego \nna końcu wydruku

Największy możliwy wynik: 3700 bajtów (74 znaki * 50 wierszy).

Najmniejszy możliwy wynik: 5 bajtów (z wejściem B, 1)

Założenia

  • Brak sąsiednich median (substring MMnie wystąpi)
  • Druga linia oznaczeń może zostać odcięta (na przykład, jeśli długość wynosi 9 lub 12 km)
  • Pasy mogą nie mieć logicznego sensu (możliwe jest dowolne zamówienie, na przykład pas skrętu w prawo po lewej stronie drogi)

To jest , więc wygrywa najkrótszy kod (w bajtach)!

lodowisko. dozorca 6
źródło
1
A tam
kochasz

Odpowiedzi:

4

Ruby, 245

Wydrukuj podział linii, jeśli to konieczne, a następnie wydrukuj linię.

Nie oczekuję wygranej.

->(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:?!}}

Dziennik zmian

Efektywnie 245 stderr i dzielenie tablic.

263 lepszy sposób na indeksowanie tablicy

268 po prostu wydrukuj każdy wiersz, nie obliczaj wersji kanonicznej.

330 początkowego zatwierdzenia

Nie ten Charles
źródło
Nie spodziewałbym się też, że Ruby wygra, ale jeśli nie będzie żadnych innych odpowiedzi w ciągu następnego tygodnia, to chyba wygrasz :-P Na drugim miejscu jest gdziekolwiek mogę to przetestować bez instalowania Ruby na moim komputerze?
rink.attendant. 6
@ rink.attendant.6 ideone.com
Nie że Charles
2

JavaScript (ES6), 316 bajtów

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,' '))}}

Próbny

Powinien działać w przeglądarce Firefox i Edge w momencie pisania, Chrome / Opera wymaga włączenia funkcji eksperymentalnych.

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>

lodowisko. dozorca 6
źródło
1

05AB1E , 175 174 175 bajtów

ð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»

Całkiem złe podejście, ale działa i było fajnie. Zdecydowanie można jednak zagrać w golfa.

+1 bajt jako poprawka błędów dla dwóch sąsiednich HHpasów.

Wypróbuj online.

Wyjaśnienie:

Krok 1: Utwórz wszystkie możliwe pasy o rozmiarze 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

Krok 2: Przekształć łańcuch wejściowy na indeksy (których będziemy używać do indeksowania do listy utworzonej w kroku 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

Krok 3: używamy tych indeksów do indeksowania na liście pasów. Następnie konwertujemy listę ścieżek na prawidłowe dane wyjściowe, w tym przedłużając / skracając je do wielkości liczby całkowitej:

è                 # 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)

Zobacz ten 05AB1E końcówki kopalni (sekcje Jak ciągi kompres nie Część słownika? I jak skompresować dużych liczb całkowitych? ) , Aby zrozumieć, dlaczego Ž5Ejest 1289; .•o¤[‹‡•jest "tlrpbhmu"; ŽDýjest 10201; •δ~¬]•jest 1119188999; Ž\nÿjest 19889.

Kevin Cruijssen
źródło