宇宙電話をかける


16

宇宙の呼び出しが説明するようそれは、23枚の127 * 127pxモノクロビットマップ画像で作られている1999年と2003年に宇宙へ送られたメッセージであるここに

あなたの使命は、127 * 2921pxメッセージ全体をテキスト(ゼロ、1、改行で構成される)または画像(画面に描画されるかディスクに保存される)として表示するプログラムを作成することです。受賞者には、テキスト出力用と画像出力用の2つのカテゴリがあります。

一般的な抜け穴を除き、すべてのトリックが許可されます。

23ページを個別に出力できます。

最大23のプログラム(各ページに1つなど)を作成し、そのサイズを合計してスコアを決定することができます。

プログラムと共に最大23個のバイナリファイルを使用できます。彼らの体重はあなたのスコアにカウントされます。

最短のコード(バイト単位)が優先されます。

ピクセルあたり1ビットで、画像には127 * 127 * 23/8 = 46370バイト+ 7ビットのデータが含まれます。(警告:ピクセル値を46371バイトに格納する場合、余分なゼロを出力することはできません)

テキスト出力には末尾の改行/スペースを使用できます。

ビジュアル出力には、宇宙コールの黒ピクセル以外の黒ピクセルを含めることはできません。1列に描画する(正しく並べ替える)か、23個の画像に分割するか、アニメーション(gifのように)することもできます。

添付ファイル:テキスト出力、および再現する画像出力:

宇宙の呼び声


19
「多くのプログラム(各ページに1つなど)を作成し、そのサイズを合計してスコアを決定することができます。」これは危険です。空のJellyプログラムが印刷され0、空のSnailsプログラムが印刷され1、空のGolfScriptプログラムが改行を印刷。誰かが0バイトの373888プログラムの回答を送信する可能性があります:)
Lynn

ハハ、オーケー、プログラムの数を23に制限します
。– xem

末尾の改行/スペースは許可されますか?
Loovjo

うん。。。。。。
xem

別のファイルを使用できますか、それともソースファイルのみで作業する必要がありますか?例えば。IOを使用して圧縮バージョンを保存してから解凍するか、すべてがコード内のリテラルである必要がありますか?
うまくいけば

回答:


18

GIF、27386バイト

個々のGIFフレームにスライスされた元の送信のページを以下に示しますが、それらのすべての1 PNGほど小さくないことが判明しました:(

コスミックコールアニメーションGIF


7
こんにちは、PPCGへようこそ!これは勝つつもりはありませんが、それでも良い投稿です。
-NoOneIsHere

ディザリングしましたか?トランジションで追加の透明度を使用すると、300バイト程度を節約できる場合があります。
魔法のタコUr

7

HTML、16012b

PNG8で画像を圧縮し、テキストエディターで開いて追加しました

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

最後に、そして:

デモ:http : //xem.github.io/miniCosmicCall/


NB:追記<img src=#>も機能しますが、大量のゴミが見えるようになるので、追加したくないです。


PS:楽しみのために、メッセージ全体を1つの実行可能なツイートに入れています(ブラウザーコンソールでコピーアンドペーストでき、画像が表示されます)。

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



まだ最後の言葉を言わなかった!
xem

ここで何を言おうとしていたのか理解できないと思います。
エリックアウトゴルファー

申し訳ありませんが、私は何かをさらに小さくしようとしています
-xem

6

Python 2.7- 10971 8077バイト

更新:

  • LZMAは何らかの理由で実際には機能しないので、Deflateに戻りました。

  • PNGをさらに圧縮するオンラインツールを見つけました(非可逆圧縮を使用すると言いますが、配列は変更されません)

  • 私は__main__.pyスクリプトをもう少しゴルフしました...
  • ステップを省略していることがわかりました(zipアーカイブからデータファイルを抽出)
  • DLリンクを追加(下を参照)

ほとんどの圧縮アルゴリズムはデータを1次元配列と見なすため、宇宙の呼び出しで表示される繰り返しの2次元文字をキャプチャできません(IMOにより、エイリアンも理解しにくくなります:P)。

最初に、各文字を7 * 5配列として選択し、すべての一意の文字のリストを作成しました(覚えている場合は101)。その後、画像を反復処理し、文字が見つかったときに、その文字の位置とインデックス(文字リスト内)を記録しました。

これらの位置は1つのintで表すことができますが、2K以上の文字が見つかり、0〜370966(divmod形式)の範囲の位置にはそれぞれ最大3バイトが必要です。ただし、文字の位置は順番に収集したため、代わりに絶対位置をオフセット位置に変換し、ほとんどの数字を1バイト未満にしました。utf-8でこのリストをエンコードして、1バイトを超える数個の数字を説明しました。

一致するすべての文字を記録して削除した後、最大の圧縮でpngを保存しました。次に、python再構築スクリプト(逆プロセス)、png、chatacterテンプレート、および文字位置リストをすべてzipファイルにパッケージ化して、pythonがフォルダーまたはzipファイルを引数として取得できるという事実を活用します。という名前の最上位のファイルで実行を開始します__main__.py。最高の圧縮を得るために7zを少し試してみましたが、これは1Mの辞書と32ビットワードの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(Pythonがロード時にある種のzlibエラーを与えてくれました)それは私の仕事のコンピューターにもあります。稼働状態に戻すことができれば、月曜日に上げます。:P
アーロン

png圧縮とエンコードする文字(使用頻度の低い文字)のバランスを最適化して、さらに数バイトを節約できるように思えます。.-
アーロン

1
@xem dlリンクを追加しました...
アーロン

2D圧縮のアイデアが大好き... 3D圧縮についてはどうですか?(画像のスタック)
NonlinearFruit

3

gzipの bzip2シェルでは、20914の 18965バイト

質問で提供されたテキスト出力を含む出力データファイルを作成しbzip2、ファイル名をに変更しますs。これにより、次のことが可能になります。

bzcat s

仕事をする。したがって、最大18958バイトのデータと7バイトのコマンドが追加されます。


1
代わりに 'bzip2'を使用して数k節約できると思います!
ドムヘイスティングス

@DomHastings:最後にあなたのアドバイスに従いました。
ジュリーペレティエ

さらなる研究のために:バブルガムzopfli
デジタル外傷

2

Pyth、46381バイト

明らかな理由により、ここに投稿することはできません。

jc.BC"<too long>"127

サンプル。

プログラムのhexdumpのペーストビン。


ビット7 x 7をラテン1文字でエンコードしますか?シンプルで素敵!:)もちろん、私ははるかに良い圧縮を探しています:p
xem

1
はい、より良い圧縮を行っています。ちなみに、8 x 8でエンコードしました。
漏れの修道女

ちなみに、このスコアは127 * 127 * 23/8 =約46371バイトでした。他の355バイトはどこに行きましたか?
xem

おかげで、今では完全に一致しています。上記のコードで実際に余分な10バイトを見ることができます(jc.BC""127")。
リーキー修道女

余分なビットをどのように扱いますか?(メッセージ全体は46370バイト+ 7ビットかかります。最後のバイトは余分なゼロを生成する可能性があり、これは有効な出力ではありません)
-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バイトのファイルを生成します。誰かが望めば、どこかにアップロードできます。

注意:の-zオプションは、cwebpロスレス圧縮モードを有効にします。9圧縮強度(最大)です。


OPの著者がこれを気に入っています
xem

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.