2016년 6월 17일 금요일

일반 공학용 계산기(scientific calculator) 3종 비교

\(\int_0^6 e^{x^3} dx\)

공학용 계산기관련 포스트를 보다가 내 계산기(CASIO fx-570ES PLUS)에서는 어느정도 걸리나 해 보니 2분정도 걸린다. ㅎㅎㅎㅎ 2분이라는 사실보다 2분을 기다리면 답이 나온다는게 더 신기하다. 중간에 overflow같은걸로 죽지 않고.


wolfram alpha 앱에 해보니 금방 나온다. 답이 조금 희한한데 근사치를 구하는 쉬운 공식이 있나보다. imaginary part가 나와서 이게 뭔가 하고 물어보니 그냥 오차라고 한다. 적분구간을 0. to 6. 이라고 주면 또 제대로 나온다고 한다.

아래는 570ES의 후속인 991EX

570ES와 디자인이 많이 다르지만 기본적인 기능은 같고, 건전지와 함께 태양광도 사용가능하도록 되어있다. 화면도 더 고해상도. 메뉴도 아이콘식으로 바뀌었지만 단지 UI변경에 불과하다. 그외 소소하게 바뀐점들이 많은데 행렬의 경우도 세개에서 네개로, 3×3에서 4×4로 limit도 커졌다. 하지만 이정도 변화야 거의 있으나 마나 한 것이니 다 그러려니 하면 될 것 같다. 다만 연산속도가 많이 향상되어 동일한 계산을 25초만에 해낸다.
 아래 TI의 장점들을 보면 알겠지만, 아주 잘 만든 기계를 사소한 마무리때문에 명기의 반열에 올리지 못하는 것 같아 안타까울 정도다.

아래는 TI의 36X Pro
 기본적으로 거의 모든 기능이나 연산능력이 570ES와 같다. 유효숫자 자리는 심지어 더 적다.(예를들어 \(\pi\)는 카시오의 경우 두 모델 다 내부적으로 3.14159265358980을 사용하지만 TI의 경우 3.141592653590을 사용한다. 열 다섯자리 vs. 열 세자리. 그래서 보다시피 위의 적분결과값도 약간 다르다. ) 연산능력이 991EX와는 비교가 되지 않아서 가격대 성능비는 매우 안좋은 편.(991EX가 몇천원 더 비싸다)
 생긴것이 가장 마음에 들고 사용감도 좋다. 같은 키를 연속으로 누르면 기능이 순서대로 바뀌는 것도 마음에 든다. 예를들어 아래 사진에서 \(\pi^e_i\)키는 누를때마다 \(\pi, e, i\)가 차례로 나온다. 이렇게 하지 않으면 카시오 제품처럼 shift, alpha이렇게 meta키 두개를 만들어서 각 모드에 따라 다르게 동작하도록 만들어야 한다. TI제품은 그래서 alpha가 없다.)
 버튼감이 좋고, 책상위에 놓았을 때 네 귀가 바닥에 밀착해서 버튼을 누를때도 계산기가 움직이지 않는다. 위의 카시오모델 두개는 모두 버튼을 누를 때마다 한 귀가 바닥에 살짝 닿았다 떨어지면서 딱딱 소리도 나고 약간씩 움직인다. 고무패딩 유무 차이인것 같다.



카시오 제품중에는 scientific calculator로 분류되면서도 더욱 강력한 모델들이 있다. 홈페이지에는 ‘프로그래밍 가능모델’로 분류되어 있다. 


 아래는 1999년에 구입했던 9900GC. 위의 계산기들과는 다르게 graphic calcuator로 분류되고 기능도 많다. 행렬도 거의 무제한 사이즈로 되는듯. 몇십×몇십을 시험삼아 눌러봤는데 가능했다. 행렬 숫자도 훨씬 더 많았고.(위의 모델들은 행렬 서너개밖에 지원하지 않는다.) 연산이 실제로 가능한지는 해보지 않았지만, 입력이 가능한것 보면 느리게라도 연산또한 가능할 것이다. 위의 계산을 똑같이 해 보았는데 30초정도 걸렸고 정확도도 상당히 떨어졌다. 유효숫자 조절이 ‘공학용/과학용’ 선택 + ‘자릿수 조절’로 가능한듯 보였는데 무엇으로 해도 더 정확한 계산결과는 얻지 못했다. 아무래도 너무 옛날 물건이라 그런 것 같다. 홈페이지에서도 이 제품에 대한 정보를 얻을 수 없다. 요즘 가장 많이 나간다는 9860G II의 매뉴얼을 보니 적분할 때 numerical method를 정해주는 것 같은데, 이 모델은 그냥 보는대로 저렇게 넣는 방법이 다인것 같다. 물론 매뉴얼도 잃어버린지 오래라 확인은 불가.





2016년 6월 7일 화요일

브라우저 비교

