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 input
i String refactor
(jako przykłady), refaktoryzuj, input
stosując refactor
następujące informacje:
refactor
String 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, input
a 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
aaa -a
?|aa
z rurką będącą wskaźnikiem.-
jeśli przyrostek nie zostanie znaleziony?Odpowiedzi:
APL,
9190 bajtówTo przyjmuje ciąg jako prawy argument, a polecenia jako lewy argument:
źródło
GolfScript, 97 bajtów
Test: golfscript.tryitonline.net
źródło
Python 3 (
164194186181168165 bajtów)Przykład pokazujący, że wskaźnik przesuwa się na koniec, jeśli nie znajdzie podciągu:
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ą
beg
parametruindex
.Stara odpowiedź:
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):
Edycja: Od 2 minut temu moja odpowiedź jest teraz nieważna zgodnie z komentarzem pytającego.
Edycja2: Naprawiono.
źródło
w,*x=input().split()
, aif'-'>i:
zamiastif i[0]=='+':
znaku tabulacji dla 2 wcięć zamiast 2 spacji zaoszczędzisz trochę bajtówTabError: inconsistent use of tabs and spaces in indentation
. Dzięki za sugestie, nie wiedziałem o tych funkcjach! Zacznę je dodawać natychmiast.find
metodę, która zwróci,-1
jeś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śćw
powinna oznaczać, że nie potrzebujesz try-wyjątkiem.-1%len(str)
aby uzyskać indeks na końcu łańcucha.str.index
astr.find
także podjąćstart
parametr, więc zakładam, można wymienićw[p:].index(i[1:])
zw.index(i[1:],p)
. Ogólnie byłobyelse:p=(w.find(i[1:],p)+p)%len(p);w=w[:p]+w[p:].replace(i[1:],'',1)
.JavaScript (ES6), 117 bajtów
Objaśnienie: Zamiast używania nieporęcznego wskaźnika trzymam lewą połowę łańcucha
t
i prawą połowęs
. Dodatkowo,split
ijoin
są wygodnym sposobem, aby wykonać usunięcie.źródło