Objetivo
Este é um desafio simples. Seu objetivo é decifrar uma string trocando cada letra pela próxima letra do mesmo caso, mantendo inalterados os caracteres que não são da letra.
Explicação passo a passo
O primeiro caractere é a
E
. Procuramos a próxima letra em maiúscula: é aC
. Trocamos esses caracteres, o que leva aCdoE!
.Avançamos para o próximo caractere: este é a
d
. Procuramos a próxima letra em minúscula: é ao
. Trocamos esses caracteres, o que leva aCodE!
.Avançamos para o próximo personagem: é
d
isso que acabamos de mudar para cá. Nós o ignoramos, porque já foi processado.Nós avançamos para o próximo personagem: este foi o
E
que foi movido aqui para o passo 1. Nós o ignoramos, porque já foi processado.Avançamos para o próximo caractere: este é a
!
. Nós o ignoramos, porque não é uma carta.
Regras
Você pode assumir que a sequência de entrada é composta exclusivamente de caracteres ASCII imprimíveis, no intervalo de 32 a 126.
Você pode escrever um programa completo ou uma função que imprima ou retorne o resultado.
Se a sequência de entrada contiver um número ímpar de letras, a última letra restante não poderá ser trocada por outra e deve permanecer no lugar, independentemente do seu caso. A mesma lógica se aplica se a sequência contiver um número par de letras, mas um número ímpar de letras maiúsculas e um número ímpar de letras minúsculas.
Isso é código-golfe, então a resposta mais curta em bytes vence. As brechas padrão são proibidas.
Casos de teste
Input : lLEhW OroLd!
Output: hELlO WorLd!
Input : rpGOZmaimgn uplRzse naC DEoO LdGf
Output: prOGRamming puzZles anD COdE GoLf
Input : eIt uqHKC RBWOO xNf ujPMO SzRE HTL EOvd yAg
Output: tHe quICK BROWN fOx juMPS OvER THE LAzy dOg
Input : NraWgCi: Nsas-eNEiTIsev rNsiTG!!
Output: WarNiNg: Case-sENsITive sTriNG!!
Casos de teste não tão aleatórios:
Input : (^_^)
Output: (^_^)
Input : AWCTY HUOS RETP
Output: WATCH YOUR STEP
Input : hwn oeesd acsp nawyya
Output: who needs caps anyway
Input : SpMycaeIesKyBorekn
Output: MySpaceKeyIsBroken
Input : D's mroyr, Ivam. I'e faardi I act'n od htta.
Output: I'm sorry, Dave. I'm afraid I can't do that.
Respostas:
Geléia ,
21201918 bytesExperimente online!
Como funciona
fonte
Retina , 53 bytes
Não é realmente inteligente, mas uma solução limpa e bastante legível
Experimente online!
fonte
MATL , 22 bytes
Experimente online! Ou verifique todos os casos de teste .
Como funciona
fonte
Utilitários Bash + Unix,
7762575654 bytesEntrada em stdin. Saída em stdout.
(Nesta última versão, o stderr também foi gravado, mas o consenso do PPCG parece ser bom - o stderr é simplesmente ignorado. )
Edição 1: Obrigado a @Dennis por 15 bytes! Melhorias: (a) Recebendo informações via stdin; (b) combinar 2 scripts sed em um; e (c) substituir tr pela substituição via expansão dos parâmetros do bash; (b) e (c) desapareceram no Edit 2.
Edit 2: Menor por 5 bytes adicionais. Utilizou uma chamada de função para substituir os itens (b) e (c) na Edição 1.
Editar 3: Mais um byte passado] como parte dos argumentos da função.
Editar 4: substituídas as duas chamadas de função por chamadas para o próprio programa quando ele não possui argumentos.
Testbed e saída da amostra:
fonte
ES6,
18595 bytesSolução severamente reduzida com a ajuda de @Neil, @Arnauld e @ edc65
Explicação
fonte
/[a-z]/i.test(c)?o[e=c>"Z"]=1/(b=o[e])?[o[b],o[j]]=[c,o[b]]:j:0
[o[b],o[j]]=[c,o[b]]
poderia sero[o[j]=o[b],b]=c
Python , 82 bytes
Experimente online!
fonte
QBasic, 229 bytes
Estratégia
Passamos pela string de entrada. Quando encontramos uma letra maiúscula, a armazenamos e sua posição. Na segunda vez que encontramos uma letra maiúscula, usamos esses valores armazenados para trocá-la pela anterior. O mesmo para minúsculas.
(Eu estava prestes a publicar uma versão mais longa que usava uma matriz, porque achava que as strings QBasic eram imutáveis. Depois, me deparei com o fato de que
MID$(strng$, index, length) = replacement$
funciona muito bem. Viva e aprenda.)Ungolfed + comentou
fonte
C ++ 11 (GCC),
154149 bytesfonte
#include<string>
alternar para o C ++ 14 e declarar um lambda genérico[](auto s)
e assumirs
como sendostd::string
. Além disso, declarar[](auto&s)
evita que você retorne a string, pois é permitido modificar argumentos de entrada para servir como saída.Qbasic,
436408 bytesEconomizou um byte graças ao DLosc. Economizou vários outros alterando o tratamento de caracteres não-letra.
Isso basicamente consiste em três partes:
Uma explicação mais detalhada (observe que essa é uma versão anterior do código, mas o princípio ainda se aplica):
fonte
PHP,
1089383 bytesVersão anterior (93 bytes)
Obrigado a @ user59178 por me lembrar de que
preg_replace()
pode usar matrizes de strings como argumentos.A resposta original (108 bytes)
O código é agrupado aqui para caber no espaço disponível.
Pode ser executado na linha de comando:
Uma versão mais curta de 1 byte é possível no PHP 7 pressionando a atribuição
$f
dentro de sua primeira chamada:Ambas as soluções, com casos de teste e versões não destruídas, podem ser encontradas no Github .
fonte
preg_replace
Você pode precisar de uma variedade de substituições para fazer isso, basta uma chamada. Além disso, é mais curto de usar<?=
do queecho
. Com estes, é simples reduzir sua resposta a 93 bytes.preg_replace()
. Eu esqueci sobre isto. Não gosto<?=
(na minha opinião,<?
não faz parte da linguagem, é apenas um marcador) e gosto de escrever pequenos programas de uma linha que podem ser executados a partir da linha de comandophp -r
. Mas, para fins de código de golfe, você está certo novamente. Eu posso salvar 1 byte usando<?=
.Mathematica, 96 bytes
Um porto da resposta Retina de Leo , que usa expressões regulares.
fonte
Python 2 , 124 bytes
Não é tão curto quanto a minha solução baseada em regex , mas acho que ainda é interessante.
Experimente online!
fonte
Bean , 83 bytes
Hexdump:
JavaScript equivalente:
Explicação:
Pegar
a
implicitamente a primeira linha de entrada não formatada como (como as novas linhas não podem fazer parte da cadeia codificada) e gera implicitamente a cadeia não codificada substituindo sequencialmente os maiúsculos e os minúsculos.Experimente a demonstração aqui.
Experimente o conjunto de testes aqui.
fonte
Ruby, 81 bytes
fonte
JavaScript (ES6), 80 bytes
Com base na resposta da retina de Leo .
Isso funciona porque os únicos caracteres maiúsculos no código
.replace(/([A-Z])([^A-Z]*)([A-Z])/g,'$3$2$1')
sãoA
eZ
, que são usados para descrever os intervalos de caracteres. É exatamente isso que precisamos transformar em minúsculas para processar a segunda passagem.Casos de teste
Mostrar snippet de código
fonte
ES6 155 - 195 bytes
Eu sei que já existe uma resposta melhor, mas eu queria tentar sem regex. Este também funciona com pontuação, mas isso parece violar o
(^_^)
teste. Nesse caso, tenho outrac()
função, dada abaixo.Explicação
fonte
Perl 6 , 56 bytes
Pega uma variável de cadeia como argumento e modifica-a no local para que, depois de chamar o lambda, a variável contenha o resultado.
Mais do que seria em Perl, porque:
<[A..Z]>
vez de[A-Z]
.EVAL
, que permitiria mais flexibilidade, requer ouse MONKEY-SEE-NO-EVAL;
pragma hostil ao golfe .No lado positivo, uma matriz em uma
@
variável pode ser referenciada diretamente em uma regex e é tratada como uma alternância.Perl 6 , 65 bytes
Versão funcional (gera o resultado como o valor de retorno da lambda).
fonte
R, 343 bytes
Solução R terrivelmente desajeitada:
fonte
Python 2, 181 bytes
Muito mais longo do que deveria, mas de qualquer maneira:
Isso primeiro cria duas listas: um dos índices dos caracteres maiúsculos e outro para os caracteres minúsculos. Cada uma dessas listas é repetida em pares de índices, e os caracteres nesses índices são alternados.
Amanhã vou jogar golfe
, mas por enquanto é hora de dormir.fonte
Pip , 28 bytes
Recebe entrada como um argumento de linha de comando. Experimente online!
Explicação
Esta é uma solução de regex, usando as variáveis de regex incorporadas
XL
(letras minúsculas`[a-z]`
) eXU
(letras maiúsculas`[A-Z]`
).Quando o segundo argumento para
R
é uma lista, as substituições são executadas em série; portanto, a substituição em minúsculas e a substituição em maiúsculas não interferem entre si.fonte
Perl 5 , 48 + 1 (-p) = 49 bytes
Experimente online!
fonte
AWK ,
121129 bytesExperimente online! Nota: O link possui 8 bytes extras para permitir entrada de várias linhas
O uso é bastante típico, mas requer uma versão
AWK
que aceite uma string vazia como separador de campos (na maioria das versões,gawk
mas tenho certeza de que o originalAWK
falharia :()É muito simples, pois simplesmente itera sobre cada personagem e verifica se já foi encontrado um desses casos antes. Nesse caso, ele troca os caracteres e redefine o índice verificado. No lado da aprendizagem, eu nunca havia usado uma declaração de atribuição em uma declaração de atribuição
AWK
antes. Por alguma razão, isso nunca aconteceu. :)Talvez eu consiga raspar alguns bytes dizendo para atribuir OFS e FS fora de um
BEGIN
bloco via atribuição de linha de comando ou similar, mas é "mais limpo" dessa maneira.A adição do link TIO me mostrou que havia um erro de transcrição que exigia 8 bytes para corrigir :( (deixei de fora
0*(U=a):
)fonte
C (gcc) ,
212206 bytesExperimente online!
fonte
Stax , 18 bytes
Execute e depure
A abordagem geral é baseada em regex.
[a-z].*?[a-z]
.fonte
R ,
223163 bytes148 bytesEDIT: -60 bytes implementando um loop for
EDIT: -15 bytes de Giuseppe
Experimente online!
Funciona testando se o caractere é minúsculo ou maiúsculo, os coloca em uma matriz, inverte a matriz para extrair os valores em um formato trocado. Em seguida, imprima com
cat
. Experimente as dificuldades onlinescan(,'')
se o código tiver mais de uma linha, daí o ponto e vírgula em toda a linha de código.fonte
x
brincadeira é a parte mais inteligente, mas livrar-se dem=matrix
4 bytes também.scan(,'')
problema? E reduzindo o "lLEhW OroLd!" no TIO parascan(,'')
ou alguma outra maneira de obter entrada?Java 7, 117 bytes
EDIT: Acabei de notar que tenho uma resposta semelhante à resposta Retina do @Leo , embora tenha pensado nisso de forma independente ..
Ungolfed:
Código do teste:
Experimente aqui.
Resultado:
fonte