CUSRS - Sistem Refactoring Tali yang Sama Sekali Tidak Berguna!

11

pengantar

Saya penggemar berat SBU (Short But Unique) tantangan yang muncul di PPCG sepanjang waktu. CUSRS adalah sistem yang dirancang untuk refactor string, fungsi CUSRS mengambil 2 parameter dan menghasilkan 1 String.

Tantangan

Menghasilkan program, fungsi, lambda atau alternatif yang dapat diterima untuk melakukan hal berikut:

Diberikan String inputdan String refactor(sebagai contoh), refactor inputmenggunakan refactorsebagai berikut:

The refactorString akan di format ((\+|\-)\w* *)+(regex), misalnya:

+Code -Golf -lf +al

Setiap bagian adalah tindakan refactoring untuk dilakukan input. Setiap program juga memiliki pointer.

+ Akan memasukkan akhiran itu (tanpa nilai tambah) di lokasi pointer saat ini di String dan kemudian mengatur ulang pointer ke 0.

Setiap operasi harus diterapkan ke inputString dan hasilnya harus dikembalikan.

Contoh:

input:
Golf +Code //pointer location: 0

output:
CodeGolf //pointer location: 0

-Akan menambah pointer melalui String sampai menemukan akhiran. Akhiran akan dihapus dari String dan pointer akan dibiarkan di sebelah kiri teks yang dihapus. Jika tidak ada suffix yang ditemukan, pointer hanya akan maju ke akhir String dan dibiarkan di sana.

input:
Golf -lf //pointer location 0

output:
Go //pointer location 2

Contohnya

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"

Kode Contoh

Contohnya adalah Java, itu tidak golf sama sekali.

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

Aturan

  • Celah Standar Berlaku
  • Kode terpendek, dalam byte, menang
Shaun Wild
sumber
1
Terkait
Emigna
Untuk apa outputnya aaa -a?
Produksi ETH
|aadengan pipa menjadi pointer.
Shaun Wild
@Emigna Setelah melihat pertanyaan yang dimaksud, saya percaya implementasi saya akan jauh berbeda.
Shaun Wild
Apa yang terjadi dengan -jika sufiks tidak ditemukan?
Zgarb

Jawaban:

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↓¨⍵⊂⍨⍵=⊃⍵}' ',⍺}

Ini menggunakan string sebagai argumen kanannya, dan perintah sebagai argumen kiri, seperti:

      '+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
sumber
1

GolfScript, 97 Bytes

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

Uji: golfscript.tryitonline.net

CodenameLambda
sumber
Selamat datang di PPCG! Anda dapat menggunakan penerjemah pada Coba online , yang mendukung input.
Martin Ender
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)

Contoh menunjukkan pointer bergerak ke ujung jika tidak menemukan substring:

Input: HelloThere -x +Friend
Output: HelloThereFriend

Terima kasih khusus kepada Artyer karena telah menyelamatkan saya 13 byte.

Terima kasih lagi kepada Artyer karena telah menyelamatkan saya 3 byte lagi melalui begparameter index.

Jawaban lama:

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)

Contoh mendemonstrasikan pointer berfungsi (semua contoh dalam Q bekerja bahkan jika Anda tidak memperhitungkan pointer dan hanya mengganti pada kejadian pertama):

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

Sunting: Sejak 2 menit yang lalu jawaban saya sekarang tidak valid sesuai dengan komentar oleh penanya.

aaa -b + b akan dihasilkan dengan aaab karena pointer akan menuju ke akhir.

Sunting2: Diperbaiki.

redstarcoder
sumber
1
w,*x=input().split(), dan if'-'>i:bukannya if i[0]=='+':dan karakter tab untuk 2 indentasi bukannya 2 spasi akan menghemat beberapa byte
Artyer
Jika saya mencoba untuk mencampur tab dan spasi yang saya dapatkan TabError: inconsistent use of tabs and spaces in indentation. Terima kasih atas sarannya, saya tidak tahu tentang fitur-fitur itu! Saya akan mulai menambahkan mereka segera.
redstarcoder
@redstartcoder Saya kira trik tab hanya bekerja di Python 2. Buruk saya
Artyer
Saya benar-benar bisa salah di sini, tetapi saya pikir string memiliki findmetode yang akan kembali -1jika tidak dapat menemukan substring. Karena -1 menunjuk ke belakang string, yang perlu Anda lakukan hanyalah mengambil modulus pdengan panjang wyang seharusnya berarti Anda tidak perlu mencoba-kecuali.
Kade
1
Anda akan lakukan -1%len(str)untuk mendapatkan indeks di akhir string. str.indexdan str.findjuga mengambil startparameter, jadi saya anggap Anda dapat mengganti w[p:].index(i[1:])dengan w.index(i[1:],p). Secara keseluruhan, itu akan menjadi 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

Penjelasan: Alih-alih menggunakan pointer yang rumit, saya menyimpan bagian kiri dari string tdan bagian kanan s. Selain itu, splitdan joinmerupakan cara mudah untuk melakukan penghapusan.

Neil
sumber