fundo
Muitas linguagens de programação esotérica não têm números incorporados em literais, portanto você deve calculá-los em tempo de execução; e em muitos desses casos, a representação numérica pode ser bastante interessante. Já tivemos um desafio em representar números para o Underload. Esse desafio é sobre a representação de números no SNUSP modular . (Observe que você não precisa aprender SNUSP para concluir esse desafio - todas as informações necessárias estão na especificação - mas você pode achar interessante o plano de fundo).
A tarefa
Para a finalidade deste desafio, um número SNUSP modular é uma sequência formada pelos caracteres @, +e =, exceto que o último caractere é a #e que o penúltimo caractere deve ser +ou =(não pode ser @). Por exemplo, números válidos incluem @+#, ==#e @@+@=#; Exemplos de números inválidos incluem +=, @@#e +?+#.
O valor de um número SNUSP modular é calculado recursivamente da seguinte maneira:
#tem um valor de 0 (este é o caso base).- Se o número tiver o formato
=x, para qualquer sequênciax, seu valor será igual ao valor dex. - Se o número tiver a forma
+x, para qualquer sequênciax, seu valor será igual ao valor dexmais 1. - Se o número tiver a forma
@cx, para qualquer caractere únicoce qualquer sequênciax, seu valor será igual ao valor dexmais o valor decx.
Para esse desafio, você deve escrever um programa que use um número inteiro não negativo como entrada e produza uma string que seja o menor número SNUSP Modular possível que possua um valor igual à entrada.
Esclarecimentos
- É perfeitamente possível que haja mais de uma string com o mesmo valor e, em particular, para alguns números inteiros, haja um empate para o número SNUSP Modular mais curto com esse valor. Nesse caso, você pode enviar qualquer um dos números envolvidos com o empate.
- Não há restrição no algoritmo usado para encontrar o número; por exemplo, seqüências de força bruta e avaliá-las é uma tática legal, mas também é algo mais inteligente para reduzir o espaço de pesquisa.
- Como de costume no PPCG, seu envio pode ser um programa completo ou uma função (escolha o que for mais conciso no seu idioma).
- Isso não é um problema ao lidar com os formatos de entrada e saída; portanto, você pode usar qualquer meio razoável para inserir um número inteiro não negativo e gerar uma string. Há um guia completo sobre a meta , mas os métodos legais mais usados incluem argumentos / retornos de função, argumentos de linha de comando e entrada / saída padrão.
Casos de teste
Aqui estão as representações mais curtas dos primeiros números:
- 0 :
# - 1 :
+# - 2 :
++# - 3 :
+++#ou@++# - 4 :
++++#ou+@++#ou@=++# - 5 :
@+++#ou@@++# - 6 :
+@+++#ou+@@++#ou@=+++#ou@=@++#ou@@=++# - 7 :
@++++#ou@+@++# - 8 :
@@+++#ou@@@++# - 9 :
+@@+++#ou+@@@++#ou@+++++#ou@++@++#ou@+@=++#ou@@=+++#ou@@=@++# - 10 :
@=@+++#ou@=@@++#ou@@@=++#( este é um caso de teste bastante importante para verificar , pois todas as respostas possíveis incluem=) - 11 :
@+@+++#ou@+@@++#ou@@++++#ou@@+@++# - 12 :
+@+@+++#ou+@+@@++#ou+@@++++#ou+@@+@++#ou@=+@+++#ou@=+@@++#ou@=@=+++#ou@=@=@++#ou@=@@=++#ou@@=++++#ou@@=+@++#ou@@=@=++# - 13 :
@@@+++#ou@@@@++# - 14 :
+@@@+++#ou+@@@@++#ou@=@++++#ou@=@+@++#ou@@+++++#ou@@++@++#ou@@+@=++# - 15 :
@+@++++#ou@+@+@++#ou@@=@+++#ou@@=@@++#ou@@@=+++#ou@@@=@++#
Tal como um caso de teste maior, a saída da entrada 40 deve ser @@@=@@+++#, @@@=@@@++#, @@@@=@+++#, ou @@@@=@@++#.
Condição de vitória
Como um desafio de código-golfe , o vencedor é a entrada mais curta, medida em bytes.
=otimamente ocorrerá apenas como@=, certo?