Para que você usa a reversão de string? [fechadas]

15

No PHP strrev(), no Rails .reverse, mas a maioria das linguagens não possui nenhuma função de reversão de string. Alguns possuem funções de inversão de matriz que podem ser usadas em caracteres. Eu estava pensando que isso deve ser uma grande fiscalização, mas então me ocorreu: para que você realmente usaria o reverse reverse?

A única vez que posso pensar que já vi isso é em demos e lições para virar "Olá Mundo!" em "! dlroW olleH".

Minha pergunta é; Existe um uso para reverter uma string ou é completamente inútil?

.

Termo aditivo

Havia muito mais respostas que eu previra e nem todas eram inteiramente acadêmicas. Eu teria apostado que ninguém poderia inventar um exemplo legítimo. Também não achei que fosse aprender algo novo, mas a sugestão de regex de Mark Canlas é simplesmente brilhante e aguardo com expectativa a oportunidade de provar a si mesma. Obrigado a todos.

clockworkgeek
fonte
@clockworkgeek - se você pedir a um candidato para fazer a reversão de cadeia de caracteres no idioma favorito, ficará surpreso com o número de pessoas que não apresentam a função básica mencionada. Então, quantos não podem criar um loop para implementá-lo eles mesmos.
Just
@justkt - Essa é outra questão que está esperando para acontecer, mas pode ser um tópico para o TopCoder.
Clockworkgeek
6
Para enviar uma mensagem de texto que possa ser lida no espelho retrovisor enquanto estiver dirigindo, para que os policiais não notem.
JeffO
@justkt - Se eu tivesse que escrever um loop iterativo para fazê-lo, começaria nas extremidades opostas, trocando caracteres até chegar ao meio. Mas então como você troca dois valores? Aqui é simplesmente a melhor resposta que já foi dada:a ^= b; b ^= a; a ^= b;
clockworkgeek
1
Eu uso reversão de string para reverter strings;)
Muad'Dib

Respostas:

19

Sexegers

Às vezes, problemas que envolvem expressões regulares podem ser escritos com mais facilidade, revertendo a string de entrada e resolvendo o problema de uma maneira diferente.

Técnica cortesia do homem que me ensinou Perl.

Sexeger em PerlMonks

Mark Canlas
fonte
Obrigado. Um truque muito útil para encontrar o último de algo. Devidamente anotado.
clockworkgeek
Eu venho fazendo isso há anos. Ajuda na análise de endereços de email.
sal
23

Bem, esta é uma resposta explícita.

"Antigamente" eu possuía uma caixa Unix, e ela tinha um arquivo de dicionário ordenado de palavras em inglês, usado para verificação ortográfica.

Criei um novo arquivo revertendo todas as palavras do dicionário, classificando-as e depois revertendo-as novamente. O resultado foi uma lista de palavras classificadas da direita para a esquerda.

Portanto, se você pesquisasse uma palavra, ao lado dela haveriam palavras com finais semelhantes. Então foi fácil fazer pequenos poemas!

Você pode realmente se divertir quando vê o que rima com o quê.

Mike Dunlavey
fonte
13

Tenho sido um codificador / programador / sysadmin para ~ 10 anos e não me lembro sempre precisando de reversão corda em situações da vida real.

O único caso de uso imediato em que consigo pensar é na conversão de base numérica: feito de forma ingênua, o procedimento retorna uma string invertida. No entanto, com um pouco de matemática, você pode calcular antecipadamente a quantidade de espaço necessária, para poder começar a preencher o buffer a partir do final.

