CUSRS-완전 쓸모없는 문자열 리팩토링 시스템!


11

소개

저는 PPCG에서 항상 발생하는 SBU (Short But Unique) 과제를 정말 좋아합니다. CUSRS는 문자열을 리팩토링하도록 설계된 시스템이며, CUSRS 함수는 2 개의 매개 변수를 사용하고 1 개의 문자열을 출력합니다.

도전

다음을 수행하기위한 프로그램, 함수, 람다 또는 허용되는 대안을 생성하십시오.

주어 String inputString 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

-접미사를 찾지 못하면 어떻게됩니까 ?
Zgarb

답변:


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

파이썬 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

13 바이트를 절약 해 준 Artyer에게 특별한 감사를드립니다.

beg매개 변수를 통해 3 바이트를 더 절약 한 Artyer에게 감사드립니다 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)

포인터 작동을 보여주는 예제

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

편집 : 2 분 전부터 내 대답은 asker의 의견에 따라 유효하지 않습니다.

포인터가 끝까지 가므로 aaa -b + b는 aaab으로 나타납니다.

편집 2 : 수정되었습니다.


1
w,*x=input().split()그리고 if'-'>i:대신 if i[0]=='+':및 탭 문자 몇 바이트를 저장합니다 대신이 개 공간이 개 들여 쓰기를위한
Artyer

탭과 공백을 혼합하려고하면 얻을 수 TabError: inconsistent use of tabs and spaces in indentation있습니다. 제안에 감사드립니다, 나는 그 기능에 대해 몰랐습니다! 즉시 추가를 시작하겠습니다.
redstarcoder

@redstartcoder 탭 트릭은 Python 2에서만 작동하는 것 같습니다. My bad
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

자바 스크립트 (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. 또한, splitjoin제거를 수행 할 수있는 편리한 방법입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.