CUSRS - абсолютно марна система рефакторингу струн!


11

Вступ

Я справді великий фанат викликів СБУ (коротких, але унікальних), які весь час виникають на 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при цьому труба є вказівником.
Shaun Wild

@Emigna Дивлячись на питання, про яке йдеться, я вважаю, що реалізація моєї справи буде значно іншою.
Shaun Wild

Що станеться, -якщо суфікс не знайдено?
Згарб

Відповіді:


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

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: виправлено.


1
w,*x=input().split(), а if'-'>i:замість if i[0]=='+':символу та вкладки на 2 відступи замість двох пробілів збережено кілька байтів
Artyer

Якщо я спробую змішати отримані вкладки та пробіли TabError: inconsistent use of tabs and spaces in indentation. Дякую за поради, я не знав про ці функції! Почну додавати їх негайно.
redstarcoder

@redstartcoder Я здогадуюсь, що вкладка працює лише в Python 2. Моє погано
Artyer

Я абсолютно не можу помилитися тут, але я думаю, що в рядках є findметод, який повернеться, -1якщо він не зможе знайти підрядку. Оскільки -1 вказує на тильну сторону рядка, все, що вам потрібно буде зробити, - це взяти модуль p, довжина wякого повинна означати, що вам не потрібна спроба.
Каде

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це зручний спосіб виконати видалення.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.