Pintura de estrada à frente


12

Dados dois padrões de faixa e comprimento da estrada , imprima uma representação ASCII das marcações da pista para o Serviço de Estradas e Trânsito para pintar as estradas.

Exemplo de entrada / saída

Entrada:, BTHMLRPHU 21

Eu não me importo se você pegar dois parâmetros ou concatenar o número no final da string, é inequívoco.

As entradas podem ser obtidas do STDIN, como argumento de função, variáveis ​​de ambiente, o que fizer sentido no seu idioma.

Resultado:

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

Cada caractere indica 0,5 metros de largura e um quilômetro de comprimento.

Especificação

Marcações de faixa

Para cada trecho de 10 km de estrada, as marcações são pintadas nos quilômetros 2, 3, 9 e 10 (do "topo" da saída). As marcações estão centralizadas na pista. Com exceção da ciclovia e da mediana, todas as pistas têm 3 metros (6 caracteres) de largura.

Caracteres de diamante e flecha ASCII não são permitidos no lugar das marcações, conforme indicado na saída de exemplo.

  • B: Ciclovia. Bmarcação. 1,5 metros (3 caracteres) de largura.
  • T: Transito. Marcação de diamante
  • H: Faixa de veículos de alta ocupação. HOV3marcação
  • Le R: Rodovia. Marcação de seta
  • P: Faixa de passagem. Marcações de sinal de intercalação
  • U: Pista irrestrita. Sem marcações

Separadores (em ordem de precedência)

  • Mediana: ##(indicada por Mna sequência de entrada, substitui qualquer outro separador, incluindo vala)
  • Vala (extrema esquerda e extrema direita): ponto de !exclamação
  • As faixas HOV alternam entre xe a |cada 5 km
  • Normal: |

Restrições

Sua função ou programa deve:

  • Imprimir em STDOUT (isso significa equivalentes System.out.printpara Java, console.logJavaScript, etc.)
  • Ser capaz de imprimir 1 a 9 pistas com 0 a 10 medianas
  • Ser capaz de imprimir até 50 km de estrada (50 linhas de saída)
  • Não use brechas padrão
  • O espaço em branco à direita não é aceitável, com exceção de um opcional \nno final da saída

Maior saída possível: 3700 bytes (74 caracteres * 50 linhas).

Menor saída possível: 5 bytes (com entrada B, 1)

Premissas

  • Nenhuma mediana adjacente (a substring MMnão ocorrerá)
  • A segunda linha de marcações pode ser cortada (por exemplo, se o comprimento for 9 ou 12 km)
  • As faixas podem não fazer sentido logicamente (qualquer ordem é possível, por exemplo, uma faixa de curva à direita à esquerda da estrada)

Isso é , então o código mais curto (em bytes) vence!


1
E lá, você ama fontes monoespaçadas
WayToDoor

Respostas:


4

Ruby, 245

Imprimir a pista divide se relevante, depois imprima a pista.

Eu não espero ganhar.

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

Changelog

245 bloqueador stderr e dividir matrizes de forma eficaz.

263 maneira melhor de indexar array

268 apenas imprima cada linha, não calcule uma versão canônica.

330 confirmação inicial


Eu também não esperaria que o Ruby vencesse, mas se não houver outras respostas na próxima semana, acho que você venceu :-P Em uma segunda observação, existe algum lugar em que eu possa testar isso sem instalar o Ruby no meu computador?
usar o seguinte código

@ rink.attendant.6 ideone.com
Não é Charles Charles

2

JavaScript (ES6), 316 bytes

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

Demo

Ele deve funcionar no Firefox e Edge no momento da redação. O Chrome / Opera exige que os recursos experimentais sejam ativados.

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 bytes

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

Abordagem bastante ruim, mas funciona e foi divertido de fazer. Definitivamente pode ser jogado um pouco mais, no entanto.

+1 byte como correção de bug para duas HHfaixas adjacentes .

Experimente online.

Explicação:

Etapa 1: crie todas as faixas possíveis com tamanho 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

Etapa 2: converta a string de entrada em índices (que vamos usar para indexar na lista que criamos na etapa 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

Etapa 3: usamos esses índices para indexar na lista de faixas. E então convertemos essas listas de faixas na saída correta, incluindo estendendo / encurtando-as para o tamanho da entrada inteira:

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

Veja esta minha dica do 05AB1E (seções Como compactar seqüências de caracteres que não fazem parte do dicionário? E Como compactar números inteiros grandes? ) Para entender por que Ž5Eé 1289; .•o¤[‹‡•é "tlrpbhmu"; ŽDýé 10201; •δ~¬]•é 1119188999; Ž\nÿé 19889.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.