소스보면 아주 간단한 기본적인 태그만을 사용했다.

아래 이미지 순서대로, 사파리, 크롬, 익스플로러9

가독성때문에 사파리를 쓰지 않을 수가 없는데, 그 이유가 잘 드러나는 웹페이지라서 포스팅.




2016년 5월 4일 수요일

remote desktop

vnc써도 되지만 귀찮고, xrdp설치하고 클라이언트 MS에서 뿌리는거 받아다가 붙으면 그냥 된다. 단 ubuntu에서 기본 gnome session은 잘 안듣는것 같았고 아래에 따라서 xfce4로 함. 역시 xubuntu
http://askubuntu.com/questions/91657/blank-desktop-when-logging-in-via-xrdp

2016년 4월 12일 화요일

How Google Plans to Solve Artificial Intelligence

원문: https://www.technologyreview.com/s/601139/how-google-plans-to-solve-artificial-intelligence/

바둑 다음은 스타크래프트라고들 (국내)뉴스에 많이 나오던데, 기사에 따르면 다음은 미로찾기가 될것같다. 거기에 2~3년정도 주력할거라고 하고.(스타크래프트를 아예 안한다는 것이 아니라 바둑같은 빅게임으로 기획하는 것은 미로찾기라는 뜻)

신장kidney의 문제를 찾는 데에 현재 응용하고 있다고 한다. 어느정도 검증을 거치면 정말로 의학계에도 큰 변화가 찾아올 것 같다.  서서히든 갑작스럽게든.

추천시스템도 염두에 두고 있는듯 하다. 언제쯤 논문이나 해당 라이브러리를 내줄지 모르겠지만 아마 나도 그걸 받아 쓰게 될듯.

지능의 근본에 대해 설명하면서 'chunking'이라고 하는데, clustering을 고전적 의미가 아닌 방식으로 표현할 적당한 단어가 그것이어서 그랬을 것이다. 생각하는게 다들 비슷하구나. 결국 근본은 무엇이 같은가 혹은 그렇지 않은가이다. '비슷하다'는 아직 인간만이 가지는 개념이다.

2016년 3월 24일 목요일

yum --nogpgcheck

if yum update or install halts with '~ package is not signed' error, try this option.
for example,
yum --nogpgcheck update 

2016년 3월 22일 화요일

Reverse Shuffle Merge

심심풀이로 가끔 가서 노는 사이트. top coder의 easy version쯤 된다.
https://www.hackerrank.com/challenges/reverse-shuffle-merge

아직 어려운 문제들을 많이 접해보지 못해서 그런데, 이 문제가 지금까지 해본 것들중에 가장 시간을 많이 잡아먹은것 같다. 선수들은 이런거 10~20분에 끝날텐데. 답안 보고 좀 더 생각해봐야겠다.

