CUSRS - Hệ thống tái cấu trúc chuỗi hoàn toàn vô dụng!


11

Giới thiệu

Tôi là một fan hâm mộ lớn thực sự của các thách thức SBU (ngắn nhưng độc đáo) luôn luôn xuất hiện trên PPCG. CUSRS là một hệ thống được thiết kế để cấu trúc lại chuỗi, hàm CUSRS có 2 tham số và xuất ra 1 Chuỗi.

Thử thách

Sản xuất một chương trình, chức năng, lambda hoặc thay thế chấp nhận được để làm như sau:

Cho String inputString refactor(như ví dụ), tái cấu trúc inputbằng cách sử dụng refactornhư sau:

Các refactorchuỗi sẽ được ở định dạng ((\+|\-)\w* *)+(regex), ví dụ:

+Code -Golf -lf +al

Mỗi phần là một hành động tái cấu trúc để thực hiện trên input. Mỗi chương trình cũng có một con trỏ.

+ Sẽ chèn hậu tố của nó (không có dấu cộng) tại vị trí con trỏ hiện tại trong Chuỗi và sau đó đặt lại con trỏ về 0.

Mỗi thao tác nên được áp dụng cho inputChuỗi và kết quả sẽ được trả về.

Thí dụ:

input:
Golf +Code //pointer location: 0

output:
CodeGolf //pointer location: 0

-Sẽ tăng con trỏ qua Chuỗi cho đến khi tìm thấy hậu tố. Hậu tố sẽ bị xóa khỏi Chuỗi và con trỏ sẽ ở bên trái của văn bản bị xóa. Nếu không tìm thấy hậu tố, con trỏ sẽ đơn giản tiến đến cuối Chuỗi và được để ở đó.

input:
Golf -lf //pointer location 0

output:
Go //pointer location 2

Ví dụ

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"

Mã ví dụ

Ví dụ là Java, nó hoàn toàn không được chơi gôn.

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

Quy tắc

  • Áp dụng sơ hở tiêu chuẩn
  • Mã ngắn nhất, tính bằng byte, thắng


Đầu ra để làm aaa -agì?
Sản xuất ETH

|aavới đường ống là con trỏ.
Shaun Wild

@Emigna Khi nhìn vào câu hỏi trong câu hỏi, tôi tin rằng việc thực hiện của tôi sẽ khác đi nhiều.
Shaun Wild

Điều gì xảy ra với -hậu tố không được tìm thấy?
Zgarb

Câu trả lời:


1

APL, 91 90 byte

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

Điều này lấy chuỗi làm đối số bên phải của nó và các lệnh làm đối số bên trái của nó, như vậy:

      '+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 byte)

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)

Ví dụ minh họa con trỏ di chuyển đến cuối nếu nó không tìm thấy một chuỗi con:

Input: HelloThere -x +Friend
Output: HelloThereFriend

Đặc biệt cảm ơn Artyer vì đã tiết kiệm cho tôi 13 byte.

Một lời cảm ơn khác đến Artyer vì đã tiết kiệm cho tôi thêm 3 byte thông qua begtham số của index.

Câu trả lời cũ:

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)

Ví dụ minh họa con trỏ hoạt động (tất cả các ví dụ trong Q hoạt động ngay cả khi bạn không tính đến con trỏ và chỉ cần thay thế trong lần xuất hiện đầu tiên):

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

Chỉnh sửa: Từ 2 phút trước câu trả lời của tôi không hợp lệ theo nhận xét của người hỏi.

aaa -b + b sẽ dẫn đến aaab vì con trỏ sẽ đi đến cuối cùng.

Chỉnh sửa2: Đã sửa.


1
w,*x=input().split()if'-'>i:thay vì if i[0]=='+':và ký tự tab cho 2 lần thụt lề thay vì 2 khoảng trắng sẽ lưu một số byte
Artyer

Nếu tôi cố gắng trộn các tab và không gian tôi nhận được TabError: inconsistent use of tabs and spaces in indentation. Cảm ơn những lời đề nghị, tôi không biết về những tính năng đó! Tôi sẽ bắt đầu thêm chúng ngay lập tức.
redstarcoder

@redstartcoder Tôi đoán thủ thuật tab chỉ hoạt động trong Python 2. My bad
Artyer

Tôi hoàn toàn có thể sai ở đây, nhưng tôi nghĩ các chuỗi có một findphương thức sẽ trả về -1nếu nó không thể tìm thấy chuỗi con. Vì -1 điểm ở mặt sau của chuỗi, tất cả những gì bạn cần làm là lấy một mô-đun ptheo độ dài wcó nghĩa là bạn không cần thử - ngoại trừ.
Kade

1
Bạn sẽ làm gì -1%len(str)để lấy chỉ mục ở cuối chuỗi. str.indexstr.findcũng lấy một starttham số, vì vậy tôi giả sử bạn có thể thay thế w[p:].index(i[1:])bằng w.index(i[1:],p). Nhìn chung, nó sẽ được else:p=(w.find(i[1:],p)+p)%len(p);w=w[:p]+w[p:].replace(i[1:],'',1).
Artyer

0

JavaScript (ES6), 117 byte

(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

Giải thích: Thay vì sử dụng một con trỏ rườm rà, tôi giữ nửa bên trái của chuỗi tvà nửa bên phải s. Ngoài ra, splitjoinlà một cách thuận tiện để thực hiện loại bỏ.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.