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 input
dan String refactor
(sebagai contoh), refactor input
menggunakan refactor
sebagai berikut:
The refactor
String 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 input
String 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
aaa -a
?|aa
dengan pipa menjadi pointer.-
jika sufiks tidak ditemukan?Jawaban:
APL,
9190 byteIni menggunakan string sebagai argumen kanannya, dan perintah sebagai argumen kiri, seperti:
sumber
GolfScript, 97 Bytes
Uji: golfscript.tryitonline.net
sumber
Python 3 (
164194186181168165 byte)Contoh menunjukkan pointer bergerak ke ujung jika tidak menemukan substring:
Terima kasih khusus kepada Artyer karena telah menyelamatkan saya 13 byte.
Terima kasih lagi kepada Artyer karena telah menyelamatkan saya 3 byte lagi melalui
beg
parameterindex
.Jawaban lama:
Contoh mendemonstrasikan pointer berfungsi (semua contoh dalam Q bekerja bahkan jika Anda tidak memperhitungkan pointer dan hanya mengganti pada kejadian pertama):
Sunting: Sejak 2 menit yang lalu jawaban saya sekarang tidak valid sesuai dengan komentar oleh penanya.
Sunting2: Diperbaiki.
sumber
w,*x=input().split()
, danif'-'>i:
bukannyaif i[0]=='+':
dan karakter tab untuk 2 indentasi bukannya 2 spasi akan menghemat beberapa byteTabError: 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.find
metode yang akan kembali-1
jika tidak dapat menemukan substring. Karena -1 menunjuk ke belakang string, yang perlu Anda lakukan hanyalah mengambil modulusp
dengan panjangw
yang seharusnya berarti Anda tidak perlu mencoba-kecuali.-1%len(str)
untuk mendapatkan indeks di akhir string.str.index
danstr.find
juga mengambilstart
parameter, jadi saya anggap Anda dapat menggantiw[p:].index(i[1:])
denganw.index(i[1:],p)
. Secara keseluruhan, itu akan menjadielse:p=(w.find(i[1:],p)+p)%len(p);w=w[:p]+w[p:].replace(i[1:],'',1)
.JavaScript (ES6), 117 byte
Penjelasan: Alih-alih menggunakan pointer yang rumit, saya menyimpan bagian kiri dari string
t
dan bagian kanans
. Selain itu,split
danjoin
merupakan cara mudah untuk melakukan penghapusan.sumber