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!

rink.attendant.6
fonte
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

Não que Charles
fonte
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>

rink.attendant.6
fonte
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.

Kevin Cruijssen
fonte