Hoje você estará fazendo outro desafio palíndromo!
Portanto, sua tarefa hoje é pegar uma string e determinar a quantidade mínima de letras necessária para inserir para transformá-la em um palíndromo.
Por exemplo, vamos pegar a string fishes
.
Nesse caso, a melhor maneira seria adicionar h if
, portanto o resultado seria 3.
fishe s
h if
---------
fishehsif
Agora vamos tentar com codegolf
. Uma vez que existe uma repetiçãoo
, podemos apenas fazer:
codeg o lf
fl ed c
-------------
flcodegedoclf
para obter um resultado de 5.
Casos de teste
ppcg -> 2
codegolf -> 5
palindrome -> 9
stackexchange -> 8
programmingpuzzlesandcodegolf -> 20
code-golf
string
palindrome
Oliver Ni
fonte
fonte
ppcg
, a pontuação é 4 + 2 = 6)Respostas:
Pitão, 10 bytes
suíte de teste.
Existem algumas caracterizações equivalentes do valor que buscamos:
A idéia comum é o "esqueleto" das letras na entrada que correspondem às letras da entrada no produto final.
Esse esqueleto é sempre um palíndromo, com letras correspondentes aos seus pares invertidos. Cada letra não esquelética é incomparável e deve ter sua contraparte inserida.
Uma alternativa de mesmo comprimento usa a quarta condição, o comprimento da entrada menos o comprimento de sua subsequência palindrômica mais longa
Link para o conjunto de testes.
A parte que é diferente é
Para ambos, em vez de remover a subsequência palíndrica da entrada e pegar o comprimento, poderíamos subtrair seu comprimento do comprimento da entrada. Qualquer um dos dois custos 4 bytes:
-lQl
vsl.-Q
.fonte
Python, 112 bytes
Muito ineficiente.
Experimente online! Você precisa esperar um minuto para que o último caso termine.
Ligue com
e(<string>, 0, <length of string - 1>)
, como e ("peixes", 0, 5) `.Ungolfed (tipo de) com explicação:
fonte
l=0
.05AB1E , 11 bytes
Usa a codificação CP-1252 .
Experimente online! ou como conjunto de testes
Explicação
fonte
Braquilog , 9 bytes
Experimente online!
Esse desafio realmente precisava de uma resposta Brachylog v2, pois a palindromização de inserção é tão intuitiva nesse idioma.
Explicação
⊆P↔P
é realmente o que faz a palindromização por inserção (veja este exemplo )fonte
C,
89121 bytesPorto vergonhoso da resposta de Oliver , não conseguia pensar em nenhuma solução mais curta.
g
chamaf
com o ponteiro para o primeiro e o último caractere de uma string (o último char faz parte da string, não o'\0'
). Fica ainda mais ineficiente porquef
é chamado duas vezes para omin
caso.Ungolfed:
Uso:
fonte
Brachylog v1 , 13 bytes
Experimente online!
Você pode verificar os palíndromos encontrados com este código .
Explicação
Estou quase surpreso que isso funcione, vendo como é ridiculamente simples.
É garantido que você encontre o menor palíndromo, pois
IrI
irá gerar seqüências de comprimento cada vez maior ao voltar atrás, começando pela sequência vazia.Isso não é eficiente o suficiente para calcular o último caso de teste no TIO, devido ao uso de
s - Ordered subset
.fonte
Lote,
234.232bytesFunciona tentando recursivamente inserir caracteres não correspondentes nas duas extremidades, de forma muito lenta (não tentei o último caso de teste). Limites de recursão significam que isso só funciona para um comprimento limitado de string, portanto
99
é um tanto arbitrário. Eu tenho que usarcall
parâmetros como variáveis locais, pois não conseguisetlocal
trabalhar para mim, o que significa que o%1
parâmetro para a:l
sub-rotina é uma expressão que avalia o número de inserções feitas até agora.fonte