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?Respostas:
Oracle SQL 11.2,
341262 bytesVersão antiga
: 1 o número a representar no SNUSP modular
Sem golfe:
Primeiro, crie uma visualização com 3 linhas, uma para cada símbolo usado para representar números, menos #, que é usado apenas no final da sequência:
Então a visão recursiva n gera todas as seqüências possíveis com esses três símbolos, concatena-as em # e as avalia.
Os parâmetros são:
s: a representação SNUSP modular do número que está sendo avaliado
v: o valor decimal de s calculado pela iteração anterior
p: v calculado pela iteração i-2
c: o próximo símbolo a concatenar para s
i: o comprimento de s, apenas necessário para se livrar de dois LENGTH () para fins de golfe
Se o último símbolo for +, adicione 1
Se for @, adicione o valor da iteração i-2 . Caso contrário,
o símbolo é # ou =. v é inicializado com 0 na parte init da visualização recursiva, portanto, o novo v é igual ao v anterior em ambos os casos.
Cada string possível com os três símbolos é calculada, esta parte garante que a solicitação não seja executada até a grande crise.
Como não há regra para a construção das seqüências, duplicatas provavelmente surgirão. Sendo uma visão recursiva, a Oracle interpreta essas duplicatas como ciclos e gera um erro se o caso não for explicitamente resolvido.
Retorna a primeira representação SNUSP modular que é avaliada como o número decimal digitado como parâmetro: 1
Nos meus testes, a primeira linha é sempre uma das mais curtas representações.
Caso seu banco de dados não atue da mesma maneira, a última cláusula deve ser substituída por
fonte
JavaScript (ES6), 100 bytes
Algoritmo de busca simples em termos de força bruta.
fonte
t<n
parat-n
o trabalho poder ...Pitão, 41 bytes
Suíte de teste
Como funciona:
Existem duas partes. Uma função recursiva que calcula o valor de uma expressão SNUSP sem a sequência
#
e uma rotina de força bruta.Avaliação:
Força bruta:
fonte
CJam, 58
Força bruta, com um pouco de inspiração da resposta de Neil. Experimente online
Versão eficiente, 107
Experimente online
Isso usa programação dinâmica.
fonte
Haskell ,
8986 bytesEDITAR:
Outra solução de força bruta que acabou com muita inspiração da resposta de Neil. (Embora tenha funcionado mais como o Pyth de isaacg antes de o golfe apresentar o
l
.)Experimente online!
f
é a função principal, que pega um número inteiro e retorna uma string.l
é uma lista infinita de tuplas(a,b,s)
, as representações mais curtass
primeiro, juntamente com seu valora
e o valorb
da representação com o primeiro caractere retirado. (como outros também notaram / notaram, é inofensivo tratar o último como 0#
).l
que não sejam o primeiro são gerados recursivamente com uma compreensão da lista.d
é o caractere que deve ser anexado paras
gerar uma nova representação na lista e 'c' é o incremento correspondente aa
.fonte