El desafío implica simplemente alternar una cadena dentro de otra cadena.
Explicación
Si la cadena de alternar es una subcadena de la cadena principal , elimine todas las instancias de la cadena de alternar de la cadena principal ; de lo contrario, agregue la cadena de alternar al final de la cadena principal .
Reglas
- Todas las cadenas están compuestas de caracteres ASCII imprimibles
- La función debe tomar dos parámetros: la cadena principal y la cadena de alternar .
- La cadena principal puede estar vacía.
- La cadena de alternar no puede estar vacía.
- El resultado debería ser una cadena, que puede estar vacía.
- La respuesta más corta gana.
Ejemplos
function toggle(main_string, toggle_string){ ... }
toggle('this string has 6 words ', 'now')
=> 'this string has 6 words now'
toggle('this string has 5 words now', ' now')
=> 'this string has 5 words'
Pruebas de casos
'','a' => 'a'
'a','a' => ''
'b','a' => 'ba'
'ab','a' => 'b'
'aba','a' => 'b'
'ababa', 'aba' => 'ba'
Respuestas:
Jalea , 7 bytes
Pruébalo en línea!
Cómo funciona
fuente
Java 8,
80706534 bytesProbablemente mi 'codegolf' más corto de Java hasta ahora ... xD
con algo de ayuda de los comentarios ...;)
Explicación:
Pruébalo en línea.
fuente
if
a un ternario. Si nada más, eliminará el "extra"return
.return m=m.replace(t,"")?m+t:m;
m==(m=m.replace...
MATL, 11 bytes
Pruébalo en línea!
Todos los casos de prueba
Explicación
fuente
Python 3, 38 bytes
fuente
JavaScript (ES6),
3937 bytesfuente
Pyke, 14 bytes
Pruébalo aquí!
Dado que Pyke no tiene
else
estructura, creo que este es un puntaje bastante razonableExplicación:
fuente
CJam, 9
Pruébalo en línea. Gracias jimmy23013 por cortar 1 byte :)
Explicación:
fuente
q~:B/2Be]
.Javascript (ECMAScript 6): 47 bytes
fuente
("a", ".")
devuelve en""
lugar de"a."
.Retina ,
3831 bytesEl recuento de bytes asume la codificación ISO 8859-1.
El avance de línea final es significativo. El formato de entrada es ambas cadenas separadas con un salto de línea.
Pruébalo en línea! La primera línea permite ejecutar varios casos de prueba a la vez (para el conjunto de pruebas, use
;
para separar las cadenas y los avances de línea para separar los casos de prueba; la primera línea se encarga de la conversión).Explicación
En este primer paso, reemplazamos todas las apariciones de la cadena de alternar en la cadena principal con
·
. Necesitamos insertar estos marcadores para que luego podamos determinar si ocurrió alguna sustitución.Esta es otra sustitución que elimina un
·
marcador, o la segunda línea (incluido el salto de línea de separación). Sin embargo,1>
es un límite, lo que significa que solo se consideran coincidencias después de la primera. Por lo tanto, si la cadena de alternancia no se produjo en la cadena principal, no habremos insertado ninguna·
, por lo que la segunda línea será la primera coincidencia y no se eliminará. De lo contrario, eliminamos la segunda línea junto con todos menos el primer marcador.Si bien esto usa una etapa de transliteración, también se usa simplemente para eliminar caracteres. En particular, movemos ambos
·
y avances de línea. Necesitamos el primero, en caso de que haya una coincidencia (porque entonces la primera·
habrá quedado atrás en la etapa anterior) y necesitamos el segundo en caso de que no haya una coincidencia (para unir las dos líneas y así agregue la cadena de alternar a la cadena principal).fuente
Python (3.4):
55544744 BytesPruebas:
La salida de prueba
Usar un def sería más largo porque tiene que usar una declaración de retorno, si fuera posible sin retorno, ahorraría 2 BytesDado que no es necesaria la declaración explícita de la función (lo siento, no lo sabía) Se guardaron 7 Bytes.fuente
toggle=
.toggle=
las pruebas funcionantoggle
se necesita para probarlo. Pero solo necesitas contar a partirlambda m,t:
de ahora.m+''+t
am+t
para guardar 3 bytes, si no me equivoco.m+' '+t
a ingresar un espacio entre ellos, pero después de leer la descripción nuevamente eliminé el espacio en blanco pero no el '' y el +C #, 63
Mejor que Java :)
Código de prueba:
Salida:
fuente
Pyth
131110 bytesBanco de pruebas.
Formato de entrada: primera cadena entre comillas, segunda cadena sin comillas.
Esto también es de 10 bytes:
Banco de pruebas.
Esto es 11 bytes:
Banco de pruebas.
Solución anterior de 13 bytes:
Banco de pruebas.
fuente
?}zQ:Qzk+Qz
Jolf, 12 bytes
O, si debemos incluir caracteres sensibles a expresiones regulares:
Pruébalo aquí!
Explicación
fuente
JavaScript (ES6), 37 bytes
Un poco más corto que la respuesta de @nobe4 aprovechando la división y la unión
fuente
Raqueta, 70 bytes
Muy claro.
fuente
Scala,
7270 bytesIntérprete en línea: www.tryscala.com
fuente
if(r==m)
.Oracle SQL 11.2, 66 bytes
fuente
Perl,
3730 bytesLas expresiones regulares dentro de la cadena de alternar no se evalúan debido a las citas con
\Q
...\E
.sub F
y\E
se eliminan de acuerdo con el comentario de msh210.No está completamente libre de efectos secundarios debido a la configuración
$_
. Usar una variable local costará seis bytes adicionales:Por otro lado, con los parámetros de entrada conmutados se pueden guardar dos bytes usando en
pop
lugar deshift
(28 bytes):Archivo de prueba:
Resultado de la prueba:
fuente
sub F
de su recuento de bytes. Además, debería poder usar enpop
lugar deshift
(invirtiendo el orden de las entradas, natch), ahorrando dos bytes. (No probado.) Finalmente, debería poder omitir el\E
, guardando dos bytes más. (También no probado.)pop
lugar deshift
puede ayudar, porque$_
debería ser el primer argumento para evitar$_[1]=~s/.../
. El orden de los argumentos de entrada está fijado por la pregunta AFAIK.C # (58 bytes)
string F(string s,string t)=>s==(s=s.Replace(t,""))?s+t:s;
Utiliza una asignación en línea para eliminar algunos bytes
fuente
var s,t
ovar s,var t
nostring
?var
, solo se puede usar en lugares donde el tipo se conoce en tiempo de compilación, por lo que no se puede usar en firmas de métodos. Podrías usardynamic
, pero es 1 carácter más largo questring
var F(string s, string t
? Eso se puede inferir ...bash + sed, 28 bytes
El script vive en un archivo toggle-string.bash, al que llamamos con
bash toggle-string.bash mainstring togglestring
.s/$2//g
elimina la cadena de alternar de la cadena principalt
salta al final si la sustitución anterior fue exitosa (es decir, la cadena principal contenía la cadena de alternar)/$/$2/
agrega la cadena de alternar al final ($
), si no saltamos al finalbash es requerido para la herejía
fuente
Julia,
3331 bytesPruébalo en línea!
fuente
PowerShell v2 +, 47 bytes
Toma entrada
$a,$b
y luego usa una(... , ...)[...]
declaración pseudoternaria para realizar un if / else. Las partes internas se evalúan primero para formar una matriz de dos elementos. El 0 es$a
con todas las apariciones de$b
-replace
d sin nada, que se almacena en$c
. El primero es solo una concatenación de cadenas de$a
y$b
.Si
$c
es-eq
ual a$a
, lo que significa que$b
no se encontró, es booleano$true
o1
, por lo que se elige el primer elemento de la matriz (la concatenación). De lo contrario, es booleano$false
, así que sacamos$c
el elemento 0.Tenga en cuenta que
-replace
es codicioso, por lo que se reemplazará desde la izquierda primero, lo que significa que elababa / aba
caso de prueba volverá correctamenteba
.fuente
Java 8, 65 bytes
La misma lógica que la solución Java 7, escrita con una lambda.
Pruébalo aquí
fuente
Ruby,
33 bytes27 bytes (28 si usa subtitulación global)definitivamente 28 bytesfuente
Mathematica, 45 bytes
Función anónima que toma la cadena principal y la cadena de alternar (en ese orden) y devuelve el resultado. Explicación:
fuente
TSQL,
143129121 BytesLegible:
Live Demo
114 bytes con estrictamente entrada de 1 carácter
fuente
TSQL (Sqlserver 2012), 49 bytes
Pruébalo en línea!
fuente
Ruby,
353728 bytes¡Hurra por la interpolación de cuerdas! Incluso funciona en expresiones regulares. El resto es simple: si la cadena
t
coincide conm
, reemplazart
con''
, de lo contrario devolverm+t
.Editar: se corrigió un error.
Editar: Apliqué la sugerencia de Kevin Lau, pero parece que he alcanzado el mismo algoritmo que el utilizado en la respuesta de Luis Masuelli .
fuente
("a", ".")
devuelve en"a"
lugar de"a."
.m[t]
es mucho más corto quem.include?(t)
y aún verifica la inclusión dentro de las cadenas.k (23 bytes)
Ejemplos:
fuente
Kotlin, 61 bytes
Esto sería más corto si la asignación fuera una expresión en Kotlin, y los parámetros fueran mutables, y hubiera un operador condicional ternario, lamentablemente este no es el caso :(
Pruébalo en línea!
Sin golf
fuente