introduction
Je suis un grand fan des défis SBU (Short But Unique) qui surgissent tout le temps sur PPCG. Le CUSRS est un système conçu pour refactoriser les chaînes, une fonction CUSRS prend 2 paramètres et génère 1 chaîne.
Défi
Produisez un programme, une fonction, un lambda ou une alternative acceptable pour effectuer les opérations suivantes:
Étant donné String input
et String refactor
(à titre d'exemples), refactoriser en input
utilisant refactor
comme suit:
La refactor
chaîne sera au format ((\+|\-)\w* *)+
(regex), par exemple:
+Code -Golf -lf +al
Chaque section est une action de refactorisation à effectuer input
. Chaque programme a également un pointeur.
+
Insère son suffixe (sans le signe plus) à l'emplacement actuel du pointeur dans la chaîne, puis réinitialise le pointeur à 0.
Chaque opération doit être appliquée à la input
chaîne et le résultat doit être renvoyé.
Exemple:
input:
Golf +Code //pointer location: 0
output:
CodeGolf //pointer location: 0
-
Incrémente le pointeur dans la chaîne jusqu'à ce qu'il trouve le suffixe. Le suffixe sera supprimé de la chaîne et le pointeur sera laissé sur le côté gauche du texte supprimé. Si aucun suffixe n'est trouvé, le pointeur progressera simplement jusqu'à la fin de la chaîne et y restera.
input:
Golf -lf //pointer location 0
output:
Go //pointer location 2
Exemples
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"
Exemple de code
L'exemple est Java, ce n'est pas du tout du golf.
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;
}
Règles
- Les échappatoires standard s'appliquent
- Le code le plus court, en octets, gagne
aaa -a
?|aa
avec le tuyau étant le pointeur.-
si le suffixe n'est pas trouvé?Réponses:
APL,
9190 octetsCela prend la chaîne comme argument de droite et les commandes comme argument de gauche, comme ceci:
la source
GolfScript, 97 octets
Test: golfscript.tryitonline.net
la source
Python 3 (
164194186 186181168165 octets)Exemple montrant le pointeur se déplaçant vers la fin s'il ne trouve pas de sous-chaîne:
Un merci spécial à Artyer pour m'avoir sauvé 13 octets.
Un autre merci à Artyer de m'avoir sauvé encore 3 octets via le
beg
paramètre deindex
.Ancienne réponse:
Exemple illustrant le fonctionnement du pointeur (tous les exemples du travail Q fonctionnent même si vous ne tenez pas compte du pointeur et ne le remplacez qu'à la première occurrence):
Edit: Depuis 2 minutes ma réponse est désormais invalide selon un commentaire du demandeur.
Edit2: fixe.
la source
w,*x=input().split()
, etif'-'>i:
au lieu deif i[0]=='+':
et tabulation pour 2 retraits au lieu de 2 espaces permettra d'économiser quelques octetsTabError: inconsistent use of tabs and spaces in indentation
. Merci pour les suggestions, je ne connaissais pas ces fonctionnalités! Je vais commencer à les ajouter immédiatement.find
méthode qui retournera-1
si elle ne trouve pas la sous-chaîne. Puisque -1 pointe vers l'arrière de la chaîne, tout ce que vous devez faire est de prendre un module dep
la longueurw
qui devrait signifier que vous n'avez pas besoin d'un essai sauf.-1%len(str)
pour obtenir l'index à la fin de la chaîne.str.index
etstr.find
aussi prendre unstart
paramètre, donc je suppose que vous pouvez remplacerw[p:].index(i[1:])
parw.index(i[1:],p)
. Dans l'ensemble, ce seraitelse:p=(w.find(i[1:],p)+p)%len(p);w=w[:p]+w[p:].replace(i[1:],'',1)
.JavaScript (ES6), 117 octets
Explication: Au lieu d'utiliser un pointeur encombrant, je garde la moitié gauche de la chaîne
t
et la moitié droite dedanss
. En outre,split
etjoin
constituent un moyen pratique d'effectuer la suppression.la source