테스트 케이스 세개. 문제 / 답 순서.
bdabaceadaedaaaeaecdeadababdbeaeeacacaba
aaaaaabaaceededecbdb
djjcddjggbiigjhfghehhbgdigjicafgjcehhfgifadihiajgciagicdahcbajjbhifjiaajigdgdfhdiijjgaiejgegbbiigida
aaaaabccigicgjihidfiejfijgidgbhhehgfhjgiibggjddjjd
cttpuwqslbtttyukcoorjbootbyrsktwxwmqtwrqrwqwctktuwtjtblwrujywyoyolkusucjuoyowswotckwultobwpwyuqymyuqxouuwuxwboqwykjuwjuukmkuytuquyubtpcytoqsyctwwtwrswptrroktmcwpstttblpuylsljmwjyqwtptktbjotqttyybyybyywlwtlyyxtqobttcuwxylswtytrcoytwtbuowkruoystqyyptwuuxykwljsuyutyboxwsutouruublwxowmomwmuoruwmbcustubtmmutswqtlmxuoyurumuwurpqsrwbltcoopyuckrbkctcqotwboxmjskcttwwrwlqptttlsuuymwuuucytytkmwutytlcojwswqlytyjwluwouuwcuowttoorwojuqwytsokwxtmtkoxtkwujsujcotbjwwutymwcmkoptwstywtwktowwwwutyckukwcjortwltocjpwwqtmmwjtwwpmwmbotsjulllmjsxwtlrpbkytwqttjuoowkuctqtwruowuwocwlyxylkroluysyktrmbtwwwkoswctojubrywpsxswqtptwcsbpmwourutttsluoocjwbcutwoptpcwjtpyubwtktuoytwytukrwtpuoktslxbspwymmuuuosluywtoyttwyujottrorcwtyywwwmtykyuytrwbwyoywtywrbpjwrkymlrwktwmwjrtwttwwwycswwuxsywrtutbptsowcucxuowuuwtrytuywxwtwuwcwlttqurottykbbwlbcxttoctwbxrurbxcrtqsyyucytwxpcuwywbbwskobwwjqjtsttsocwwxuryjputpwktjkoutyukywqywkspwopuroybqtyyokywultwmwomwxttbwwcutxoycotbptsttbwtwqutywjlxbpoplywljkqkwxttooqwwxtbtbccmbsocuuuptjultbowkuwpuspruqtoupltwmoutlyjjjqkxlwptctwwywtwjbcmuwkbltwyuormsuwtwxpxkkycspjjpmokuytbcowxxpuwwtxottjqpotwoxxwkwqwwswtwlowryplsoctstyorywyrlyrlltuyqtmowjpxtkttkowmtuttbolwpouwtxwwupucuuujckubwkuywkswkxuuybpsckuworqupqktujywwcywtuttbccottpuywkbukuwmjtsputkyjyrmwusllcbttlusmwwymybqwokspbolspokuwwwotrbwtwtopqpolsqrwkwtjottputboptuurlotxsttyywcktyymltmywobwwtpooqtopcbktbxcuwtxuuyyywulcqwxqywtkckutrtsttxtkyoccumttuwsumutrwryqwxktyjoxbtcuwmpjcqcwpxmwlumucstwykxoquylwxtuypwytkwkyltmtybsbywrwltytutyuruumumulpytouwttbuxtrlwkrowwywtywtjotbbosjwtutctuxutjbopywjturtqotubjwcwwtuymtyypxtyouubpjuotowsbcoowkwrwutwyuprltwuoquowurujtusutuwywtkpbwjoytcouyscbllrcoowmwbttywwwubpxptmstwtwwrutlmywmtbyucyujywqtjuxoltkwlsmuylwjktobwutyrpoxtwuytuuqclytutswwkcwoytuuywqrlyywsquypkltskwuoctmwwwwttwrtttuctcpwtkmjuqyouuoutjusuusuctwytkwcccuyylyluwxtocttrotywybwwmlokywtywurpocyttcrtpwwrqctwoxtrupoujqyutsqxtssurtyoqwuupwwyowtyutywtqyowjwwyukmqwuctjmtouuttwytwsxtlrurxotrttupswttjustwswtjxscjtusywwswkwpxkkcykluwyuruqtwwuwuutsubctmuprobjswmbstuqjytuytrtlbsytupubjyswrmoyowjwywxolqxukuwtxkktouccuomwptwtuctutwprubswcxscwcmcostwwttrumtoytowwulotwsqujrmopubuusuuwxwqwwlmyyttttklbtxoxwxttjwmwtumtptwlbuouowpswcytotropsuwwtmwuyutkryrwwtyxuyyyywwwyuttwucutcctwwtjjtxtmwttwoubtcsytwucwsbupttutjwwtxwutmwqttowwuxsbokkmujtwwuctwptytuwwowpwwoxoowtjutwruttcwwmbwowttplttbpubxlyuojwurwxptrjttwuyqttyuttstwotbywuwymtottptlsrbxjutbubtypwbcttjswuwywwutklttxwttttyukqpttykjtcwwpyxuxyopsswmxbyyulwuctokouwwkyowcwcwmsrojmswwbyokwyywcuwlxoymsrbbruotwotcwuqtwuqwqyuuytbsowbwlubyywxkwupuyosoxmsuqsyucqctwmpokstwtcrwytuuwjmupwtoowtycuockpxsypstktyttxkltycbpsrwwtuxqpommwwwtkmwsjmubuquccwwslwtwotjtwwtukowomojbwubwttptoowtubrbwrycxcpotttwjpooutuowbotuwuwjysuwsjlbtcstwbbwpobuyxstyjuxtjrutjtuuwustorprjuwbwsttkwuuwwwpmjcuctlowkxwwmttwtwxqmywusmyorjtptwoyswwqbpywkwkyxttocmcwujtqcrubskqjtoujouyuwtpmucutupcqttjymtbywtpyytotcluwutkyljmpqyowupsuxmuusjtkwwcqstjqwwruttcbttcptctowtomtuojoywutuktwwwoortpmxubljumwslocurlwttooustwyqptylytpmxukwytxrojltubtuusyttutssmkwyqojtrjquotwtwwppwwmctwytyytwtclkworwwbtusryuwowkostwwwwwwmxowbmoltutystxmpwwttttltyqxoybbutmotwqqutxprkmoyomqbjtttuupmjlpmwwxsstcottrwttlrwwptsybywtobwotoxxybowxurwroqcsyrpoqwuwuttutrmwwytwxuwkutbrtmmuosywobtuctcuxpwcxqsuowutusmywsbmttsyuuuuuttttwjtopytljomywtotytuuwsoyjkwlooowlyxxtopyyuwyutctjukubyqxpurwbkurwyrpswmktuubxooyqktcboucsywolkwoqoymtjktwoqrourxubuwwywlwujjwwwqwpyxuwrykujlutqocmwltpcmxstoxklqtutsotoxyututwtwtwwrwysumupyrwxlwwmwslslwboxwtbtlpwlxyqlttjubptmytmwbsoyuwjtttwlwpryumxkpcowkujowtltywuolwwotyutucysuqltttwjutoucowtpttwtwltjsostwwoktkwtwtptwrtyjobtutqrwwqtyqtuwyomttmymkqtrrjtwtyuxtxlutotpwyjwsojwtmpstrooowwocrwywyxpocuktmoylupstrpccooptucmtybwxowwuruulpywqpwkqtowswtttcromumuwbkwctpckqbyjttwrjbtxpwpwwjtcmwtuwcbxcxyuqttsxjtpulumwptoxmxyqybwcjpkuwcoxcbwtcowypttuquuosyurucbtywykwtouwtrskbltuwtjybtmquytjyxtkucscuwulwjxwbbwotswpqqkrpybuwwumtpoxlwykqurqcukrmutucctowytwtbpxwbjojkqwuyklwttytupqwopoqyyqmoybutbwuywujwqbowwlywmwwwumbcwbytusortwwuqmqbulwtkouqmutotstomwmbylwrkowwusrqcyboouwwklytowxwkttsrwootqxwswtsjwlolqobtucwpqwotpuqkwjtlcucwjjtcmkkxurybukqtybjjxuwttquswytojtwbytxwubuttuwtwswlwytmtquywtuuwupmwubqtuuxctottkojqbtxbuyqwsquutoqwctwwuwrwomtwowttuwsywuykuttwruoppwumutltwttwstusxuyqotypujtxwtuwukqtmmtuuywuctqyrttptpytbloplsmtuctmryoctqmtuwtoytmwtuopjkwtutckckswswowoutulxjwlosylyjuutttjcwuwousrowttwlwuxqqobmtwmcttwyuxubryjkoouossyjpoqrxrtrmtrsotbyplwrwtcypmqcttousypyrokscyjropxwtputjwyylobttwouuustqtrcwowysottptyoktuwspkujubyrtwtqutwqsbkuuccyjlmltblrtyqwxtuxbukmuoptojwcrtsocbywcttulmtukjqtsuswwuyuttrkywuwqqcpcruymkxoltyxwrsqcuotkwkwtroclumrxyulcosrwowutouqxttlwolkkquqtrouuuxswuwtotypulrkurltuomwubpymkwuttuwtwywpouoswtkluytttywutwwwytwumxpktquoutrotbbttuxptuouqwwmtutuussuttspruwouyolxqwtpyxmlylcwwrlktypwtulwwyqywjpluoswpyqtmpttouptstwxurtruwpjojlwtwqtsctoutsswyuxpxbtwwotyjouubwwuttbkuocootswcktqbukcbywutjwwmwukrljwyxwkqwlowmkwkpcmumtqwowkytlrwycyuwtcbyutrxrowtstytckqyubttotltkmcysuskrbtucttxwluulsttjutcjskmwklrymwutcuustxkwmyycbqjlquwmqwjwutwuwutwusosclkxtktjompkoputtobqwmlqljxltuojptkcwmcqpttoyjuuosltwloubrjwjttjtwttuwuoctsttowwwwjybytqmoqytwrtctswworbtjruluyoktlwtswtrwyjxtjtttobtpouuyutlqcotslrcwmkbwjtstwxospqjtlbkuujouoowtcywwuwjtpqjutwtotbqcwytbswuubtuuwbbjjqboutcuosuwtrtmtpbxpytutowybjwxuuwwtotwuxtywubwotutmtpqcxoyuucyowuxqtcwtltpslcwyuuucwctpowsxrtsssuwycywrtutrjbccmblytwtktltucmjtywwupxtttpyrtmtuytcbwymtybyyllrsujtrtjoucwqyxtkuywtcwotuxbmtxsuwwyqurysotccrwrttrqjwwumrtlwmoottoywurjcrwttyyutcwmotmkusotcrbwrltswrwjupwowlykwywwlwqttttwcuxttbuqtutsoclutyyuwwwklbupwybrctbpsjwybjqwobttlxywwwwjuwxorowyrurwywoocwwwtbkpkuourokpttxqsxpyrloryuwlwwwkwyutuqluwuowwtywttywtutoulotxwluwwtbottuowsuqltuwrwkbjwtwptyytpxttwkmyutyqsyobocwbtwwtwutwbpotyupocuwwrpqyjpoypwwomtolwqwcstymuulmxuuuyllpcwcppqwkcwubkjjymuxtbuuoytuyyoubbjtpyutwkttycywtykwttqllmxpuslkxutowkwusuxmqooxptmmcsorryqtuwuuxcjctjwywyjwmyuwtsxtyowbrjwutluqkkqortwtcrwsskkytytummwymlstwqykwuttwpjptyuxwyltyxubustwsjytooqmpctkpltwutotkbtpyjsuwkuquowmuwpjtwtmcmtsobwttoqcstwcqyjcuttjbkowwsutwswjqmtrotutwpluotxtrqmwjtbuwjwuwtttbtkwkomwqltcwtqkouojcttccuttuwkwwotbxurwkowtmtxmuwswpotwwtykxcucsuuwtsbpwbsuywjwboqsurxotrtbukplwbttyptuwuwwwoutusbwtytwtuwxtrspwutwxrutmwwyxtmpupowtrbwxwtywcxyljtuwtuttlpulctrywwttrwspyomottxjbmuysotqckrbyljyrukpolmkxwbcojcloycryybtwlqmyuoluwoqqbwwxjuxltpwrtyocowqkbqttujyrwyrtrqtujumrutlyuumurcwttwcoyqpwkumctwbtxjsktwwpwturbybuqwwotwuwwtwkstjmkbtymtbyyyrxtlupwyyyqwbrpurttmwuujuyowwwwottrqpwjuwutbtkjytrmwqtuoyyqbypwwwcxwtukowmuyotpwyjwoyouspbuluurtwuwtlwxjkscutukolcmtxtotkpjuoctuupxlslkswqwwoycrwttquooyuwlystuttwuctkyoobojyrcutowkpowwmwcomtuusrmosyyrxubttwcwuljutrotuxtttotptoowsuctojbcucrwyycouoxolktsyupswuytwbwtkwwwtbuwtxtcwtwxyywxtwctuqtwyytjtsokwtuorwwwoututttuuuttotowtotkuouwpwyujtooqykwqtuyuwypuytybouwotmtuwktowcwywsytutwtptpjjwmjktxtswqccmotbbwqyytotwrltrobcbcblyowtbxucwobmttwxscyoccwyluxytbuxwmjrmqmutttlmjyookywpqjwoxkwtwuwutotbsywttuyslbwuymouupwmbbxtubuypuyyyxrbtwwpqwctwuusqoytwytuoqkwjorjrqmttckrwljbuwurwtupuqybwpuukwtuqmwwwmwotuykyorsqqtwyypbobmymjukrwuwswoqbtxppyblbwtmjtutxcususootbytuybljlstttjtjyuwcwsoukwtuuywjkmbwpxoywytmoxjsmlmwjjojukstussswkoyllltpuwywtmtcwwwyosttlrrmsrultqpucqsxplxuslupqutrtybtowttuyxwwwkqtwyypytmuctuoxltwpwwyrtjubtuyuyytroloobyumqttobrtwcuxcccbqrjwuuttuykwubkqloootwytctxwypcutxuwytswttwbptrbwtyqtbmtwoxtcwccmotwrtrxoqcxuwmoootuqujubottxwkokcwycyqtqwuwpxyymouctrywuyktytlukujssuktwowwyctrtwtywlcctkttujpyrpkotqcwmrwwttybmssmbjwussbutmuluttutulmswlljtuxbwyujwkytytmxyltuxwtuomtoourswuuoyupkojlulutuktubuxwxttyquuxylwsumcuotwbuuukttttwjtjobtyjtusuoubctmtwwwswlcxpsojculowxcuwutktkwykwuwxkwotclccrwwwxwtjutotmtbtosusqtruobbtotswxtbrruywbwuwrctwysxjmlmsytljutmowwyqpwtjotybcwyoutyxqojxutkytqcctwmrwrubtwwutctkttwutwolwywrtrwmboulwtjcwubtoooxboutopswbqytywmwtwwqwptcottwwoscrytttwuomscbbbjqycuuomxusuubwxyctsowrpouqbjwwwxtuwqwstwjssckxoywwmpcrsttupuoqquuuqwxywrupuwktcttuukmcwuyuuortwysbtpqtttlqrtysssuowstcuwowupklokmcxuususkmktsyywkbwqkmtlbtkcwwouckpxjwoxujutkuttqmkwwqltpxwuuklwoojtcmtotkuqtwsytytructwjosujywwlsxyqtputyqryyukxupwtymwokyywuytoorwlpppybtpqstjlowswuwlywuwwtcpybjtostwwoqlwbwoklwlttulutqwowtqywwtbkwlwmwowtwwtupojwjmtwwpkcwcywmywuustqowtcttstyuqwtyllcywctmtywwqolrbjuostswtxttusoucmwtltsqckowwoupwywswllwotostlwsrjbtppwbobskcmsttmkuyowjtwctsomxoyttutlpyycxutlxwytmjuuoscuuqpwwttwwtwwlwwwkbowwttbtscuwmwkourboqqowlwqkpytwtocrtwbuyktqtlouxoomurructtlycywxswwpyustwmrswymwmwtqotuwowuwwbswbkpuwtrpuolsjyluquwpcwoywbpubpjullckkyxpwttypturwuutrrtwucsrstcuuuroutwmtxqyytybkpwjtlywjytumkwwysruumtcwycuuwqbrttxoutorwlumyyuoouoccwsptyqtyusukojqutrppjuosubwmwwpooquktyuybutpwbouwjtmostrtwqwwmbtoqyokputwtjbptywkytjbttqwwyukotlwoyoyopwtorxkjwuwttwxtttypktuclwtxsckoqtxytwtlttoctlswtqbucwkbwubxotkttcbtutottcttpuybqlwrojbwwoqwobysmxtpobltjoywlwkptukytpttymtltsxlpqbyuwlmycummltwpptttpwuwjojjwwsrqujyuttuujoopkjcuputjqwxjotcsbqwrottbtjwrbycoqbluyoutwtotosmktqtwtqwbsoxycurrxstjowuwuctjucjrtuwxskqjktuoxlqkxwtywrwwucbtukworttutprcbwsouupxytwmutuwykxwswrtulcywywprpotqcwsxosutkombtscotccyostwwtwrwuwpsujlwbqqrmutjrptxrtwoxcxuyptrkuuwxbuoywyrwmttujruwopowwuttkwwuuwtoqwctqwutwuttcxqbtcbyjtrotyskxqpxmjllumylcjkwlcotljqkyjsyojkowuturuojltwtolmmwukxbtksxsujuswooupttjtutyoupwqwutwmysupkukoyymywywomwwwccomtbcxyoqucjyjpwytybsowjkxytyttwjylurpkrtttsqttkutrtuwuwttttmuwxwxutookorcwkwstwttxuyywkuccwtwwtuuwyooktytktjutsousjbqulmrxwwwjwsocqtwwpttoykwypptbwjptklwlucrmbcwkyutobtwucwxlywxrsruywyumowwtmjbsmjjrtyblyttcwoutwtqsyxxultuyuqwrqwwupmqwwotsytomjqtcuwutscxkokwxwtttubuwjtujxttluuwwotwruuwywcktkmyryywtusotjttouwowbuuwtwjswuwpocoucobkrtwttytrywtwttulbxjpywsosxtbrocjuptytcwttmowtsuwrpjpmumqtljwjclttoquuprwjwqswutjbwtwtbortwcbtxtwswswpopywbcouwtwlbujxucyrwctwuyjptutowksyutkrwutupkklwojutucsowquttsulllwxppotuoktubrtopttmkbtmwmwkttopwpbkyxbuwkbjwyutmtwotsostswuxyjqqwlxutucltutxwtumyopjwlowwwttuwtopotuulwuowutottkppwotocwwxtbcusywwqwxtwtkytquttuwyujttusqwwcwmpttcllyrsxwuobrtmtbqptwqytplwyuwmtyltbcrwubrwxtwtqmkwkwptkmuujlwutqukwpyjrtxwsstmutuqytmpxkypulwortyswtuxwsukyruqbtostbbtyyyubttusjukwmmwstcyo
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbccjjcjcjtjjltjottccktjotjlqlmqottjtktcosttjqmqjqcmwkxtctuwlkwjctujttluulwxttcutrksuscktltottuqcttstworxrtuctwucwrltkwowqtmuckwkmwlwqkwxywjlrkuwmwwjtuwyckuqtcwstcoukttuwwuujytowwtxpxuywsstuotcstqwtwljojpwurtruxwtstpuottmtqypwsouljwyqywwlutwpytklrwwclylmxyptwqxloyuowurpsttussuututmwwquoutpxutttortuouqtkpxmuwtywwwtuwytttyulktwsouopwywtwuttuwkmypuwmoutlrukrlupytotwuwsxuuuortquqkklowlttxquotuwowrsocluyxrmulcortwkwktoucqsrwxytloxkmyurccqqwuwykrttuyuwwsustqjkutluttcwycostrcwjotoukuxutxwqytrltlljyccuuksqwtuqtwtryujukpswutkoytpttosywowcrtqtsuuuowttolyywjtuptwxporjycskorypysuottcqmpyctwrwlpytosrtmrtrxrqopjyssouoojyruxuywttcmwtmoqqxuwlwttworsuowuwcjtttuujylysolwjxlutuowowswsckctutwkjpoutwmtyotwutmqtcoyrmtcutmslpoltyptpttryqtcuwyuutmmtqkuwutwxtjupytoqyuxsutswttwtltumuwppourwttukyuwyswuttwowtmowrwuwwtcwqotuuqswqyuxtqjokttotcxuutquwmpuwuutwyuqtmtywlwswtwuttuuwxtywtjotywsuqttwuxjjytqkuyruxkkmctjjwcucltjwkquptowqpwcutoqlolwjstwswxqtoowrsttkwxwotylkwwuooycqrsuwwokrwlymwmotstotumquoktwluqmquwwtrosutywcmuwwwmwylwwoqwjuwyuwtuyomqyyqopowqputyttwlkyuwqkjojwxptwtywotccutumrkucqruqkywlxoptmuwwuyprkqqpwstowwxjwluwucscuktxyjtyuqmtyjtwutlksrtwuotwkywytcuruysouuquttpywoctwcxocwukpjcwyqyxmxotpwmuluptjxsttquyxcxcwutwmctjwwpwpxtjrwttjyqkcptcwkwumumorctttwswotqkwpqwypluuruwwoxwytmcutpooccprtspulyomtkucopxywywrcowwooortspmtwjoswjywptotulxtxuytwtjrrtqkmymttmoywutqytqwwrqtutojytrwtptwtwktkowwtsosjtlwtwttptwocuotujwtttlqusycutuytowwlouwytltwojukwocpkxmuyrpwlwtttjwuyoswmtymtpujttlqyxlwplttwxowlslswmwwlxwrypumusywrwwtwtwtutuyxotostutqlkxotsxmcptlwmcoqtuljukyrwuxypwqwwwjjuwlwywwuuxruorqowtkjtmyoqowklowyscuoctkqyooxuutkmwsprywrukwrupxqyukujtctuywuyypotxxylwooolwkjyoswuutytotwymojltypotjwttttuuuuuysttmswymsutuwousqxcwpxuctcutowysoummtrtukwuxwtywwmrtuttuwuwqopryscqorwruxwoyxxotowotwyystpwwrlttwrttoctssxwwmpljmpuutttjqmoyomkrpxtuqqwtomtuyoxqytlttttwwpmxtsytutlomwoxmwwwwwwtsokwowuyrsutwwrowklctwtyytywtcmwwppwwtwtouqjrtjoqywkmsstuttysuututljorxtywkuxmptylytpqywtsuoottwlrucolswmujluxmptroowwwtkutuwyojoutmotwotctpcttctturwwqjtsqcwwktjsuumxuspuwoyqpmjlyktuwulctotyyptwytmyjttqcputucumptwuyuojuotjqksurcqtjuwcmcottxykwkwypqwwsyowtptjroymsuwymqxwtwttmwwxkwoltcucjmpwwwuuwkttswwujrprotsuwuutjturjtxujytsxyuopwwtsctljswusyjwuwutowoutuoopjwtttopcxcyrwrutwootpttwuwjomowokutwwtjtowtwlswwccuquumjswmktwwwmmopqxutwwrspcytlkxttytktspysxpkcoucytwootwpumjwuutywrctwtskopmwtcqcuysqusmxosoyupuwkxwyyulwwostyuuyqwquwtquwctowtourrsmyoxlwucwyywkoywwsmjorsmwcwcwoykwwuokotcuwluyyxmwsspoyxuxypwwctjkyttpqkuyttttwxttlktuwwywuwsjttcwpytutujxrsltpttotmywuwytowtsttuyttqyuwttjrtpxwruwjouylxupttlpttwowmwwctturwtujtwooxowwpwowwutytpwtcuwwtjumkkosxuwwottqwmtuwxtwwjtuttpuswcuwtysctuowttwmtxtjjtwwtcctucuwttuywwwyyyyuxytwwryrktuyuwmtwwusportotycwspwououlwtptmutwmwjttxwxoxtlkttttyymlwwqwxwuusuuupomrjuqswtoluwwotyotmurttwwtsocmcwcsxcwsurpwtutcutwtpwmouccuotkkxtwukuxqloxwywjwoyomrwsyjuputysltrtyutyjqutsmwsjorpumtcustuuwuwwtquruywulkyckkxpwkwswwysutjcsxjtwswtsujttwsputtrtoxrurltxswtywttuuotmjtcuwqmkuywwjwoyqtwytuytwoywwpuuwqoytrusstxqstuyqjuopurtxowtcqrwwptrcttycopruwytwykolmwwywytorttcotxwulylyyucccwktywtcusuusujtuouuoyqujmktwpctcutttrwttwwwwmtcouwkstlkpyuqswyylrqwyuutyowckwwstutylcquutyuwtxoprytuwotkjwlyumslwktloxujtqwyjuycuytmwymlturwwtwtsmtpxpuwwwyttwmwoocrllcsyuoctyojwpktwywutusutjuruwouqouwtlrpuywtuwrwkwoocswotoujpuuoytxpyytmyutwwcwjutoqtrutjwypojtuxutctutwjsotojtwytwywworkwlrtxuttwuotyplumumuuruytutytlwrwysytmtlykwktywpyutxwlyuqoxkywtscumulwmxpwcqcjpmwuctxojytkxwqyrwrtumuswuttmuccoyktxttstrtukcktwyqxwqcluwyyyuuxtwucxtkcpotqooptwwowymtlmyytkcwyyttsxtolruutpotupttojtwkwrqslopqpotwtwrtowwwukopslopskowqymywwmsulttcllsuwmryjyktupstjmwukukwyupttoccttutwycwwyjutkqpuqrowukcspyuuxkwskwyukwukcjuuucupuwwxtwuopwlottutmwokttktxpjwomtqyutllrylrywyroytstcoslpyrwolwtwswwqwkwxxowtopqjttoxtwwupxxwoctyukompjjpscykkxpxwtwusmrouywtlkwumcjwtwywwtctpwlxkqjjjyltuomwtlpuotqurpsupwukwotlujtpuuucosmccttxwwqoottxwkqkjlwylpopxljwytuqwtwttstptocyoxtucwwttxwmowmwtluwykoyytqyorupowpskwyqwykuytuokjtkwptupjyruxwwcosttstjqjwwokswwywucpxwtycuyysqtrcxrurxwtcottxclwkyttoruqttlwcwuwtwxwyutyrtwuuwouxcucwostptutrwysxuwwscywwwttwtrjwmwtkwrlmykrwjprwytwyoywwrtyuykytmwwwyytwcrorttojuywttyotwyulsouuummywpsxlstkouptwrkutywtyoutktwuyptjwcptpowtucwjcooulsttturuowmpscwtptqwsxspwyrujotcwsokwwwtmrtkysyulorklyxylwcowuwourwtqtcukwooujttqwtykprltwxsjmlllujstomwmpwwtjwmmtqwwpjcotlwtrojcwkukcytuwwwwotkwtwytswtpokmcwmytuwwjtocjusjuwktxoktmtxwkostywqujowroottwoucwuuowulwjytylqwswjocltytuwmktytycuuuwmyuusltttpqlwrwwttcksjmxowtoqctckrkcuypooctlwrsqpruwumuruyouxmltqwstummtutsucmwuroumwmomwoxwluuruotuswxoytuyusjlwkyxuuwtpyyqtsyourkwoutwtyocrtytwslyxwucttoqtxyyltwlwyyyyyyttqtojtktptwqyjwmjlslyupltttspwcmtkorrtpwsrwtwwtcysqotycptuyuqutyukmkuujwujkywqowxuwuuoxquymyquywpwotluwktowswoyoujusukloyoywyjurwltjtwutktwqwrqrwtqmwxwtksrytoojrookuytttlsqwuptt


