Inspirado por este desafío (o, más específicamente, al interpretarlo mal), se me ocurrió el siguiente desafío:
Dada una cadena de entrada S, invierta el orden de todos los caracteres en mayúscula y todos los caracteres en minúscula. Deje todos los caracteres que no sean letras en su lugar. Por ejemplo:
Tenga en cuenta que la mayúscula W
(la primera letra mayúscula) se reemplazó por H
(la última). Lo mismo ocurre con las letras minúsculas: 'd' (la primera) se intercambia con e
(la última), l
(la segunda) se reemplaza con l
(pen-ultimate) ... Todos los caracteres que no son letras se dejan en su lugar.
Entrada
- La entrada es una cadena con solo caracteres ASCII en el rango 32-126.
- Se garantiza que la entrada tendrá al menos 1 carácter y no excederá el límite de su idioma.
Salida
- Esa misma cadena, con los caracteres intercambiados como se describe.
Reglas adicionales
- Las lagunas estándar están prohibidas
- La respuesta debe ser un programa completo o una función, no un fragmento o una entrada REPL.
- code-golf , la respuesta más corta en bytes gana.
Casos de prueba
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.*
)Respuestas:
MATL , 14 bytes
Pruébalo en MATL Online
Explicación
fuente
2:"tttXk>f)5MP(Yo
para 17 bytesRetina , 19 bytes
La retina no tiene una forma directa de invertir una cadena, pero podemos hacerlo explotando la etapa de clasificación:
Ordenar (
O
), leerlos como números (#
) y luego invertir el orden (^
) de todas las cadenas que coinciden con la expresión regular dada (letras minúsculas para la primera línea y letras mayúsculas para la segunda).Esto funciona porque cuando intentamos leer cadenas sin caracteres numéricos como números a los que se las trata
0
, por lo que todos los caracteres tienen el mismo valor para la ordenación. Dado que la ordenación es estable, se dejan en el mismo orden, y al invertirlos se devuelve la cadena original.Pruébalo en línea!
fuente
Perl , 45 bytes
44 bytes de código +
-p
bandera.Pruébalo en línea!
Clases de caracteres Unicode
\p{Lu}
y\p{Ll}
coincide con letras mayúsculas y minúsculas respectivamente.Por
/\p{L$c}/
lo tanto , devolverá la lista de todas las letras mayúsculas (o minúsculas) (y la almacenará dentro@T
).Y luego, la expresión regular
s/\p{$c}/pop@T/ge
reemplazará cada letra (mayúscula y luego minúscula) por la última letra de@T
mientras la elimina@T
.fuente
JavaScript (ES6),
74737170 bytesEditar: guardado 1 byte gracias a @Arnauld.
fuente
JavaScript (ES6), 92 bytes
No ha llegado a ser una forma de aprovechar la similitud entre las expresiones regulares ...
Fragmento de prueba
Mostrar fragmento de código
fuente
f
? ¿No debería estar en el conteo de bytes?F
luego la llama recursivamente dos veces. La función externa no se llama a sí misma en ningún momento..*
en las expresiones regulares?a
de([x],a,y)=>
)Perl 6 ,
7569 bytesCómo funciona
my @a=.comb;
Divide la cadena en caracteres y guárdalos en una matriz.
for /<:Lu>/,/<:Ll>/
Para dos expresiones regulares que coinciden con letras mayúsculas y minúsculas, respectivamente ...
@(grep $_,@a)
Obtenga una porción de todas las entradas de matriz que coincidan con la expresión regular.
.&{@$_=[R,] $_}
Asigne el reverso del corte a sí mismo.
[~] @a
Concatene la matriz modificada para formar una cadena nuevamente y devuélvala.
-6 bytes al robar la idea de usar clases Unicode en lugar de rangos de caracteres, de la solución de @ Dada.
fuente
Jalea , 14 bytes
Pruébalo en línea!
Cómo funciona
fuente
Bash + Unix utilidades,
122121 bytesPruébalo en línea!
Realmente no muy corto; tal vez alguien pueda jugar más golf.
Entrada en stdin, salida en stdout.
Esto funcionará correctamente en entradas de menos de 200 caracteres.
(En realidad, maneja correctamente cualquier cadena con menos de 200 letras minúsculas y menos de 200 letras mayúsculas).
Si aumenta el 99 en el código a 102 (a costa de un byte adicional), manejará cadenas de hasta 205 caracteres.
Sin embargo, no puede aumentar el 99 en el código más allá de 102 ya que luego excederá la longitud máxima de argumento de sed.
Aquí hay una versión sin ninguna limitación de tamaño de entrada particular, pero el recuento es un poco más largo, 137 bytes. (Esta versión más larga escribe en un archivo auxiliar llamado t).
Pruebas de funcionamiento:
fuente
sed
implementación instalada en su sistema, pero a GNUsed
puede agregar una-r
opción y eliminar el\
escape de todos los paréntesis.Python 2 , 115 bytes
Pruébalo en línea!
fuente
exec
se analiza como el código Python habitual, por lo que el bucle for debe estar en su propia línea.Java (OpenJDK 8) , 271 bytes
Pruébalo en línea!
fuente
s->new String...
char[]o=s.toCharArray();char c;int b;
al golf: achar o[]=s.toCharArray(),c,b;
; y ambos&&
a&
'; yc=o[i];return b>1?!Character.isUpperCase(c):!Character.isLowerCase(c);
ac=o[i];Character x=c;return b>1?!x.isUpperCase(c):!x.isLowerCase(c);
( 259 bytes en total ). Y probablemente me perdí algunas cosas para jugar más al golf. Además, si aún no lo ha visto, los consejos para jugar al golf en Java pueden ser interesantes de leer.R , 107 bytes
Adaptado de mi respuesta al desafío vinculado. Esto es considerablemente más fácil que simplemente intercambiar pares. Me pregunto si podría obtener sub 100 con algunos campos de golf ...
Pruébalo en línea!
fuente