Gol
Este es un desafío simple. Su objetivo es descifrar una cadena intercambiando cada letra con la siguiente letra del mismo caso, sin modificar los caracteres que no sean letras.
Explicación paso a paso
El primer personaje es a
E
. Buscamos la siguiente letra en mayúscula: es aC
. Intercambiamos estos caracteres, lo que conduce aCdoE!
.Avanzamos al siguiente personaje: este es un
d
. Buscamos la siguiente letra en minúscula: es ao
. Intercambiamos estos caracteres, lo que conduce aCodE!
.Avanzamos al siguiente personaje: este es el
d
que acabamos de mudar aquí. Lo ignoramos porque ya ha sido procesado.Avanzamos al siguiente personaje: este es el
E
que se movió aquí en el paso 1. Lo ignoramos porque ya ha sido procesado.Avanzamos al siguiente personaje: este es un
!
. Lo ignoramos, porque no es una carta.
Reglas
Puede suponer que la cadena de entrada está hecha exclusivamente de caracteres ASCII imprimibles, en el rango de 32 a 126.
Puede escribir un programa completo o una función, que imprime o devuelve el resultado.
Si la cadena de entrada contiene un número impar de letras, la última letra restante no se puede intercambiar con otra y debe permanecer en su lugar, sin importar su caso. La misma lógica se aplica si la cadena contiene un número par de letras, pero un número impar de letras mayúsculas y un número impar de letras minúsculas.
Este es el código de golf, por lo que gana la respuesta más corta en bytes. Las lagunas estándar están prohibidas.
Casos de prueba
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 prueba no tan aleatorios:
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.
Respuestas:
Jalea ,
21201918 bytesPruébalo en línea!
Cómo funciona
fuente
Retina , 53 bytes
No es realmente inteligente, pero es una solución limpia y bastante legible
Pruébalo en línea!
fuente
MATL , 22 bytes
Pruébalo en línea! O verificar todos los casos de prueba .
Cómo funciona
fuente
Utilidades Bash + Unix,
7762575654 bytesEntrada en stdin. Salida en stdout.
(En esta última versión, stderr también está escrito, pero el consenso de PPCG parece ser que está bien, simplemente se ignora stderr ) .
Edición 1: ¡Gracias a @Dennis por 15 bytes! Mejoras: (a) Tomar entrada a través de stdin; (b) combinar 2 scripts sed en uno; y (c) reemplazar tr con sustitución mediante expansión de parámetros bash; (b) y (c) desaparecieron en Edit 2.
Edición 2: más corta en 5 bytes adicionales. Usó una llamada de función para reemplazar tanto (b) como (c) en Editar 1.
Edición 3: Un byte más pasado] como parte de los argumentos de la función.
Edición 4: reemplazó las dos llamadas de función con llamadas al programa en sí cuando no tiene argumentos.
Testbed y salida de muestra:
fuente
ES6,
18595 bytesSolución severamente acortada con la ayuda de @Neil, @Arnauld y @ edc65
Explicación
fuente
/[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]]
podría sero[o[j]=o[b],b]=c
Python , 82 bytes
Pruébalo en línea!
fuente
QBasic, 229 bytes
Estrategia
Recorremos la cadena de entrada. Cuando encontramos una letra mayúscula, la almacenamos y su posición. La segunda vez que encontramos una letra mayúscula, usamos esos valores almacenados para intercambiarla con la anterior. Lo mismo para minúsculas.
(Estaba a punto de publicar una versión bastante más larga que usaba una matriz, porque pensé que las cadenas QBasic eran inmutables. Luego me topé con el hecho de que
MID$(strng$, index, length) = replacement$
funciona bien. Vive y aprende).Ungolfed + comentó
fuente
C ++ 11 (GCC),
154149 bytesfuente
#include<string>
o cambiar a C ++ 14 y declarar un lambda genérico[](auto s)
y asumirs
que es destd::string
. Además, la declaración[](auto&s)
evita que devuelva la cadena, ya que se permite modificar los argumentos de entrada para que sirvan como salida.Qbasic,
436408 bytesGuardado un byte gracias a DLosc. Se ahorraron varios más al cambiar el manejo de los caracteres que no son letras.
Esto consiste básicamente en tres partes:
Una explicación más detallada (tenga en cuenta que se trata de una versión anterior del código, pero el principio todavía se aplica):
fuente
PHP,
1089383 bytesVersión anterior (93 bytes)
Gracias a @ user59178 por recordarme que
preg_replace()
puede tomar matrices de cadenas como argumentos.La respuesta original (108 bytes)
El código se envuelve aquí para adaptarse al espacio disponible.
Se puede ejecutar desde la línea de comando:
Es posible una versión más corta de 1 byte en PHP 7 apretando la asignación de
$f
dentro de su primera llamada:Ambas soluciones, con casos de prueba y versiones no protegidas, se pueden encontrar en Github .
fuente
preg_replace
puede tomar una variedad de reemplazos para hacerlo, por lo que solo necesita una llamada. Además, es más corto de usar<?=
queecho
. Con estos, es simple obtener su respuesta a 93 bytes.preg_replace()
. Me habia olvidado de eso. No me gusta<?=
(en mi opinión<?
no es parte del lenguaje, es solo un marcador) y me gusta escribir programas cortos de una línea que se puedan ejecutar desde la línea de comandos usandophp -r
. Pero para el propósito del código golf tienes razón otra vez. Puedo guardar 1 byte usando<?=
.Mathematica, 96 bytes
Un puerto de respuesta de Retina de Leo , que utiliza expresiones regulares.
fuente
Python 2 , 124 bytes
No es tan corto como mi solución basada en expresiones regulares , pero creo que sigue siendo interesante.
Pruébalo en línea!
fuente
Bean , 83 bytes
Hexdump:
JavaScript equivalente:
Explicación:
Toma implícitamente la primera línea de entrada sin formatear como
a
(ya que las nuevas líneas no pueden ser parte de una cadena codificada), y genera implícitamente una cadena sin codificar reemplazando secuencialmente los pares en mayúscula y luego en minúscula.Prueba la demo aquí.
Prueba el paquete de prueba aquí.
fuente
Ruby, 81 bytes
fuente
JavaScript (ES6), 80 bytes
Basado en la respuesta de Leo Retina .
Esto funciona porque los únicos caracteres en mayúscula en el código
.replace(/([A-Z])([^A-Z]*)([A-Z])/g,'$3$2$1')
sonA
yZ
, que se utilizan para describir los rangos de caracteres. Esto es precisamente lo que necesitamos transformar en minúsculas para procesar el segundo paso.Casos de prueba
Mostrar fragmento de código
fuente
ES6 155 - 195 bytes
Sé que ya hay una mejor respuesta, pero quería probar sin expresiones regulares. Este también funciona en la puntuación, pero parece violar la
(^_^)
prueba. En ese caso tengo otrac()
función, dada a continuación.Explicación
fuente
Perl 6 , 56 bytes
Toma una variable de cadena como argumento y la modifica in situ para que después de llamar a lambda la variable contenga el resultado.
Más largo de lo que sería en Perl, porque:
<[A..Z]>
lugar de[A-Z]
.EVAL
, que permitiría una mayor flexibilidad, requiere eluse MONKEY-SEE-NO-EVAL;
pragma hostil al golf .En el lado positivo, una matriz en una
@
variable se puede referenciar directamente en una expresión regular, y se trata como una alternancia.Perl 6 , 65 bytes
Versión funcional (genera el resultado como el valor de retorno de la lambda).
fuente
R, 343 bytes
Solución R terriblemente torpe:
fuente
Python 2, 181 bytes
Mucho más de lo que debería ser, pero de todos modos:
Esto crea primero dos listas: uno de los índices de los caracteres en mayúscula y otro para los caracteres en minúscula. Cada una de estas listas se repite en pares de índices, y los caracteres en esos índices se cambian.
Mañana jugaré golf
, pero por ahora es hora de dormir.fuente
Pip , 28 bytes
Toma entrada como argumento de línea de comando. Pruébalo en línea!
Explicación
Esta es una solución de expresiones regulares, utilizando las variables de expresión regular incorporadas
XL
(letras minúsculas`[a-z]`
) yXU
(letras mayúsculas`[A-Z]`
).Cuando el segundo argumento
R
es una lista, los reemplazos se realizan en serie; por lo tanto, el reemplazo en minúsculas y el reemplazo en mayúsculas no interfieren entre sí.fuente
Perl 5 , 48 + 1 (-p) = 49 bytes
Pruébalo en línea!
fuente
AWK ,
121129 bytesPruébalo en línea! Nota: el enlace tiene 8 bytes adicionales para permitir la entrada multilínea
El uso es bastante típico, pero requiere una versión
AWK
que acepte una cadena vacía como separador de campo (la mayoría de las versiones de,gawk
pero estoy bastante seguro de que el originalAWK
fallará :()Es muy sencillo, ya que simplemente itera sobre cada personaje y comprueba si ha encontrado uno de esos casos antes. Si es así, intercambia los caracteres y restablece el índice marcado. En el lado del aprendizaje, nunca antes había usado una declaración de asignación dentro de una declaración de asignación
AWK
. Por alguna razón, nunca había surgido. :)Podría ser capaz de reducir un par de bytes diciendo que asigne OFS y FS fuera de un
BEGIN
bloque mediante la asignación de línea de comando o similar, pero es "más limpio" de esta manera.Agregar el enlace TIO me mostró que tenía un error de transcripción que requería 8 bytes para solucionarlo :( (lo dejé fuera
0*(U=a):
)fuente
C (gcc) ,
212206 bytesPruébalo en línea!
fuente
Stax , 18 bytes
Ejecutar y depurarlo
El enfoque general se basa en expresiones regulares.
[a-z].*?[a-z]
.fuente
R ,
223163bytes148 bytesEDITAR: -60 bytes implementando un bucle for
EDITAR: -15 bytes de Giuseppe
Pruébalo en línea!
Funciona probando si el carácter es minúscula o mayúscula, los coloca en una matriz, invierte la matriz para extraer los valores en un formato intercambiado. Luego salida con
cat
. Pruébelo en línea con problemasscan(,'')
si el código es más de una línea, por lo tanto, los puntos y comas en toda la línea de código.fuente
x
violín es el bit inteligente, pero eliminarlo tambiénm=matrix
era de 4 bytes.scan(,'')
problema? ¡Y reduciendo el "iLEhW OroLd!" en TIOscan(,'')
o de alguna otra manera para obtener información?Java 7, 117 bytes
EDITAR: Acabo de notar que tengo una respuesta similar a la respuesta Retina de @Leo , a pesar de que lo he pensado de forma independiente.
Sin golf:
Código de prueba:
Pruébalo aquí
Salida:
fuente