Estrelado é uma linguagem de programação esotérica engraçada, na qual o código consiste apenas em +*.,`'
onde o comando real representado por cada um desses caracteres é determinado pelo número de espaços à sua frente. Isso torna complicado até mesmo enfrentar desafios de saída fixa, porque comandos diferentes podem ser responsáveis por números muito diferentes de bytes. Em particular, os literais numéricos têm uma representação unária, o que torna necessário construir números maiores operando em números menores.
Portanto, esse desafio é escrever um programa que possa jogar golfe nesses programas estrelados.
Como funciona o Starry?
(Alguns detalhes são deixados não especificados em esolangs, então eu vou acompanhar o comportamento do intérprete Ruby .)
Estrelado é uma linguagem baseada em pilha, com uma única pilha de valores inteiros de precisão arbitrária (inicialmente vazia).
Os únicos caracteres significativos são:
+*.,`'
e espaços. Todos os outros caracteres são ignorados. Cada sequência de espaços seguida por um desses caracteres não espaciais representa uma única instrução. O tipo de instrução depende do caractere não espacial e do número de espaços.
As instruções são:
Spaces Symbol Meaning
0 + Invalid opcode.
1 + Duplicate top of stack.
2 + Swap top 2 stack elements.
3 + Rotate top 3 stack elements. That is, send the top stack element
two positions down. [... 1 2 3] becomes [... 3 1 2].
4 + Pop and discard top of stack.
n ≥ 5 + Push n − 5 to stack.
0 mod 5 * Pop y, pop x, push x + y.
1 mod 5 * Pop y, pop x, push x − y.
2 mod 5 * Pop y, pop x, push x * y.
3 mod 5 * Pop y, pop x, push x / y, rounded towards -∞.
4 mod 5 * Pop y, pop x, push x % y. The sign of the result matches the sign of y.
0 mod 2 . Pop a value and print it as a decimal number.
1 mod 2 . Pop a value and print it as an ASCII character. This throws an error
if the value is not in the range [0, 255].
n ` Mark label n.
n ' Pop a value; if non-zero, jump to label n.
Observe que o intérprete verifica o código-fonte quanto aos rótulos antes do início da execução, portanto é possível pular para frente e para trás.
É claro que Starry também possui comandos de entrada (usando ,
analogamente para .
), mas esses são irrelevantes para esse desafio.
O desafio
Dada uma sequência, gere um programa Starry que não recebe entrada e imprime essa sequência exatamente em STDOUT.
Você pode escrever um programa ou função, recebendo entrada via STDIN (ou alternativa mais próxima), argumento da linha de comando ou argumento da função e emitindo o resultado via STDOUT (ou alternativa mais próxima), valor de retorno da função ou parâmetro da função (saída).
Você pode supor que a string não tenha mais de 128 caracteres e que consistirá apenas em caracteres ASCII imprimíveis (pontos de código 0x20 a 0x7E).
Sua solução deve processar qualquer entrada desse tipo em menos de 5 minutos em uma máquina de desktop razoável (há alguma margem de manobra; se demorar mais alguns minutos no meu laptop, não me importo, mas se levar 15, desqualificarei isto).
Sua solução será testada em várias seqüências diferentes listadas abaixo. Sua pontuação é a contagem total de bytes dos programas Starry correspondentes. No caso de empate, o menor metagolfer vence. Ou seja, não se preocupe em jogar seu próprio código a menos que haja um empate (o que eu acho que só acontecerá no caso de uma solução ideal ser possível).
Você não deve otimizar seu código para os casos de teste específicos listados abaixo. Especificamente, você não deve codificar soluções artesanais para eles. A otimização para classes de strings cuja estrutura é semelhante à das strings fornecidas é boa. Se eu suspeitar de alguém com soluções codificadas, reservo-me o direito de substituir alguns ou todos os casos de teste (por cadeias de estruturas comparáveis).
Casos de teste
Cada linha é um caso de teste separado:
Hello, World!
pneumonoultramicroscopicsilicovolcanoconiosis
.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.
Hickory, dickory, dock. The mouse ran up the clock. The clock struck 1. The mouse ran down. Hickory, dickory, dock.
36912059868043514648560046917066768694455682545071266675083273015450033938555319356951628735735013250100789433961153496780296165
bVZ48121347GLtpYnt76CZSxTpMDs6791EJE808077eySXldY162424ddTB90707UupwlWGb63618542VhA252989453TXrWgqGm85899uHOAY2oAKE198GOVUttvW63
7MYxoWBNt180CDHS5xBGvU70HHVB17bh8jYzIIiU6n6g98Rose1nOe8Svcg56nax20q30kT3Ttb2jHl5q2Iuf1vPbjPxm9cyKXwxc0OUK8pr13b2n7U9Y7RwQTc26A1I
n9}unwxVa}[rj+5em6K#-H@= p^X/:DS]b*Jv/_x4.a5vT/So2R`yKy=in7-15B=g _BD`Bw=Z`Br;UwwF[{q]cS|&i;Gn4)q=`!G]8"eFP`Mn:zt-#mfCV2AL2^fL"A
Os créditos para o segundo caso de teste vão para Dennis . Os créditos para o quarto caso de teste vão para o Sp3000.
Solução de referência
Aqui está uma solução de referência realmente básica no CJam:
q{S5*\iS*'+S'.}%
Você pode executá-lo em todo o conjunto de testes aqui. As pontuações são:
1233
5240
4223
11110
7735
10497
11524
11392
Total: 62954
É a abordagem mais simples possível: pressione o ponto de código de cada caractere como um literal e imprima-o. Não faz uso de pequenas diferenças entre caracteres consecutivos, impressão inteira, partes repetitivas da string, etc. Vou deixar essas coisas para você.
Acredito que há muito espaço para melhorias. Para referência, o mais curto artesanal "Olá, Mundo!" tem apenas 169 bytes.
JavaScript,
2515823778Agora compatível com ES5!
Resultados:
Um bom começo na minha opinião, mas obviamente não terminou. Em vez de criar cada caractere separadamente, ele adiciona ou subtrai do código de caractere anterior. Vou adicionar uma explicação completa quando terminar o meta-golfe.
fonte
charCodeAt
.