Wprowadzenie
Wsparcie! Przypadkowo upuściłem kalkulator TI-84 przez okno (nie pytaj jak) i się zepsuł. Mam jutro test matematyczny, a jedynym kalkulatorem, który mogę znaleźć, jest ten z tymi przyciskami:
7 8 9 +
4 5 6 -
1 2 3 *
0 = /
Mój test matematyczny jest sprawdzianem oceny wyrażeń. Potrzebuję programu do wyrażenia takiego jak 1+(5*4)/7
i przekonwertowania go na naciśnięcia klawiszy potrzebne do rozwiązania go na moim zapasowym kalkulatorze. (A gdybyś się zastanawiał, tak się ze mną stało).
Wyzwanie
Biorąc niepusty ciąg wejściowy zawierający tylko ze znaków 0-9
, (
, )
, +
, -
, *
, a /
wyjście z klawiszy w łańcuchu przestrzeń oddzielona (np. 1 + 3 / 3 =
). Na końcu danych wyjściowych zawsze musi znajdować się znak równości. Standardowe luki są niedozwolone.
Przykłady:
- Wejście:,
1+(5*4)/7
Wyjście:5 * 4 / 7 + 1 =
- Wejście:,
6*(2/3)
Wyjście:2 / 3 * 6 =
- Wejście:,
(7-3)/2
Wyjście:7 - 3 / 2 =
Aby ułatwić to wyzwanie:
- Możesz założyć, że na wejściu jest połączona seria naciśnięć klawiszy, która nie wymaga wyczyszczenia kalkulatora (
1-(7*3)
jest niepoprawna, ponieważ wymagałaby odnalezienia7 * 3
, a następnie wyczyszczenia kalkulatora1 - 21
. Wszystkie powyższe przykłady są prawidłowe, ponieważ istnieje jeden , ciągłe wyjście, które nie wymaga od użytkownika wyczyszczenia kalkulatora i zapamiętania liczby). - Możesz założyć, że po a będzie tylko jedna liczba całkowita
/
, ponieważ posiadanie danych wejściowych,21/(7*3)
które nie przeszłyby również pierwszego założenia. - Możesz założyć, że zawsze będzie
*
nawias całkowity i lewy nawias (ważny:,6*(7)
nieprawidłowy:)6(7)
. - Możesz założyć, że dane wejściowe zawsze generują wartości całkowite.
- Możesz założyć, że dane wejściowe mają tylko trzy poziomy nawiasów.
Nie-przykłady
2-(14/2)
jak trzeba by zrobić14 / 2
, to usunąć , a następnie2 - 7
.36/(2*3)
jak trzeba by zrobić2 * 3
, to usunąć , a następnie36 / 6
.1024*4/(1*2+2)
jak trzeba by zrobić1*2+2
, to usunąć , a następnie1024 * 4 / 4
.
Bonusy
- -5%, jeśli twój program rozpoznaje mnożenie nawiasów (wie o tym
6(7)=6*(7)
). - -5% jeśli program może obsługiwać dane wejściowe z liczb dziesiętnych (
3.4
,2.75
,7.8
) a wyjście obejmuje.
(jak tam musi być.
klucz na wolnym kalkulatorem w tym przypadku). - -5%, jeśli twój program może obsługiwać nieograniczoną liczbę nawiasów.
To jest golf-code , wygrywa najkrótszy kod w bajtach (łącznie z bonusami)!
Liderów
Oto fragment kodu, który pozwala wygenerować zarówno zwykłą tabelę wyników, jak i przegląd zwycięzców według języka.
Aby upewnić się, że twoja odpowiedź się pojawi, zacznij od nagłówka, korzystając z następującego szablonu Markdown:
## Language Name, N bytes
gdzie N
jest rozmiar twojego zgłoszenia. Jeśli poprawić swój wynik, to może zachować stare porachunki w nagłówku, uderzając je przez. Na przykład:
## Ruby, <s>104</s> <s>101</s> 96 bytes
Jeśli chcesz umieścić w nagłówku wiele liczb (np. Ponieważ twój wynik jest sumą dwóch plików lub chcesz osobno wymienić kary za flagi tłumacza), upewnij się, że rzeczywisty wynik jest ostatnią liczbą w nagłówku:
## Perl, 43 + 2 (-p flag) = 45 bytes
Możesz także ustawić nazwę języka jako link, który pojawi się we fragmencie tabeli wyników:
## [><>](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>
źródło
6(7)
nie będzie się działo, to także mówi, że znak?
na6?(7)
zawsze będzie*
.Odpowiedzi:
Python 3.
337327 - 10% = 295 bajtówObsługuje zmiennoprzecinkowe i nieograniczone poziomy nawiasów, więc kwalifikuje się do premii -10%.
źródło
sys.argv[1]
zinput()
prac w ideone (i jest Shoter - hint hint)input()
ponieważ jest to Python 3! Python 2'sraw_input()
===
Python 3'sinput()
!TI-BASIC, 605,2 bajtów
Kwalifikuje się do nagrody TI-BASIC dla Lirtosiasta w ramach Dopasowanie, ale nieodpowiednich języków .
Kwalifikuje się do wszystkich 3 bonusy
712 - 15% = 605.2
. Jest kilka okazji do gry w golfa tu i tam, ale chciałem to najpierw wyciągnąć, ponieważ niektóre z potencjalnych golfów są nietrywialne. Należy pamiętać, że TI-BASIC jest językiem tokenizowanym, a poniżej jest tekstową reprezentacją tego programu. Zatem program nie ma 1182 bajtów, ponieważ ten program nie jest zakodowany w UTF-8. Zauważ, że~
jest to równoważne jednoznacznej negacji i->
doSTO>
operatora. Dane wyjściowe to ciąg, który można odzyskać zAns
lubStr1
.Poniższy program jest wynikiem kilku godzin myślenia i programowania kilku programistów, rozłożonych na kilka tygodni.
Ogólne wyjaśnienie
Oto klucz, z którym pracowałem podczas tworzenia programu:
A oto odpowiednik odręcznego kodu JavaScript, którego użyłem do testowania i rozwijania tego programu.
Przedstawię bardziej szczegółowe wyjaśnienie, gdy będę pewien, że skończyłem grać w golfa, ale tymczasem może to pomóc w pobieżnym zrozumieniu kodu.
źródło
Input "",Str1 0->dim(L1 0->dim(L2 1->I DelVar S
możeszPrompt Str1:SetUpEditor :1->I
, i możesz użyć toString (. Również mieć zbędnetoString
ponieważ sam nie mam CE. Zajmę się emulacją, aby zapewnić ważność programu.JavaScript (ES6), 535 - 80 (premia 15%) = 455 bajtów
Nie jest to minimalne rozwiązanie, jestem pewien, ale dość kompletne, uwzględniające wszystkie trzy bonusy. Niektóre instancje wymagają wielokrotnego naciśnięcia klawisza równości, ale nie wymagają czyszczenia zawartości kalkulatora. (np. 3,5,6 i 7 w skrzypcach)
Link do JSFiddle z niektórymi testami: https://jsfiddle.net/2v8rkysp/3/
Oto trochę rozwinięty, częściowo nieudostępniony kod z kilkoma komentarzami dla lepszej oceny.
źródło