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 dex
mais 1. - Se o número tiver a forma
@cx
, para qualquer caractere únicoc
e qualquer sequênciax
, seu valor será igual ao valor dex
mais 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?