Nos Estados Unidos , as duas direções opostas de tráfego em uma estrada são separadas por uma linha amarela tracejada se a passagem for permitida e duas linhas amarelas sólidas se a passagem não for permitida.
(Apenas um lado pode ser tracejado para permitir a passagem desse lado, e as linhas amarelas podem significar outras coisas, como faixas centrais ou reversíveis, mas não estamos preocupados com nenhum desses casos.)
Escreva um programa que utilize uma sequência codificada de comprimento de P
execução de para passagem e N
para não passagem e imprima uma versão ASCII da estrada correspondente. Exceto pela linha central, a estrada sempre tem o mesmo padrão, que pode ser facilmente deduzido dos exemplos abaixo.
Haverá um número decimal positivo antes de cada um P
e N
na sequência de entrada. Este número define o comprimento da região de passagem ou não da parte atual da estrada.
Exemplos
Uma entrada de 12N
produziria 12 colunas de nenhuma estrada que passa (linha central todas =
):
____________
============
____________
Uma entrada de 12P
produziria 12 colunas de estrada que passa ( -
repetição da linha central ):
____________
- - - - - -
____________
Passagem e não passagem podem então ser combinadas, por exemplo 4N4P9N7P1N1P2N2P
, produziriam:
______________________________
====- - =========- - - -=-==-
______________________________
Estas são 4 colunas sem passagem , depois 4 com passagem , depois 9 sem passagem , etc.
Observe que uma zona de passagem sempre começa com um traço ( -
) no lado esquerdo, não um espaço ( ). Isso é necessário.
Detalhes
- A entrada nunca terá duas
N
zonas ou duasP
zonas seguidas. por exemplo4P5P
, nunca ocorrerá. - Você não precisa apoiar letras sem um número positivo inicial. A planície
P
sempre será1P
, a planícieN
sempre será1N
. - Pode haver espaços à direita, desde que não ultrapassem a coluna final da estrada. Pode haver uma nova linha opcional à direita.
- Em vez de um programa, você pode escrever uma função que aceita a cadeia codificada no comprimento da execução e imprime ou retorna a estrada ASCII.
- Recebe entrada de qualquer maneira padrão (stdin, linha de comando, função arg).
O código mais curto em bytes vence. O desempatador é um post anterior.
Respostas:
CJam, 38 bytes
Como funciona
Nós primeiro atribuir a coluna estrada correta para variáveis
N
eP
em seguida, basta avaliar a cadeia de entrada. Isso deixa um par de comprimento e a coluna na pilha. Nós os agrupamos, executamos um RLD nele para obter as colunas completas, transpor para juntá-las e, finalmente, converter o contínuo--
em-
.Experimente online aqui
fonte
JavaScript (ES6), 114
Usando seqüências de caracteres de modelo , os 5 feeds de linha são significativos e devem ser contados.
fonte
rs , 252 caracteres
Embora isso possa não contar, porque eu adicionei o operador de convergência como uma imitação da Retina de Martin Büttner há uma hora ... Não estou realmente aqui para competir. É divertido criar uma solução baseada em regex para isso.
Recebi a linha 2 da resposta de Martin da Retina para Linguagens de programação ao longo dos anos .
Explicação
Isso faz muita mágica. Veja a resposta que eu vinculei acima para obter mais informações.
Basicamente, com a entrada
4N4P9N7P1N1P2N2P
, este será o resultado:Próximo:
Isso substitui os números que precedem o símbolo de não passagem (N) pelos sinais de igual. O resultado com a entrada anterior:
Este:
substitui o primeiro número que precede um símbolo de passagem (P) pelo primeiro traço. O resultado:
As próximas duas linhas continuam o mesmo padrão:
A primeira linha substitui o restante da linha pelo padrão de espaço do traço. O segundo lida com um número ímpar; ele substitui o último traço seguido por um único número inteiro (como
-5
) por um traço-espaço (-
). Agora, a saída é:Agora as coisas estão começando a se encaixar. A próxima linha:
apenas remove o
#N
e#P
.configure os sublinhados na parte superior e inferior para fornecer:
Por fim, removemos o
A
:fonte
Haskell, 165 bytes
Exemplo de execução (
f
retorna uma string, para melhor visualização, imprima-a):Como funciona:
p
retorna a linha do meio analisando recursivamente a sequência de entrada e concatenando o número especificado de símbolos encontrados pela função de pesquisak
. A função principalf
une uma lista de cinco elementos com novas linhas, consistindo na linha superior (todos os caracteres da linha do meio substituídos por_
), uma nova linha, a linha do meio, uma linha vazia e a linha de fundo (o mesmo que na parte superior).fonte
Python 3,
169168 bytes. (167 com Python 2)Bastante ungolfed:
Experimente online aqui .
fonte
p+=['='*v,('- '*v)[:v]][_[-1]=='P']
no final da linha anterior com um ponto e vírgula anterior economiza um byte.print
.Python 2, 136 bytes
Surpreendentemente, a importação
re
parece realmente valer a pena aqui.fonte
PHP, 187 bytes
O código pode permanecer em uma única linha; ele é exibido aqui em várias linhas para ser mais legível (os espaços em branco e as novas linhas usadas para formatação não foram contados).
É possível salvar dois bytes não imprimindo a nova linha à direita. Mais cinco bytes podem ser salvos usando caracteres de nova linha reais no
echo()
:Seis bytes adicionais podem ser salvos, omitindo a inicialização de
$o
($o='';
), mas isso acionará um aviso. O aviso pode ser suprimido executando o script usando a linha de comando:Isso leva a 174 bytes.
fonte
Ruby,
137135 bytesNão é o mais curto que eu pude imaginar, mas quase o melhor. Emprestado parcialmente da resposta do Optimizer.
Ungolfed:
fonte
(a.shift.zip(*a).map(&:join)*?\n).gsub'--','- '
.C, 155 bytes
Mais legível:
O loop externo conta linhas de 5 a 0.
O loop do meio itera sobre partes da string codificada:
O loop interno decodifica uma peça, como
7P
,, e itera o número necessário de vezes (por exemplo, 7).Cada iteração imprime uma
char
. O valor dechar
é descrito pelo códigol%5?l^2?32:c^78?++x&1?45:32:61:95
:_
)=
)x
em 1 (foi inicializado em 2 porsscanf
)-
), senão imprima 32 (espaço)fonte
Scala, 163 bytes
Primeira tentativa, pode ser jogado um pouco mais.
fonte
Ruby, 94 bytes
Toma emprestada a
gsub'--','- '
ideia da resposta de 14mRh4X0r . Eu acho que essa resposta é mais interessante, embora seja mais curta.Teste:
Produz:
fonte
deixe-me incluir minha versão do Matlab
MATLAB (267 b)
entrada
Uma cadeia de caracteres formatada em ASCII com um espaço (já que não há fim da cadeia '\ 0' no matlab
exemplo V = '12N13P'
saída
representação padrão da estrada
função
a função deve ser chamada de sua cauda 1 (o caractere vazio é removido)
exemplo : p (V, numel (V) -1)
Simulação
experimente online aqui
fonte
R, 132 bytes
Não estou muito satisfeito com isso, mas foi um pouco divertido de fazer :) Tentei me livrar dos múltiplos
gsub
s, mas meus esforços foram em vão. Eu suspeito que há uma maneira muito melhor de fazer isso.scan
pega as cordas de STDIN e pega a quarta. Observe que as linhas vazias requerem um espaço (ou algo) nelas para a digitalização continuar recebendo a entrada.=
s porN
s, the-
epor
P
s.NP
ePN
rbind
) com o primeiro caractere de cada stringcat
.Execução de teste
fonte