우주 전화 보내기


16

우주 호출은 설명대로 23 개 127 * 127px 단색 비트 맵 이미지로 만들어졌다 1999 년과 2003 년에 우주로 보낸 메시지입니다 여기 .

당신의 임무는 전체 127 * 2921px 메시지를 텍스트 (0, 1 및 줄 바꿈으로 만든) 또는 이미지 (화면에 그리거나 디스크에 저장)로 표시하는 프로그램을 작성하는 것입니다. 당첨자 카테고리에는 텍스트 출력용과 이미지 출력용의 두 가지 범주가 있습니다.

일반적인 허점을 제외한 모든 트릭이 허용됩니다.

23 페이지를 별도로 출력 할 수 있습니다.

최대 23 개의 프로그램 (예 : 각 페이지 당 하나씩)을 작성하고 크기를 합산하여 점수를 결정할 수 있습니다.

프로그램과 함께 최대 23 개의 이진 파일을 사용할 수 있습니다. 체중은 점수에 포함됩니다.

가장 짧은 코드 (바이트)가 이깁니다.

픽셀 당 1 비트에서 이미지는 127 * 127 * 23 / 8 = 46370 바이트 + 7 비트의 데이터를 포함합니다. (경고 : 픽셀 값을 46371 바이트로 저장하면 추가 0을 출력 할 수 없습니다)

텍스트 출력에는 후행 줄 바꿈 / 공백이 허용됩니다.

시각적 출력에는 국제 통화의 검은 색 픽셀 외에 검은 색 픽셀이 포함될 수 없습니다. 하나의 열에 그려 지거나 (정확하게 정렬 됨) 23 개의 이미지로 분할하거나 애니메이션 (gif와 같은)으로 올바르게 정렬 할 수 있습니다.

첨부 : 텍스트 출력 및 이미지 출력 :

우주의 전화


19
"많은 프로그램 (예 : 각 페이지 당 하나씩)을 작성하고 크기를 합산하여 점수를 결정할 수 있습니다." 젤리 프로그램이 인쇄 0되고 빈 달팽이 프로그램이 인쇄 1되며 빈 GolfScript 프로그램이 줄 바꿈을 인쇄하는 것은 위험 합니다. 누군가가 0 바이트, 373888 프로그램 답변을 제출할 수도 있습니다 :)
Lynn

하하, 알았어요. 그래서 프로그램 수를 23 개로 제한하겠습니다.
xem

후행 줄 바꿈 / 공백이 허용됩니까?
Loovjo 2016 년

네. . . . . .
xem

다른 파일을 사용할 수 있습니까? 아니면 소스 파일에서만 작업해야합니까? 예 : IO를 사용하여 압축 버전을 저장 한 다음 압축을 풀거나 코드에서 리터럴이 될 필요가 있습니까?
희망적으로 도움이되는

답변:


18

GIF, 27386 바이트

다음은 원래 GIF 페이지를 개별 GIF 프레임으로 얇게 썰어 만든 것입니다.

우주의 전화 애니메이션 GIF


7
안녕하세요, PPCG에 오신 것을 환영합니다! 이것은 이길 수 없지만 여전히 좋은 포스트입니다.
NoOneIsHere6

디더링 했습니까? 전환에 추가 투명 용지를 사용하는 경우 300 바이트 정도를 절약 할 수 있습니다.
Magic Octopus Urn

7

HTML, 16012b

PNG8에서 이미지를 압축하고 텍스트 편집기에서 열어서 추가했습니다.

<svg onload="document.body.innerHTML='<img src=#>'">

끝에, 그리고 다음과 같이하십시오 :

데모 : http://xem.github.io/miniCosmicCall/


NB : 추가하는 것도 <img src=#>효과가 있지만 많은 쓰레기를 볼 수 있으므로 선호하지 않습니다.


추신 : 재미를 위해 전체 메시지를 하나의 실행 가능한 트윗에 넣습니다 (브라우저 콘솔에 복사하여 붙여 넣을 수 있으며 이미지가 나타납니다).

https://twitter.com/MaximeEuziere/status/742440423994580992


