CUSRS - Całkowicie bezużyteczny system refaktoryzacji łańcuchów!

11

Wprowadzenie

Jestem wielkim fanem wyzwań SBU (Short But Unique), które pojawiają się cały czas na PPCG. CUSRS to system zaprojektowany do refaktoryzacji ciągów, funkcja CUSRS przyjmuje 2 parametry i wyprowadza 1 ciąg.

Wyzwanie

Utwórz program, funkcję, lambda lub akceptowalną alternatywę, aby wykonać następujące czynności:

Biorąc pod uwagę String inputi String refactor(jako przykłady), refaktoryzuj, inputstosując refactornastępujące informacje:

refactorString będą w formacie ((\+|\-)\w* *)+(regex), na przykład:

+Code -Golf -lf +al

Każda sekcja jest działaniem refaktoryzacyjnym do wykonania input. Każdy program ma również wskaźnik.

+ Wstawi jego przyrostek (bez plusa) w bieżącej lokalizacji wskaźników w łańcuchu, a następnie zresetuje wskaźnik na 0.

Każda operacja powinna zostać zastosowana do ciągu, inputa wynik powinien zostać zwrócony.

Przykład:

input:
Golf +Code //pointer location: 0

output:
CodeGolf //pointer location: 0

-Będzie zwiększać wskaźnik przez String, aż znajdzie przyrostek. Sufiks zostanie usunięty z ciągu, a wskaźnik pozostanie po lewej stronie usuniętego tekstu. Jeśli nie zostanie znaleziony żaden przyrostek, wskaźnik po prostu przejdzie do końca ciągu i pozostanie tam.

input:
Golf -lf //pointer location 0

output:
Go //pointer location 2

Przykłady

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"

Przykładowy kod

Przykładem jest Java, wcale nie jest golfa.

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;
}

Zasady

  • Obowiązują standardowe luki
  • Najkrótszy kod w bajtach wygrywa
Shaun Wild
źródło
1
Powiązane
Emigna
Jaka powinna być wydajność aaa -a?
ETHprodukcje
|aaz rurką będącą wskaźnikiem.
Shaun Wild,
@Emigna Patrząc na pytanie, wierzę, że wdrożenie mojego byłoby znacznie inne.
Shaun Wild,
Co się stanie, -jeśli przyrostek nie zostanie znaleziony?
Zgarb

Odpowiedzi:

1

APL, 91 90 bajtów

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

To przyjmuje ciąg jako prawy argument, a polecenia jako lewy argument:

      '+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
marinus
źródło
1

GolfScript, 97 bajtów

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

Test: golfscript.tryitonline.net

CodenameLambda
źródło
Witamy w PPCG! Możesz użyć interpretera w Try it online , który obsługuje wprowadzanie danych.
Martin Ender,
1

Python 3 ( 164 194 186 181 168 165 bajtów)

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)

Przykład pokazujący, że wskaźnik przesuwa się na koniec, jeśli nie znajdzie podciągu:

Input: HelloThere -x +Friend
Output: HelloThereFriend

Specjalne podziękowania dla Artyera za uratowanie mi 13 bajtów.

Kolejne podziękowania dla Artyera za uratowanie mi kolejnych 3 bajtów za pomocą begparametru index.

Stara odpowiedź:

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)

Przykład pokazujący działanie wskaźnika (wszystkie przykłady w Q działają, nawet jeśli nie uwzględnisz wskaźnika i po prostu zastąpisz przy pierwszym wystąpieniu):

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

Edycja: Od 2 minut temu moja odpowiedź jest teraz nieważna zgodnie z komentarzem pytającego.

aaa -b + b spowodowałoby aaab, ponieważ wskaźnik miałby przebiegać aż do końca.

Edycja2: Naprawiono.

redstarcoder
źródło
1
w,*x=input().split(), a if'-'>i:zamiast if i[0]=='+':znaku tabulacji dla 2 wcięć zamiast 2 spacji zaoszczędzisz trochę bajtów
Artyer
Jeśli spróbuję łączyć tabulatory i spacje, otrzymuję TabError: inconsistent use of tabs and spaces in indentation. Dzięki za sugestie, nie wiedziałem o tych funkcjach! Zacznę je dodawać natychmiast.
redstarcoder
@ redstartcoder Chyba tab trick działa tylko w Pythonie 2. Mój zły
Artyer
Mogę absolutnie się mylić, ale myślę, że łańcuchy mają findmetodę, która zwróci, -1jeśli nie będzie mogła znaleźć podłańcucha. Ponieważ -1 wskazuje na tył łańcucha, wszystko, co musisz zrobić, to wziąć moduł p, którego długość wpowinna oznaczać, że nie potrzebujesz try-wyjątkiem.
Kade,
1
Zrobiłbyś, -1%len(str)aby uzyskać indeks na końcu łańcucha. str.indexa str.findtakże podjąć startparametr, więc zakładam, można wymienić w[p:].index(i[1:])z w.index(i[1:],p). Ogólnie byłoby else:p=(w.find(i[1:],p)+p)%len(p);w=w[:p]+w[p:].replace(i[1:],'',1).
Artyer
0

JavaScript (ES6), 117 bajtów

(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

Objaśnienie: Zamiast używania nieporęcznego wskaźnika trzymam lewą połowę łańcucha ti prawą połowę s. Dodatkowo, spliti joinsą wygodnym sposobem, aby wykonać usunięcie.

Neil
źródło