Mengetik Keyboard Ponsel
Pertanyaan ini ditanyakan beberapa waktu yang lalu, tetapi ditutup karena spesifikasi yang buruk. Jadi, saya mengulanginya, dengan spesifikasi yang lebih baik. Pertanyaan ini terkait, tetapi berjalan ke arah yang berlawanan.
Sebelum T9 muncul, untuk mengetik karakter dalam pesan teks, Anda harus menekan salah satu tombol angka beberapa kali untuk mendapatkan karakter yang Anda inginkan. Untuk referensi, berikut adalah pemetaan standar:
+-------+-------+-------+
| 1 | 2 | 3 |
| .?!1 | ABC2 | DEF3 |
+-------+-------+-------+
| 4 | 5 | 6 |
| GHI4 | JKL5 | MNO6 |
+-------+-------+-------+
| 7 | 8 | 9 |
| PQRS7 | TUV8 | WXYZ9 |
+-------+-------+-------+
| * | 0 | # |
| ← |SPACE 0| → |
+-------+-------+-------+
*
adalah backspace, 0
adalah spasi ( ' '
) atau angka 0
, dan #
mengonfirmasi karakter saat ini. Demi kesederhanaan, semua karakter adalah huruf besar.
Ketika Anda menekan tombol beberapa kali, siklus karakter yang dipilih melalui karakter yang mungkin untuk kunci yang: 2 -> A
, 22 -> B
, 222 -> C
, 2222 -> 2
, 22222 -> A
, dan sebagainya. Perhatikan bahwa, karena *
hanya memiliki satu opsi, menekannya berulang kali menyebabkan banyak spasi mundur dimasukkan. Menekan #
beberapa kali berturut-turut tidak berpengaruh. Trailing #
tidak perlu.
Selain itu, jika tombol yang berbeda ditekan segera setelah menekan tombol, penekanan tombol sebelumnya secara otomatis dikonfirmasi. Dengan demikian, 223
secara fungsional identik dengan 22#3
.
Tantangan Anda adalah menerjemahkan serangkaian penekanan tombol ke string yang sesuai yang akan ditampilkan ponsel.
Contohnya
8#99999#055#33#999#22#666#2#777#3#1 -> T9 KEYBOARD
4433555#55566609666666677755533*3111 -> HELLO WORLD!
7##222#222**7#222#4 -> PPCG
00#0#00 -> 0 0
Aturan
- Ini adalah kode-golf , sehingga solusi terpendek yang benar (dalam byte) menang
- Jawaban yang menang akan dipilih dalam satu minggu
- Celah standar dilarang
- Jawaban Anda mungkin dalam bentuk program lengkap, fungsi bernama, atau fungsi anonim, mengambil input dan menghasilkan output dalam salah satu metode standar
Papan peringkat
Cuplikan Stack di bagian bawah posting ini menghasilkan leaderboard dari jawaban a) sebagai daftar solusi terpendek per bahasa dan b) sebagai leaderboard keseluruhan.
Untuk memastikan bahwa jawaban Anda muncul, silakan mulai jawaban Anda dengan tajuk utama, menggunakan templat Penurunan harga berikut:
## Language Name, N bytes
di mana N
ukuran kiriman Anda. Jika Anda meningkatkan skor Anda, Anda dapat menyimpan skor lama di headline, dengan mencoretnya. Contohnya:
## Ruby, <s>104</s> <s>101</s> 96 bytes
Jika Anda ingin memasukkan beberapa angka dalam tajuk Anda (mis. Karena skor Anda adalah jumlah dari dua file atau Anda ingin membuat daftar hukuman penterjemah secara terpisah), pastikan bahwa skor sebenarnya adalah angka terakhir di tajuk:
## Perl, 43 + 2 (-p flag) = 45 bytes
Anda juga dapat membuat nama bahasa menjadi tautan yang kemudian akan muncul di cuplikan:
## [><>](http://esolangs.org/wiki/Fish), 121 bytes
<style>body { text-align: left !important} #answer-list { padding: 10px; width: 290px; float: left; } #language-list { padding: 10px; width: 290px; float: left; } table thead { font-weight: bold; } table td { padding: 5px; }</style><script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"> <div id="language-list"> <h2>Shortest Solution by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr> </thead> <tbody id="languages"> </tbody> </table> </div> <div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr> </thead> <tbody id="answers"> </tbody> </table> </div> <table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr> </tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr> </tbody> </table><script>var QUESTION_ID = 61545; var ANSWER_FILTER = "!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe"; var COMMENT_FILTER = "!)Q2B_A2kjfAiU78X(md6BoYk"; var OVERRIDE_USER = 45941; var answers = [], answers_hash, answer_ids, answer_page = 1, more_answers = true, comment_page; function answersUrl(index) { return "https://api.stackexchange.com/2.2/questions/" + QUESTION_ID + "/answers?page=" + index + "&pagesize=100&order=desc&sort=creation&site=codegolf&filter=" + ANSWER_FILTER; } function commentUrl(index, answers) { return "https://api.stackexchange.com/2.2/answers/" + answers.join(';') + "/comments?page=" + index + "&pagesize=100&order=desc&sort=creation&site=codegolf&filter=" + COMMENT_FILTER; } function getAnswers() { jQuery.ajax({ url: answersUrl(answer_page++), method: "get", dataType: "jsonp", crossDomain: true, success: function (data) { answers.push.apply(answers, data.items); answers_hash = []; answer_ids = []; data.items.forEach(function(a) { a.comments = []; var id = +a.share_link.match(/\d+/); answer_ids.push(id); answers_hash[id] = a; }); if (!data.has_more) more_answers = false; comment_page = 1; getComments(); } }); } function getComments() { jQuery.ajax({ url: commentUrl(comment_page++, answer_ids), method: "get", dataType: "jsonp", crossDomain: true, success: function (data) { data.items.forEach(function(c) { if (c.owner.user_id === OVERRIDE_USER) answers_hash[c.post_id].comments.push(c); }); if (data.has_more) getComments(); else if (more_answers) getAnswers(); else process(); } }); } getAnswers(); var SCORE_REG = /<h\d>\s*([^\n,<]*(?:<(?:[^\n>]*>[^\n<]*<\/[^\n>]*>)[^\n,<]*)*),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/; var OVERRIDE_REG = /^Override\s*header:\s*/i; function getAuthorName(a) { return a.owner.display_name; } function process() { var valid = []; answers.forEach(function(a) { var body = a.body; a.comments.forEach(function(c) { if(OVERRIDE_REG.test(c.body)) body = '<h1>' + c.body.replace(OVERRIDE_REG, '') + '</h1>'; }); var match = body.match(SCORE_REG); if (match) valid.push({ user: getAuthorName(a), size: +match[2], language: match[1], link: a.share_link, }); else console.log(body); }); valid.sort(function (a, b) { var aB = a.size, bB = b.size; return aB - bB }); var languages = {}; var place = 1; var lastSize = null; var lastPlace = 1; valid.forEach(function (a) { if (a.size != lastSize) lastPlace = place; lastSize = a.size; ++place; var answer = jQuery("#answer-template").html(); answer = answer.replace("{{PLACE}}", lastPlace + ".") .replace("{{NAME}}", a.user) .replace("{{LANGUAGE}}", a.language) .replace("{{SIZE}}", a.size) .replace("{{LINK}}", a.link); answer = jQuery(answer); jQuery("#answers").append(answer); var lang = a.language; lang = jQuery('<a>'+lang+'</a>').text(); languages[lang] = languages[lang] || {lang: a.language, lang_raw: lang.toLowerCase(), user: a.user, size: a.size, link: a.link}; }); var langs = []; for (var lang in languages) if (languages.hasOwnProperty(lang)) langs.push(languages[lang]); langs.sort(function (a, b) { if (a.lang_raw > b.lang_raw) return 1; if (a.lang_raw < b.lang_raw) return -1; return 0; }); for (var i = 0; i < langs.length; ++i) { var language = jQuery("#language-template").html(); var lang = langs[i]; language = language.replace("{{LANGUAGE}}", lang.lang) .replace("{{NAME}}", lang.user) .replace("{{SIZE}}", lang.size) .replace("{{LINK}}", lang.link); language = jQuery(language); jQuery("#languages").append(language); } }</script>
2 -> A
,22 -> B
...,2222 -> A
....) tidak mengizinkan angka apa pun untuk diproduksi.Jawaban:
K5, 112 byte
Yang ini benar-benar berantakan, tapi saya pikir ada cukup banyak ruang untuk bermain golf.
Pertama kita perlu membuat tabel pencarian untuk keymap. Ada kunci dengan 2, 4 dan 5 karakter yang dipetakan padanya, jadi menambahkan setiap entri ke 20 menyederhanakan proses pengindeksan tabel ini secara siklis nanti:
Lalu saya membagi input menjadi run:
Jatuhkan setiap # run dan strip trailing running setiap kali saya menemukan *:
Dan kemudian saya siap untuk hanya mengindeks ke dalam tabel pencarian berdasarkan panjang dan elemen pertama dari setiap proses.
Bersama:
Edit:
Hemat 5 byte:
sumber
(20#'((" ";".?!"),0 3 6 9 12 15 19 22_`c$65+!26),'$!10)
menjadi(20#'((" ";".?!"),((3*!6),19 22)_`c$65+!26),'$!10)
.Python 2,
230206 byteYang ini menciptakan fungsi f yang mengambil string penekanan tombol sebagai argumen dan mengembalikan string yang sesuai yang akan ditampilkan ponsel. Itu juga terjadi untuk mengambil argumen opsional kedua sebagai kunci pemetaan kamus untuk karakter yang sesuai, misalnya {"0": "0", "1": ".?! 1", ...} .
Pertama, string penekanan tombol dikelompokkan dengan karakter berulang, misalnya ["8", "#", "99999", "#", ...] . Kemudian, karakter pertama dari setiap grup dipetakan dalam kamus yang diteruskan sebagai argumen kedua, misalnya 9 peta ke WXYZ9 . Akhirnya, panjang grup digunakan sebagai offset dalam nilai dari kamus.
Perhatikan bahwa offset harus menggunakan modulo pada panjang grup karakter yang berulang karena penekanan tombol mungkin berputar. Perhatikan juga bahwa karakter # dipetakan ke \ 0 dan hanya dihapus pada akhirnya karena 99 # 99 tidak sama dengan 9999 .
Berikut ini adalah output dari fungsi untuk masing-masing contoh dalam pertanyaan:
sumber
JavaScript,
214184168162 byteIni mungkin bisa dibuat sedikit lebih kecil, tapi saya cukup senang dengan hasilnya. Pisahkan karakter menjadi kelompok yang diulang satu atau lebih, kemudian langkah-langkah melalui array, memetakan setiap karakter untuk nilainya dalam hash dan menambahkannya ke string terakhir. Jika ia menemukan sejumlah '#', itu mengabaikannya. Jika ia menemukan '*', itu menghilangkan jumlah mereka dari akhir string terakhir.
sumber
Python 2, 237 byte
Menggunakan kamus cr3, tetapi tanpa kembali.
sumber
Python 2, 265 byte
Terlalu lama. IO: stdin, stdout.
sumber