zvrba
fonte
1
É possível que um pouco de matemática seja mais caro do que reverter a string, portanto, após o benchmarking na sua plataforma (ARM, MIPS, x86), você poderá usar um reverso de string. Talvez.
Zan Lynx
Você pode preencher o buffer a partir do final e usar a memmoveaté o início quando terminar. Provavelmente é mais barato do que calcular log (n) / log (base) para calcular o número de dígitos necessários.
Patrick Schlüter
12
public bool IsPalindrome(string toCheck)
{
    return toCheck == toCheck.Reverse();
}
Scott Whitlock
fonte
1
Sim - na verdade, temos uma triagem de entrevistas em que os candidatos escrevem um verificador palíndromo e a maioria faz isso. No entanto, eu gosto melhor quando os candidatos iteração a partir 0de n/2e comparar o personagem na extremidade oposta.
Nicole
@ Renesis: Você também pode fazer: definir o início da string, q fim da string, while ( (*p == *q) && (p <= q) {p++; q--} return p > q;em C e outros idiomas dos ponteiros.
Michael K
4
Suponho que, embora um "verificador palíndromo" não seja notavelmente útil ", escreva um verificador palíndromo" pelo menos tenha um propósito.
clockworkgeek
2
Em uma entrevista, eles me pediram para reverter uma string e disseram "lembre-se disso sem string.Rverse (). Então, eu apenas converti a string em uma matriz de caracteres e fiz Array.Reverse
Jack Marchetti
Esse é um nicho bastante usado e não um que você geralmente diria que valeria a pena incluir na linguagem / biblioteca!
Dan Diplo
8

Entrevistas!

A reversão de uma string (no lugar ou não) é uma pergunta de entrevista muito comum para conhecimentos básicos de programação. Seria difícil entrevistar um idioma sem essas funções integradas. O candidato realmente teria que saber alguma coisa. 1


1: Esta é uma resposta explícita.

Josh K
fonte
6

Vi situações em que um aplicativo de desktop conversava com dispositivos incorporados e alternava constantemente a ordem de bytes e os dados eram movidos como strings. Mas é sobre isso para mim.

Eu não teria usado seqüências de caracteres para esse aplicativo, mas é assim que era ...

whatsisname
fonte
+1 para esta resposta. É pelo menos um exemplo prático, embora eu também o tivesse feito de outra maneira, talvez escolhendo tipos primitivos que sejam diferentemente enddianos.
clockworkgeek
5
<span style="unicode-bidi: bidi-override; direction:rtl;">
    <?php echo strrev($emailaddress); ?>
</span>

Não é a melhor solução para ofuscar um endereço de e-mail, pois quando você o adiciona à área de transferência, ele ainda é revertido. E, se se tornasse popular, logo seria detectado por e-mail raspando bots.

Ainda assim, foi sugerido .

Nicole
fonte
1
E a ofuscação mais popular em uso recebeu apenas uma frase em todo o artigo ... Codificação como imagem.
clockworkgeek
1
@clockworkgeek, pode ser popular, mas IMHO é a pior das soluções eficazes - não é fácil de gerar, não é embutida em HTML (velocidade, armazenamento de imagens, carregamento do servidor), parece fora do lugar, não pode ser estilizada com CSS e a mesma experiência ruim do usuário como reversão de string, de ter que lembrar e redigitar. E provavelmente mais problemas em que não estou pensando.
Nicole
Curiosamente, porém, o uso do AT e DOT, o mais fácil de decodificar para uma colheitadeira, acaba tendo uma eficácia quase perfeita na prevenção da colheita. Às vezes, mantê-lo simples não é uma má idéia.
Joeri Sebrechts
5

ASCII não é a melhor codificação para informações genéticas (você pode incluir os tipos de base ACGT como 2 bits). Empacote-os em uma série de longos e você receberá 32 "letras" genéticas por palavra. O DNA pode ser revertido, então você deve verificar um pedaço de DNA em ambos os lados, cópias reversas de uma sequência de teste. Portanto, ser capaz de reverter uma sequência compactada de quantidades de 2 bits pode ser muito útil para vários tipos de análises genéticas.

Eu tinha como item de referência para agências de espionagem, com que rapidez você pode reverter os bits por muito tempo (na verdade, uma variedade muito longa de longos). O método óbvio de trocar 2 bits por vez é muito mais lento que os métodos menos óbvios. Eles estão relacionados a alguns dos algoritmos puros para a transposição de matriz no local.

Tangurena: A operação a que você se refere é chamada de contagem da população. Desejáveis ​​semelhantes para dados compactados em bits estão levando e contando zero. Há muitas coisas realmente legais que se pode fazer com dados compactados em bits. Uma única operação em um longo período é paralela aos dados de 64 vias; portanto, se você souber o que está fazendo, poderá obter um desempenho incrível para certos tipos de computação.

Omega Centauri
fonte
Tópico interessante, como você inverteria um campo de bits?
clockworkgeek
"como você reverteria um campo de bits?"
Omega Centauri
2
Uma abordagem é a pesquisa de tabela. Você pode reverter um byte usando uma tabela. Então você pode fazer isso nos bytes individuais. Também existem maneiras de mover vários bits e uma vez ... Um pouco de esperteza e vantagens (tamanho da tabela versus número de operações etc.) e você pode tentar ajustá-lo.
Omega Centauri
5

Qualquer coisa em que trabalhar com a sequência invertida é mais fácil.

Trabalhar com números inteiros como seqüências de caracteres é muito mais fácil se elas forem revertidas. Criei algumas funções de biblioteca para fazer matemática com números inteiros grandes e usei a reversão de cadeias para simplificar as funções aritméticas.

É verdade que só o usei para dar respostas ao Projeto Euler, mas ainda assim, a premissa original é válida.

Machado
fonte
+1. ao usar representações de números de strings, a representação invertida é muito útil. e geralmente a biblioteca padrão representará números na ordem normal.
back2dos
3

Talvez suporte multilíngue de baixo custo, para idiomas que usam letras da direita para a esquerda (como o árabe), em vez da esquerda para a direita. Claro que você deve ter cuidado com os caracteres acentuados que modificam o caractere certo ...

Cyclops
fonte
2

Não sei, talvez alguém tenha uma necessidade ardente de procurar palíndromos ...

Não acho que seja completamente inútil, pois pode haver situações em que é preciso ser capaz de reverter uma string.

Noite escura
fonte
A pergunta seguinte seria: quando você já precisou verificar um palíndromo no mundo real? Novamente, eu só vi alguém se importar com lições de algoritmo.
clockworkgeek
como este, por exemplo: jimsabo.com/palindrome.html
Darknight
Acho que provavelmente existem outros usos, mas é específico do domínio. Por exemplo, se as pesquisas de seqüência de caracteres foram otimizadas para pesquisa direta e você desejou fazer várias pesquisas para a última ocorrência, convém revertê-la primeiro. Porém, isso seria uma otimização e não deve ser feito, a menos que exista um caso comprovável. Eu poderia imaginar um algoritmo para gerar um hash de um valor de string que desejasse usar o final da cauda, ​​possivelmente revertido, se isso proporcionasse melhores características de hash.
Scott Whitlock
2

No processamento e análise de linguagem natural, às vezes é mais fácil pesquisar uma string do fim ao começo. Um reverso de string seria útil para depuração ou como uma maneira alternativa de escrever o loop (inverta o string e depois faça um loop do índice 0 ao n-1).

Além disso, alguns idiomas são escritos da direita para a esquerda, portanto, um inversor de string pode ser usado para isso se você estiver em um ambiente que não reconheça nativamente os idiomas LTR / RTL.

Uma string (em alguns idiomas) é uma matriz de caracteres, mas também pode ser contracheques ou modificações de inventário. Em um loop que se desloca entre eles, você pode fazer alguns cálculos que devem ser os mesmos, independentemente da ordem em que você os processa. Um teste de unidade perfeitamente cromulento seria verificar se os cálculos se aplicam da mesma forma para a frente ou para trás. Isso pode ser trivialmente óbvio para adição, talvez não para outras operações mais opacas.

MatthewMartin
fonte
1

Para compiladores?

É divertido, mas a maioria dos símbolos em um idioma começará por um padrão comum. Não estou falando sobre notação húngara aqui, mas se você pensar em namespace / classes, muitos símbolos realmente compartilharão um prefixo comum .

myproject::SomeClass::GetFoo
myproject::SomeClass::GetBar

O problema é que, ao fazer uma pesquisa binária, os prefixos comuns são a pior coisa com a qual você pode acabar, porque você comparará esses prefixos repetidamente.

Por outro lado, se você olhar as cordas para trás, verá muito mais entropia! E, de repente, uma pesquisa binária (sobre um Trie) fica muito mais poderosa!

Sempre me incomodou que os nomes desconfigurados do C ++ (por gcc) não fossem revertidos para colocar o namespace LAST :)

Matthieu M.
fonte
0

Inverto números de telefone e algumas sequências para pesquisas de tempos em tempos

Don
fonte
0

A única vez em que me lembro de ter sido usada a reversão de cadeia de caracteres foi uma função que vi no passado, quando a utilizava ao analisar nomes de arquivos, para garantir que o '.' encontrado no nome do arquivo foi de fato o último ponto que separou o nome do arquivo da extensão. ou seja, ao analisar um nome de arquivo data.2010.12.08.dat, você inverte a string, encontra o primeiro ponto, subtrai essa posição do final da string original e pega a substring. Não estou dizendo que é a maneira ideal de fazê-lo, mas foi o que ele fez. Pode ter sido no powerbuilder, onde esses usos estranhos de funções eram comuns para solucionar vários problemas não óbvios.

GrandmasterB
fonte
0

O único aplicativo de worls reais que eu vi usando o strrev era armazenar senhas de usuário 'ilegíveis' no banco de dados ...

Mas eu lembro que existe um padrão em C para usar o strrev, talvez eu o invente depois.


fonte