1
최단 답변 +1
Out the Outgolfer Erik

내 마지막 말을 아직하지 않았다!
xem

나는 당신이 여기서 말하려는 것을 이해할 수 없다고 확신합니다.
Outgolfer Erik

죄송합니다, 더 작게 만들려고 했어요
xem

6

파이썬 2.7- 10971 8077 바이트

최신 정보:

  • LZMA는 실제로 어떤 이유로 든 작동하지 않으므로 Deflate로 돌아갔습니다.

  • PNG를 훨씬 더 압축 하는 온라인 도구 를 찾았습니다 (손실 압축을 사용하지만 어레이는 변경되지 않음)

  • __main__.py스크립트를 조금 더 골프를 쳤습니다 .
  • 단계를 생략하고 있음을 발견했습니다 (zip 아카이브에서 데이터 파일 추출)
  • DL 링크 추가 (아래 참조)

대부분의 압축 알고리즘은 데이터를 1 차원 배열로 간주하므로 우주 호출에 표시되는 반복되는 2 차원 문자를 캡처 할 수 없습니다 (IMO는 외계인도 이해하기 어렵습니다 : P).

먼저 각 문자를 7 * 5 배열로 선택하고 모든 고유 문자 목록을 작성했습니다 (기억하면 101). 그런 다음 이미지를 반복하고 문자가 발견되면 해당 문자 (문자 목록에서)의 위치와 색인이 기록되었습니다.

이러한 위치는 단일 정수로 표시 될 수 있지만 2K 이상의 문자가 발견되며 0-370966 (divmod 형식) 범위의 위치는 각각 최대 3 바이트가 필요합니다. 그러나 문자 위치를 순서대로 수집했기 때문에 대신 절대 위치를 오프셋 위치로 변환하여 대부분의 숫자를 1 바이트 미만으로 만들었습니다. 1 바이트보다 큰 소수를 설명하기 위해이 목록을 utf-8로 인코딩했습니다.

일치하는 모든 문자를 기록하고 제거한 후 png를 최대 압축으로 저장했습니다. 그런 다음 파이썬 재구성 스크립트 (역순으로 동일한 프로세스), png, chatacter 템플릿 및 문자 위치 목록을 모두 zip 파일로 패키지하여 파이썬이 폴더 또는 zip 파일을 인수로 사용할 수 있다는 사실을 이용했습니다. 라는 최상위 레벨의 모든 파일에서 실행을 시작합니다 __main__.py. 나는 최고의 압축을 얻기 위해 7z로 조금 놀았습니다 .1M dict와 32bit 단어를 가진 LZMA로 밝혀졌습니다.

여기에 디코더 스크립트가 있습니다 (골프되었지만 여전히 주석이 있습니다)

import sys,zipfile as z
z.ZipFile(sys.argv[0]).extractall() #extract data files from zip to cwd
from numpy import*
o=open  #next line overwrites open, which I need
from PIL.Image import*
from scipy.ndimage import*
a=imread('p')[:,:,0]/255 #read image file
a[:2414,0]=0 #draw vertical borders
a[2541:,0]=0
a[2412:,-1]=0
a[:2287,-1]=0
for x in range(0,2921,127):a[[x,x+126],:]=0 #draw horizontal borders
with o('c','rb') as f:t=f.read();C=[int(i)for c in t for i in'{0:08b}'.format(ord(c))] #read character template file and convert to list of bytes
C=array(C[:-1]).reshape([101,7,5]) #re-slice (extra 0 appended to make even number of bytes) and re-shape
with o('l','rb') as f:L=array([ord(x)for x in f.read().decode('utf_8')]).reshape([2158,2]) #read decode and reshape positional list
p=0 #relative position accumulator
for e in L:p+=e[0];x,y=p%127,p/127;a[y:y+7,x:x+5]=C[e[1]] #divmod for x,y position and paste character template onto array at position
i=fromarray(a*255)
i.show()
zip 파일 다운로드 링크 ...


