CUSRS - ระบบ Refactoring String ที่ไร้ประโยชน์อย่างสมบูรณ์!


11

บทนำ

ฉันเป็นแฟนตัวยงของ SBU (สั้น แต่ไม่เหมือนใคร) ที่ท้าทายความสามารถในการเพาะปลูก PPCG ตลอดเวลา CUSRS เป็นระบบที่ออกแบบมาเพื่อ refactor สตริงฟังก์ชั่น CUSRS ใช้เวลา 2 พารามิเตอร์และเอาท์พุท 1 สตริง

ท้าทาย

จัดทำโปรแกรมฟังก์ชั่นแลมบ์ดาหรือทางเลือกที่ยอมรับได้เพื่อทำสิ่งต่อไปนี้:

รับString inputและString refactor(เป็นตัวอย่าง) refactor inputใช้refactorดังนี้:

refactorString จะอยู่ในรูปแบบของ((\+|\-)\w* *)+(regex) ตัวอย่างเช่น:

+Code -Golf -lf +al

แต่ละส่วนคือการกระทำที่ refactoring inputเพื่อดำเนินการเกี่ยวกับ แต่ละโปรแกรมยังมีตัวชี้

+ จะแทรกคำต่อท้าย (โดยไม่มีเครื่องหมายบวก) ที่ตัวชี้ตำแหน่งปัจจุบันในสตริงแล้วรีเซ็ตตัวชี้เป็น 0

แต่ละการดำเนินการควรถูกนำไปใช้กับinputString และควรส่งคืนผลลัพธ์

ตัวอย่าง:

input:
Golf +Code //pointer location: 0

output:
CodeGolf //pointer location: 0

-จะเพิ่มตัวชี้ผ่านสตริงจนกว่าจะพบคำต่อท้าย ส่วนต่อท้ายจะถูกลบออกจาก String และตัวชี้จะถูกทิ้งไว้ที่ด้านซ้ายของข้อความที่ถูกลบ หากไม่พบคำต่อท้ายตัวชี้จะดำเนินต่อไปจนถึงจุดสิ้นสุดของสตริงและอยู่ที่นั่น

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

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 ไบต์ผ่านพารามิเตอร์ของbegindex

คำตอบเก่า:

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 เพราะตัวชี้จะไปจนสุด

แก้ไข 2: แก้ไข


1
w,*x=input().split()และif'-'>i:แทนที่จะเป็นif i[0]=='+':และตัวละครแท็บสำหรับ 2 การเยื้องแทน 2 ช่องว่างจะบันทึกบาง bytes
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

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เป็นวิธีที่สะดวกในการทำการลบ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.