Gửi một cuộc gọi vũ trụ


16

Cuộc gọi vũ trụ là một thông điệp được gửi vào không gian vào năm 1999 và 2003. Nó được tạo từ các hình ảnh bitmap đơn sắc 23 127 * 127px, như chi tiết ở đây .

Nhiệm vụ của bạn là viết một chương trình hiển thị toàn bộ tin nhắn 127 * 2921px, dưới dạng văn bản (được tạo từ số không, số ngắt và dòng ngắt) hoặc dưới dạng hình ảnh (được vẽ trên màn hình hoặc được lưu trên đĩa). Sẽ có hai loại người chiến thắng: một cho đầu ra văn bản và một cho đầu ra hình ảnh.

Tất cả các thủ thuật được cho phép, ngoại trừ sơ hở thông thường.

Nó được phép xuất 23 trang riêng biệt.

Nó được phép viết tối đa 23 chương trình (như, một cho mỗi trang) và tính tổng kích thước của chúng để xác định điểm của bạn.

Nó được phép sử dụng tối đa 23 tệp nhị phân cùng với (các) chương trình của bạn. Trọng lượng của họ được tính vào điểm số của bạn.

Mã ngắn nhất (tính bằng byte) sẽ thắng.

Với 1 bit trên mỗi pixel, hình ảnh chứa 127 * 127 * 23/8 = 46370 byte + 7 bit dữ liệu. (cảnh báo: không được phép xuất thêm 0 nếu bạn lưu trữ giá trị pixel thành 46371 byte)

Trailing newline / space được phép cho đầu ra văn bản.

Đầu ra trực quan không thể chứa bất kỳ pixel đen nào ngoài các pixel đen của lệnh gọi vũ trụ. Nó có thể được vẽ trong một cột (được sắp xếp chính xác) hoặc chia thành 23 hình ảnh hoặc hoạt hình (như gif), cũng được sắp xếp chính xác.

Tệp đính kèm: đầu ra văn bản và đầu ra hình ảnh để tái tạo:

cuộc gọi vũ trụ


19
Phần mềm được phép viết nhiều chương trình (như, một cho mỗi trang) và tính tổng kích thước của chúng để xác định điểm của bạn. Điều này rất nguy hiểm: chương trình Jelly0 trống , bản in chương trình Snails trống 1và chương trình GolfScript trống in một dòng mới . Ai đó có thể gửi câu trả lời 0 byte, 373888 chương trình :)
Lynn

Haha, được rồi, vì vậy tôi sẽ giới hạn số lượng chương trình ở mức 23.
xem

Được theo dõi dòng mới / không gian được phép?
Loovjo

Vâng . . . . . .
xem

Chúng ta có thể sử dụng một tệp khác hay chúng ta chỉ phải làm việc với tệp nguồn? Ví dụ. Tôi có thể sử dụng IO để lưu trữ phiên bản nén và sau đó giải nén nó hay mọi thứ cần phải là một chữ trong mã.
Hy vọng có ích

Câu trả lời:


18

GIF, 27386 byte

