Kozmik bir çağrı gönderin


16

Kozmik çağrı ayrıntılı olarak O, 23 127 * 127px renkli bitmap görüntülerin yapılmış 1999 ve 2003 yılında uzaya gönderilen bir mesajdır burada .

Senin görevin bir metin (sıfırlar, olanlar ve satır sonları yapılmış) veya bir görüntü (ekranda çizilen veya diske kaydedilen) olarak 127 * 2921 piksel mesajın tamamını görüntüleyen bir program yazmaktır. İki kategori kazananı olacaktır: biri metin çıktısı ve diğeri görüntü çıktısı için.

Ortak boşluklar hariç tüm numaralara izin verilir.

23 sayfanın ayrı olarak çıkmasına izin verilir.

En fazla 23 program yazmanıza izin verilir (her sayfa için bir tane gibi) ve puanınızı belirlemek için boyutlarını toplayabilirsiniz.

Programlarınızın yanında 23 adede kadar ikili dosya kullanmanıza izin verilir. Kiloları skorunuzda sayılır.

En kısa kod (bayt cinsinden) kazanır.

Piksel başına 1 bitte, görüntü 127 * 127 * 23/8 = 46370 bayt + 7 bit veri içerir. (uyarı: piksel değerlerini 46371 bayta depolarsanız ekstra sıfır vermesine izin verilmez)

Metin çıktısı için son satırsonuna / boşluğa izin verilir.

Görsel çıktı, kozmik çağrının siyah piksellerinin yanında siyah bir piksel içeremez. Tek bir sütunda çizilebilir (doğru sıralı) veya 23 görüntüye bölünebilir veya animasyonlu (gif gibi) de doğru şekilde sıralanabilir.

Ek: metin çıktısı ve çoğaltılacak görüntü çıktısı:

kozmik çağrı


19
“Puanınızı belirlemek için birçok program yazmanıza (her sayfa için bir tane gibi) ve boyutlarını toplamanıza izin verilir.” Bu tehlikelidir: boş Jelly programı yazdırılır 0, boş Salyangoz programı yazdırılır 1ve boş GolfScript programı yeni bir satır yazdırır . Birisi 0 bayt, 373888 programlı bir cevap gönderebilir :)
Lynn

Haha, tamam, bu yüzden program sayısını 23 ile sınırlayacağım.
xem

Sondaki satırsonlarına / boşluklara izin veriliyor mu?
Loovjo

evet. . . . . .
xem

Başka bir dosya kullanabilir miyiz yoksa yalnızca kaynak dosya üzerinde çalışmak zorunda mıyız? Örneğin. Sıkıştırılmış bir sürümünü saklamak ve sonra sıkıştırmasını açmak için IO kullanabilir miyim ya da her şey kodu bir değişmez olması gerekir.
HopefullyHelpful

Yanıtlar:


18

GIF, 27386 bayt

İşte orijinal GIF'in ayrı ayrı GIF çerçevelerine dilimlenmiş sayfaları, hepsinin 1 PNG kadar küçük olmadığı ortaya çıktı :(

kozmik çağrı animasyonlu GIF


7
Merhaba, PPCG'ye hoş geldiniz! Bu kazanmayacak olsa da, hala iyi bir gönderi.
NoOneIsHere

Titreme mi yaptın? Geçişlerde ek asetatlar kullanırsanız 300 bayt kadar tasarruf edebilirsiniz.
Sihirli Ahtapot Urn

7

HTML, 16012b

Resmi PNG8'de sıkıştırdım, bir metin düzenleyicisinde açtım, ekli

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

sonunda ve voilà:

Demo: http://xem.github.io/miniCosmicCall/


Not: ekleme de <img src=#>işe yarıyor, ancak çok fazla çöp görünür hale getiriyor, bu yüzden yapmamayı tercih ediyorum.


Not: eğlence için, tüm mesajı tek bir yürütülebilir tweet'e koydum (bir tarayıcı konsoluna kopyalayıp yapıştırabilirsiniz ve görüntü görünür):

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


1
en kısa cevap + 1
Outgolfer Erik

son sözümü henüz söylemedi!
xem

Burada ne söylemek istediğini anlayamadığımdan eminim.
Outgolfer Erik

üzgünüm, daha küçük bir şey yapmaya çalışıyordum demek
xem

6

Python 2.7 - 10971 8077 bayt

Güncelleme:

  • LZMA aslında bir nedenden dolayı benim için çalışmıyor, bu yüzden Deflate'e geri döndüm.

  • PNG'yi daha da sıkıştırmak için çevrimiçi bir araç buldum (kayıplı sıkıştırma kullandıklarını söylüyorlar, ancak dizi değişmeden kalıyor)

  • __main__.pySenaryoyu biraz daha golf oynadım
  • Bir adımı atladığımı fark ettim (veri arşivlerini zip arşivinden ayıklama)
  • DL bağlantısı eklendi (aşağıya bakın)

Çoğu sıkıştırma algoritması verilere 1 boyutlu bir dizi olarak bakar ve bu nedenle kozmik çağrıda görüntülenen yinelenen 2 boyutlu karakterleri yakalayamaz (IMO ayrıca uzaylıların da anlamasını zorlaştırır: P).

İlk olarak, her karakteri 7 * 5 dizisi olarak seçtim ve tüm benzersiz karakterlerin bir listesini yaptım (hatırlıyorum 101). Sonra görüntüyü yineledim ve bir karakter bulunduğunda, o karakterin (karakter listesinde) konumu ve dizini kaydedildi.

