국기를 11비트로 압축하는 인코딩 설계, 허프만 트리로 종횡비와 레이어를 부호화
- 프랑스 국기가 11비트로 인코딩되고, 같은 2색 가로 줄무늬인 인도네시아 11비트, 폴란드 14비트, 모나코 17비트로 길이가 갈림. 댓글에서는 종횡비까지 함께 인코딩하기 때문으로 봄
- 설계 기준은 국가 국기만 대상으로 하고 네팔(직사각형이 아님)과 문장(coat of arms)을 제외하며, 위치와 도형 세부, 정확한 색상은 틀려도 되고 단순한 국기는 적은 비트, 복잡한 국기는 많은 비트를 쓰는 가변 길이 인코딩임
- 국기를 종횡비(2:3 약 45%, 1:2 약 28%, 3:5 약 9%), 색상 팔레트, 레이어(스트라이프·도형·밴드·리전)로 나눠 정의하고, 값 대부분이 Zipf 법칙을 따른다며 항목별 허프만 트리로 부호화함
- 결과물은 miniflags 페이지에서 확인할 수 있고, 댓글에는 국가·영토가 256개 미만이라 8비트 룩업 테이블이면 충분하다는 반론이 올라옴. 반대편은 디코더에 SVG를 넣어야 해서 크기 이점이 없다고 반박
- HN 댓글에서는 이 인코딩으로 존재한 적 없는 그럴듯한 국기를 생성할 수 있다는 점, 문장을 표현하는 기존 DSL인 blazon(헤럴드리)이 언급되지 않은 점이 함께 논의됨
Hacker News opinions
이거 재밌다. 결과물은 vantezzen.github.io/miniflags에서 바로 볼 수 있음
룩업 테이블 쓰면 되지 않나. 국가·영토가 256개도 안 되니까 8비트 키로 충분하고, 문장(coat of arms)까지 커버됨. 서로 거의 똑같은 국기 문제도 해결되고
그럼 디코더에 SVG를 넣어야 하는데 그게 5KB보다 작음? 결국 SVG 스프라이트랑 다를 게 없음
아니면 국기마다 등장 빈도가 다르니까 허프만으로 자주 쓰는 국기를 짧게 보내는 방법도 있음. 평균 비트 수가 줄어듦
비슷한 국기 목록에 슬로베니아랑 슬로바키아가 빠진 게 신기함. 둘 다 흰-파랑-빨강 가로 줄무늬에 문장이 있고, 언어 이름도 Slovenščina와 Slovenčina라 일부러 헷갈리게 만드는 것 같음
8비트로 압축한다는 건 셰익스피어 전집을 6비트로 압축한다는 소리랑 비슷함. 작품이 39개니까 가능하지만 결국 파일 크기는 원본 합계임
이 글은 아이템 목록을 압축하는 얘기가 아니라 국기를 그리는 방법 얘기임. 8비트로 되는 건 id만 저장하고 그리는 방법은 안 담기 때문임
서로 비슷한 2색 줄무늬인 인도네시아, 폴란드, 모나코가 11, 14, 17비트로 갈리는 게 신기함. 아마 종횡비도 같이 인코딩해서 그런 듯
이런 글에 헤럴드리(blazon) 언급이 없는 게 아쉬움. 문장을 표현하는 사실상의 DSL이 이미 있음
MySQL에서 boolean 여러 개를 TINYINT 하나에 비트 연산으로 밀어넣고 싶은 유혹을 참았음. 코드 리뷰를 통과했으면 내 이름이 얼마나 욕먹었을지
Union Jack은 배 뒤쪽 jackstaff에 다는 깃발이고 UK 국기는 Union Flag임. 그런데 다들 Union Jack이라 부르니 상관없긴 함. 현실은 훨씬 복잡해서 술(tassel) 달린 국기도 있음
Union Flag를 그냥 프리셋으로 넣은 건 효율적인 선택이라고 봄. 그 국기가 다른 여러 나라 국기를 지배하고 있으니까
네팔 헌법에 국기 규격이 기하학 교과서 문제처럼 실려 있음
작성자의 AI가 전 세계 인구 약 35%, 30억 명 분량의 국기를 인코딩하지 못했음. 인도가 큰 몫이고 내 나라도 안 됨. 그래도 종횡비를 우선한 건 좋음. 국기가 잘못된 비율로 늘어나면 바로 티가 남
윈도우는 국기 이모지 대신 국가 코드를 보여주는데, 개발자 도구에 이 북마클릿을 넣으면 트위모지 국기가 뜸
파란색을 더 중간값으로 잡으면 어땠을까. 비교 페이지를 보면 대부분 로열 블루보다 하늘색에 가까움. 르완다는 종횡비가 틀린 것 같은데 임의로 인코딩 가능한 거 아님?
비트 패턴 하나를 네팔에 주면 안 됐나. 삼각형을 더 큰 흰 깃발의 일부로 취급해도 되고