2016년 2월 4일 목요일

네이버 내비게이션

 네이버에서 내비게이션이 얼마전에 나왔다. 네이버에서 만든건 아니고 네이버 지도에 맵피 내비게이션을 붙였다고 하는데 정확한건 모르겠다. 아이폰은 없고 안드로이드에만 있다. 네이버에서 손을 댔으니 추후 아이폰도 지원하지 않을까 한다. 사용해보니 뭔가 아직 깔끔하게 정돈된 느낌은 아니고 이리저리 약간 지저분하기는 한데 사용하기에 불편함은 없다. 네이버 지도에서 검색 후 내비로 넘어갈 수도 있고, 내비에서 바로 검색도 가능하다.
 무엇보다 검색능력이 타사 내비에 비해 압도적이어서 만족스럽다. 상호명이 약간 다르다거나 상호가 아니라 그냥 주소를 넣는다거나, 상호가 두 단어일 때 두 단어의 순서가 바뀐것, ‘강원도 편의점’처럼 지역과 추상어의 결합도 가능했다. 다른 내비게이션들도 되기는 되는데 매우 기능이 약해서 검색이 안되는 경우가 허다하다. 
 길안내 UI도 첫인상과는 달리 괜찮았다. 첫인상은 굉장히 허접해보이는데, 허접해 보이는 와중에도 보여야 할 정보가 보이지 않는다든지 하는 일은 없었다. 예전에 티맵을 쓰다가 티맵이 갈수록 자꾸 골목길로 안내를 한다든지 뻔한 길을 놔두고 돌아가는 길을 알려주는 일이 잦아져서 맵피, 올레내비, 현대자동차기본내비를 돌아가면서 썼다. 자동차 기본 내비는 자동차와의 일체감이 훌륭하고 예전처럼 구리지 않아서 충분히 그것만으로도 실사용이 가능하나 실시간 교통상황의 반영이 느리고, 올레내비는 너무 샛길로 빠지지도 않고 그렇다고 대로로만 가지도 않는, 정말 훌륭한 길을 알려주지만 UI가 너무 좋지 않아서 운전하면서 보기가 힘들다. 안내음성도 과속구간에서는 너무 시끄럽고, 빠지는 길에서는 어디에서 빠진다고 알려주는 타이밍이 타사 내비에 비해 좋지 않다. 지금 어디쯤 왔는지 보려고 해도 글씨가 너무 작아서 보기가 힘들다. 자동차 기본내비는 화면이 크다보니 이런점에는 절대적 우위에 있었다. 맵피는 이 둘의 균형이 아주 좋다. 길도 너무 어렵지 않으면서 적당히 빠른 길을 잘 알려주고 UI도 알아보기 좋고 음성안내도 적절하고. 나름 만족스러웠다. 다만, 균형이 좋다는건 어느것 하나 뛰어난 것이 없이 무난하다는 말도 되어서 ‘좋은 길’을 더욱 선호하는 나로서는 UI가 조금 불편해도 올레내비를 자주 사용하게 된다. (김기사는 그 어느것 하나 장점이랄만한 것이 없어서 두세번정도 사용해보고 곧바로 제외했다.)
 네이버 내비는 위에 나열한 내비중에는 (당연하게도) 맵피에 가장 근접한데, 목표점 검색이 빠르고 정확해서 몇번 사용해보니 다른 내비가 너무 불편하게 느껴졌다. 위의 내비들은 공통적으로 동작이 느려서 ‘다들 그러니 원래 그런것이려니’하고 사용해왔는데 목표점 검색/설정/안내 - 이 세 동작이 빠르게 연결되는 내비를 써보니 다른점들은 다 고만고만하게 느껴진다. 앞으로는 네이버 내비를 주로 이용하게 될것 같다.

2015년 12월 30일 수요일

gdb print stl

gdb쓸 때 vector, map등 stl이 pretty하게 보이지 않으면 다음을 이용한다.

https://sourceware.org/gdb/wiki/STLSupport

링크에 세가지 방법이 있는데, 첫번째 방법만 써도 거의 모든 문제가 해결된다.
혹시 링크 깨질까봐 옮겨두자면,
svn co svn://gcc.gnu.org/svn/gcc/trunk/libstdc++-v3/python
하고, ~/.gdbinit에 다음을 추가.
sys.path.insert의 path에는 위에서 받은 python directory의 path를 넣어준다.
python
import sys
sys.path.insert(0, '/home/maude/gdb_printers/python')
from libstdcxx.v6.printers import register_libstdcxx_printers
register_libstdcxx_printers (None)
end

2015년 9월 11일 금요일

merge arrays




그냥 간단하게 하면 되는 것을 꼼수를 써보겠다고 쇼를 했다.
자세한건 다음에...