Bu konumlar tek bir int ile temsil edilebilir, ancak 2K'dan fazla karakter bulundu ve 0-370966 (divmod formu) arasındaki konumların her biri en fazla 3 bayt gerektirir. Ancak karakter pozisyonlarını sırayla topladım, bunun yerine mutlak pozisyonu ofset pozisyonuna dönüştürdüm ve sayıların çoğunu 1 bayttan az hale getirdim. 1 bayttan büyük sayıları hesaba katmak için bu listeyi utf-8'de kodladım

Eşleşen tüm karakterleri kaydettikten ve kaldırdıktan sonra, png'yi maksimum sıkıştırma ile kaydettim. Daha sonra python'un bir klasörü veya zip dosyasını bağımsız değişken olarak alabilmesi gerçeğinden yararlanmak için python yeniden yapılandırma komut dosyasını (aynı işlemi tersine), png, chatacter şablonunu ve karakter konumu listesini bir zip dosyasına paketledim ve en üst düzeydeki herhangi bir dosyada yürütülmeye başlayacaktır __main__.py. En iyi sıkıştırmayı elde etmek için 7z ile oynadım, bu da 1M dict ve 32bit kelimelerle LZMA olduğu ortaya çıktı.

İşte kod çözücü komut dosyası (golf ama yorumlarla hala)

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 dosyası için indirme bağlantısı ...


Ben :) (ve bu skor için tebrikler!)
xem

@xem ... gönderdikten kısa bir süre sonra, onunla uğraşmaya devam ettim ve kırık rn (python bana yükte bir çeşit zlib hatası veriyor) da iş bilgisayarımda. Çalışma durumuna geri dönebilirsem pazartesi koyacağım. : P
Aaron

PNG sıkıştırması ve birkaç karakter daha kaydetmek için hangi karakterleri kodladığım (daha az kullanılanlar) arasında bir denge optimize etmek mümkün olabilir gibi hissediyorum
Aaron

1
@xem Bir dl bağlantısı ekledim ...
Aaron

2D sıkıştırma fikrini seviyorum ... 3D sıkıştırma ne olacak? (Görüntüleri istifleme)
NonlinearFruit

3

bzip2Kabukta Gzip , 20914 18965 bayt

Çıktı veri dosyasını soruda verilen metin çıktısıyla yapın bzip2, dosyayı yeniden adlandırın s. Bu daha sonra şunları sağlar:

bzcat s

işi yapmak. Böylece 18958 bayta kadar veri ve 7 bayt komutu ekler.


1
Bunun yerine 'bzip2' kullanarak birkaç k kaydedebilirsiniz!
Dom Hastings

@DomHastings: Sonunda tavsiyeni takip ettim.
Julie Pelletier

: Daha fazla araştırma için Bubblegum'da ve zopfli .
Dijital Travma

2

Pyth, 46381 bayt

Açık nedenlerden dolayı buraya gönderilemez.

jc.BC"<too long>"127

Örneklem.

Hexdump programının hamur.


latin-1 karakterlerinde 7'ye 7 bitlerini kodlarsınız, değil mi? Basit ve güzel! :) Tabii ki, çok daha iyi sıkıştırma arıyorum: p
xem

1
Evet, daha iyi bir sıkıştırma yapıyorum. Bu arada onları 8'e 8 kodladım.
Leaky Nun

Bu arada, bu puanı nasıl aldığınızı merak ediyorum: 127 * 127 * 23/8 = yaklaşık 46371 bayt. Diğer 355 bayt nereye gitti?
xem

Teşekkürler, şimdi tam olarak eşleşiyor. Yukarıdaki kodda fazladan 10 bayt görebilirsiniz ( jc.BC""127").
Leaky Nun

Ekstra bitle nasıl başa çıkıyorsunuz? (tüm mesaj 46370 bayt + 7 bit alır. Son baytınız fazladan bir sıfır üretebilir, bu geçerli bir çıktı değildir)
xem

2

Bash + WebP ikili, 11 + 15330 = 15341 bayt

Kurallarda belirtildiği gibi:

Senin görevin 127 * 2921 piksel mesajın tamamını görüntüleyen bir program yazmak ... veya bir görüntü olarak (ekranda çizilen veya diske kaydedilen ).

Programlarınızın yanında 23 adede kadar ikili dosya kullanmanıza izin verilir. Kiloları skorunuzda sayılır.

ve

Ortak boşluklar hariç tüm numaralara izin verilir.

… Aptalca basit bir şey yayınlamaya dayanamadım.

Program bash'tadır ve görüntüyü diske kaydederek çıkarır.
Bu aynı zamanda görüntü dosyası (evet WebP bir görüntü biçimidir) olur 1 ikili dosya kullanır, bu nedenle program o dosyanın bir kopyasını yapmak kadar az yapabilirsiniz.

Yani, kod (11 bayt):

cp b a.webp

Tamamlayıcı ikili dosyaya "b" adı verildiğini varsayarsak, kod resim dosyasını doğru uzantıya ("a.webp") diske yazar.

İkili dosya yüklemek için çok az neden görüyorum, çünkü kaçınarak çalıştırılıyor

cwebp -z 9 <downloaded input file> b

dosyayı 15330 bayt ile üretir. Birisi isterse, bir yere yükleyebilirim.

Not: -zseçeneği cwebpaktive kayıpsız sıkıştırma modu. 9sıkıştırma gücüdür (maks).


OP yazar bunu beğendi
xem

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.