CUSRS - полностью бесполезная система рефакторинга строк!

11

Вступление

Я очень большой поклонник проблем 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?
ETHproductions
|aaс указателем на трубу.
Шон Уайлд,
@Emigna Посмотрев на рассматриваемый вопрос, я полагаю, что реализация моего будет сильно отличаться.
Шон Уайлд,
Что происходит, -если суффикс не найден?
Згарб

Ответы:

1

APL, 91 90 байт

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

Это принимает строку в качестве правого аргумента, а команды - в качестве левого аргумента, например:

      '+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
Мэринус
источник
1

GolfScript, 97 байт

" "%(: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

Тест: golfscript.tryitonline.net

CodenameLambda
источник
Добро пожаловать в PPCG! Вы можете использовать переводчика на сайте Try it online , который поддерживает ввод.
Мартин Эндер
1

Python 3 ( 164 194 186 181 168 165 байт)

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)

Пример, демонстрирующий перемещение указателя в конец, если он не находит подстроку:

Input: HelloThere -x +Friend
Output: HelloThereFriend

Отдельное спасибо Artyer за то, что он спас мне 13 байтов.

Еще одно спасибо Artyer за сохранение мне еще 3 байта через begпараметрindex .

Старый ответ:

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)

Пример, демонстрирующий работу указателя (все примеры в Q работают, даже если вы не учитываете указатель и просто заменяете в первый раз):

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

Редактировать: 2 минуты назад мой ответ стал недействительным согласно комментарию автора.

aaa -b + b приведет к aaab, потому что указатель будет идти до конца.

Edit2: исправлено.

redstarcoder
источник
1
w,*x=input().split(), а if'-'>i:вместо if i[0]=='+':и символа табуляции для 2 отступов вместо 2 пробелов будут сохранены некоторые байты
Artyer
Если я пытаюсь смешать табуляции и пробелы, я получаю TabError: inconsistent use of tabs and spaces in indentation. Спасибо за предложения, я не знал об этих функциях! Я начну добавлять их немедленно.
Redstarcoder
@redstartcoder Я думаю, трюк с вкладками работает только в Python 2. Мой плохой
Artyer
Я мог бы быть совершенно неправ здесь, но я думаю, что у строк есть findметод, который будет возвращать, -1если он не может найти подстроку. Поскольку -1 указывает на заднюю часть строки, все, что вам нужно сделать, это взять модуль p, длина wкоторого должна означать, что вам не нужна попытка, кроме.
Kade
1
Вы бы сделали, -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).
Artyer
0

JavaScript (ES6), 117 байт

(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

Объяснение: Вместо использования громоздкого указателя я оставляю левую половину строки tи правую половину s. Кроме того, splitи joinэто удобный способ выполнить удаление.

Нил
источник