pengantar
Membantu! Saya tidak sengaja menjatuhkan kalkulator TI-84 saya ke luar jendela saya (jangan tanya bagaimana) dan itu rusak. Saya memiliki tes matematika besok dan satu-satunya kalkulator yang dapat saya temukan adalah satu dengan tombol-tombol ini:
7 8 9 +
4 5 6 -
1 2 3 *
0 = /
Tes matematika saya adalah tes ulasan untuk mengevaluasi ekspresi. Saya memerlukan program untuk mengambil ekspresi seperti1+(5*4)/7
dan mengubahnya menjadi penekanan tombol yang diperlukan untuk menyelesaikannya di kalkulator cadangan saya. (Dan jika Anda bertanya-tanya, ini benar-benar terjadi pada saya).
Tantangan
Mengingat string masukan non-kosong yang mengandung hanya karakter 0-9
, (
, )
, +
, -
, *
, dan /
, output penekanan tombol dalam serangkaian ruang yang dipisahkan (misalnya. 1 + 3 / 3 =
). Harus selalu ada tanda sama dengan di akhir output. Tidak ada celah standar.
Contoh:
- Input
1+(5*4)/7
:, Output:5 * 4 / 7 + 1 =
- Input
6*(2/3)
:, Output:2 / 3 * 6 =
- Input
(7-3)/2
:, Output:7 - 3 / 2 =
Untuk membuat tantangan ini lebih mudah:
- Anda dapat berasumsi bahwa input memiliki serangkaian penekanan tombol yang terkait dengannya yang tidak memerlukan pembersihan kalkulator (
1-(7*3)
tidak valid karena akan mengharuskan Anda untuk menemukan7 * 3
, kemudian menghapus kalkulator untuk melakukan1 - 21
. Semua contoh di atas valid karena ada satu , hasil terus menerus yang tidak mengharuskan pengguna untuk menghapus kalkulator dan mengingat angka). - Anda dapat berasumsi bahwa hanya akan ada bilangan bulat tunggal setelah a
/
, karena memiliki input seperti21/(7*3)
tidak akan lulus asumsi pertama juga. - Anda dapat mengasumsikan bahwa akan selalu ada
*
antara bilangan bulat dan tanda kurung kiri (Valid6*(7)
:, Tidak valid:)6(7)
. - Anda dapat menganggap input selalu menghasilkan output integer.
- Anda dapat menganggap input hanya memiliki tiga tingkat tanda kurung.
Bukan contoh
2-(14/2)
Anda harus melakukan14 / 2
, maka jelas , kemudian2 - 7
.36/(2*3)
Anda harus melakukan2 * 3
, maka jelas , kemudian36 / 6
.1024*4/(1*2+2)
Anda harus melakukan1*2+2
, maka jelas , kemudian1024 * 4 / 4
.
Bonus
- -5% jika program Anda dapat mengenali perkalian kurung (ia tahu itu
6(7)=6*(7)
). - -5% jika program Anda dapat menangani input dengan angka desimal (
3.4
,2.75
,7.8
) dan output termasuk.
(seperti harus ada.
kunci pada kalkulator luang saya dalam kasus ini). - -5% jika program Anda dapat menangani level tanda kurung tanpa batas.
Ini adalah kode-golf , kode terpendek dalam byte (termasuk bonus) menang!
Papan peringkat
Berikut ini adalah Stack Snippet untuk menghasilkan leaderboard biasa dan gambaran umum pemenang berdasarkan bahasa.
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 tautan nama bahasa yang kemudian akan muncul di cuplikan papan peringkat:
## [><>](http://esolangs.org/wiki/Fish), 121 bytes
var QUESTION_ID=61751,OVERRIDE_USER=141697;function answersUrl(e){return"http://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(e,s){return"http://api.stackexchange.com/2.2/answers/"+s.join(";")+"/comments?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),answers_hash=[],answer_ids=[],e.items.forEach(function(e){e.comments=[];var s=+e.share_link.match(/\d+/);answer_ids.push(s),answers_hash[s]=e}),e.has_more||(more_answers=!1),comment_page=1,getComments()}})}function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){e.items.forEach(function(e){e.owner.user_id===OVERRIDE_USER&&answers_hash[e.post_id].comments.push(e)}),e.has_more?getComments():more_answers?getAnswers():process()}})}function getAuthorName(e){return e.owner.display_name}function process(){var e=[];answers.forEach(function(s){var r=s.body;s.comments.forEach(function(e){OVERRIDE_REG.test(e.body)&&(r="<h1>"+e.body.replace(OVERRIDE_REG,"")+"</h1>")});var a=r.match(SCORE_REG);a&&e.push({user:getAuthorName(s),size:+a[2],language:a[1],link:s.share_link})}),e.sort(function(e,s){var r=e.size,a=s.size;return r-a});var s={},r=1,a=null,n=1;e.forEach(function(e){e.size!=a&&(n=r),a=e.size,++r;var t=jQuery("#answer-template").html();t=t.replace("{{PLACE}}",n+".").replace("{{NAME}}",e.user).replace("{{LANGUAGE}}",e.language).replace("{{SIZE}}",e.size).replace("{{LINK}}",e.link),t=jQuery(t),jQuery("#answers").append(t);var o=e.language;/<a/.test(o)&&(o=jQuery(o).text()),s[o]=s[o]||{lang:e.language,user:e.user,size:e.size,link:e.link}});var t=[];for(var o in s)s.hasOwnProperty(o)&&t.push(s[o]);t.sort(function(e,s){return e.lang>s.lang?1:e.lang<s.lang?-1:0});for(var c=0;c<t.length;++c){var i=jQuery("#language-template").html(),o=t[c];i=i.replace("{{LANGUAGE}}",o.lang).replace("{{NAME}}",o.user).replace("{{SIZE}}",o.size).replace("{{LINK}}",o.link),i=jQuery(i),jQuery("#languages").append(i)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk",answers=[],answers_hash,answer_ids,answer_page=1,more_answers=!0,comment_page;getAnswers();var SCORE_REG=/<h\d>\s*([^\n,]*[^\s,]),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/,OVERRIDE_REG=/^Override\s*header:\s*/i;
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<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="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><div id="language-list"> <h2>Winners 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><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>
sumber
6(7)
tidak akan terjadi, juga mengatakan bahwa tanda?
di6?(7)
akan selalu menjadi*
.Jawaban:
Python 3.
337327 - 10% = 295 byteMendukung floating-point dan level kurung yang tidak terbatas, sehingga memenuhi syarat untuk bonus -10%.
sumber
sys.argv[1]
denganinput()
karya di ideone (dan merupakan shoter - hint hint)input()
karena ini adalah Python 3! Python 2'sraw_input()
===
Python 3'sinput()
!TI-BASIC, 605,2 byte
Layak untuk karunia TI-BASIC lirtosiast di bawah Bahasa Fitting tetapi Tidak Cocok .
Memenuhi syarat untuk semua 3 bonus
712 - 15% = 605.2
,. Ada beberapa peluang bermain golf di sana-sini, tetapi saya ingin mendapatkan ini dulu, karena beberapa potensi golf bersifat non-sepele. Harap dicatat bahwa TI-BASIC adalah bahasa tokenized, dan di bawah ini adalah representasi tekstual dari program itu. Dengan demikian, program ini bukan 1182 byte, karena program ini tidak dikodekan dalam UTF-8. Catatan yang~
setara dengan negasi unary dan->
keSTO>
operator. Output adalah string, dapat diambil dariAns
atauStr1
.Program di bawah ini adalah hasil dari beberapa jam pemikir dan pemrograman programmer, yang tersebar selama beberapa minggu.
Penjelasan umum
Inilah kunci yang saya kerjakan saat mengembangkan program:
Dan di sini adalah kode JavaScript setara yang ditulis tangan yang saya gunakan untuk menguji dan mengembangkan program ini.
Saya akan memberikan penjelasan yang lebih mendalam begitu saya yakin saya sudah selesai bermain golf, tetapi sementara itu, ini mungkin membantu memberikan pemahaman sepintas tentang kode tersebut.
sumber
Input "",Str1 0->dim(L1 0->dim(L2 1->I DelVar S
jugaPrompt Str1:SetUpEditor :1->I
, dan Anda dapat menggunakan toString (. Juga memiliki beberapatoString
karena saya sendiri tidak memiliki CE. Saya akan melihat emulasi untuk memastikan validitas program.Javascript (ES6), 535 - 80 (bonus 15%) = 455 byte
Saya yakin bukan solusi minimal, tetapi cukup lengkap, memungkinkan untuk ketiga bonus. Beberapa contoh membutuhkan beberapa kali penekanan tombol yang sama, tetapi tidak memerlukan pembersihan konten kalkulator. (mis. 3,5,6 & 7 dalam biola)
Tautan ke JSFiddle dengan beberapa tes: https://jsfiddle.net/2v8rkysp/3/
Berikut adalah beberapa kode semi-unobfuscated terbuka dengan beberapa komentar untuk ukuran yang baik.
sumber