그림의 단어가 1000 단어 인 경우 140 자에 얼마나 많은 그림을 넣을 수 있습니까?
참고 : 그것은 사람들입니다! 바운티 마감일이 다가 왔고, 약간의 심의를 거쳐 Boojum의 입국이 Sam Hocevar의 출전 을 거의 끝내지 못했다고 결정했습니다 . 글을 쓸 기회가 생기면 더 자세한 메모를 게시 할 것입니다. 물론 모든 사람은 계속해서 솔루션을 제출하고 사람들이 투표 할 수있는 솔루션을 개선해야합니다. 제출하고 참가한 모든 사람에게 감사합니다. 나는 그들 모두를 즐겼다. 이것은 내가 달리는 데 많은 재미가 있었고, 참가자와 관중 모두에게 재미 있기를 바랍니다.
나는 우연히 이 흥미로운 게시물 트위터 코멘트로 압축 이미지에 노력에 대해, 그 스레드 (그리고 사람들의 많은 레딧에 스레드는 ) 당신이 그것을 할 수있는 다른 방법에 대한 제안을했다. 그래서 나는 그것이 좋은 코딩 도전을 만들 것이라고 생각합니다. 사람들이 입에 돈을 넣을 수있게하고, 인코딩에 대한 그들의 아이디어가 당신이 이용할 수있는 제한된 공간에서 어떻게 더 자세하게 이끌어 낼 수 있는지 보여줍니다.
140 개의 문자 Twitter 메시지로 이미지를 인코딩하고 다시 이미지로 디코딩하는 범용 시스템을 제안합니다. 유니 코드 문자를 사용할 수 있으므로 문자 당 8 비트 이상을 얻을 수 있습니다. 그러나 유니 코드 문자를 허용하더라도 이미지를 아주 작은 공간으로 압축해야합니다. 이것은 확실히 압축 손실이 될 것이므로 각 결과가 얼마나 잘 보이는지에 대한 주관적인 판단이 필요합니다.
다음은 원작자 인 Quasimondo 가 자신의 인코딩에서 얻은 결과입니다 (이미지는 Creative Commons Attribution-Noncommercial 라이센스에 따라 라이센스가 부여됨 ).
더 잘할 수 있습니까?
규칙
- 프로그램에는 인코딩 과 디코딩의 두 가지 모드가 있어야합니다 .
- 인코딩 할 때 :
- 프로그램은 선택한 합리적인 래스터 그래픽 형식의 그래픽을 입력으로 가져와야 합니다. ImageMagick이 지원하는 모든 래스터 형식 은 합리적이라고 간주합니다.
- 프로그램은 140 개 이하의 유니 코드 코드 포인트로 표시 될 수있는 메시지를 출력해야합니다. 범위 (140) 코드 포인트
U+0000
-U+10FFFF
(비 문자를 제외한U+FFFE
,U+FFFF
,U+
NFFFE
,U+
NFFFF
여기서 N 인1
-10
진수 및 범위U+FDD0
-U+FDEF
) 및 대리 코드 포인트 (U+D800
-U+DFFF
). 선택한 적절한 인코딩으로 출력 될 수 있습니다. GNU에서iconv
지원하는 모든 인코딩 은 합리적이며 플랫폼 기본 인코딩 또는 로캘 인코딩이 적합 할 것입니다. 자세한 내용 은 아래의 유니 코드 노트 를 참조하십시오.
- 디코딩 할 때 :
- 프로그램은 인코딩 모드 의 출력을 입력으로 가져와야 합니다.
- 출력 벡터 형식도 정상이지만 프로그램은 위에서 정의한대로 적절한 형식으로 이미지를 출력해야합니다.
- 이미지 출력은 입력 이미지의 근사값이어야합니다. 입력 이미지에 가까울수록 좋습니다.
- 디코딩 프로세스는 상기 지정된 출력 이외의 다른 인코딩 프로세스의 다른 출력에 액세스 할 수 없으며; 즉, 이미지를 어딘가에 업로드하고 디코딩 프로세스에서 다운로드 할 URL 또는 이와 유사한 것을 출력 할 수 없습니다.
사용자 인터페이스의 일관성을 유지하려면 프로그램이 다음과 같이 작동해야합니다.
- 프로그램은 적절한 인터프리터가있는 플랫폼에서 실행 파일로 설정 될 수있는 스크립트이거나 실행 파일로 컴파일 될 수있는 프로그램이어야합니다.
- 프로그램은 첫 번째 인수로
encode
또는decode
모드를 설정해야합니다. 프로그램은 다음 방법 중 하나 이상을 입력해야합니다 (파일 이름을 사용하는 방법을 구현하는 경우 파일 이름이 누락 된 경우 stdin 및 stdout에서 읽고 쓸 수도 있음).
표준 입력에서 입력을 가져 와서 표준 출력에서 출력을 생성합니다.
my-program encode <input.png >output.txt my-program decode <output.txt >output.png
두 번째 인수로 명명 된 파일에서 입력을 받고 세 번째로 명명 된 파일에서 출력을 생성하십시오.
my-program encode input.png output.txt my-program decode output.txt output.png
- 솔루션을 위해 다음을 게시하십시오.
- 전체 코드 및 / 또는 다른 곳에서 호스팅 된 링크 (매우 길거나 컴파일하는 데 많은 파일이 필요한 경우 등)
- 코드에서 즉시 명확하지 않거나 코드가 길고 사람들이 요약에 관심이있는 경우 작동 방식에 대한 설명.
- 원본 이미지와 함께 압축되는 텍스트 및 디코딩 된 이미지의 예제 이미지입니다.
- 다른 사람이 가지고있는 아이디어를 기반으로하는 경우 해당 속성을 지정하십시오. 다른 사람의 아이디어를 구체화하려고해도 괜찮지 만, 그 특성을 귀속 해야 합니다.
지침
기본적으로 위반 될 수있는 규칙, 제안 또는 점수 기준입니다.
- 미학이 중요합니다. 나는 다음을 근거로 판단하고 다른 사람들이 판단 할 것을 제안 할 것이다.
- 출력 이미지의 모양 및 원본의 모양
- 텍스트가 멋지다. 당신이 정말로 영리한 압축 체계를 가지고 있다면 완전히 임의의 gobbledigook는 괜찮습니다. 원래 솔루션의 작성자는 한자 만 사용하기로 결정했습니다.
- 재미있는 코드와 영리한 알고리즘이 항상 좋습니다. 나는 짧고 요점을 밝히고 명확한 코드를 좋아하지만 좋은 결과를 낳는 한 정말 영리한 복잡한 알고리즘도 괜찮습니다.
- 작업이 이미지를 잘 압축하는 것만 큼 중요하지는 않지만 속도도 중요합니다. 차라리 며칠 동안 유전자 알고리즘을 실행하는 것보다 10 분의 1 초 안에 이미지를 변환 할 수있는 프로그램이 있습니다.
- 품질이 합리적으로 비교되는 한 더 긴 솔루션보다 더 짧은 솔루션을 선호합니다. 간결함은 미덕입니다.
- 프로그램은 Mac OS X, Linux 또는 Windows에서 무료로 구현 가능한 언어로 구현해야합니다. 프로그램을 실행할 수 있기를 원하지만 MATLAB 또는 다른 제품 에서만 실행되는 훌륭한 솔루션이 있다면 괜찮습니다.
- 프로그램은 가능한 한 일반적이어야합니다. 일부 이미지는 다른 이미지보다 더 나은 결과를 얻을 수 있지만 가능한 한 많은 이미지에서 작동해야합니다. 특히:
- 프로그램에 내장되고 참조를 작성하고 디코딩 할 때 일치하는 이미지를 생성하는 몇 개의 이미지가 프로그램에 내장되어있는 것은 상당히 불충분하며 일부 이미지 만 포함합니다.
- 단순하고 평평한 기하학적 모양의 이미지를 가져 와서 벡터 프리미티브로 분해 할 수있는 프로그램은 꽤 근사하지만, 특정 복잡성을 넘어서 이미지에 실패하면 불충분하게 일반적 일 것입니다.
- 특정 고정 종횡비의 이미지 만 찍을 수 있지만 잘 작동하는 프로그램도 괜찮지 만 이상적이지는 않습니다.
- 흑백 이미지는 컬러 이미지보다 작은 공간에 더 많은 정보를 얻을 수 있습니다. 반면에 적용 가능한 이미지 유형이 제한 될 수 있습니다. 얼굴은 흑백으로 잘 나오지만 추상적 인 디자인은 그다지 좋지 않을 수 있습니다.
- 출력 이미지가 입력보다 작 으면 대략 동일한 비율이면 완벽하게 괜찮습니다. 원본과 비교하기 위해 이미지를 확대해야하는 경우에도 괜찮습니다. 중요한 것은 그것이 어떻게 보이는지입니다.
- 당신의 프로그램은 실제로 트위터를 통과하고 상처없이 나올 수있는 결과물을 생산해야합니다. 지원되는 정확한 문자 세트에 대한 문서를 찾을 수 없기 때문에 이것은 규칙이 아니라 지침 일뿐입니다. 그러나 제어 문자, 보이지 않는 결합 문자, 개인용 문자 등은 피해야합니다.
채점 루 브릭
허용되는 솔루션을 선택할 때 솔루션 순위를 매기는 방법에 대한 일반적인 지침으로 25 점 척도로 솔루션을 평가할 것이라고 가정 해 보겠습니다 (매우 거칠고 직접 사용하여 직접 점수를 매기 지 않을 것입니다). 이것은 기본 지침으로) :
- 인코딩 체계가 광범위한 입력 이미지를 얼마나 잘 재현하는지 15 점 . 이것은 주관적이고 미학적 판단입니다
- 0은 전혀 작동하지 않음을 의미하며 매번 같은 이미지를 다시 제공합니다.
- 5는 디코딩 된 버전이보기에 좋지 않고 더 복잡한 이미지에서는 전혀 작동하지 않을 수 있지만 몇 개의 이미지를 인코딩 할 수 있음을 의미합니다.
- 10은 광범위한 이미지에서 작동하며 때로는 눈에 잘 띄는 유쾌한 이미지를 생성 함을 의미합니다.
- 15는 일부 이미지의 완벽한 복제본을 생성하고 더 크고 복잡한 이미지의 경우에도 인식 할 수있는 무언가를 제공함을 의미합니다. 또는 인식 할 수있는 이미지를 만들지 않지만 원본에서 명확하게 파생 된 아름다운 이미지를 생성 할 수 있습니다.
- 3 점유니 코드 문자 집합을 영리하게 사용하기위한
- 허용되는 전체 문자 집합을 간단히 사용하기위한 0 점
- 트위터를 통해 또는보다 다양한 상황에서 안전하게 전송할 수있는 제한된 문자 집합을 사용하기위한 1 포인트
- Han 표의 문자 만 또는 오른쪽에서 왼쪽으로 만 문자와 같은 주제별 하위 집합을 사용하기위한 2 점
- 읽을 수있는 텍스트를 생성하거나 문제의 이미지처럼 보이는 문자를 사용하는 등 실제로 깔끔한 작업을 수행하기위한 3 가지 포인트
- 영리한 알고리즘 접근법과 코드 스타일을위한
3 가지 포인트
- 이미지를 축소하고 픽셀 당 1 비트로 처리하고 base64로 인코딩하기 위해 1000 줄의 코드 만있는 0 포인트
- 표준 인코딩 기술을 사용하고 잘 작성되고 간단한 무언가를위한 1 점
- 비교적 새로운 인코딩 기술을 도입하거나 놀랍도록 짧고 깨끗한 것을 나타내는 2 포인트
- 실제로 좋은 결과를 생성하는 하나의 라이너 또는 그래픽 인코딩의 새로운 지평을 여는 무언가에 대해 3 점 게다가)
- 속도 2 점 다른 모든 것은 같고 빠를수록 좋습니다. 그러나 위의 기준은 속도보다 중요합니다.
- 자유 소프트웨어를 선호하기 때문에 무료 (오픈 소스) 소프트웨어에서 1 포인트 실행 (C #은 Mono에서 실행되는 한이 포인트를 계속 사용할 수 있습니다. 마찬가지로 MATLAB 코드는 GNU Octave에서 실행되는 경우에도 마찬가지입니다)
- 실제로 모든 규칙을 따르는 경우 1 점 . 이 규칙은 조금 크고 복잡해 졌으므로 작은 세부 사항이 잘못되어있는 좋은 대답을 받아 들일 것입니다. 그러나 실제로 모든 규칙을 따르는 솔루션에 대한 추가 포인트를 줄 것입니다.
참조 이미지
일부 사람들은 참조 이미지를 요청했습니다. 다음은 시도 할 수있는 몇 가지 참조 이미지입니다. 더 작은 버전은 여기에 포함되어 있으며 필요한 경우 더 큰 버전의 이미지로 연결됩니다.
상
나는 제공하고 500 담당자 현상금 솔루션에 대한 (플러스 50 그 StackOverflow의 킥을) 그 I 위의 기준에 따라, 최고의있다. 물론 다른 모든 사람들도 여기에서 자신이 좋아하는 솔루션에 투표하도록 권장합니다.
마감 시한
이 콘테스트는 5 월 30 일 토요일 오후 6 시경에 현상금이 소진 될 때까지 진행됩니다. 나는 그것이 끝나는 정확한 시간을 말할 수 없습니다. 오후 5시에서 7시 사이에있을 수 있습니다. 오후 2 시까 지 제출 된 모든 출품작을 볼 것을 보장 할 것이며 오후 4 시까 지 제출 된 모든 출품작을 보도록 최선을 다하겠습니다. 그 이후에 솔루션을 제출하면 결정을 내리기 전에 공정한 모습을 보일 기회가 없을 수 있습니다. 또한 제출이 빠를수록 최적의 솔루션을 선택할 수 있도록 투표 할 수있는 기회가 많아 지므로 마감 시한이 아니라 빨리 제출하여 제출하십시오.
유니 코드 노트
정확히 어떤 유니 코드 문자가 허용되는지에 대한 혼동이있었습니다. 가능한 유니 코드 코드 포인트 범위는 U+0000
에 U+10FFFF
. 열린 데이터 교환에서 유니 코드 문자로 사용하기에는 결코 유효하지 않은 일부 코드 포인트가 있습니다. 이들은입니다 noncharacters 와 대리 코드 포인트 . Noncharacters가 정의되어 Unidode 표준 섹션 5.1.0 1670 값으로 U+FFFE
, U+FFFF
, U+
NFFFE
, U+
NFFFF
여기서 N 이다 1
- . 이러한 값은 응용 프로그램 별 내부 용도로 사용되며 적합한 응용 프로그램은 이러한 문자를 처리 한 텍스트에서 제거 할 수 있습니다. 에 정의 된 대리 코드 포인트10
진수 및 범위 U+FDD0
-U+FDEF
유니 코드 표준 5.1.0 3.8 으로는 U+D800
- U+DFFF
, UTF-16에 기본 다국어 평면을 넘어 문자를 인코딩하는 데 사용된다 따라서 이러한 코드 포인트를 UTF-16 인코딩으로 직접 표현할 수 없으며 다른 인코딩으로 인코딩 할 수 없습니다. 따라서,이 대회의 목적을 위해, 전 범위 이상이면 140 유니 코드 코드 포인트들의 시퀀스로 영상을 부호화하는 프로그램을 수 U+0000
-U+10FFFF
상기 정의 된 바와 같은 모든 noncharacters 및 게이트 쌍을 제외한.
나는 것이다 선호 에만 할당 된 문자 및 할당 된 문자의 영리한 하위 집합을 사용하거나 그들이 사용하는 문자 집합으로 뭔가 재미있는을 더 나은 사람을 사용하는 솔루션을. 할당 된 문자 목록은 유니 코드 문자 데이터베이스를 참조하십시오 . 일부 문자는 직접 나열되고 일부 문자는 범위의 시작과 끝으로 만 나열됩니다. 또한 대리 코드 포인트는 데이터베이스에 나열되어 있지만 위에서 언급 한 바와 같이 금지되어 있습니다. 출력하는 텍스트를 더 흥미롭게 만들기 위해 특정 문자 속성을 활용하려면 명명 된 코드 블록 목록 및 다양한 문자 속성 과 같은 다양한 문자 정보 데이터베이스를 사용할 수 있습니다..
트위터는 그들이 지원하는 정확한 문자 세트를 지정하지 않기 때문에 특정 문자가 추가되거나 특정 문자가 제거되기 때문에 실제로 트위터와 작동하지 않는 솔루션에 대해 관대합니다. 모든 인코딩 된 출력을 트위터 나 identi.ca 와 같은 다른 마이크로 블로깅 서비스를 통해 무해 하게 전송할 수 있어야하지만 바람직하지는 않습니다 . 트위터 엔터티가 <,> 및 &를 인코딩하여 각각 4, 4 및 5 문자로 계산한다는 내용의 문서를 보았지만 직접 테스트하지는 않았으며 JavaScript 문자 카운터가 보이지 않습니다. 그런 식으로 그들을 계산합니다.
팁 및 링크
- 규칙에서 유효한 유니 코드 문자의 정의는 약간 복잡합니다. CJK Unified Ideographs (U + 4E00–U + 9FCF)와 같은 단일 문자 블록을 선택하는 것이 더 쉬울 수 있습니다.
- 이미지 조작에 ImageMagick 또는 Python Imaging Library 와 같은 기존 이미지 라이브러리를 사용할 수 있습니다 .
- 유니 코드 문자 집합 및 다양한 인코딩을 이해하는 데 도움이 필요한 경우이 빠른 안내서 또는 Linux 및 Unix의 UTF-8에 대한 자세한 FAQ를 참조하십시오 .
- 솔루션을 일찍받을수록 더 많은 시간을 투표해야합니다. 개선하면 솔루션을 편집 할 수 있습니다. 솔루션을 마지막으로 살펴볼 때 최신 버전을 기반으로 현상금을 적용합니다.
- 쉬운 이미지 형식을 구문 분석하고 쓰려면 (기존 형식 만 사용하고 싶지 않은 경우) PPM 형식을 사용하는 것이 좋습니다 . 작업하기 매우 쉬운 텍스트 기반 형식이며 ImageMagick 을 사용 하여 변환 할 수 있습니다 .