Considere estes sete vagões de trem ASCII.
Motor (E)
__
====== \/
| [] |=========
| )
================
O-O-O O-O-O \\
Carro de passageiro (P)
===============
| [] [] [] [] |
===============
O-O O-O
Vagão coberto (B)
===============
|-|-| | |-|-|
===============
O-O O-O
Petroleiro (T)
_____---_____
( )
===============
O-O O-O
Funil (H)
_______________
\ | | | | | | /
===============
O-O O-O
Mesa (F)
===============
O-O O-O
Caboose (C)
=====
====| |====
| [] [] |
=============
O-O O-O
Escreva um programa que, ao receber uma sequência de caracteres EPBTHFC
, produza sua representação de trem ASCII, usando --
para os acoplamentos de carro. Os caracteres de entrada mais à esquerda se tornam os vagões de trem mais à direita. O trem está sempre voltado para a direita.
Por exemplo, uma entrada de EEHTBPFC
deve produzir
__ __
===== ====== \/ ====== \/
====| |==== =============== =============== _____---_____ _______________ | [] |========= | [] |=========
| [] [] | | [] [] [] [] | |-|-| | |-|-| ( ) \ | | | | | | / | ) | )
=============--===============--===============--===============--===============--===============--================--================
O-O O-O O-O O-O O-O O-O O-O O-O O-O O-O O-O O-O O-O-O O-O-O \\ O-O-O O-O-O \\
Detalhes
- Isso é código de golfe; o programa mais curto em bytes vence.
- Qualquer sequência de uma ou mais letras
EPBTHFC
é entrada válida. - Seu programa deve ser capaz de produzir todos os 7 tipos de carros exatamente como eles aparecem acima.
- Receba as informações da linha de comando ou diretamente do usuário (por exemplo, caixa de mensagem). Saída para stdout. (As cotações em torno da entrada são boas.)
- A altura da saída deve ser 6 ou a altura máxima necessária para os vagões de trem sendo puxados.
- Não coloque acoplamentos (
--
) na frente do primeiro carro ou na traseira do último carro.
code-golf
ascii-art
kolmogorov-complexity
Passatempos de Calvin
fonte
fonte
E
na frente e pode haver umE
no meio?Respostas:
Perl, 265 bytes
Como essa entrada contém bytes que não correspondem a caracteres ASCII imprimíveis, ela não pode ser copiada e colada aqui diretamente. Em vez disso, estou fornecendo-o como um dump hexadecimal. Usuários em sistemas Unix-ish podem reconstruir o script, alimentando o seguinte hex dump no
xxd -r
comando:O script usa o
say
recurso Perl 5.10 e, portanto, precisa ser executadoperl -M5.010
. É necessário um único argumento de linha de comando que consiste nas letrasEPBTHFC
e gera o arranjo correspondente do vagão. Por exemplo, a entradaFEH
produz a seguinte saída:O código legível no início do script simplesmente descompacta a sequência compactada em zlib que contém o corpo do script e o avalia. O código descompactado, por sua vez, fica assim:
Observe que todos os vagões de trem têm suas linhas preenchidas com espaços de comprimento uniforme e incluem o acoplamento (que é retirado do vagão mais à direita pelo loop de saída). A compactação DEFLATE usada pelo zlib é muito boa para compactar esses dados repetitivos; portanto, não há necessidade de tentar compactá-los manualmente.
Observe que esta é uma primeira tentativa rápida. Tenho certeza de que seria possível reduzir vários bytes de comprimento jogando com variações como reordenar os vagões de trem na fonte.
fonte
Python, 464
Eu fui para uma abordagem usando maldições. Realmente não pode competir, mas me diverti um pouco (~ 630 bytes):
fonte
sl
2,0Python (
582488476450 caracteres)A salada ascii é uma cadeia compactada com zlib codificada em base64 contendo as figuras ...
fonte
string.decode('base64')
2.j=lambda y:y==4and'--'or' '
3. recuos de 1 espaço 4.for c in A[::-1]:i.append(C[c][y])
5.f.append(j(y).join(i)
for l in((y==4and'--'or' ').join(C[c][y]for c in A[::-1])for y in range(6-h,6)):print l
for y in range(6-h,6):print(y==4and'--'or' ').join(C[c][y]for c in A[::-1])
Python,
402369Obrigado pelas melhorias, ugoren!
fonte
range(6)
,for x,y in zip("EPBTHFC",range(0,42,6)):
Javascript,> 471 bytes
Bem, porcaria, já acima da melhor pontuação, e ainda não consegui imprimir tudo em sequência. Mas passei uma tarde nisso e ainda queria mostrá-lo.
Apenas
console.log(c(L)); // L=train car letter
e imprimirá um único carro no console. Eu sei que há muito corte que eu poderia fazer para justamente isso, mas desisto. : Pfonte
<marquee>
seu diabo diabólico. Por que eles te depreciam?Java (583 caracteres)
Com a compactação caseira básica - embora não seja tão eficiente :-) A cadeia de trem (por exemplo
EEHTBPFC
) deve ser passada como parâmetro.Desdobrado:
fonte
C #,
758664603562bytesNão é uma pontuação excelente, 200 bytes ou mais na cadeia mal codificada e cerca de 80 bytes dedicados à decodificação. Quantidade frustrante de código gasto resolvendo o acoplamento no motor! Agora, deixa um espaço em branco à frente do trem, que é desarrumado, mas dentro das regras, e também tem as dimensões da cadeia de dados codificada, algo que eu relutava em fazer inicialmente.
Formatado um pouco:
A string é compactada de maneira muito simples, substituindo o caractere repetido por uma representação do número de caracteres seguido pelo caractere (menos 1), ou apenas o caractere se houver apenas um deles (eu queria ficar com o ASCII e evitar fazer qualquer coisa no nível sub-char). Codificador (não incluído na partitura):
fonte
Aqui está a minha solução em PHP (compatível com a v5.4), 512 bytes. Poderia ser mais curto, mas fez uma compilação rápida para tentar isso.
Esta é uma versão expandida para facilitar a leitura:
fonte
Python, 491 bytes
Eu gosto de como saiu, mesmo que não seja um vencedor.
fonte
if j==5...x[j]+=y[w[i]][j]+k
parax[j]+=y[w[i]][j]+('\\ 'if j==5 and w[i]=='E'else'--'if j==4 and i!=u-1 else' ')
economizar um pouco. (Além disso, você pode colocar uma página em vez de dois espaços na frentex[j]...
.)GNU sed , 491 bytes
Experimente online!
Explicação
Este é basicamente um esquema de compactação personalizado super ingênuo. A primeira linha anexa a cada letra na entrada um espaço e
#
, para marcar o final de cada parte:As próximas 7 linhas substituem cada letra por uma representação compactada da imagem ASCII correspondente:
As próximas 14 linhas fazem a "descompressão". Por exemplo, um
S
descompacta para seiss
es e ums
descomprime para dois espaços,S
tornando - se 12 espaços.Descomprimida, as linhas de cada carro são precedidas por um número de linha e cada carro é terminado por
#
. O restante do código é anexado0123456;
(o número da linha e o delimitador) ao espaço do padrão e, em um loop, substitui cada dígito pela linha correspondente de cada carro.Por fim, corta o espaço do padrão em linhas dividindo dígitos e limpa caracteres estranhos:
Há muito espaço para melhorias aqui. Não fui rigoroso em encontrar um conjunto ideal de compressões, e usar uma tabela de pesquisa em vez de 14
s///g
s separados seria uma vitória fácil. Eu posso ou não macarrão com isso um pouco mais.fonte
Python 3 , 529 bytes
Experimente online!
Imaginei que o postaria porque não usa nenhuma compressão, ao contrário da maioria das outras respostas aqui.
fonte
C (GCC) ,
501499490489484 bytes-2 -9 -1 -5 bytes graças ao ceilingcat .
Experimente online!
fonte