CUSRS - ¡El sistema de refactorización de cuerdas completamente inútil!

11

Introducción

Soy un gran admirador de los desafíos SBU (Short But Unique) que surgen en PPCG todo el tiempo. El CUSRS es un sistema diseñado para refactorizar cadenas, una función CUSRS toma 2 parámetros y genera 1 cadena.

Desafío

Produzca un programa, función, lambda o alternativa aceptable para hacer lo siguiente:

Dado String inputy String refactor(como ejemplos), refactorizar inputusando refactorlo siguiente:

La refactorcadena tendrá el formato de ((\+|\-)\w* *)+(regex), por ejemplo:

+Code -Golf -lf +al

Cada sección es una acción de refactorización para realizar input. Cada programa también tiene un puntero.

+ Insertará su sufijo (sin el signo más) en la ubicación actual de los punteros en la Cadena y luego restablecerá el puntero a 0.

Cada operación debe aplicarse a la inputcadena y el resultado debe devolverse.

Ejemplo:

input:
Golf +Code //pointer location: 0

output:
CodeGolf //pointer location: 0

-Incrementará el puntero a través de la cadena hasta que encuentre el sufijo. El sufijo se eliminará de la cadena y el puntero se dejará en el lado izquierdo del texto eliminado. Si no se encuentra ningún sufijo, el puntero simplemente avanzará hasta el final de la Cadena y se quedará allí.

input:
Golf -lf //pointer location 0

output:
Go //pointer location 2

Ejemplos

input:
"Simple" "-impl +nip -e +er"

output:
"Sniper"

input:
"Function" "-F +Conj"

output:
"Conjunction"

input:
"Goal" "+Code -al +lf"

output:
"CodeGolf"

input:
"Chocolate" "Chocolate"

output:
"Chocolate" //Nothing happens...

input:
"Hello" "-lo+p        +Please" //Spaces are irrelevant

output:
"PleaseHelp"

input:
"Mississippi" "-s-s-i-ppi+ng" //Operations can be in any order

output:
"Missing"

input:
"abcb" "-c -b +d"

output:
"abd"

input:
"1+1=2" "-1+22-=2+=23"

outut:
"22+1=23"

Código de ejemplo

El ejemplo es Java, no es golf en absoluto.

public static String refactor(String input, String swap) {
    int pointer = 0;
    String[] commands = swap.replace(" ", "").split("(?=[-+])");

    for (String s : commands) {
        if (s.startsWith("+")) {
            input = input.substring(0, pointer) + s.substring(1) + input.substring(pointer, input.length());
            pointer = 0;
        } else {
            if (s.startsWith("-")) {
                String remove = s.substring(1);
                for (int i = pointer; i < input.length(); i++) {
                    if (input.substring(i, i + remove.length() > input.length() ? input.length() : i + remove.length()).equals(remove)) {
                        pointer = i;
                        input = input.substring(0, i) + input.substring(i + remove.length(), input.length());
                        break;
                    }
                }
            }
        }
    }

    return input;
}

Reglas

  • Se aplican lagunas estándar
  • El código más corto, en bytes, gana
Shaun Wild
fuente
1
Relacionado
Emigna
¿Para qué debería ser la salida aaa -a?
ETHproductions
|aacon la tubería como puntero.
Shaun Wild
@Emigna Al mirar la pregunta en cuestión, creo que la implementación de la mía sería muy diferente.
Shaun Wild
¿Qué sucede -si no se encuentra el sufijo?
Zgarb

Respuestas:

1

APL, 91 90 bytes

{s l←⍵0⋄s⊣{g←1↓⍵⋄'+'=⊃⍵:+s∘←(l↑s),g,l↓s⋄l∘←¯1+1⍳⍨g⍷s⋄+s∘←(l↑s),s↓⍨l+⍴g}¨{1↓¨⍵⊂⍨⍵=⊃⍵}' ',⍺}