#include <iostream>#include <vector>#include <algorithm>
#define v std::vector<int>
v MergeArrays(v A, v B) {  v u(100),n(100),x(100);  n.resize(set_intersection(A.begin(), A.end(), B.begin(), B.end(), n.begin())-n.begin());  x.resize(set_symmetric_difference(A.begin(), A.end(), B.begin(), B.end(), x.begin())-x.begin());  u.resize(set_symmetric_difference(n.begin(), n.end(), x.begin(), x.end(), u.begin())-u.begin());  u.resize(unique(u.begin(), u.end())-u.begin());  return u;}
int main() {  v r = MergeArrays({10,10,10,15,20,20,25,25,30,7000},{10,15,20,20,27,7200});  for(int i:r)    std::cout << i << ", ";
  return 0;}


2015년 8월 27일 목요일

bash prompt color

일과는 별로 상관 없는 것인데 은근히 꾸준히 찾아보게 된다.
stackoverflow에 정말 great한 answer가 있어서 링크
http://stackoverflow.com/a/20983251/766330

2015년 8월 25일 화요일

digital sum

https://codefights.com/challenge/hmnrz6mxXZWNRAkZu

35char가 말이 되나?
답이 나오면 꼭 봐야지.

int Digital_sum(int a) {
  return a%9 ?: 9;  
}

9거법.
내가 한심하다.

last digit

아 오늘 할것 있었는데 한문제에 또 낚여가지고.. ㅜㅜ

아래 식을 구하는 프로그램이다.
https://codefights.com/challenge/BNLZseQgvXBRPPBFr

$$ \sum _1 ^n n^n \mod 10 $$

일단 내 나름의 답은 아래와 같다.
int s,g,j,t,i,last(std::string N) {
  t = N.size();
  for(;++j<=atoi(N.substr(t>2?t-2:0).c_str());s+=g)
    for(g=1,i=j;i--;)
      g = g*j%10;
  return s%10;
}


나중에 1, 2등의 답안을 보니 atoi대신 stoi를 썼으면 몇자 더 줄일 수 있었다.
1등답안은 또 같은 사람인데, 이번엔 2등답안이 더 훌륭하다. 2등이 조금만 더 신경썼어도 여유롭게 1등할 수 있었을텐데 쓸모없는 변수조차 지우지 않는 여유를 부렸다.
1등답안은 좀 찬찬히 살펴봐야겠다 아직 이해가 안감.
int n, i, r, last(std::string N) {
  N="0"+N;
  for(r=N[n=N.size()-2]*7-6; i<4; )
r+="                                         "[N[n]%2*40+4*N[n+1]-192+i]%2<<i++;
  return r%10;


}
(with l in vim. all spaces are replaced to underscore.
int_n,_i,_r,_last(std::string_N)_{$
__N="0"+N;$
__for(r=N[n=N.size()-2]*7-6;_i<4;_)$
r+="____^I___^I_^I__^I_____^I^I^I__^I__^I_^I_____^I^I^I^I_____^I___^I^I^I______^I^I_^I___^I^I^I___^I____^I^I^I^I_"[N[n]%2*40+4*N[n+1]-192+i]%2<<i++;$
__return_r%10;$
}$
)
공백은 캐릭터 숫자로 포함되지 않아서 그것을 이용한 뭔가 굉장히 tricky한 방법 같은데 도무지 알수가 없다. abusing에 가깝지 않은가 싶기도 하고. 

성의없는 2등답안은 다음과 같은데,
int n, l, h, m, last(std::string N)
{
  n = N.size();
  l = std::stoi( N.substr( --n ? --n : 0));
  for(m = 0; l; l--)
    m += pow(l, l % 4 ? l % 4 : 4);
    
  return m % 10;
}
약간만 손보면 다음과 같이 된다.
int n, l, m, last(std::string N)
{
  n = N.size();
  l = stoi( N.substr( --n ? --n : 0));
  for(;l; l--)
    m += pow(l, l%4 ? : 4);

  return m%10;
}

문제를 처음 봤을 때 2등답안같은 답이 가능할것 같아서 좀 찾아봤는데 워낙 수학실력이 형편없다보니 저런 단순한 식에는 접근조차 못했다.
In[233]:= i = Range[100]; 

In[234]:= r1234 = PadRight[Range[4], Length@i, Range[4]]

Out[234]= {1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, \
4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, \
3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, \
2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, \
1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4}

In[239]:= Mod[i^i , 10] == Mod[i^r1234, 10]

Out[239]= True

아름답다.


2015년 8월 24일 월요일

overlap point

이번에도 역시 codefight
https://codefights.com/challenge/7BLpypv6zjpr25iPY/solutions

