Вступление
Я очень большой поклонник проблем SBU (Short But Unique), которые постоянно появляются на PPCG. CUSRS - это система, предназначенная для рефакторинга строк, функция CUSRS принимает 2 параметра и выводит 1 строку.
Вызов
Создайте программу, функцию, лямбду или приемлемую альтернативу для выполнения следующих действий:
Учитывая String input
и String refactor
(в качестве примера), рефакторинг input
используют refactor
следующим образом:
refactor
Строка будет в формате ((\+|\-)\w* *)+
(регулярных выражений), например:
+Code -Golf -lf +al
Каждый раздел - это действие по рефакторингу input
. Каждая программа также имеет указатель.
+
Вставит его суффикс (без плюса) в текущее местоположение указателей в строке, а затем сбросит указатель на 0.
Каждая операция должна быть применена к input
строке и результат должен быть возвращен.
Пример:
input:
Golf +Code //pointer location: 0
output:
CodeGolf //pointer location: 0
-
Увеличивает указатель через строку, пока не найдет суффикс. Суффикс будет удален из строки, а указатель слева от удаленного текста. Если суффикс не найден, указатель просто перейдет к концу строки и останется там.
input:
Golf -lf //pointer location 0
output:
Go //pointer location 2
Примеры
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"
Пример кода
Пример - Java, это не игра в гольф вообще.
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;
}
правила
- Применяются стандартные лазейки
- Самый короткий код, в байтах, выигрывает
aaa -a
?|aa
с указателем на трубу.-
если суффикс не найден?Ответы:
APL,
9190 байтЭто принимает строку в качестве правого аргумента, а команды - в качестве левого аргумента, например:
источник
GolfScript, 97 байт
Тест: golfscript.tryitonline.net
источник
Python 3 (
164194186181168165 байт)Пример, демонстрирующий перемещение указателя в конец, если он не находит подстроку:
Отдельное спасибо Artyer за то, что он спас мне 13 байтов.
Еще одно спасибо Artyer за сохранение мне еще 3 байта через
beg
параметрindex
.Старый ответ:
Пример, демонстрирующий работу указателя (все примеры в Q работают, даже если вы не учитываете указатель и просто заменяете в первый раз):
Редактировать: 2 минуты назад мой ответ стал недействительным согласно комментарию автора.
Edit2: исправлено.
источник
w,*x=input().split()
, аif'-'>i:
вместоif i[0]=='+':
и символа табуляции для 2 отступов вместо 2 пробелов будут сохранены некоторые байтыTabError: inconsistent use of tabs and spaces in indentation
. Спасибо за предложения, я не знал об этих функциях! Я начну добавлять их немедленно.find
метод, который будет возвращать,-1
если он не может найти подстроку. Поскольку -1 указывает на заднюю часть строки, все, что вам нужно сделать, это взять модульp
, длинаw
которого должна означать, что вам не нужна попытка, кроме.-1%len(str)
чтобы получить индекс в конце строки.str.index
аstr.find
также принятьstart
параметр, поэтому я предполагаю, что вы можете заменитьw[p:].index(i[1:])
наw.index(i[1:],p)
. В целом, это было быelse:p=(w.find(i[1:],p)+p)%len(p);w=w[:p]+w[p:].replace(i[1:],'',1)
.JavaScript (ES6), 117 байт
Объяснение: Вместо использования громоздкого указателя я оставляю левую половину строки
t
и правую половинуs
. Кроме того,split
иjoin
это удобный способ выполнить удаление.источник