나는 :) (그리고이 점수를
축하합니다

@ xem ... 게시 직후에, 나는 그것을 계속 엉망으로 만들었고, rn이 깨졌습니다 (파이썬에서로드시 zlib 오류가 발생합니다). 내 작업 컴퓨터에도 있습니다. 작동 상태로 되돌릴 수 있다면 월요일에 올리겠습니다. : P
Aaron

필자는 png 압축과 몇 개의 바이트를 절약하기 위해 인코딩하는 문자 (더 적게 사용 된 문자) 간의 균형을 최적화 할 수 있다고 생각합니다.
Aaron

1
@xem dl 링크를 추가했습니다 ...
Aaron

2D 압축 아이디어를 좋아하십시오 ... 3D 압축은 어떻습니까? (이미지 스택)
NonlinearFruit

3

bzip2쉘의 Gzip , 20914 18965 바이트

질문에 제공된 텍스트 출력으로 출력 데이터 파일을 bzip2만들고 파일 이름을로 바꿉니다 s. 그러면 다음이 가능합니다.

bzcat s

작업을 수행합니다. 따라서 최대 18958 바이트의 데이터와 7 바이트 명령을 추가합니다.


1
대신 'bzip2'를 사용하여 몇 k를 저장할 수 있다고 생각합니다!
Dom Hastings

@DomHastings : 나는 마침내 당신의 충고를 따랐습니다.
Julie Pelletier 2016 년

: 더 연구를위한 풍선 껌zopfli .
디지털 외상

2

Pyth, 46381 바이트

명백한 이유로 여기에 게시 할 수 없습니다.

jc.BC"<too long>"127

견본.

프로그램의 hexdump의 Pastebin.


라틴 -1 문자로 비트 7을 7로 인코딩합니다. 간단하고 좋은! :) 물론, 나는 훨씬 더 나은 압축을 찾고 있습니다 : p
xem

1
예, 더 나은 압축을 만들고 있습니다. 그런데 8 x 8로 인코딩했습니다.
Leaky Nun

그건 그렇고, 당신 이이 점수를 얻는 방법이 궁금합니다 : 127 * 127 * 23/8 = 약 46371 바이트. 355 개의 다른 바이트는 어디로 갔습니까?
xem

고마워, 이제 정확히 일치합니다. 실제로 위 코드에서 여분의 10 바이트를 볼 수 있습니다 ( jc.BC""127").
Leaky Nun

여분의 비트를 어떻게 처리합니까? (전체 메시지는 46370 바이트 + 7 비트가 필요합니다. 마지막 바이트는 0을 더 생성 할 수 있으며 이는 유효한 출력이 아닙니다)
xem

2

Bash + WebP 바이너리, 11 + 15330 = 15341 바이트

규칙에 따르면 다음과 같습니다.

당신의 임무는 전체 127 * 2921px 메시지… 또는 이미지 (화면에 그리 거나 디스크에 저장 됨 ) 를 표시하는 프로그램을 작성하는 것입니다 .

프로그램과 함께 최대 23 개의 이진 파일을 사용할 수 있습니다. 체중은 점수에 포함됩니다.

일반적인 허점을 제외한 모든 트릭이 허용됩니다.

… 어리석은 간단한 글을 올리는 것을 거부 할 수 없었습니다.

프로그램은 bash에 있으며 이미지를 디스크에 저장하여 이미지를 출력합니다.
그것은 1 이진 파일을 사용하는데, 이미지 파일이기도합니다 (예 WebP는 이미지 형식입니다). 따라서 프로그램은 최소한 그 파일을 복사 할 수 있습니다.

따라서 코드 (11 바이트) :

cp b a.webp

컴패니언 바이너리의 이름이 "b"라고 가정하면 코드는 이미지 파일을 올바른 확장자 ( "a.webp")로 디스크에 씁니다.

바이너리를 실행하여 사소하게 생성되었으므로 바이너리를 업로드 할 이유가 거의 없습니다.

cwebp -z 9 <downloaded input file> b

15330 바이트의 파일을 생성합니다. 누구나 원한다면 어딘가에 업로드 할 수 있습니다.

NB : -z옵션은 cwebp무손실 압축 모드 를 활성화합니다. 9압축 강도 (최대)입니다.


OP 작가가 좋아합니다
xem

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.