Inspirado por esse desafio (ou, mais especificamente, por interpretá-lo mal), eu vim com o seguinte desafio:
Dada uma sequência de entrada S, inverta a ordem de todos os caracteres maiúsculos e minúsculos. Deixe todos os caracteres não alfabéticos no lugar. Por exemplo:
Observe que a maiúscula W
(a primeira letra maiúscula) foi substituída por H
(a última). O mesmo vale para as letras minúsculas: 'd' (o primeiro) é trocado por e
(o último), l
(segundo) é substituído por l
(caneta final) ... Todos os caracteres que não são letras são deixados no lugar.
Entrada
- Entrada é uma sequência com apenas caracteres ASCII no intervalo 32-126.
- É garantido que a entrada tenha pelo menos 1 caractere e não excederá o limite do seu idioma.
Saída
- Essa mesma sequência, com os caracteres trocados conforme descrito.
Regras adicionais
- As brechas padrão são proibidas
- A resposta deve ser um programa ou uma função completa, não um trecho de texto ou uma entrada REPL.
- code-golf , a resposta mais curta em bytes vence.
Casos de teste
A
A
Ok
Ok
OK
KO
Hello, World!
Wdlro, Holle!
0123456789
0123456789
The quick brown Fox jumps over the lazy doge
Feg odyza lehtr Tev ospmu jxon wor bkci uqeh
odd
ddo
racecar
racecar
EtOn Em OsN R AaToNsIsIhT!!1!
ThIs Is NoT A RaNsOmEnOtE!!1!
.+
a.*
)Respostas:
MATL , 14 bytes
Experimente no MATL Online
Explicação
fonte
2:"tttXk>f)5MP(Yo
por 17 bytesRetina , 19 bytes
O Retina não tem uma maneira direta de reverter uma string, mas podemos fazer isso explorando o estágio de classificação:
Sort (
O
), lendo-os como números (#
) e, em seguida, inverta a ordem (^
) de todas as strings correspondentes ao regex fornecido (letras minúsculas para a primeira linha e letras maiúsculas para a segunda).Isso funciona porque, quando tentamos ler cadeias sem caracteres numéricos como números, elas são tratadas como
0
, portanto, todos os caracteres têm o mesmo valor para classificação. Como a classificação é estável, elas são deixadas na mesma ordem e a reversão retorna a string original invertida.Experimente online!
fonte
Perl , 45 bytes
44 bytes de código +
-p
sinalizador.Experimente online!
Os caracteres Unicode classificam
\p{Lu}
e\p{Ll}
correspondem respectivamente às letras maiúsculas e minúsculas.Portanto
/\p{L$c}/
, retornará a lista de todas as letras maiúsculas (ou minúsculas) (e armazenará dentro@T
).E então, o regex
s/\p{$c}/pop@T/ge
substituirá cada letra (maiúscula e minúscula) pela última letra@T
ao removê-la@T
.fonte
JavaScript (ES6),
74737170 bytesEditar: salvou 1 byte graças a @Arnauld.
fonte
JavaScript (ES6), 92 bytes
Tem tem que haver uma maneira de tirar proveito da semelhança entre as expressões regulares ...
Snippet de teste
Mostrar snippet de código
fonte
f
? Isso não deveria estar na contagem de bytes?F
e a chama recursivamente duas vezes. A função externa não se chama de fato a qualquer momento..*
nas regexes?a
in([x],a,y)=>
)Perl 6 ,
7569 bytesComo funciona
my @a=.comb;
Divida a string em caracteres e armazene-os em uma matriz.
for /<:Lu>/,/<:Ll>/
Para duas regexes correspondentes às letras maiúsculas e minúsculas, respectivamente ...
@(grep $_,@a)
Obtenha uma fatia de todas as entradas da matriz que correspondem ao regex.
.&{@$_=[R,] $_}
Atribua o reverso da fatia a si próprio.
[~] @a
Concatene a matriz modificada para formar uma sequência novamente e retorne-a.
-6 bytes, roubando a ideia de usar classes Unicode em vez de intervalos de caracteres, da solução da @ Dada.
fonte
Gelatina , 14 bytes
Experimente online!
Como funciona
fonte
Utilitários Bash + Unix,
122121 bytesExperimente online!
Não é realmente muito curto; talvez alguém possa jogar mais.
Entrada em stdin, saída em stdout.
Isso funcionará corretamente em entradas com menos de 200 caracteres.
(Na verdade, ele manipula corretamente qualquer sequência com menos de 200 letras minúsculas e menos de 200 letras maiúsculas.)
Se você aumentar o 99 no código para 102 (ao custo de um byte adicional), ele manipulará seqüências de caracteres até 205 caracteres.
No entanto, não é possível aumentar o 99 no código além de 102, pois você excederá o tamanho máximo do argumento do sed.
Aqui está uma versão sem qualquer limitação de tamanho de entrada específica, mas a contagem é um pouco mais longa, 137 bytes. (Esta versão mais longa grava em um arquivo auxiliar chamado t.)
Execuções de teste:
fonte
sed
implementação instalada no seu sistema, mas no GNUsed
você pode adicionar-r
opções e remover os\
escapes de todos os parênteses.Python 2 , 115 bytes
Experimente online!
fonte
exec
é analisado como o código Python usual, portanto, o loop for deve estar em sua própria linha.Java (OpenJDK 8) , 271 bytes
Experimente online!
fonte
s->new String...
char[]o=s.toCharArray();char c;int b;
parachar o[]=s.toCharArray(),c,b;
; e ambos&&
para&
'; ec=o[i];return b>1?!Character.isUpperCase(c):!Character.isLowerCase(c);
parac=o[i];Character x=c;return b>1?!x.isUpperCase(c):!x.isLowerCase(c);
( 259 bytes no total ). E provavelmente perdi algumas coisas para jogar mais. Além disso, se você ainda não o viu, pode ser interessante ler dicas de golfe em Java .R , 107 bytes
Adaptado da minha resposta ao desafio vinculado. Isso é consideravelmente mais fácil do que apenas trocar pares. Gostaria de saber se eu poderia obter sub 100 com alguns golfe ...
Experimente online!
fonte