Houve algumas tentativas anteriores de fazer essa pergunta, mas nenhuma delas está em conformidade com os padrões modernos deste site. Por discussão sobre o Meta , estou reposicionando-o de uma maneira que permita uma concorrência justa de acordo com nossos modernos conjuntos de regras.
fundo
Um palíndromo é uma sequência que "lê o mesmo para a frente e para trás", ou seja, o reverso da sequência é o mesmo que a própria sequência. Não estamos falando de "palíndromos convenientes" aqui, mas de uma estrita inversão caractere a caractere; por exemplo, ()()
não é um palíndromo, mas ())(
é.
A tarefa
Escreva um programa ou função que use uma string S (ou o equivalente apropriado no seu idioma) como entrada e tenha uma saída Q (de um tipo de sua escolha). Você pode usar qualquer meio razoável para receber a entrada e fornecer a saída.
- Quando a entrada S é um palíndromo, a saída Q deve ter um valor A (que é o mesmo para qualquer palíndromo S ).
- Quando a entrada S não é um palíndromo, a saída Q deve ter um valor B (que é o mesmo para qualquer S não palíndrico ).
- A e B devem ser distintos um do outro.
Ou seja: mapeie todos os palíndromos para um valor e todos os não palíndromos para outro.
Além disso, o programa ou função que você escreve deve ser um palíndromo em si (ou seja, seu código-fonte deve ser palíndrico), tornando este um desafio de fonte restrita .
Esclarecimentos
- Embora
true
efalse
são escolhas óbvias para A e B , você pode usar quaisquer dois valores distintos para o seu "é um palíndromo" e "não é um palíndromo" saídas, que não precisa ser booleans. - Estamos definindo a reversão de cadeia no nível do caractere aqui;
éé
é palíndrico, independentemente de o programa estar codificado em UTF-8 ou Latin-1, mesmo que não seja uma sequência palindrômica de octetos após a codificação UTF-8. - No entanto, mesmo que seu programa contenha caracteres não ASCII, ele precisará trabalhar apenas para entrada ASCII. Especificamente, a entrada S conterá apenas caracteres ASCII imprimíveis (incluindo espaço, mas não incluindo nova linha). Entre outras coisas, isso significa que, se você tratar a entrada como uma sequência de bytes, e não como uma sequência de caracteres, seu programa provavelmente ainda estará em conformidade com a especificação (a menos que a codificação de E / S do seu idioma seja muito estranha). Como tal, a definição de um palíndromo no item anterior realmente importa apenas quando se verifica se o programa possui a forma correta.
- Ocultar metade do programa em um comentário ou literal de string, apesar de não ser criativo, é legal; você está sendo pontuado no comprimento, não na criatividade; portanto, sinta-se à vontade para usar métodos "chatos" para garantir que seu programa seja um palíndromo. É claro que, como você está sendo pontuado no comprimento, partes do seu programa que não fazem nada pioram sua pontuação; portanto, poder usar as duas partes do seu programa provavelmente será útil se você puder gerenciá-lo. .
- Como o critério de vitória é medido em bytes, você precisará especificar a codificação na qual seu programa foi gravado para poder pontuá-lo (embora em muitos casos seja óbvio qual codificação você está usando).
Critério de vitória
Mesmo que o programa precise ser um palíndromo no nível do personagem, estamos usando bytes para ver quem ganha. Especificamente, quanto mais curto for o seu programa, medido em bytes, melhor; este é um desafio do código-golfe . Para permitir a comparação de envios (especialmente envios no mesmo idioma), coloque uma contagem de bytes para o seu programa no cabeçalho do envio (mais uma contagem de caracteres, se for diferente do número de bytes).
(
pora
e)
comb
. Éabab
um palíndromo? Não, teria que serabba
. Então()()
também não é um palíndromo; teria que ser())(
.()() is not a palindrome, but ())( is.
Parabéns, você chegou ao reddit!Respostas:
Brachylog (2), 3 bytes na página de códigos de Brachylog
Experimente online!
Este é um programa completo que recebe entradas via entrada padrão (usando a sintaxe de Brachylog para constantes, ou seja, as cadeias são colocadas entre aspas duplas) e sai via saída padrão. As saídas são
true.
para uma entrada palindrômica efalse.
para uma entrada não palindrômica.Este programa não é apenas palindrômico, mas também possui simetria no espelho esquerdo / direito (e provavelmente em algumas fontes para cima / para baixo).
Explicação
No Brachylog, as letras maiúsculas marcam pontos no programa que têm valores idênticos; isso é usado quase como um circuito elétrico para transportar informações de uma parte do programa para outra. Uma conseqüência disso é que, se você incluir um comando entre um par idêntico de letras maiúsculas, estará efetivamente afirmando que a entrada e a saída do comando são as mesmas. O Brachylog aceita implicitamente a entrada, portanto, neste caso, também estamos afirmando que a entrada do comando é a mesma que a entrada do programa. Neste programa, estamos usando o comando
↔
, que inverte as coisas (neste caso, strings); portanto, o programa efetivamente afirma que a entrada é a mesma para frente e para trás.Um programa completo (em oposição a uma função) no Brachylog retorna um booleano,
false.
se não houver maneira de corrigir todas as asserções do programa de uma só vez, outrue.
se as asserções do programa forem compatíveis entre si. Temos apenas uma afirmação aqui - que a reversão da entrada não a altera -, portanto, o programa atua como um verificador palíndromo.fonte
Pitão , 3 bytes
Retorna Verdadeiro ou Falso .
Experimente online!
Como funciona
fonte
_
?Python , 39 bytes
Experimente online!
Chato, mas se houver mais curto em Python, será impressionante.
fonte
(
,)
foram alguns bons (e confusas) entradas :)Gelatina , 5 bytes
Retorna 1 ou 0 . A primeira linha é um link auxiliar não executado, a segunda linha chama o teste palíndromo.
Experimente online!
fonte
Gelatina , 5 bytes
Experimente online!
É igual a reverso e reverso é igual.
Ou o mais eficiente e menos esteticamente agradável:
ou
fonte
Mathematica, 23 bytes
Não é muito interessante, mas por uma questão de perfeição ...
O acima é um
CompoundExpression
que avaliaPalindromeQ
, um interno que resolve o desafio.QemordnilaP
é simplesmente um identificador indefinido, que é ignorado por causa do;
.fonte
Haskell,
87854434 bytesExplicação:
((->) a)
é uma instância de Applicative (obrigado @faubiguy),<*>
definida comoAssim, substituindo nos argumentos, pode-se ver por que isso funciona.
fonte
--
é um comentário.(==)
,reverse
eid
funções (id
é a função identidade).<*>
vez de<$>
e removendo o<*>id
05AB1E , 3 bytes
Código:
Explicação:
Usa a codificação CP-1252 . Experimente online!
fonte
ÂQ
PHP, 55 bytes
Além disso, o nome do idioma é um palíndromo, então ... pontos de bônus!
fonte
MATL , 7 bytes
Experimente online!
Retorna [1; 1] para entrada palíndrica e [0; 0] caso contrário.
fonte
Pip ,
1211 bytesAgora sem comentários!
Recebe entrada como um argumento de linha de comando; saídas
1
para palíndromo,0
para não palíndromo. Experimente online!O núcleo do que queremos fazer é
RVaQa
:reverse(a) string-equals a
. O códigox:RVaQa
calcula esse resultado e o atribuix
. Em seguida,VR:x
atribui o valorx
à variávelVR
. Como essa atribuição é a última instrução do programa, seu valor também é impresso automaticamente. Voila!Para uma versão interessante anterior usando algum comportamento indefinido, consulte o histórico de revisões.
fonte
Perl 6 , 25 bytes / caracteres utf8
Tente
fonte
R,
111103 bytesNão é a resposta mais original.
#
é o caractere de comentário em RUngolfed:
A cadeia de caracteres de
scan
é convertida em bytes brutos, graças àcharToRaw
função Esses bytes brutos são comparados um a um aos seus equivalentes darev()
função, que reverte a ordem do seu argumento. A saída desta parte é um vetor deTRUE
e / ouFALSE
.A
all
função então geraTRUE
se todos esses elementos foremTRUE
Aqui,
"\n"
nascan
função é necessário para entradas com mais de uma palavra.Resposta anterior (em bytes), 81 bytes
com - 24 bytes graças a @rturnbull .
fonte
charToRaw
conversão antes da atribuiçãos
e alterando como define osep
argumentoscan
:all((s<-charToRaw(scan(,"",,,"\n")))==rev(s))#))s(ver==)))"n\",,,"",(nacs(waRoTrahc-<s((lla
éé
sob uma codificação UTF-8, mas eu não acho que quebra as regras do desafio.)éé
com umalatin1
codificação.RProgN , 11 bytes
A primeira metade disso faz todo o trabalho pesado e, por uma conveniência do RProgN, a segunda metade é um No-op.
Experimente online!
fonte
Retina , 53 bytes
A contagem de bytes assume a codificação ISO 8859-1.
Experimente online!
Tenho certeza de que isso ainda não é o ideal (a
»
linha parece particularmente esbanjadora e eu tenho uma solução de 45 bytes palindrômica, exceto um caractere), mas acho que é um começo.fonte
GNU sed ,
6459 + 1 (sinalizador r) = 60 bytes UTF-8Demorei um pouco para encontrar uma resposta sed que não usasse uma seção de comentários para tornar o código um palíndromo. Em vez disso, eu uso o
c
comando que imprimiria a primeira metade do código na ordem inversa, apenas garanto que esta instrução não seja alcançada.O script será impresso
1
se a sequência de entrada não for um palíndromo (pense nisso como um erro). Se a string for um palíndromo, nenhuma saída será fornecida (pense nela como saindo com êxito).Execute exemplos: ou Experimente online!
Explicação:
fonte
-r
não funciona, mas você pode simplesmente envolver tudo no BASH. Experimente Online!Alice , 19 bytes
Experimente online!
Imprime
Jabberwocky
para palíndromos e nada para não-palíndromos. Funciona para entrada UTF-8 arbitrária.Explicação
Como essa é uma tarefa de processamento de cadeia, Alice terá que operar no modo Ordinal para resolvê-la. Isso, por sua vez, significa que o ponteiro da instrução precisa se mover na diagonal e, portanto, precisamos de pelo menos duas linhas para que o IP possa saltar para cima e para baixo. O avanço de linha nesse programa contribui para uma boa posição para colocar o caractere do meio do palíndromo. Isso significa que a segunda linha precisa ser o inverso da primeira. Mas como estamos executando apenas todos os outros caracteres em cada linha, se tivermos certeza de que o comprimento da linha é ímpar, o inverso do código se ajustará perfeitamente às suas próprias lacunas. O único caractere que não é usado é a barra invertida, mas, como foi arbitrária, eu a escolhi para tornar o programa bonito e simétrico.
De qualquer forma, o código relevante é este:
Que é executado em zigue-zague da esquerda para a direita.
fonte
Haskell , 34 bytes
Experimente online! Ligue com
f "some string"
, retornaTrue
ouFalse
.O
=<<
operador em funções funciona assimf=<<g = \s -> f (g s) s
, então o código é equivalente af s=s==reverse s
, o qual, como acabei de notar, resultaria na mesma contagem de bytes.Versão sem comentário: (49 bytes)
Experimente online!
Ligue com
p "some string"
. Isso geraFalse
, se a string dada é um palíndromo, eTrue
se é não um palíndromo.Explicação:
Encontrei esse palíndromo livre de comentários começando com a versão do comentário e substituindo o comentário por uma nova linha:
A segunda linha falha porque os parênteses não coincidem, portanto, precisamos nos livrar deles. Se tivéssemos uma função
e
que verifica a igualdade, entãoserá tanto compilar com a segunda linha que define uma infixa-operador
<<=
que leva dois argumentosesrever
ee
e retorna a funçãop
.Para definir
e
como a função de igualdade, normalmente se escreveriae=(==)
, mas)==(=e
novamente não será compilado. Em vez disso, poderia levar explicitamente dois argumentos e passá-las para==
:e x y=x==y
. Agora, o código invertidoy==x=y x e
compila, mas redefine o==
operador, causandoe x y=x==y
falha na definição . No entanto, se mudarmos para o operador de desigualdade/=
, a definição invertida se tornay=/x=y x e
e define um=/
operador que não interfere no/=
operador original .fonte
ÓLEO , 178 bytes
Lê uma entrada, explode, adiciona lentamente seu comprimento (por meio de incrementos e decrementos) ao endereço para saber o endereço após a string, pula para uma parte diferente do código (no meio), inverte a direção da banda, implode a string novamente e verifica se é igual à string original. TL; DR: É uma dor, como sempre.
Saída
40
se a sequência não for um palíndromo,0
se for.fonte
Javascript, 64 bytes
Chamar função
f
com stringfonte
f
, seu código não atribui a sua função seta a uma variável por isso não pode ser chamadoJaponês ,
72 bytesExecutá-lo
Solução antiga:
Experimente online!
Explicação
Japt não escapa funções, a menos que um parêntese de fechamento (ou espaço) seja alcançado.
Isso pode ser reescrito:
U¥Uw(U¥U)
→U¥Uw
→U==Uw
. No Japt, o parêntese deixado de fora no início e no final de uma função é inserido automaticamente.fonte
w
é uma função que não aceita argumentos, como ela se aplicaU
? É algo parecidoU.reverse()
?U
da mesma maneira queU.reverse()
.Utilitários Bash + Unix, 49 bytes
A entrada é passada como argumento.
A saída é retornada no código do resultado - 0 para um palíndromo, 1 para um não-palíndromo.
Talvez alguém possa fazer melhor e não apenas confiar em um comentário para tornar o código palindrômico.
Experimente online!
fonte
[[ $1 = `rev<<<$1` ]]
é mais curto. ([[
Sintaxe Bash , sem aspas)rev<<<$1
são necessárias mesmo na[[...]]
solução. Teste-o com a sequência de entrada'[$]]$['
(que é um palíndromo). Com essas aspas adicionadas para fazê-lo funcionar, sua solução tem o mesmo tamanho da minha solução.==
in[[
seria interpretado como umcase
padrão parecido.> <>, 11 bytes
Experimente aqui!
Retorna "\ nalgo cheira a peixe ..." em um palíndromo válido, nenhuma saída em um palíndromo inválido. Coloque o palíndromo na pilha.
fonte
Java -
171169160 bytesO comentário no final é torná-lo um palíndromo. Retorna
P(alindrome)
quando a entrada é palíndromo eN(ot)
quando não.Versão não destruída:
2 bytes salvos graças ao @DLosc
Agradecemos a @Olivier Grégoire por apontar a quantidade incorreta de bytes! Corrigido agora
fonte
int
s em vez dechar
s.'P'
e 78 para'N'
ou usar caracteres diferentes para economizar ainda mais bytes.new StringBuffer(s).reverse()+""
vez denew StringBuffer(s).reverse().toString()
int
vez debool
?Java 8,
9290 bytesEsta é uma versão de comentário. Se uma string contém seu reverso, é um palíndromo (
true
), caso contrário não é (false
).Experimente online!
Atualizar
;
'sfonte
s->s.contains(new StringBuffer(s).reverse())//))(esrever.)s(reffuBgnirtS wen(sniatnoc.s>-s
. Experimente online 90 bytes .Na verdade , 5 bytes
Experimente online!
A saída
[1]\n[1]
verdadeira é e a saída falsey é[]\n[]
(em ambas as saídas,\n
representa uma nova linha literal).Explicação:
fonte
C ++, 154 bytes
Devo dizer que a afirmação inversa foi cara, mas não consigo imaginar muito que possa fazer para mudar isso. Ser capaz de cortar os símbolos std :: me salvaria em torno de 10 caracteres, mas "usando o namespace std;" é muito mais.
Suponho que C ++ não foi realmente feito para ser breve.
fonte
Prolog, 44 bytes
Isso usa gramáticas de cláusulas definidas. Na verdade, é uma gramática livre de contexto completo:
Uso:
fonte
CJam, 13 bytes
Explicação:
Exemplo:
fonte
l_W%#e#%W_l
J, 15 bytes, 15 caracteres
Retorna 1 se palíndromo, 0 se não.
Resultado:
Explicação:
fonte