Se você já tentou escrever código palindrômico antes, saberia quantos colchetes tendem a atrapalhar. ()()
não é um palíndromo, embora kinda parece que deve ser, ao mesmo tempo ())(
e ()(
são ambos palíndromo e ambos muito burra procurando. Não seria conveniente se fosse o contrário?
Uma string é convenientemente palíndrica se for igual à string derivada quando seu reverso tiver todos os seus parênteses ( ()
), colchetes ( []
) e chaves ( {}
) invertidos. Nenhum outro caractere é especial e requer inversão. ( <>
às vezes são emparelhados, mas geralmente não são excluídos.)
Sua tarefa é escrever, em seu idioma, um programa (com entrada no STDIN) ou uma função (com um argumento de cadeia única) que (a) forneça um valor verdadeiro consistente * quando seu argumento for convenientemente palindrômico e um falso diferente e consistente valor caso contrário, e (b) é ele próprio convenientemente palindrômico.
Por exemplo, as seguintes entradas são convenientemente palíndricas:
racecar
(a)(bb)(a)
void main(int argc, *char[] argv) {} (vgra []rahc* ,cgra tni)niam diov
E o seguinte não é:
non-palindrome
A nut for a jar of tuna?
(old [style] parens) )snerap ]elyts[ dlo(
ingirumimusnocte)etconsumimurigni
Você não pode confiar em nenhum estado externo (nome do arquivo específico, estrutura de diretórios, outras entradas do usuário, acesso à web etc.), exceto sinalizadores de interpretador / compilador.
Além disso, você não pode usar o "truque de comentários" em que comenta ou processa um pedaço de código não utilizado, aproveitando os recursos de comentários do seu idioma. Por exemplo, todos os itens a seguir não são permitidos, porque contêm peças não funcionais que podem ser removidas ou destruídas com segurança (às custas da perda conveniente de palindrômico):
{some code} // {edoc emos}
{some code} NB.BN {edoc emos}
"n\" ;{edoc emos} ;"; {some code}; "\n"
Obviamente, isso pode não abranger todos os casos, mas o espírito do desafio aqui não é usar comentários e código não analisado ** para obter palindrominess, em vez disso, usar os parênteses e parênteses corrigidos. Estou olhando para você, LISP, Brainfuck.
Este é um código de golfe , portanto o código mais curto vence, mas todos os comprimentos de código são bem-vindos.
* Por valores verdadeiros e falsos consistentes, quero dizer que você pode retornar um de um par de valores, como 1
verdadeiro e 0
falso, ou False
verdadeiro e "no"
falso, desde que esses valores sejam diferentes um do outro e não mude de execução para execução do seu programa. Use o que salvar seus personagens.
** Não deve ser confundido com não executado : código válido e que pode fazer coisas estranhas, mas nunca chamado, é bom.
fonte
if(false){some code}
variáveis não utilizadas? Eles são permitidos?(eslaf)fi
, você começa a usarif(false)
.()()
não é um palíndromoRespostas:
J (60)
Esta é uma função que aceita um argumento:
Explicação:
f :: g
executa a funçãof
sobre a entrada e retorna o resultado se retornar sem erro. Sef
falhar, ele será executadog
.O
f
aqui é(|.-:'())([]][{}}{'&charsub)
, que faz o trabalho real:|.
: marcha ré-:
: é igual a'())([]][{}}{'&charsub
: substituindo cada suporte pelo suporte opostog
função é(busrahc&'}{{}][[])(()':-.|)
absurda, mas sintaticamente válida.busrahc
não está definido, mas isso não importa, porque só é resolvido quando é executado (e não é executado).fonte
f :: g
emg@-@f
.g
é equivalente ao gancho,(-.|)
por:
isso as saídas se tornam -1 e a lista vazia para convenientemente palíndrico e não, respectivamente.GolfScript,
10791Novas linhas são artísticas.
fi
,c43
ec
são noops, mas o código inteiro é executado.Imprime
-3-1-1
para palíndromos convenientes,-4-1-1
caso contrário. Experimente online!Versão alternativa, 155 bytes
Ao custo de 64 bytes, isso pode ser aprimorado em:
Como antes, o código inteiro é executado e cada byte afeta a saída.
Imprime
010
para palíndromos convenientes,-100
caso contrário. Experimente online!Testes e exemplos
Como funciona
fonte
Ruby, 110
Imprime
true
se a entrada for um palíndromo conveniente efalse
se não for. Observe que esta solução pressupõe que a entrada não seja finalizada por uma nova linha; portanto, teste-a comecho -n
:Esta é uma porta um tanto direta da minha resposta ao Palindromic Palindrome Checker (e ainda não jogamos golfe). O principal truque usado é que a primeira expressão entre parênteses sempre retorne
1
; portanto, a segunda metade da expressão booleana nunca é avaliada (mas é analisada).A única dificuldade em adaptar isso foi descobrir como adicionar a chamada ao
z.tr
que seu "conveniente inverso" também fosse sintaticamente válido - mas eu poderia simplesmente usar o mesmo truque que já usei: -*
, que no primeiro semestre é analisado como operador splat (use o conteúdo da matriz como parâmetros de função) e como operador de multiplicação (ou repetição) da matriz na segunda metade.Ruby, 157
297, todo o código executadoEssa versão (um pouco mais longa) executa todo o código e todas as linhas, exceto duas, afetam a saída, que é impressa na última linha - mas todas as linhas são analisadas e executadas sem erros. Esta versão interpreta qualquer nova linha à direita como parte da entrada; portanto, use-a
echo -n
para testá-la ou acrescente uma entrada à sua nova linha. Imprimetrue
se a entrada for um palíndromo conveniente oufalse
não.Explicação
fonte
GolfScript, 61 caracteres
OK, aqui está uma solução de linha de base no GolfScript. Tenho certeza de que poderia ser melhorado ainda mais:
Como de costume no GolfScript, este programa lê sua entrada do stdin. Emite:
se a entrada for um palíndromo conveniente, conforme definido no desafio acima, e:
Se não é.
Explicação: Este programa depende fortemente da decisão de que o código não executado está OK, desde que seja analisado. Consiste em dois blocos de código, delimitados por chaves (
{ }
), que são imagens espelhadas uma da outra.O primeiro bloco de código é executado pelo
~
seguinte e verifica se a entrada é um palíndromo conveniente, produzindo1
se é e0
se não é. O segundo bloco de código não é executado e, portanto, simplesmente permanece na pilha até que o programa termine e tudo na pilha seja automaticamente codificado e impresso pelo intérprete GolfScript.Deve-se notar que o intérprete GolfScript faz muito poucas verificações de sintaxe no momento da análise (ou nunca, nesse caso); um literal de bloco de código GolfScript pode conter quase qualquer coisa, mesmo que possa travar quando executado. Ainda assim, alguns erros de sintaxe, como literais de cadeia não terminada, geram um erro mesmo em código não executado, então acredito que essa solução (apenas) se enquadra nas regras.
Ps. Observando o código real executado, ele contém alguns elementos convenientemente palindrômicos, como
@[.]@
a string literal"([{}])"
e até o loop%{ ... }%
. Isso oferece a sugestão tentadora de que uma solução GolfScript "intrinsecamente palindrômica", onde o programa palindrômico completo seria executado e funcional, seja realmente possível. Como ainda não consegui produzir um, ofereço uma recompensa de +100 representantes à primeira pessoa que conseguir criar um!fonte
"n\";X;";X;"\n"
espécie de comentar, mas darei a você o benefício da dúvida. Eu estava realmente procurando essas soluções "intrinsecamente palindrômicas" para começar, no entanto, ou pelo menos aquelas em que a não execução de blocos era um pouco mais discreta.1;
). Isso ainda conta como totalmente funcional?JavaScript (ES6), 245 bytes
Eu queria uma resposta JS que pudesse ser executada no navegador, então aqui está.
Removendo todo o código que nunca é realmente executado, obtemos o seguinte:
O que pode ser simplificado para isso:
fonte
n1=>n1==(('',n1))['nioj','split']``['esrever','map'](c=>`()[]{}`[`()[]{}`['indexOf'](c)^1]||c||[1^(c)['fOxedni']`{}[]()`]`{}[]()`>=c)['pam','reverse']``['tilps','join']((1n,''))==1n>=1n
(185 bytes)Javascript (ES6) 288
Executa no shell da linha de comando Spidermonkey . Lê uma única linha de STDIN e produz
true
oufalse
depende se a entrada é um palíndromo conveniente.Este código é sintaticamente válido, mas tudo depois
&&
não é executado, pois aprint
função retorna um valor de falsey.Você pode executar esse código no console do Firefox executando este calço primeiro para emular as funções
readline
eprint
. Edite a entrada dentroreadline
conforme necessário:E aqui está um exemplo rápido da saída:
fonte
&&
foi realmente inteligente, recomendo-lhe (mas parece um pouco caro) #05AB1E, 35 bytes
Experimente online!
Explicação:
fonte
"()[]{}"
você pode fazeržu„<>-
q
analisado pelo menos quanto à validade sintática? Caso contrário, consideraria o mesmo que comentar a segunda metade do código.CJam, 38 bytes
Imprime
"=re%W_@%W_q"1
se a entrada for convenientemente palíndrica ou"=re%W_@%W_q"0
não.Experimente online no intérprete CJam .
Como funciona
Depois de executar o programa, o CJam imprime automaticamente todos os três itens na pilha: a sequência inspecionada, o Booleano da comparação de sequências e a sequência vazia.
fonte
Perl, 83 + 2 = 85 bytes
Correr com
-nl
O código sai após a impressão da veracidade da entrada. Tudo após o ponto-e-vírgula é interpretado (e trava quando o script chega a esse ponto, não fosse pelos
exit
encontros), mas não executado. Se eu deixasse deexit;tixe;
fora o código, ele ainda imprimiria o resultado corretamente antes de travar.fonte