Dưới đây là các trang của truyền tải ban đầu được cắt thành các khung GIF riêng lẻ, hóa ra nó không nhỏ bằng 1 PNG của tất cả chúng :(

cuộc gọi vũ trụ GIF hoạt hình


7
Xin chào, và chào mừng đến với PPCG! Trong khi điều này sẽ không giành chiến thắng , nó vẫn là một bài viết tốt.
NoOneIsHãy

Bạn đã làm gì? Có thể có thể tiết kiệm 300byte hoặc hơn nếu bạn sử dụng độ trong suốt phụ gia trên các chuyển đổi.
Bạch tuộc ma thuật Urn

7

HTML, 16012b

Tôi đã nén hình ảnh trong PNG8, mở nó trong một trình soạn thảo văn bản, nối thêm

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

ở cuối, và voilà:

Bản trình diễn: http://xem.github.io/miniCosmicCall/


NB: nối thêm chỉ <img src=#>hoạt động nhưng nó cho phép nhìn thấy rất nhiều rác, vì vậy tôi không muốn.


PS: để giải trí, tôi cũng đặt toàn bộ tin nhắn trong một tweet có thể thực hiện được (bạn có thể sao chép-dán nó trong bảng điều khiển trình duyệt và hình ảnh xuất hiện):

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


1
câu trả lời ngắn nhất + 1
Erik the Outgolfer

chưa nói lời cuối cùng của tôi!
xem

Tôi chắc chắn tôi không thể hiểu những gì bạn định nói ở đây.
Erik the Outgolfer

xin lỗi, ý tôi là tôi đang cố làm một cái gì đó nhỏ hơn nữa
xem

6

Python 2.7 - 10971 8077 byte

cập nhật:

  • LZMA thực sự vì một số lý do không phù hợp với tôi, vì vậy tôi đã quay trở lại Deflate.

  • Tôi đã tìm thấy một công cụ trực tuyến để nén PNG hơn nữa (họ nói rằng họ sử dụng nén mất dữ liệu, nhưng mảng vẫn không thay đổi)

  • Tôi đánh gôn __main__.pykịch bản thêm một chút ...
  • Tôi thấy tôi đã bỏ qua một bước (trích xuất các tệp dữ liệu từ kho lưu trữ zip)
  • Đã thêm liên kết DL (xem phía dưới)

Hầu hết các thuật toán nén xem dữ liệu là mảng 1 chiều và do đó không thể chụp các ký tự 2 chiều lặp lại được hiển thị trong lệnh gọi vũ trụ (IMO cũng khiến người ngoài hành tinh khó hiểu hơn: P).

Đầu tiên, tôi chọn mỗi ký tự là một mảng 7 * 5 và lập danh sách tất cả các ký tự duy nhất (101 nếu tôi nhớ lại). Sau đó, tôi lặp lại hình ảnh, và khi tìm thấy một nhân vật, vị trí và chỉ số của nhân vật đó (trong danh sách nhân vật) đã được ghi lại.

Các vị trí đó có thể được biểu diễn bằng một int int, tuy nhiên với hơn 2K ký tự được tìm thấy và các vị trí nằm trong khoảng 0-370966 (dạng divmod) yêu cầu tối đa 3 byte mỗi ký tự. Tuy nhiên, tôi đã thu thập các vị trí ký tự theo thứ tự, vì vậy thay vào đó tôi đã chuyển đổi vị trí tuyệt đối sang vị trí bù, làm cho hầu hết các số nhỏ hơn 1 byte. Tôi đã mã hóa danh sách này trong utf-8 để tính đến một vài số lớn hơn 1 byte

Sau khi ghi và xóa tất cả các ký tự trùng khớp, tôi đã lưu png với mức nén tối đa. Sau đó, tôi đã đóng gói tập lệnh tái tạo python (quy trình ngược lại), png, mẫu chatacter và danh sách vị trí ký tự tất cả vào một tệp zip để lợi dụng thực tế là python có thể lấy một thư mục hoặc tệp zip làm đối số và nó sẽ bắt đầu thực thi ở bất kỳ tập tin nào ở cấp cao nhất có tên __main__.py. Tôi đã chơi xung quanh với 7z một chút để có được độ nén tốt nhất, hóa ra là LZMA với một từ 1M và các từ 32 bit.

đây là kịch bản giải mã (được đánh gôn nhưng vẫn có ý kiến)

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()
liên kết để tải xuống cho tệp zip ...


Tôi là :) (và chúc mừng cho số điểm này!)
xem

@xem ... ngay sau khi đăng bài, tôi tiếp tục gặp rắc rối với nó và nó đã bị hỏng (python cho tôi một số lỗi zlib khi tải) cũng là trên máy tính làm việc của tôi. Tôi sẽ đưa nó lên thứ hai nếu tôi có thể hoàn nguyên nó về trạng thái làm việc. : P
Aaron

Tôi cảm thấy có thể tối ưu hóa sự cân bằng giữa nén png và các ký tự tôi mã hóa (các ký tự ít sử dụng hơn) để tiết kiệm thêm một vài byte ..
Aaron

