Ayo parsing dan proses Key-Language! Diberikan input dari urutan penekanan tombol keyboard dan / atau tombol khusus, tulis program, fungsi, dll. Yang menghasilkan produk ketika semua tindakan diproses berdasarkan keyboard berikut:
+-------------------------------------------------------+
| ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | - | + | |
| ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | _ | = |Del|
+-------------------------------------------------------+
|TAB| q | w | e | r | t | y | u | i | o | p | [ | ] | \ |
| | Q | W | E | R | T | Y | U | I | O | P | { | } | | |
+-------------------------------------------------------+
|CAPS | a | s | d | f | g | h | j | k | l | ; | ' | RET |
| | A | S | D | F | G | H | J | K | L | : | " | |
+-------------------------------------------------------+
| SHIFT | z | x | c | v | b | n | m | , | . | / | SHIFT |
| | Z | X | C | V | B | N | M | < | > | ? | |
+-------------------------------------------------------+
| |
| SPACEBAR |
+-------------------------------------------------------+
Kunci bahwa output karakter yang sebenarnya tidak terdiri dari spasi dan yang dapat dimodifikasi oleh kunci lainnya akan dikenal sebagai "kunci karakter", dan orang-orang yang memodifikasi output kunci lainnya atau output spasi akan dikenal sebagai "tombol khusus". Tombol karakter alfabet, yang akan ditampilkan pada input dengan huruf besar, dapat dimodifikasi dengan salah satu Shift
atau Caps Lock
untuk menghasilkan huruf besar, dan sisa tombol karakter hanya dapat dimodifikasi dengan Shift
untuk menghasilkan karakter alternatif mereka. Oleh karena itu A
dalam input sesuai dengan a A
kunci karakter, yang output normalnya a
dan output modifikasinya, dapat diperoleh dengan tombol Shift
atau Caps Lock
, adalah A
. Di samping itu,/
, yang sesuai dengan tombol / ?
karakter, memiliki output normal /
dan output yang dimodifikasi ?
hanya dapat diperoleh dengan Shift
waktu ini.
Aturan
Input akan selalu berupa string yang terdiri dari urutan tombol karakter dan tombol khusus. Kunci khusus penuh untuk pemetaan string untuk input (yaitu format mereka dijamin berada di input) dan tindakan / output yang sesuai adalah sebagai berikut:
<DEL> -> Delete the previous character (including whitespace). If called when string is empty, nothing happens. If called 2 or more times in a row, 2 consecutive deletes happen. For instance, "RE<DEL><DEL>" should return an empty string ("") and also "R<RET><DEL><DEL>E" should return just "E".
<CAPS> -> Enable Caps Lock until <CAPS> appears again, upon which it is disabled, although it is not guaranteed to be disabled by the end of the input. Enabling this only modifies the upcoming alphabet keys resulting in them outputting only uppercase letters. For instance, "<CAPS>RE<CAPS>" results in the output "RE", but <CAPS>.<CAPS> would still result in a ".".
<RET> -> Add a new line.
<SPC> -> Add a single blank space.
<TAB> -> Add 4 spaces.
<SHFT> -> Shift is held down resulting in the alternate character of the upcoming keypress to be output, after which the key is released. For instance, "<SHFT>A" results in the output "A", "<SHFT>1" results in the output "!", and "<SHFT>1234" results in the output "!234" as only the first upcoming keypress is modified and nothing else. It is guaranteed that a character key will succeed a <SHFT>. Therefore, <SHFT><SPC> is not a possible input.
String kosong juga dimungkinkan sebagai input, yang outputnya seharusnya tidak ada.
- Penggunaan bawaan apa pun yang memecahkan masalah ini secara langsung dilarang.
- Penggunaan celah standar tidak diizinkan.
Uji Kasus
Disajikan dalam format yang Actual String Input -> Actual String Output
diikuti oleh penjelasan untuk beberapa orang.
1<SHFT>2<TAB><CAPS>R.KAP.<SPC><SHFT>123 -> 1@ R.KAP. !23
Keluaran
1
saat1
tombol ditekan tanpa beralih, lalu Shift ditekan dan2
tombol ditekan menghasilkan@
output. Kemudian tombol Shift dilepaskan dan Tab ditekan, menghasilkan lekukan 4 spasi. Menindaklanjuti, Caps Lock kunci ditekan, setelah ituR
,.
,K
,A
,P
, dan.
tombol yang ditekan, menghasilkan outputR.KAP.
. Akhirnya, satu ruang yang keluaran diikuti dengan pergeseran sehingga!23
menjadi output ketika1
,2
dan3
tombol yang ditekan di akhir.<SHFT>ABCDEFG<SHFT>HIJK<SHFT>1<SHFT>2<SHFT>3<SHFT>4567890 -> AbcdefgHijk!@#$567890
Tombol Shift ditekan terus diikuti oleh
A
tombol, menghasilkan outputA
diikuti oleh outputbcdefg
ketikaB-G
tombol ditekan. Kemudian, tombol Shift ditekan lagi digantikan olehH
tombol, setelah itu outputH
, diikuti olehijk
ketikaI-K
tombol ditekan. Akhirnya, semua1-4
tombol dimodifikasi karena shift ditekan sebelum setiap penekanan tombol yang menghasilkan output!@#$
selesai567890
ketika5-0
tombol ditekan kembali.<CAPS>THIS<SPC>IS<SPC>IN<SPC>ALL<SPC>CAPS<CAPS><SPC>NOW<SPC>THIS<SPC>IS<SPC>IN<SPC>ALL<SPC>LOWERCASE -> THIS IS IN ALL CAPS now this is in all lowercase
<TAB><SPC><TAB><SHFT>1 -> !
<CAPS>WWW<CAPS>.CODEGOLF.STACKEXCHANGE<SHFT>.COM -> WWW.codegolf.stackexchange>com
PROGRAMMING<CAPS><SPC>IS<SPC><CAPS>AWESOME -> programming IS awesome
<DEL><RET><DEL><RET><DEL> -> "" (Empty String)
Tombol hapus ditekan di awal dan setelah itu tidak ada yang terjadi. Kemudian, tombol Return ditekan sehingga menghasilkan baris baru, yang dihapus setelah tombol backspace ditekan lagi. Akhirnya, urutan yang sama (baris baru diikuti oleh backspace) diulang. Setelah semua ini, outputnya adalah string kosong.
<SHFT>HI<SPC>HOW<SPC>ARE<SPC>YOU<SHFT>/<RET><SHFT>I<SPC><SHFT>AM<SPC>O<DEL><SHFT>GOOD<SHFT>1 -> Hi how are you?\nI Am Good!
<SHFT>,<CAPS>RET<CAPS><SHFT>. -> <RET>
String
<RET>
harus berupa output string yang sebenarnya . Jadi, ini seharusnya tidak menghasilkan baris baru.<CAPS>67890,.;'[]<CAPS> -> 67890,.;'[]
<CAPS><SHFT>A -> A
RE<DEL><DEL> -> "" (Empty String)
U<RET><DEL><DEL>I -> i
<DEL><DEL><DEL>5<DEL> -> "" (Empty string)
"" (Empty String) -> "" (Empty String)
Ini adalah codegolf sehingga kode terpendek dalam byte menang!
AbcdefgHijk!@#$567890
? Juga, dalam pengujian # 8,<SHFT>
adalah di akhir string, tetapi aturan menyatakan: "Dijamin bahwa kunci karakter akan berhasil <SHFT>."Jawaban:
Kode mesin x86 16-bit,
140139 byteDisimpan 1 byte dengan mengganti DL dengan DX di opcode kedua hingga terakhir. Juga offset lompatan yang diperbaiki dalam pembongkaran untuk mencocokkan hex dump.
Karena sifat tugas membutuhkan beberapa data yang diinisialisasi, dan jawabannya bukan program lengkap tetapi fungsi, saya berasumsi bahwa ada bagian data dalam program dan tautan segera memperbarui alamat data. Tempat penampung alamat dilambangkan dengan '????'.
Ini adalah representasi hex kode. Parameternya adalah pointer ke string input di SI dan pointer ke buffer output di DI. String diasumsikan diakhiri dengan NULL.
Konten dari tabel pemetaan (25 byte):
Jumlah byte dihitung untuk kode dan data.
Membongkar:
Untuk set instruksi 32-bit kodenya benar-benar sama kecuali untuk instruksi pertama yang 2 byte lebih lama karena pengalamatan 32-bit (8d1d ???????? lea ebx, ds: ???????? ?)
sumber
i
untuk kasus ujiU<RET><DEL><DEL>I
dan string kosong untuk inputRE<DEL><DEL>
? Saya mengklarifikasi aturan sedikit tentang kunci hapus, jadi jika 2 kasus uji tidak berfungsi, bisakah Anda juga memperbarui kode Anda sehingga menghasilkan output yang benar untuk kasus uji tersebut? Terima kasih!Retina, 136 byte
Mungkin bisa bermain golf lebih lanjut.
Verifikasi semua testcases. (Sedikit dimodifikasi untuk menjalankan semua testcas sekaligus.)
sumber
Caps+Shift+A = A
. Man keyboard saya aneh ...JavaScript (ES6), 207
Diperbarui untuk memperbaiki bug dengan penghapusan berulang, bahkan beberapa byte lebih pendek.
kurang golf
Uji
sumber
I
untuk kasus ujiU<RET><DEL><DEL>I
dan string kosong untuk inputRE<DEL><DEL>
? Saya mengklarifikasi aturan sedikit tentang kunci hapus, jadi jika 2 kasus uji tidak berfungsi, bisakah Anda juga memperbarui kode Anda sehingga menghasilkan output yang benar untuk kasus uji tersebut? Terima kasih!U<RET><DEL>I
sebaiknyai
tidak memberiI