Tugas Anda adalah mensimulasikan beberapa penekanan tombol yang diketik pengguna.
Memasukkan
Array string atau string dengan pembatas pilihan Anda (di luar rentang 32-126) yang mengandung setidaknya satu 'keystroke'.
Array ini hanya akan berisi dua jenis string: penekanan tombol pasif (karakter tunggal) dan perintah (karakter dalam tanda kurung [ ]
).
- Penekanan tombol pasif
- Kode karakter ASCII
[32-126]
- Kode karakter ASCII
- Perintah:
[B]
: backspace (hapus karakter terakhir yang ditambahkan jika ada)[C]
: salin semua yang sudah ditulis[D]
: hapus semua yang telah ditulis[P]
: rekatkan apa yang telah disalin
Keluaran
Tali yang dihasilkan oleh penekanan tombol.
Contohnya
['H', 'e', 'l', 'l', 'o'] -> 'Hello'
['H', 'e', 'l', 'l', 'o', ' ', '[C]', '[P]'] -> 'Hello Hello '
['[D]', 'D', '[B]'] -> ''
['H', '[C]', 'i', '[P]', '[C]', '[P]'] -> 'HiHHiH'
['e', '[C]', '[B]', 'I', ' ', 'l', 'i', 'k', '[P]', ' ', 'b', '[P]', '[P]', 's', '!'] -> I like bees!
['N', '[P]'] -> 'N'
['#', '5', '0', 'K', '0', '0', '1', '[D]', '#', 'n', 'o', 't'] -> '#not'
['H', 'o', 'w', ' ', '[D]', 'H', 'e', 'y'] -> 'Hey'
['s', 'u', 'd', '[B]', 'p', '[C]', '[D]', 'I', ' ' , 'h', 'a', 'v', 'e', ' ', '[P]', 'p', 'e', 'r', '!'] -> 'I have supper!'
Ini adalah kode-golf , jadi kode terpendek dalam byte menang!
[D]
mana itu bukan satu-satunya yang digunakan, sehingga kode tidak akan hanya menjadisplit('[D]')[1]
atau sesuatu.[D]
Jawaban:
05AB1E ,
34333127 byteMenggunakan pengodean CP-1252 .
Cobalah online!
Penjelasan
Pasangan fungsi yang dievaluasi dalam kode di atas adalah:
Disimpan 4 byte menggunakan
mod 5
trik dari jawaban Lynn CJamsumber
Vim,
76, 64, 62, 58 penekanan tombolTerima kasih kepada Loovjo karena telah menyimpan 7 penekanan tombol
Apakah ada yang mengatakan mensimulasikan penekanan tombol? Baiklah, itu hal yang baik bahasa favorit saya untuk bermain golf adalah tentang mensimulasikan penekanan tombol!
Masukan datang dalam format ini:
Ini adalah jawaban yang cukup mudah. Itu hanya menerjemahkan setiap "perintah" ke setara vim keystroke dari perintah itu. Mari kita bawa baris demi baris.
Ini menghemat satu ton byte. Vim memiliki "command line" bawaan di mana Anda dapat membuat pemetaan, mengubah pengaturan, menyimpan file, dll. Di sini kita membuat pemetaan.
:no
kependekan:nnoremap
yang artinya "Ketika kita berada dalam mode normal, gantikan sisi kiri ini dengan sisi kanan ini." Karena kita menelepon:%s/
lima kali berbeda , ini menghemat banyak. Ini\M
adalah trik yang bagus. Ini berarti bahwa pencarian berikut akan menjadi "Very No Magic", yang berarti bahwa regex[B]
akan cocok dengan teks literal[B]
daripada rentang yang hanya berisi B di dalamnya. Karena sebagian besar perintah pengganti memiliki tanda kurung di dalamnya, kami mengisi yang pertama.Kemudian, kami memanggil lima perintah pengganti. Perlu dicatat mengapa saya menelepon
<C-v>
berkali-kali. Karakter seperti<esc>
,<C-v>
,<C-r>
, dll adalah karakter tak patut ditulis, dan harus diketik ke dalam baris perintah dengan<C-v>
.[B]: backspace. Yang ini cukup mudah. Cukup gantikan masing
[B]
- masing denganCtrl-h
, yang setara dengan backspace dalam vim.[C]: salin semua yang sudah ditulis. Ini diterjemahkan ke
<esc>0y$A
. Ini berarti:Kita hampir bisa melakukannya
Y
di tempat0y$
yang berarti "menarik seluruh baris", tetapi ini juga mengambil baris baru yang tidak kita inginkan.[D]: hapus semua yang sudah ditulis. Ini
<esc>"_S
. Seperti sebelumnya,<esc>
keluar dari mode penyisipan sehingga kita dapat menjalankan perintah. Ada beberapa hal yang lebih nyaman di sini. Jadi kita lakukan[P]: rekatkan apa yang sudah disalin. Yang ini juga sangat mudah. Itu hanya
<C-r>"
berartiInsert the contents of register '"'
."
kebetulan menjadi register utama yang 'y' nyampai untuk.Sekarang kita telah menerjemahkan semua perintah, kita harus menggabungkan semua baris bersama dengan menghapus semua karakter baris baru. Berkat pemetaan kami, ini adil
Ini
<bs>
adalah backspace, (ASCII 0x08) dan kami membutuhkannya karena[
kami telah mengisinya.Sekarang, kami telah menerjemahkan input ke dalam kode vim, dan kami hanya perlu menjalankannya. Jadi kami:
sumber
<C-r>
didokumentasikan?:h mode_keystroke
. Dalam hal ini, itu akan menjadi:h i_ctrl-r
/g
bendera. Saya akan menambahkan detailnya.0ii<esc>D@"
?CJam , 33 byte
Cobalah online!
Penjelasan
Peta "fungsi hash"
1>3b
memetakan[B]
ke 291 (= 1 mod 5),[D]
ke 297 (= 2 mod 5),[P]
ke 333 (= 3 mod 5),[C]
ke 294 (= 4 mod 5).Nilai ini (mod 5) digunakan sebagai indeks ke dalam daftar cuplikan kode CJam:
h
, cuplikan"h"
dikembalikan, yang mendorong string karakter tunggal ke tumpukan.[B]
, cuplikan;
dikembalikan, yang memunculkan elemen.[D]
, potongan];
dikembalikan, yang membersihkan tumpukan.[P]
, potonganL~
dikembalikan, yang menambahkan variabelL
ke tumpukan.[C]
, potongan]:L~
dikembalikan, yang menyimpan tumpukan saat ini dalam variabelL
.Cuplikan ini disatukan dan dieksekusi; tumpukan terakhir dicetak secara implisit oleh CJam.
L
awalnya daftar kosong, jadi buffer salinan awalnya "kosong".sumber
Python 2,
969593 bytesumber
or"E"
ke definisix
untuk menghemat ruang?x
itu tidak sepadan. Thex=="C"
saja bisao=="[C]"
.Jelly ,
50 5148 byteTryItOnline
Atau semua test case
Bagaimana?
Sebagai contoh
- dengan modal
'B'
sebagai test case, karena sebelum saya memperbaiki bug itu akan kembali"I likeees!"
sumber
['e', 'e', 'e', '[B]', '[C]', '[B]', '[D]', 'I', ' ', 'l', 'i', 'k', '[P]', '[B]', ' ', 'b', '[P]', 's', '!']
.JavaScript (ES6),
84807776 byteDisimpan 3 byte berkat @Neil, 1 lagi berkat @ edc65
.map
lebih panjang dua byte:Cuplikan tes
Tampilkan cuplikan kode
sumber
reduce
versi dengan menggunakan(s,[c,z])
..map
versi juga.x=>x.reduce((s,[c,z])=>z<'C'?s.slice(0,-1):z<'D'?t=s:z<'P'?'':s+=z?t:c,t='')
1 byte lebih sedikit. Anehnya undefined <char apa pun salahx=>x.reduce((s,[c,z])=>z<'C'?s.slice(0,-1):z<'D'?t=s:z<'P'?"":z?t:s+c,t="")
menyimpan satu karakter lagi. Jika z benar, tempel, tambahkan char untuk output.z?s+t:s+c
1 byte lebih daris+=z?t:c
Perl,
5350 byteTermasuk +1 untuk
-p
Berikan masukan pada STDIN yang diakhiri oleh baris baru (baris baru terakhir mungkin ditinggalkan, sehingga dianggap sebagai string yang dipisahkan oleh baris baru):
memberi
keystrokes.pl
:Hampir menangkap jawaban Jelly tetapi iblis lolos ke 48 byte ...
sumber
Python
120 119116 byteIdeone
Fungsi rekursif dengan input,
s
daftar tombol-stroke.Setiap panggilan rekursif memperbarui teks kembali,
r
dan, dalam kasus a[C]
, clipboard,c
hinggas
kosong.Nilai baru
r
danc
ditemukan dengan mengindeks ke dalam kamus{...}
,, dan diteruskan dengan membongkar*
,. Untuk penekanan tombol pasifs[0][1:2]
akan mengembalikan string kosong dan kunci''
akan digunakan sebagai gantinya.sumber
lambda s,r='',c=''
gantilambda s,r,c=''
?s
) sehingga fungsinya perlu bekerja tanpa input lain.Haskell,
136 133 130127 byteCobalah di Ideone.
Penjelasan:
k
melakukan rekursi ekor atas daftar perintah.b
adalah buffer di mana string dibangun,c
menyimpan bagian yang disalin.Sunting: Untuk menyimpan beberapa byte perintah
[B][C][D][P]
tidak lagi sama persis tetapi dibandingkan: kurang dari'C'
? ->B
dan seterusnya. Terima kasih kepada @nimi karena telah menghemat 3 byte.sumber
init b
melempar pengecualian jikab
daftar kosong.Mathematica, 100 byte
Fungsi anonim. Mengambil daftar string sebagai input dan mengembalikan string sebagai output. Abaikan semua pesan yang dihasilkan.
sumber
Java 7,
207203 byteIni bisa dipastikan golf lagi,
tapi ini adalah jawaban awal saya. Akan mengedit setelah saya menemukan sesuatu untuk menghapusdiganti denganequals
-checks ..charAt
, tetapi mungkin masih bisa golf ..Tidak digabungkan & kode uji:
Coba di sini.
Keluaran:
sumber
PHP, 131 Bytes
17 Bytes disimpan oleh operator ternary @IsmaelMiguel
sumber
<?$c=[];foreach($_GET[a]as$k=>$v)$v=="[P]"?$o=array_merge($o,$c):($v=="[C]"?$c=$o:($v=="[B]"?array_pop($o):$v=="[D]"?$o=[]:$o[]=$v));echo join($o);
. (Ganti seluruhif()
rantai Anda dengan rantai operasi trenary).PHP, 108 byte
Menggunakan pendekatan berbasis string daripada pendekatan berbasis array.
Gunakan seperti:
sunting: disimpan 8 byte dengan mengotak-atik urutan?: s dan membuatnya negatif untuk menghindari keharusan menggunakan begitu banyak tanda kurung;
sumber
$s=$argv[++$i]
alih-alihnull!==$s=$argv[++$i]
jika Anda menggunakan PHP> 7, Anda dapat menulis$s=$argv[++$i]??0
untuk melewati pemberitahuan'0'
melihat bagaimana'0'
palsu. Ada begitu banyak pemberitahuan lain yang terlewati sehingga orang tertentu tampak seperti buang-buang waktu.SpecBAS - 216 byte
Input diberikan sebagai string dengan koma, yang kemudian diubah menjadi array.
sumber
V , 49 byte
Cobalah online!
Karena ini berisi karakter yang tidak patut dicetak, berikut adalah hexdump:
Ini hanya terjemahan langsung dari jawaban vim saya sehingga saya bisa bersaing dengan Jelly. Sayangnya, saya masih satu byte lebih, tetapi saya masih mengerjakan yang terakhir. :)
Saya lebih bangga dengan jawaban itu, jadi jika Anda ingin penjelasan yang sangat rinci, bacalah yang itu.
sumber
Sebenarnya, 56 byte
Cobalah online!
Penjelasan:
sumber
Jawa, 181
Versi yang lebih mudah dibaca:
sumber
if(s.length()>1){...}else
p==1
menjadip<2
MATL , 46 byte
Cobalah online! Atau verifikasi semua kasus uji .
Penjelasan
sumber
TCL, 186 byte
Diformat dengan baik:
Saya hanya ingin membuktikan bahwa saya bisa melakukan ini di TCL
sumber
foreach
denganlmap
;return
olehset x
. Inilah yang bisa saya katakan dengan cepat.Scala, 158 byte
Tidak Disatukan:
Memecahkan masalah ini sebagai lipatan dengan hasilnya dan clipboard sebagai akumulator. Sayangnya, scala tidak memiliki operator kondisional ternary, melainkan digunakan
if else
sebagai ekspresi.sumber
PHP 7.1,
9592 byteCatatan: membutuhkan PHP 7.1 untuk offset string negatif.
Tanpa offset string negatif (101 byte):
Jalankan seperti ini:
Penjelasan
Tweaks
sumber