Esto toma la cadena como argumento derecho y los comandos como argumento izquierdo, así:

      '+Code -al +lf' {s l←⍵0⋄s⊣{g←1↓⍵⋄'+'=⊃⍵:+s∘←(l↑s),g,l↓s⋄l∘←¯1+1⍳⍨g⍷s⋄+s∘←(l↑s),s↓⍨l+⍴g}¨{1↓¨⍵⊂⍨⍵=⊃⍵}' ',⍺} 'Goal'
CodeGolf
marinus
fuente
1

GolfScript, 97 bytes

" "%(:s;0:p;{("-"0=={.s p>\?.-1={;;s,:p;}{:p;,:l;s p<s p l+>+:s;}if}{s p<\+s p>+:s;0:p;}if}/"\n"s

Prueba: golfscript.tryitonline.net

Nombre claveLambda
fuente
Bienvenido a PPCG! Puede usar el intérprete en Pruébelo en línea , que admite entrada.
Martin Ender
1

Python 3 ( 164 194 186 181 168 165 bytes)

p=0
w,*x=input().split()
for i in x:
 if '-'>i:w,p=w[:p]+i[1:]+w[p:],0
 else:
  try:p=w.index(i[1:],p)
  except:p=len(w)
  w=w[:p]+w[p:].replace(i[1:],'',1)
print(w)

Ejemplo que demuestra que el puntero se mueve hasta el final si no encuentra una subcadena:

Input: HelloThere -x +Friend
Output: HelloThereFriend

Un agradecimiento especial a Artyer por salvarme 13 bytes.

Otro agradecimiento a Artyer por guardarme otros 3 bytes a través del begparámetro de index.

Vieja respuesta:

p=0
x=input().split()
w=x[0]
for i in x[1:]:
 if i[0]=='+':
  w=w[:p]+i[1:]+w[p:]
  p=0
 else:
  p=w[p:].index(i[1:])+p
  w=w[:p]+w[p:].replace(i[1:],'',1)
print(w)

Ejemplo que demuestra que el puntero funciona (todos los ejemplos en la Q funcionan incluso si no tiene en cuenta el puntero y simplemente lo reemplaza en la primera aparición):

Input: HelloThereCowboy -r -e -y +ySays +Oh
Output: OhHelloTheCowboySays

Editar: desde hace 2 minutos, mi respuesta ahora no es válida según un comentario del autor de la pregunta.

aaa -b + b resultaría con aaab porque el puntero iría hasta el final.

Edit2: fijo.

Redstarcoder
fuente
1
w,*x=input().split(), y en if'-'>i:lugar de un if i[0]=='+':carácter de tabulación para 2 sangrías en lugar de 2 espacios ahorrará algunos bytes
Artyer
Si trato de mezclar pestañas y espacios me sale TabError: inconsistent use of tabs and spaces in indentation. Gracias por las sugerencias, ¡no conocía esas características! Comenzaré a agregarlos de inmediato.
redstarcoder
@redstartcoder Supongo que el truco de las pestañas solo funciona en Python 2. Mi problema
Artyer el
Podría estar completamente equivocado aquí, pero creo que las cadenas tienen un findmétodo que devolverá -1si no puede encontrar la subcadena. Dado que -1 puntos al final de la cadena, todo lo que necesita hacer es tomar un módulo cuya plongitud wdebería significar que no necesita un try-except.
Kade
1
Harías -1%len(str)para obtener el índice al final de la cadena. str.indexy str.findtambién tome un startparámetro, así que supongo que puede reemplazarlo w[p:].index(i[1:])con w.index(i[1:],p). En general, lo sería else:p=(w.find(i[1:],p)+p)%len(p);w=w[:p]+w[p:].replace(i[1:],'',1).
Artyer
0

JavaScript (ES6), 117 bytes

(s,r,t='')=>r.match(/\S\w*/g).map(r=>(q=r.slice(1),r<'-'?(s=t+q+s.t=''):([b,...a]=s.split(q),t+=b,s=a.join(q))))&&t+s

Explicación: en lugar de utilizar un puntero engorroso, mantengo la mitad izquierda de la cuerda ty la mitad derecha adentro s. Además, splity joinson una forma conveniente de realizar la eliminación.

Neil
fuente