1
@xem Tôi đã thêm một liên kết dl ...
Aaron

Thích ý tưởng nén 2D ... Còn về nén 3D thì sao? (Xếp chồng hình ảnh)
Phi tuyến

3

Gzip bzip2 trong shell, 20914 18965 byte

Tạo tệp dữ liệu đầu ra với đầu ra văn bản được cung cấp trong câu hỏi, bzip2nó và đổi tên tệp thành s. Điều này sau đó cho phép:

bzcat s

để làm công việc đó. Vì vậy, nó bổ sung tới 18958 byte dữ liệu và lệnh 7 byte.


1
Tôi nghĩ rằng bạn có thể lưu một vài k bằng cách sử dụng 'bzip2'!
Dom Hastings

@DomHastings: Cuối cùng tôi đã làm theo lời khuyên của bạn.
Julie Pelletier

Để nghiên cứu thêm: Bubblegumzopfli .
Chấn thương kỹ thuật số

2

Pyth, 46381 byte

Vì lý do rõ ràng nó không thể được đăng ở đây.

jc.BC"<too long>"127

Mẫu vật.

Pastebin của hexdump của chương trình.


bạn mã hóa các bit 7 bằng 7 bằng ký tự Latin-1, phải không? Đơn giản và tốt đẹp! :) Tất nhiên, tôi đang tìm cách nén tốt hơn nhiều: p
xem

1
Vâng, tôi đang thực hiện nén tốt hơn. Nhân tiện, tôi đã mã hóa chúng 8/8.
Rò rỉ Nun

Nhân tiện, tôi tự hỏi làm thế nào bạn có được số điểm này: 127 * 127 * 23/8 = khoảng 46371 byte. 355 byte khác đã đi đâu?
xem

Cảm ơn, nó chính xác phù hợp với nó bây giờ. Bạn thực sự có thể thấy thêm 10 byte trong đoạn mã trên ( jc.BC""127").
Rò rỉ Nun

Làm thế nào để bạn đối phó với bit thừa? (toàn bộ tin nhắn mất 46370 byte + 7 bit. Byte cuối cùng của bạn có thể tạo thêm 0, không phải là đầu ra hợp lệ)
xem

2

Bash + WebP nhị phân, 11 + 15330 = 15341 byte

Theo quy định này:

Nhiệm vụ của bạn là viết một chương trình hiển thị toàn bộ tin nhắn 127 * 2921px, hoặc dưới dạng hình ảnh (được vẽ trên màn hình hoặc lưu trên đĩa ).

Nó được phép sử dụng tối đa 23 tệp nhị phân cùng với (các) chương trình của bạn. Trọng lượng của họ được tính vào điểm số của bạn.

Tất cả các thủ thuật được cho phép, ngoại trừ sơ hở thông thường.

Tôi không thể cưỡng lại việc đăng một cái gì đó đơn giản một cách ngu ngốc.

Chương trình nằm trong bash và nó xuất hình ảnh bằng cách lưu nó vào đĩa.
Nó sử dụng 1 tệp nhị phân, cũng là tệp hình ảnh (vâng WebP là định dạng hình ảnh), do đó chương trình có thể làm ít nhất là khi tạo ra một bản sao của tệp đó.

Vì vậy, mã (11 byte):

cp b a.webp

Giả sử nhị phân đồng hành được đặt tên là "b", mã ghi tệp hình ảnh vào đĩa với phần mở rộng chính xác ("a.webp").

Tôi thấy ít lý do để tải lên tệp nhị phân, bởi vì nó được tạo ra một cách tầm thường bằng cách chạy

cwebp -z 9 <downloaded input file> b

nó tạo ra tệp có 15330 byte. Nếu bất cứ ai muốn, tôi có thể tải nó lên một nơi nào đó.

NB: -ztùy chọn trong cwebpkích hoạt chế độ nén không mất dữ liệu. 9là cường độ nén (tối đa).


Tác giả OP thích điều này
xem

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.