O desafio
Seu programa ou função aceitará uma entrada de sequência única de STDIN ou um parâmetro de função. Você pode assumir que a entrada conterá apenas caracteres alfabéticos (a-zA-Z), espaços e pontos finais. A entrada não diferencia maiúsculas de minúsculas, portanto, você deve tratar 'a' exatamente da mesma forma que trataria 'A'.
Para cada caractere na sequência, você produzirá uma representação de um edifício conforme a seguinte especificação.
Cada edifício deve ter um telhado, designado por um sublinhado na linha superior, depois uma barra, espaço, barra invertida na segunda linha.
_
/ \
Você terá um número de andares, correspondendo ao número da letra (a = 1, b = 2, c = 3 etc.) representados por uma parede (|) em cada lado e um espaço no meio. O piso inferior (e somente o piso inferior) deve ter uma base, que é um sublinhado entre as paredes. Como isso...
|_|
Por exemplo, 'b' ficaria assim
_
/ \
| |
|_|
Agora, sabemos que prédios muito altos e estreitos não podem suportar e devem ficar mais largos na base; portanto, nenhum edifício pode ter mais de três andares sem suporte adicional. Portanto, a cada três níveis (não menos), você deve adicionar uma 'camada de ampliação'. A camada de alargamento consiste em uma barra e uma barra invertida diretamente acima das paredes da seção abaixo dela, e a seção abaixo deve ter dois espaços mais largos que a seção acima. A camada extra não conta para a altura do edifício.
Os edifícios não devem se sobrepor, mas não devem ter espaços desnecessários entre eles, e o chão é sempre plano, portanto todos os edifícios devem ter sua base no mesmo nível.
Por exemplo, 'abcdefga' ficará assim.
_
/ \
_ | |
_ / \ | |
_ / \ | | | |
/ \ | | | | / \
_ | | | | | | | |
_ / \ | | | | / \ | |
_ / \| | | | / \| | | | _
/ \| || |/ \| || |/ \/ \
|_||_||_||___||___||___||_____||_|
Os espaços na entrada da string devem ser representados por um espaço duplo.
Paradas completas na entrada de string devem ser representadas por entulhos como este.
/\/\
Outros exemplos
Input = Hello world.
Saída =
_
/ \
| |
| |
| |
/ \
| |
| | _
| | / \
/ \ | |
| | | |
_ | | _ | |
/ \ | | / \ / \
| | / \ | | | |
| | | | | | | |
_ _ | | | | | | | | _
/ \ / \ / \ | | / \ / \ / \
| | | | | | / \ | | | | | |
| | | | | | | | | | | | | |
| | | | | | | | | | | | | |
_ / \ / \ / \ | | / \ / \ / \
/ \ | | | | | | / \ | | | | | |
| | | | | | | | | | | | | | | |
| | | | | | | | | | | | | | | |
| | _ / \ / \ / \ | | / \ / \ / \
/ \ / \ | | | | | | / \ | | | | | | _
| | | | | | | | | | | | | | | | | | / \
| | | | | | | | | | | | | | | | | | | |
| | | | / \/ \/ \ | | / \/ \/ \ | |
/ \/ \| || || | / \| || || | | |
| || || || || | | || || || |/ \
|_____||___||_______||_______||_________| |_______________||_________||___________||_______||___|/\/\
Input = lorem ipsum
_
/ \
_ | |
/ \ | |
_ | | | |
/ \ | | / \
| | _ | | | |
| | / \ / \ | |
_ | | | | | | | |
/ \ / \ | | | | / \
| | | | _ | | | | | | _
| | | | / \ / \ / \ | | / \
_ | | | | | | | | | | | | | |
/ \ / \ / \ | | | | | | / \ | |
| | | | | | | | | | | | | | | |
| | | | | | / \ / \ / \ | | / \
| | | | | | | | _ | | | | | | | |
/ \ / \ / \ | | / \ | | | | / \ | |
| | | | | | | | | | | | | | | | | |
| | | | | | / \ | | / \ / \ | | / \
| | | | | | | | | | | | | | | | | |
/ \ / \ / \ _ | | / \ | | | | / \ | |
| | | | | | / \ | | | | | | | | | | | |
| | | | | | | | / \ | | / \ / \ | | / \
| | | | | | | | | | | | | | | | | | | |
/ \/ \/ \ | | | | / \ | | | | / \ | |
| || || |/ \ | | | | | | | | | | | |
| || || || |/ \ | |/ \/ \| |/ \
|_______||_________||___________||___||_________| |_____||___________||_____________||_____________||_________|
Input = a.a.a.x.x.x.a.a.a
_ _ _
/ \ / \ / \
| | | | | |
| | | | | |
| | | | | |
/ \ / \ / \
| | | | | |
| | | | | |
| | | | | |
/ \ / \ / \
| | | | | |
| | | | | |
| | | | | |
/ \ / \ / \
| | | | | |
| | | | | |
| | | | | |
/ \ / \ / \
| | | | | |
| | | | | |
| | | | | |
/ \ / \ / \
| | | | | |
| | | | | |
| | | | | |
/ \ / \ / \
| | | | | |
| | | | | |
| | | | | |
/ \ / \ / \
_ _ _ | | | | | | _ _ _
/ \ / \ / \ | | | | | | / \ / \ / \
|_|/\/\|_|/\/\|_|/\/\|_______________|/\/\|_______________|/\/\|_______________|/\/\|_|/\/\|_|/\/\|_|
Regras
- Claro que isso é código de golfe, a menor pontuação em bytes ganha
- Aplicam-se regras de brecha padrão
- Qualquer número de linhas em branco adicionais antes ou depois da saída é permitido
- Você pode optar por gerar o resultado inteiro em uma sequência ou oferecer a saída como uma matriz em que cada elemento representa uma linha de saída ou enviar para STDOUT
Nota
Este é o meu primeiro post no PPCG, então, vá com calma comigo. Já passou pela caixa de areia. Quaisquer pontos negativos ou possíveis melhorias, por favor poste como comentário e farei o que puder
[a,z]
e[A,Z]
to[1,26]
parece um requisito inútil. Seria muito melhor usar apenas uma lista de números inteiros como entrada (0
sendo a entrada para entulho). Além disso, postar seu desafio depois que ele estiver na Sandbox por apenas 21 horas , sem esperar para receber votos ou feedback de mais de um usuário, não conta como se tivesse "passado pela sandbox". É recomendável deixar os desafios no Sandbox por 48 a 72 horas, no mínimo, para dar às pessoas tempo suficiente para analisá-los.[a,z]
,[1.26]
partes do Mego mencionado. Tê-lo opcional é muitas vezes a melhor (a menos que seja uma parte fundamental do desafio (não é aqui).Respostas:
JavaScript (ES6),
330326...315309 bytesConstrói a arte ASCII de forma recursiva, começando com o piso inferior e aplicando várias expressões regulares entre cada estágio:
Como funciona
1) Piso inferior
Começamos traduzindo a string de entrada em um piso inferior, como:
Onde:
y
é um alias mais curto para a barra invertida (que requer escape)0
,1
ou2
) logo antes de uma sequência de_
é a parede esquerda do edifício. Representa o número de paredes que devem ser colocadas acima dela antes da próxima 'camada de alargamento'._
é a parede direita do edifício e está sempre definido como0
.2) Expressões regulares aplicadas entre cada estágio
O processo recursivo consiste em aplicar 9 substituições no andar anterior, usando as seguintes expressões regulares:
/\/y/g
=>" "
(remover os escombros)/_/g
=>"x"
(substitua a fundação ou a parte superior do edifício por um bloco sólido)/\/xy/g
=>" _ "
(substitua a última camada de alargamento pela parte superior do edifício)/1/g
=>"3"
(substitua temporariamente1
por3
- veja a última etapa)/2/g
=>"1"
(substitua2
por1
)/\/xx(x+)y/g
=>" 2$10 "
(substitua uma camada ampliada por uma nova parede mais estreita)/0(x+)0/g
=>"/$1y"
(substitua a parte superior da parede por uma camada maior)/3/g
=>"0"
(substitua3
por0
)Por exemplo, aqui estão as transformações sucessivas de
2___0
(piso inferior gerado por a'f'
):NB : O topo do edifício é então substituído por a
x
. Isso não é mostrado no diagrama acima.3) Expressões regulares aplicadas ao resultado final
A recursão para quando não há mais nada a substituir, o que significa que estamos além do topo do edifício mais alto.
Agora precisamos limpar tudo com mais algumas expressões regulares:
/\d/g
=>"|"
(substituir dígitos por tubos)/x/g
=>" "
(substituir blocos sólidos por espaços)/y/g
=>"\"
(substituay
por barras invertidas)Por exemplo:
Demo
Contribuintes:
4 bytes salvos graças a Hedi
8 bytes salvos graças a Not that Charles
fonte
.charCodeAt()
, no entanto.new
emnew RegExp(e,'g')
y
não requer escapamento para a barra. 2. Se você usar_
para o piso térreo, você ainda pode diferenciar o topo com o regex:/_ /
.PHP,
386376367364362358356 bytesPrimeira abordagem; ainda pode ser jogável.
PHP,
366362361360357 bytesabordagem semelhante com uma subfunção:
repartição para a segunda abordagem
+16 bytes, se novas linhas iniciais não forem permitidas:
Substitua
echo"$o[$y]\n;
porif($s=rtrim($o[$y]))echo"$s\n";
.-3 bytes para qualquer um dos
;<=>?[\]^_{|}~
escombros: Substitua 1)($n=31&ord($c))
por$n
, 2)$n=28,$w='.'!=$c
por($n=31&ord($c))<27
e 3)4
por($n=28)/7
.Outro -8 para
>
,^
ou~
como entulho: Desfazer 3)fonte
if(!$n){$o[$y++].=str_pad(_,$w," ",2);}
-2 bytes para os colchetesfor($y=36;$y--;)echo"$o[$y]\n";
; mas eu tenho uma nova abordagem que salva outros 2 bytes.use
só funciona para funções anônimas. economizaria 2 bytes; mas eu precisaria armazenar essa função em uma variável em$a=
vez de dar um nome (+3 bytes) e adicionar a$
a cada uma das quatro chamadas.Pitão,
9379 bytesExperimente online. Suíte de teste.
Explicação
Eu escondi isso por padrão, já que é muito longo.
Mostrar snippet de código
fonte
Perl,
147146 bytesInclui +1 para
-p
Execute com entrada no STDIN, por exemplo
citysky.pl
:Funciona como mostrado, mas substitua os
\xhh
escapes pelo valor literal para obter a pontuação reivindicada. Você pode fazer isso usando esta linha de comando:Eu realmente não explorei outras abordagens, então isso pode ser muito superável ...
fonte
Haskell, 289 bytes
fonte
Ruby, 245
Você permite quantas novas linhas extras quiser, então estou tendo liberdade com isso. Além disso, o processo é o seguinte:
a
.a[0]
/\/\
aa[0]
c.upcase.ord + (c.upcase.ord-1)/3
)a
:a[t]+=w*(a[0].size-a[t].size)
h
, centralize um_
| |
ou/ \
da largura adequada (1+2*((h-t)/4
), dependendo seh-t%4==0
"|___|"
da largura certa paraa[0]
a.reverse
Aposto que posso diminuí-lo se eu resolver as contas para evitar
reverse
fonte
PHP, 297 bytes
Uma versão mais legível:
fonte