#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
#include <cassert>

using namespace std;
const int CHARMAX=26;

bool incl(int* stat, int* remain) {
    for(int i=0 ; i<CHARMAX; i++)
        if(stat[i] > remain[i])
            return false;
    return true;
}

int nextidx(string &s, int idx, int* stat, int* remain) {
    int smallidx = idx;
    int tmpremain[CHARMAX];
    for(int j=0; j<CHARMAX; j++) tmpremain[j]= remain[j];
    
    for(int i=idx; i<s.size(); i++) {
        if(stat[s[i]-'a'] > 0 && s[i]<s[smallidx]) {
            if(incl(stat, tmpremain)) {
                smallidx = i;
            }
        }
        tmpremain[s[i]-'a']--;
    }
    return smallidx;
}

int main() {
    string s;
    cin >> s;
    int stat[CHARMAX], remain[CHARMAX];
    for(int i=0; i<CHARMAX; i++)
        stat[i] = 0;
    for(int i=0; i<s.size(); i++)
        stat[s[i]-'a']++;
    for(int i=0; i<CHARMAX; i++) {
        remain[i] = stat[i];
        stat[i] /= 2;
    }
    
    string ans;
    for(int i=0; i<s.length(); i++) {
        int ni = nextidx(s, i, stat, remain);
        char thechar = s[ni];
        if(stat[thechar-'a']-- > 0) ans += thechar;
        if(ans.size() == s.length()/2) break;
        
        for(int j=i; j<=ni; j++)
            remain[s[j]-'a']--;
        i = ni;
    }
    cout << ans << endl;
    return 0;
}

2016년 3월 21일 월요일

random , shuffle.

C++을 쓰다 보면 C보다 참 쉽게 느껴지다가도 이런거 보면 자바따라가나 싶기도 하고.

string shuffle 예제. (출처)

string shuffle(string a) {
    unsigned seed = chrono::system_clock::now().time_since_epoch().count();
    shuffle(a.begin(), a.end(), default_random_engine(seed));
    cout << "shuffle : " << a << endl;
    return a;
}

아래는  random string 생성 예제인데, 좀더 fancy/tricky한 방법이 몇개 더 있는것 같지만 가장 직관적인 것 같다. (출처)

string gen_random(const int len) {
    string r;
    static const char alphanum[] =
    "0123456789"
    "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    "abcdefghijklmnopqrstuvwxyz";
    
    for (int i = 0; i < len; ++i) {
        r += (char)(alphanum[rand() % (sizeof(alphanum) - 1)]);
    }
    
    return r;

}