Su desafío es escribir un programa o función que, cuando se le dan dos cadenas de igual longitud, intercambia cada otro carácter y genera / devuelve las cadenas resultantes en cualquier orden.
Ejemplos
"Hello," "world!" --> "Hollo!" "werld,"
"code" "golf" --> "codf" "gole"
"happy" "angry" --> "hnpry" "aagpy"
"qwerty" "dvorak" --> "qvertk" "dworay"
"1, 2, 3" "a, b, c" --> "1, b, 3" "a, 2, c"
"3.141592653589" "2.718281828459" --> "3.111291623489" "2.748582858559"
"DJMcMayhem" "trichoplax" --> "DrMcMoylex" "tJichapham"
"Doorknob" "Downgoat" --> "Doonkoot" "Dowrgnab"
"Halloween" "Challenge" --> "Hhlloeegn" "Caallwnee"
Reglas
- Las cadenas solo contendrán caracteres ASCII (32-126).
- Las cadenas siempre tendrán la misma longitud y nunca estarán vacías.
- Puede aceptar entradas en cualquier formato adecuado: parámetros separados, elementos en una matriz, separados por una o más líneas nuevas, incluso concatenados. La única restricción es que una cadena debe aparecer completamente antes que la otra (por ejemplo,
a1\nb2\nc3
for"abc", "123"
no es válida). - La salida puede estar en cualquier orden (es decir, puede comenzar a intercambiar desde el primer o el segundo carácter), y en cualquier formato válido mencionado anteriormente. (Matriz de 2 elementos, separados por línea (s) nueva, concatenados, etc.)
Tanteo
Este es el código de golf , por lo que gana el código más corto en bytes para cada idioma.
DrMcMoylex
. : DRespuestas:
Haskell, 37 bytes
Comprime las dos cadenas, alternando alternativamente los caracteres, luego descomprime.
Una alternativa recursiva de 37 bytes:
fuente
Python, 42 bytes con golf de E / S
Intercambia cualquier otro personaje de las dos listas. Toma como entrada dos listas de caracteres y sale modificándolos .
da
fuente
Vim,
18, 17 bytesPruébalo en línea!
Esto utiliza el intérprete de V debido a la compatibilidad con versiones anteriores. La entrada viene en este formato:
Explicación:
fuente
x
lugar deyl
y luego jus enP
lugar de segundovP
:lqqxjvPkPll@qq@q
[save]
botón? De cualquier manera, no está funcionando para mí . La verdadera razón es porque cuando eresx
el último personaje en la línea, mueve el cursor hacia la izquierda, arruinando la ubicación del intercambio.Haskell, 41 bytes
Devuelve un par con las cadenas. Ejemplo de uso:
( (unzip.).(#) ) "Hello," "world!"
->("Hollo!","werld,")
.Enfoque recursivo simple: tome el primer carácter de cada cadena como un par y agregue una llamada recursiva con el (resto de) cadenas intercambiadas.
unzip
hace un par de listas de la lista de pares.fuente
05AB1E ,
1110 bytesPruébalo en línea!
Explicación
input =
["code", "golf"]
usado como ejemplo.fuente
Perl, 48 bytes
Bytecount incluye 47 bytes de código y
-p
bandera.Corre con
-p
y-E
bandera. Espere cada cadena en una línea diferente:Explicaciones :
-p
: captura la entrada$_
y la imprime al final. (para obtener e imprimir la primera cadena)<>
: obtenga una línea de entrada. (para obtener la segunda cadena).=~
: aplica una expresión regular a<>
:,s%%%geer
donder
se devuelve gracias a la cadena modificada (y luego se imprime gracias asay
).La expresión regular:
.\K(.)
encuentra dos caracteres y reemplazará el segundo con el resultado de la evaluación de este código"s/.{$-[0]}\\K(.)/$1/;\$1"
:la primera parte,
s/.{$-[0]}\\K(.)/$1/
aplica una expresión regular a$_
: y la reemplaza con el carácter de la expresión regular externa ( ). Y luego agregamos, por lo que el resultado es el personaje que capturamos en la expresión regular interna. Puede que hayas notado que.{$-[0]}
omite los primeros caracteres para llegar al mismo punto que la expresión regular externa (ya que$-[0]
contiene índice del primer grupo de captura, entonces en ese caso el índice de los caracteres a sustituir), y luego capturamos un carácter con(.)
$1
$1
"s/.{$-[0]}\\K(.)/$1/;\$1"
$1
nos referimos al carácter que queremos reemplazar en ambas cadenas (por lo tanto, dos caracteres diferentes), así que jugamos con el/ee
modificador de la expresión regular que evalúa el lado derecho de la expresión regular dos veces: el primero sustituirá solo el$1
que no está precedido por el\
.fuente
Python, 55 bytes
Rebanar!
58 bytes:
64 bytes:
Acumula recursivamente los caracteres de las dos cadenas en
s
yt
, y genera el par de ellas al final. La alternancia se realiza cambiando las cadenas de entrada de cada llamada recursiva. La salida de una cadena separada por espacios tenía la misma longitud:Esto superó por poco una estrategia recursiva diferente de tomar alternativamente caracteres de cada cadena, con cada una de las dos cadenas posibles como la primera. (65 bytes)
fuente
MATL ,
111098 bytes¡Gracias a ETHproductions por 1 byte de descuento!
La entrada es una matriz 2D que contiene las dos cadenas, como:
['Halloween'; 'Challenge']
. Las cadenas de salida están en orden inverso.Pruébalo en línea!
Explicación
Versión anterior: 9 bytes
Explicación
fuente
Jalea , 5 bytes
La entrada es como argumentos separados, la salida se concatena.
Pruébalo en línea! o verificar todos los casos de prueba .
Cómo funciona
fuente
Gelatina ,
986 bytes¡Gracias a Dennis por guardar 2 bytes!
Utiliza la codificación Jelly .
Pruébalo en línea!
fuente
ṙ"J$
lugar deĖṙ@/€
. Además, no es necesario separar la cadena, por lo que puede soltar elY
.V , 12 bytes
Pruébalo en línea!
Nada demasiado interesante, solo un puerto directo de mi respuesta vim para que pueda competir con (pero no vencer) 05AB1E.
fuente
Pyke, 9 bytes
Pruébalo aquí!
fuente
JavaScript (ES6), 51
54Editar 3 bytes guardados gracias a @Neil
Función con entrada / salida de matriz
Me gusta más, pero es 55 (2 cadenas en entrada, matriz en salida)
Prueba
fuente
replace
le ahorra 3 bytes:p=>p.map((w,i)=>w.replace(/./g,(c,j)=>a[i+j&1][j]))
.Pyth, 8 bytes
Pruébelo en línea: demostración
Transpone las palabras, invierte cada par de letras 'índice actual'-veces, transpone nuevamente.
fuente
JavaScript (ES6), 55 bytes
Quería hacer algo inteligente con el uso de regexp para reemplazar caracteres alternativos, pero eso terminó tomando
6757 bytes:fuente
f=([a,...A],[b,...B])=>a?[a+f(B,A)[0],b+f(A,B)[0]]:[""]
para la misma longitud.map
, redujo 10 bytes de mi respuesta regexp. Aunque todavía es demasiado largo.Perl, 40 bytes
Incluye +1 para
-n
Dar cadenas como líneas en STDIN
interlace.pl
fuente
Java,
132103100 bytes¡Gracias a Kevin Cruijssen por sugerir devolver la matriz (entre otras mejoras) y guardar 29 bytes! ¡También Olivier Grégoire por 3 bytes!
Llamado así:
Salida:
Hollo,werld!
Aprovecha el hecho de que la entrada básicamente puede formatearse de cualquier manera (en este caso, una única matriz de caracteres de cadenas que están delimitadas por una coma) y reglas de salida bastante indulgentes.
fuente
char[]c(char[]s,int l){for(int o=l,t;o-->0;)if(l%2>0){t=s[l];s[l]=s[l+o+1];s[l+o+1]=(char)t;}return s;}
( 103 bytes ) con la salida que se devuelve en lugar de imprimirse directamente. Ejemplo de entrada:System.out.println(c("Hello,world!".toCharArray(), 5));
; Ejemplo de salida:Hollo,werld!
.Hollo!werld,
y noHollo,werld!
(la puntuación es incorrecta). Creo que esto se puede solucionar con un valor de entrada de 6 en lugar de 5.t
achar
, ¿por qué no se declara en el bucle for directamente comochar
? Tendría unos pocos bytes para hacerlo.C, 124 bytes
Llamar con:
La longitud de la cadena está limitada a 98 caracteres.
fuente
Octava ,
6461 bytesFunción anónima que ingresa una matriz de caracteres 2D con cada cadena en una fila y produce la salida en el mismo formato.
Pruébalo en Ideone .
fuente
Raqueta 208 bytes
Sin golf:
Pruebas:
Salida:
Arriba está la versión recursiva.
Versión iterativa:
Sin golf:
fuente
PowerShell v2 +, 82 bytes
Todavía jugando al golf ...No. Parece que no se puede reducir esto sin usar una expresión regular como otras respuestas (abucheo en los algoritmos de copia).Así que tomamos
$a
y$b
como cadenas, establecemos el índice$i
en0
, lo convertimos$a
en unachar
matriz y lo enviamos a través de un bucle|%{...}
. Cada iteración, estamos concatenando cadenas$c
e$d
indexando en una selección de matriz (es decir, alternando de un lado a otro). Luego, nos vamos$c
y estamos$d
en la tubería, y la salida a través de lo implícitoWrite-Output
sucede al finalizar el programa.fuente
Lithp , 120 caracteres (+3 para la bandera -v1)
Línea dividida en 2 para facilitar la lectura:
Requiere la
-v1
bandera pararun.js
ya que algunas funciones aún no forman parte de la biblioteca estándar.Uso de la muestra:
Este tipo de aspectos destacados que no he pasado suficiente tiempo en la biblioteca estándar. Tener que usar
js-bridge/1
dos veces y la forma de expresión regular larga, así como invocar el uso del mapa,invoke/*
contribuyen a que esto sea mucho más largo de lo necesario.Tiempo para trabajar en mi biblioteca estándar más creo.
fuente
PHP, 79 bytes
Versión anterior PHP, 82 bytes
fuente
for(...)echo$a[1+$i%2][$i];echo" $y";
(-2)for(;$i<=strlen(($a=$argv)[1]);$y.=$a[2-$i%2][$i++])echo$a[1+$i%2][$i]??" $y";
hay un -2 más, aunque requiere php 7Notice: String offset cast occurred in Command line code on line 1
C,
5452 bytesAsume salida
c
ya tiene la longitud deseada.Uso:
}
Si insiste en crear la salida, aquí hay una solución de 91 bytes :
Uso:
fuente
C, 150 bytes
Usé las omisiones típicas de los archivos de encabezado y
main()
el tipo de retorno y la declaración de retorno. Lanza una advertencia, pero se compila sin problemas. También utilicé un truco específico de GCC que permite declaraciones de matriz con expresiones variables.El programa espera las cadenas de la línea de comando y, como tal, el programa debe ejecutarse con
./a.out string1 string2
.O más legible,
fuente
Mathematica, 51 bytes
Toma la entrada como una matriz de dos matrices de caracteres, con salida en el mismo formato. La función simplemente construye la nueva matriz usando una operación (mod 2).
fuente
QBasic 4.5, 172 bytes
Ay, este se vuelve doloroso con el viejo QBasic ...
Dato curioso: el uso de
DEFSTR
más bytes guardados de lo que cuesta porque ahora podría usar enA
lugar dea$
.fuente
QBIC , 112 bytes
QBIC puede simplificar muchas de las repeticiones de QBasic, pero el
MID$
motor principal aún debe hacerse en QBasic porque QBIC carece de una función de subcadena. Aún así, me ahorra 60 bytes.fuente
MIND$
=>MIN$
en el texto.Java, 68 bytes
Sin golf y probando
fuente
APL, 12
Explicación: {...} define una función, ⍵ es el argumento correcto. La toma (↑) crea una matriz a partir de las dos cadenas, luego gira cada columna (⊖) n veces, donde n es la parte entre paréntesis (⍳⍴⊃⍵). Eso se define como el ápice de la longitud del primer argumento. (Ej: longitud = 5 ==> 1 2 3 4 5). Entonces, la primera columna se gira una vez, la segunda dos veces (volviendo a las posiciones originales), la tercera columna tres veces, etc.
Pruébalo en tryapl.org
fuente