Pyramid Scheme é uma linguagem que está sendo desenvolvida pela @ ConorO'Brien . No esquema de pirâmide, o código que você escreve se parece com isso:
^ ^
/ \ /3\
/ \ ---
/ + \
^-------^
/9\ /3\
/123\ ---
-----
Agora, esse código tem duas qualidades óbvias: é difícil de analisar e difícil de escrever. Conor resolveu o primeiro, no entanto, será seu trabalho resolver esse segundo problema.
O código acima é processado pelo interpretador PyramidScheme em uma matriz de cadeias aninhadas, assim:
[["+", ["9123", "3"]], "3"]
Sua tarefa é escrever um programa ou função que, dada uma matriz aninhada de cadeias, produza ou retorne o código PyramidScheme recriado. Você pode assumir que a matriz de entrada sempre será válida.
Uma pirâmide é um triângulo isósceles. O topo é ^
, os lados inclinam-se diagonalmente para longe com /
e \
, e o fundo é -
. Os dois cantos inferiores estão vazios ou contêm o início de outras pirâmides, que são argumentos. O meio é preenchido com o nome da pirâmide, ignorando as quebras de linha.
Veja como o analisador converte o código em um formato utilizável. Primeiro, ele procura uma pirâmide de nível superior. Se não houver argumentos, representa-o com uma única string e segue em frente. Caso contrário, ele representa é como uma matriz ["name",[arg1,arg2]]
ou ["name",[arg1]]
. Os argumentos são as pirâmides no canto inferior esquerdo e no canto inferior direito da pirâmide, que podem ser cadeias de caracteres ou mais matrizes descritas acima. Você pode perceber que isso se assemelha um pouco ao Lisp; nesse caso, você também pode ter notado o trocadilho horrível que é o nome do idioma. Depois que a pirâmide é totalmente representada, o analisador passa para a próxima.
Este é o código-golfe , o código mais curto vence!
Casos de teste: essas não são as únicas saídas válidas, são exemplos de saídas válidas.
[["+", ["9123", "3"]], "3"]
^ ^
/ \ /3\
/ \ ---
/ + \
^-------^
/9\ /3\
/123\ ---
-----
[["out", [["chr", ["72"]], ["chr", ["101"]]]], ["out", [["chr", ["108"]]]], ["out", [["chr", ["108"]]]], ["out", [["chr", ["111"]]]]]
^ ^ ^ ^
/ \ / \ / \ / \
/out\ /out\ /out\ /out\
^-----^ -----^----- -----^
/ \ / \ / \ / \
/chr\ /chr\ /chr\ /chr\
^----- -----^ -----^ ^-----
/ \ / \ / \ / \
/72 \ /101\ /108\ /111\
----- ----- ----- -----
[ ["+", [ ["asdfghjkl"], ["do", [ "1" ]] ]] ]
^
/ \
/ + \
/ \
^-------^
/a\ /d\
/sdf\ /o \
/ghjkl\ ^-----
-------/1\
---
Observe que no segundo caso de teste, a segunda e a terceira out
pirâmide têm a ["chr", ["108"]]
como parâmetro, que é recolhido em uma pilha de pirâmide compartilhada por duas de nível superior. Essa é uma otimização válida que seu código pode suportar, mas é completamente opcional; A pontuação não se baseia no tamanho da sua saída.
Para os curiosos, o primeiro caso é exibido 9126 3
devido à impressão implícita de pirâmides de nível superior, o segundo é impresso Hello
e o último é um erro de sintaxe, incluído apenas por ter uma estrutura elegante.
Você pode assumir que a entrada contém apenas ASCII imprimíveis, excluindo os espaços, ^
, /
, \
, e -
. A entrada sempre será válida e conterá pelo menos uma pirâmide. Não há limite para o tamanho da matriz ou das seqüências de entrada; no entanto, você pode escrever seu código como se o tipo inteiro padrão do seu idioma fosse uma precisão infinita e que seu computador tenha memória arbitrária. Se você usar a entrada como uma única sequência, poderá usar qualquer coisa razoável (vírgula, espaço etc., desde que esteja em ascii imprimível e não "
ou []
) para delimitar matrizes. Você não precisa incluir colchetes ao redor da coisa inteira e, em vez disso, usar várias matrizes separadas por seu delimitador.
Sua saída não precisa ser jogada no golfe, você pode inserir espaço extra ou tornar suas pirâmides maiores que o necessário. As pirâmides de nível superior devem estar na primeira linha. A saída deve ser uma sequência com novas linhas ou uma lista de sequências.
Qualquer um que faz incluir uma versão de seu código que otimamente golfs as pirâmides podem receber algum representante na forma de upvotes / bounties (mas provavelmente apenas upvotes).
Respostas:
Lisp comum -
25241890 bytesObrigado ao @coredump por vários truques de golfe. Exemplo de saída da pergunta:
Aqui está a versão original (principalmente) não-destruída:
Experimente Online!
fonte
()
; você também pode usar variáveis leitor, às vezesloop while (not x)
éloop until x
,(cdr (cdr x))
é(cddr x)
,(setf a b c d)
é mais curto do que(setf a b)
seguido por(setf c d)
, etc. Mas isso já é uma resposta boa