1등은 이번에도 역시 같은 사람
코드는
#define f(x) hypot(i/9-4-x 0], i%9-4-x 1])<=x 2]
int i, r;
template <class T>
int overlapPoint(T a, T b) {
  for(;i++<99;)
      r+=f(a[) & f(b[);
  return r;
}

볼때마다 배울 것이 생기니까 아직까지는 지루하지 않다. 볼 시간이 많지 않은것이 흠이라면 흠.

핵심은 두가지다. 하나는 hypot함수, 하나는 평면의 격자를 루프 한번에 해결하는 것.
hypot함수 외에도 math.h에 희한한 함수들이 더 있는 것 같은데 처음 봤다. 짬날때 봐야 할 것 같다(하지만 보지 않겠지 -_-)

평면의 모든 격자는 예를 들어 다음과 같이 하면 쉽다
for(; x--; )
  for(; y--; )
    // do sth. (x,y) coord.

위에서는 변수를 하나만 만들고 정수 나눗셈과 modular를 이용해서 모든 격자점을 구해낸다. 참 놀라운 아이디어다.
99까지밖에 루프를 돌지 않는데 이건 테스트케이스가 작아서 운이 좋았던 것 같다. 그래도 예상할 수 있는 모든 범위에 대해 확장할 수 있으니 큰 문제는 없어보인다.

아래는 mathematica로 격자점을 구해본것. 격자점이 어떻게 모두 구해지는지 조금 더 직관적으로 볼 수 있다.
In[148]:= i = Range[0, 99]

Out[148]= {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, \
17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, \
34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, \
51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, \
68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, \
85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99}

In[157]:= i / 9 - 4 // Floor

Out[157]= {-4, -4, -4, -4, -4, -4, -4, -4, -4, -3, -3, -3, -3, -3, \
-3, -3, -3, -3, -2, -2, -2, -2, -2, -2, -2, -2, -2, -1, -1, -1, -1, \
-1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, \
1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, \
4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, \
6, 7}

In[158]:= Mod[i, 9] - 4

Out[158]= {-4, -3, -2, -1, 0, 1, 2, 3, 4, -4, -3, -2, -1, 0, 1, 2, 3, \
4, -4, -3, -2, -1, 0, 1, 2, 3, 4, -4, -3, -2, -1, 0, 1, 2, 3, 4, -4, \
-3, -2, -1, 0, 1, 2, 3, 4, -4, -3, -2, -1, 0, 1, 2, 3, 4, -4, -3, -2, \
-1, 0, 1, 2, 3, 4, -4, -3, -2, -1, 0, 1, 2, 3, 4, -4, -3, -2, -1, 0, \
1, 2, 3, 4, -4, -3, -2, -1, 0, 1, 2, 3, 4, -4, -3, -2, -1, 0, 1, 2, \
3, 4, -4}

In[160]:= {%157, %158} // Transpose

Out[160]= {{-4, -4}, {-4, -3}, {-4, -2}, {-4, -1}, {-4, 0}, {-4, 
  1}, {-4, 2}, {-4, 3}, {-4, 
  4}, {-3, -4}, {-3, -3}, {-3, -2}, {-3, -1}, {-3, 0}, {-3, 1}, {-3, 
  2}, {-3, 3}, {-3, 4}, {-2, -4}, {-2, -3}, {-2, -2}, {-2, -1}, {-2, 
  0}, {-2, 1}, {-2, 2}, {-2, 3}, {-2, 
  4}, {-1, -4}, {-1, -3}, {-1, -2}, {-1, -1}, {-1, 0}, {-1, 1}, {-1, 
  2}, {-1, 3}, {-1, 4}, {0, -4}, {0, -3}, {0, -2}, {0, -1}, {0, 
  0}, {0, 1}, {0, 2}, {0, 3}, {0, 
  4}, {1, -4}, {1, -3}, {1, -2}, {1, -1}, {1, 0}, {1, 1}, {1, 2}, {1, 
  3}, {1, 4}, {2, -4}, {2, -3}, {2, -2}, {2, -1}, {2, 0}, {2, 1}, {2, 
  2}, {2, 3}, {2, 4}, {3, -4}, {3, -3}, {3, -2}, {3, -1}, {3, 0}, {3, 
  1}, {3, 2}, {3, 3}, {3, 4}, {4, -4}, {4, -3}, {4, -2}, {4, -1}, {4, 
  0}, {4, 1}, {4, 2}, {4, 3}, {4, 
  4}, {5, -4}, {5, -3}, {5, -2}, {5, -1}, {5, 0}, {5, 1}, {5, 2}, {5, 
  3}, {5, 4}, {6, -4}, {6, -3}, {6, -2}, {6, -1}, {6, 0}, {6, 1}, {6, 
  2}, {6, 3}, {6, 4}, {7, -4}}