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 input
y String refactor
(como ejemplos), refactorizar input
usando refactor
lo siguiente:
La refactor
cadena 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 input
cadena 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
aaa -a
?|aa
con la tubería como puntero.-
si no se encuentra el sufijo?Respuestas:
APL,
9190 bytesEsto toma la cadena como argumento derecho y los comandos como argumento izquierdo, así:
fuente
GolfScript, 97 bytes
Prueba: golfscript.tryitonline.net
fuente
Python 3 (
164194186181168165 bytes)Ejemplo que demuestra que el puntero se mueve hasta el final si no encuentra una subcadena:
Un agradecimiento especial a Artyer por salvarme 13 bytes.
Otro agradecimiento a Artyer por guardarme otros 3 bytes a través del
beg
parámetro deindex
.Vieja respuesta:
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):
Editar: desde hace 2 minutos, mi respuesta ahora no es válida según un comentario del autor de la pregunta.
Edit2: fijo.
fuente
w,*x=input().split()
, y enif'-'>i:
lugar de unif i[0]=='+':
carácter de tabulación para 2 sangrías en lugar de 2 espacios ahorrará algunos bytesTabError: inconsistent use of tabs and spaces in indentation
. Gracias por las sugerencias, ¡no conocía esas características! Comenzaré a agregarlos de inmediato.find
método que devolverá-1
si no puede encontrar la subcadena. Dado que -1 puntos al final de la cadena, todo lo que necesita hacer es tomar un módulo cuyap
longitudw
debería significar que no necesita un try-except.-1%len(str)
para obtener el índice al final de la cadena.str.index
ystr.find
también tome unstart
parámetro, así que supongo que puede reemplazarlow[p:].index(i[1:])
conw.index(i[1:],p)
. En general, lo seríaelse:p=(w.find(i[1:],p)+p)%len(p);w=w[:p]+w[p:].replace(i[1:],'',1)
.JavaScript (ES6), 117 bytes
Explicación: en lugar de utilizar un puntero engorroso, mantengo la mitad izquierda de la cuerda
t
y la mitad derecha adentros
. Además,split
yjoin
son una forma conveniente de realizar la eliminación.fuente