Objetivo
Crear una función para invertir la concatenación de cadenas
Entrada
Dos cadenas (alfanuméricas + espacios), donde una debe sustraerse por la otra.
- Puede suponer que la cadena que se restará nunca será más grande que la otra.
Salida
El resultado de la resta.
Sustracción
Debe eliminar una cadena desde el principio o el final de otra cadena. Si la cadena está presente al principio y al final, solo puede eliminar una, la que se eliminará depende de usted.
Si la cadena no está al principio o al final, o no es una coincidencia exacta, es una resta no válida y debe generar la cadena original.
Casos de prueba
Resta válida
'abcde','ab' -> 'cde'
'abcde','cde' -> 'ab'
'abab','ab' -> 'ab'
'abcab','ab' -> 'abc' or 'cab'
'ababcde','ab' -> 'abcde'
'acdbcd','cd' -> 'acdb'
'abcde','abcde' -> ''
'abcde','' -> 'abcde'
'','' -> ''
Resta no válida (devuelve la cadena original)
'abcde','ae' -> 'abcde'
'abcde','aa' -> 'abcde'
'abcde','bcd' -> 'abcde'
'abcde','xab' -> 'abcde'
'abcde','yde' -> 'abcde'
Entrada inválida (no necesita ser manejada)
'','a' -> ''
Este es el código de golf , por lo que gana el código más corto en bytes.
cde
? ¿Qué quieres decir con válido? ¿Necesitamos juzgar la validez de la entrada o quiere decir que no recibiremos entradas no válidas?'abcde','bcd' -> 'abcde'
, por romper mi solución'ababcde', 'ab'
→'abcde'
como un caso de prueba. Algunos algoritmos ingenuos fallan en eso.Respuestas:
Java 8,
46454440 bytes-1 byte gracias a TheLethalCoder
-1 byte porque soy tonto (¡gracias Rod!)
-4 bytes gracias a Kevin Cruijssen
Pruébalo en línea!(incluye todos los casos de prueba)
Una respuesta Java realmente supera algunos otros lenguajes prácticos. Sonrisas (¡y ahora supera a JS!)
fuente
a->b->
First
aAll
por -2 bytes. Debido a que^
y$
siempre está al final o al comienzo de la Cadena, por lo que incluso conreplaceAll
ella solo la reemplaza una vez. Pruébalo aquí PD: Agregué el byte-count anterior marcado a su respuesta, que es lo que generalmente se hace después de las ediciones de código de golf aquí en PPCG.All
lugar deFirst
, esto se hace realidad:"abab" + "ab" -> ""
JavaScript (ES6), 41 bytes
Toma entrada a través de la sintaxis de curry, es decir
f("abab")("ab")
.fuente
eval()
para construir RegExes antes?Brachylog (¡Pruébelo en línea!), 12 bytes
Pruébalo en línea!
Toma la cadena para restar de la entrada estándar y la cadena para restar como argumento de línea de comando.
Explicación
fuente
Retina , 21 bytes
1 byte gracias a Martin Ender.
Pruébalo en línea!
fuente
JavaScript (ES6),
76704541 bytesIntentalo
fuente
new
.Perl 6 , 21 bytes
Intentalo
Expandido:
fuente
Japt ,
119 bytesPruébalo en línea!
fuente
TI-Basic (TI-84 Plus CE), 63 bytes
fuente
Ans
incluso en la cuarta línea?Ans
refiere al último valor evaluado, por lo que en este caso se refiere al valor devuelto porinString(
, que es el índice de la subcadenaStr2
en la cadenaStr0
o 0 si la subcadena no aparece. Una instrucción if no modifica el valor de Ans, por lo que en la cuarta línea el índice todavía estáAns
.inString
funcionaba. Buen golf!Mathematica, 162 bytes
estilo de entrada de prueba ["abcde", "ab"]
fuente
#
lugar de#1
: significan exactamente lo mismo. Además, en lugar de usarStringJoin@t
, puedes hacer trampa uniendo una cadena vacía con ella""<>t
, que también une automáticamente todot
. ¿Has visto la página de consejos de golf de Mathematica ?t={};
al principio, por ejemplo), pero podría ser más fácil usar un enfoque completamente diferente. ¿Ha intentado usar elStringReplace
¿función?c=Characters;a=c@#;b=c@#2;
l@Intersection[a,b]
esl[a∩b]
.Pitón,
696864575145 bytesEsto terminó siendo una solución completamente diferente con Regex.
¡Gracias a Value Ink por -2 bytes!
y Felipe Nardi Batista por los masivos -6 bytes!
Pruébalo en línea!
fuente
re.sub(c.join("^|$"),'',s,1)
c+'$|^'+c
Golpetazo ,
666149 bytesPruébalo en línea!
menos golf:
Utiliza mayúsculas y minúsculas para probar el comienzo o el final, y la resta de prefijo / sufijo de matriz (% / #)
fuente
case
, pero más de lo necesario. La segunda y tercera patrón podrían fusionarse en uno solo:*)c=${1#$2};;
. A continuación, con sólo 2 ramas serían más cortos aecho
cada uno directamente en lugar de utilizar variables$c
:case $1 in *$2)echo ${1%$2};;*)echo ${1#$2};;esac
. O bien, podría seguir utilizándolo, pero sincase
:c=${1%$2};[[ $c = $1 ]]&&c=${1#$2};echo $c
.APL (Dyalog) ,
3130 bytes-1 gracias a Zacharý .
¡Esto realmente usa la concatenación inversa (es decir, la inversa de)! Toma la cadena original como argumento izquierdo y qué restar como argumento derecho.
Pruébalo en línea!
Sin golf:
Leyenda:
{
...}
función anónima⍺
argumento izquierdo de la función actual⍵
argumento correcto de la función actual0::
... si ocurre algún error, ejecute esto, de lo contrario ...⍣¯1⊢
inverso,∘⍵
concatenar ⍵ a la derecha⍵,
concatenar ⍵ a la izquierdafuente
{0::⍺{0::⍺⋄,∘⍵⍣¯1⊢⍺}⍵⋄⍵,⍣¯1⊢⍺}
.PHP, 54 bytes
Casos de prueba
fuente
Python 2 , 68 bytes
Pruébalo en línea!
fuente
Haskell , 49 bytes
Pruébalo en línea! Uso:
f"" "abcdef" "ab"
. Alternativamente, defina(-)=f""
y use like"abcdef" - "ab"
.Esta solución libre de expresiones regulares funciona dividiendo recursivamente la cadena en todos sus prefijos y prefijos y verificando si la cadena que se restará coincide con una de ellas.
fuente
Python 2 ,
7265 bytesPruébalo en línea!
-7 bytes gracias a @FelipeNardiBatista
fuente
C #, 88 bytes
Compila a a
Func<string, Func<string, string>>
.fuente
Ruby (expresión lambda), 29 bytes
¡Yay por interpolación de expresiones regulares! Requiere sustraendos seguros para expresiones regulares, pero está bien según el desafío.
fuente
Tcl , 37 bytes
Pruébalo en línea!(ahora ejecuta todas las pruebas)
Tcl es sencillo.
proc s {a b}
define una función llamadas
que toma parámetrosa
yb
.regsub
sustituye{}
, que es una cadena vacía, para el valor deb
cuando está al principio o al final dea
. El retorno es implícito.fuente
C, 96 bytes
Es de conocimiento común que la manipulación de cuerdas en C es engorrosa, ya que una extensión de golf sería limítrofe masoquista. A mí me parece bien.
Uno de los programas menos legibles que he escrito. Toma dos entradas (a pesar de cómo se ve la función), una
char**
señalando a la cadena para desconcatar y unachar*
que es la cadena a eliminar. El puntero de entrada se edita en su lugar y se convierte en la salida (de todos modos, en caso de pérdidas de memoria).Ejemplo de uso:
fuente
AWK ,
2132 bytesPruébalo en línea!
El envío original reemplazó ingenuamente el texto dentro de la primera cadena, no solo al principio o al final.
Pruébalo en línea!
Originalmente se probó sin llaves, pero requirió trucos para imprimir líneas vacías y / o no coincidencias que terminaron agregando más bytes que esta versión.
fuente
R,
204241 bytes-1 byte gracias a MickyT!
Devuelve una función anónima (que tiene argumentos en el orden
b,a
). Calcula la diferencia de cadenaa-b
.sub
es una sustitución simple que intercambia la primera aparición del patrón con, en este caso, la cadena vacía''
. Construye la expresión regularsprintf
para que coincida solo al principio y al final de la cadena. Requierepryr
que se instale el paquete.En el enlace TIO, utiliza la
function(a,b)
definición más detallada de la función para cuatro bytes más.Pruébalo en línea!
fuente
'abcde','bcd' -> 'abcde'
caso?sub
es una sustitución simple que simplemente intercambia la primera aparición deb
ina
": ¿Esto cambiará si la segunda cadena está en el medio de la primera cadena?sprintf('^%s|%s$',b,b)
Lisp común, 121 bytes
Pruébalo en línea!
La habitual palabra común Lisp!
Versión sin golf:
fuente
Kotlin , 91 bytes
Pruébalo en línea!
fuente
{a,b->var c=a.removePrefix(b);if(a==c){c=a.removeSuffix(b)};c}
Powershell,
3440 bytes+6 bytes cuando
Invalid Subtraction
se agregan casos de pruebaComentario:
La expresión regexp
^$t|$t$
no funciona como se esperaba: reemplaza ambas coincidencias en lugar de una (marcag
siempre activada). Por lo tanto, nos vemos obligados a usar el grupo negativo de búsqueda anticipada.Script de prueba:
Salida:
fuente
QBIC , 57 bytes
Whegh, esto es un desastre en QBIC / QBasic ...
fuente
Lua ,
7165 bytesAceptar sugerencias
Pruébalo en línea!
fuente
Inicialmente leí mal las instrucciones. ¡Gracias, Ørjan Johansen por señalar mi error!
PowerShell ,
4651 bytesPruébalo en línea!
fuente
abcde
:bcd
no ocurre en ninguno de los extremos de la cadena.Excel, 129 bytes
fuente
sed ,
5653 bytesPruébalo en línea!
fuente