Bir resim 1000 kelimeye bedelse, 140 karaktere bir resmin ne kadarını sığdırabilirsiniz?
Not : Hepsi bu kadar! Ödül verme zamanı geldi ve bazı zorlu görüşmelerden sonra Boojum'un girişinin Sam Hocevar'ı zar zor kestiğine karar verdim . Yazma şansım olduğunda daha ayrıntılı notlar göndereceğim. Tabii ki, herkes çözüm sunmaya devam etmekte ve insanların oy kullanması için çözümleri geliştirmekten çekinmeyin. Gönderen ve giriş yapan herkese teşekkür ederim; Hepsinden keyif aldım. Bu benim için çok eğlenceli geçti ve umarım hem katılımcılar hem de seyirciler için eğlenceli olmuştur.
Görüntüleri bir Twitter yorumuna sıkıştırmaya çalışmakla ilgili bu ilginç gönderiyle karşılaştım ve bu iş parçacığında (ve Reddit'te bir iş parçacığında ) birçok kişinin bunu yapabileceğiniz farklı yollar hakkında önerileri vardı. Yani, iyi bir kodlama zorluğu yaratacağını düşünüyorum; insanların paralarını ağızlarına koymasına izin verin ve kodlama hakkındaki fikirlerinin, sahip olduğunuz sınırlı alanda nasıl daha fazla ayrıntıya yol açabileceğini gösterin.
Görüntüleri 140 karakterlik Twitter mesajlarına kodlamak ve tekrar bir görüntüye çözmek için genel bir amaç sistemi bulmanıza meydan okuyorum. Unicode karakterleri kullanabilirsiniz, böylece karakter başına 8 bitten fazla elde edersiniz. Bununla birlikte, Unicode karakterlere izin vermek bile, görüntüleri çok küçük bir alana sıkıştırmanız gerekir; bu kesinlikle kayıplı bir sıkıştırma olacaktır ve bu nedenle her sonucun ne kadar iyi göründüğü konusunda öznel yargılar olmalıdır.
Orijinal yazar Quasimondo'nun kodlamasından aldığı sonuç (resim bir Creative Commons Atıf-Ticari Olmayan lisansı altında lisanslanmıştır ):
Daha iyisini yapabilir misin?
kurallar
- Programınızın iki modu olmalıdır: kodlama ve kod çözme .
- Tüm kodlayan :
- Programınız , seçtiğiniz herhangi bir makul raster grafik formatında bir grafik olarak girdi almalıdır . ImageMagick tarafından desteklenen herhangi bir raster biçiminin makul sayıldığını söyleyeceğiz .
- Programınız 140 veya daha az Unicode kod noktasında temsil edilebilecek bir mesaj vermelidir; Aralığında 140 kod noktaları
U+0000
-U+10FFFF
hariç olmayan karakter (U+FFFE
,U+FFFF
,U+
nFFFE
,U+
n,FFFF
burada n bir1
-10
onaltılı, ve aralıkU+FDD0
-U+FDEF
) ve yedek kod noktaları (U+D800
-U+DFFF
). Seçtiğiniz herhangi bir makul kodlamada çıktı alınabilir; GNUiconv
tarafından desteklenen herhangi bir kodlama makul olarak kabul edilir ve platform yerel kodlaması veya yerel ayar kodlaması muhtemelen iyi bir seçim olacaktır. Daha fazla ayrıntı için aşağıdaki Unicode notlarına bakın.
- Kod çözme sırasında :
- Programınız kodlama modunuzun çıktısını girdi olarak almalıdır .
- Çıktı vektörü formatları için de uygun olsa da, programınızın yukarıda tanımlandığı gibi seçtiğiniz herhangi bir makul formatta bir görüntü vermesi gerekir.
- Görüntü çıkışı, giriş görüntüsünün yaklaşık bir değeri olmalıdır; giriş görüntüsüne ne kadar yakınlaşırsanız o kadar iyidir.
- Kod çözme işleminin, kodlama işleminin yukarıda belirtilen çıktıdan başka bir çıktısına erişimi olmayabilir; yani, görüntüyü bir yere yükleyemez ve kod çözme işleminin indirileceği URL'yi veya bunun gibi aptalca bir şeyi çıktılayamazsınız.
Kullanıcı arayüzünde tutarlılık sağlamak için programınız aşağıdaki gibi davranmalıdır:
- Programınız, uygun yorumlayıcıya sahip bir platformda yürütülebilir olarak ayarlanabilen bir komut dosyası veya yürütülebilir bir dosyada derlenebilecek bir program olmalıdır.
- Programın ilk argümanı olarak ya
encode
dadecode
modu ayarlamak için alması gerekir . Programınız aşağıdaki yollardan bir veya daha fazlasını girmelidir (dosya adlarını alan dosyayı uygularsanız, dosya adları eksikse stdin ve stdout'tan da okuyabilir ve yazabilirsiniz):
Standart girişten giriş alın ve standart çıkışta çıkış üretin.
my-program encode <input.png >output.txt my-program decode <output.txt >output.png
İkinci bağımsız değişkende adlandırılmış bir dosyadan girdi alın ve üçüncü bağımsız değişkende adlandırılmış dosyada çıktı üretin.
my-program encode input.png output.txt my-program decode output.txt output.png
- Çözümünüz için lütfen gönderin:
- Kodunuz, tam olarak ve / veya başka bir yerde barındırılan bir bağlantı (çok uzunsa veya derlenmesi için çok sayıda dosya gerekiyorsa).
- Koddan hemen anlaşılmadıysa veya kod uzunsa ve insanlar bir özetle ilgilenecekse, nasıl çalıştığına dair bir açıklama.
- Orijinal görüntü, sıkıştırıldığı metin ve kod çözülmüş görüntü ile birlikte örnek bir görüntü.
- Başka birinin sahip olduğu bir fikir üzerine inşa ediyorsanız, lütfen bunları belirtin. It yolundaysa başkasının fikrine ait arıtımı yapmak denemek için, ama gerekir onları bağlıyor.
Kuralları
Bunlar temel olarak kırılabilecek kurallar, öneriler veya puanlama ölçütleridir:
- Estetik önemlidir. Yargılayacağım ve diğer insanların aşağıdakilere dayanarak yargılanmasını öneriyorum:
- Çıktı görüntüsünün ne kadar iyi göründüğü ve orijinaline ne kadar benzediği.
- Metin ne kadar güzel görünüyor. Gerçekten zekice bir sıkıştırma düzeniniz varsa tamamen rastgele gobbledigook tamam, ama aynı zamanda görüntüleri çok dilli şiirlere veya bunun gibi akıllı bir şeye dönüştüren cevapları görmek istiyorum. Orijinal çözümün yazarının sadece Çince karakterler kullanmaya karar verdiğine dikkat edin, çünkü bu daha hoş görünüyordu.
- İlginç kod ve akıllı algoritmalar her zaman iyidir. Kısa, açık ve net kod gibi, ama gerçekten zeki karmaşık algoritmalar iyi sonuçlar ürettikleri sürece de sorun yok.
- Hız da önemlidir, ancak yaptığınız görüntüyü sıkıştıran bir iş kadar iyi değildir. Genetik algoritmaları günlerce çalıştıracak bir şeyden bir saniyenin onda birinde bir görüntüyü dönüştürebilmeyi tercih ederim.
- Kalitesi makul düzeyde karşılaştırılabilir olduğu sürece daha uzun olanlara daha kısa çözümleri tercih edeceğim; özlülük bir erdemdir.
- Programınız, Mac OS X, Linux veya Windows üzerinde ücretsiz olarak kullanılabilen bir dilde uygulanmalıdır. Programları çalıştırabilmek istiyorum, ancak sadece MATLAB veya benzeri bir şeyle çalışan harika bir çözümünüz varsa , sorun değil.
- Programınız mümkün olduğunca genel olmalıdır; bazılarının diğerlerinden daha iyi sonuçlar vermesine rağmen, olabildiğince çok farklı görüntü için çalışmalıdır. Özellikle:
- Eşleşen ve bir referans yazdığı programa yerleştirilmiş birkaç görüntüye sahip olmak ve daha sonra kod çözme üzerine eşleşen görüntüyü üretmek, oldukça topaldır ve sadece birkaç görüntüyü kapsayacaktır.
- Basit, düz, geometrik şekillerin görüntülerini alıp bir vektör ilkeline ayırabilen bir program oldukça şıktır, ancak belirli bir karmaşıklığın ötesindeki görüntülerde başarısız olursa, muhtemelen yeterince geneldir.
- Sadece belirli bir sabit en boy oranına sahip görüntüler alabilen, ancak onlarla iyi iş yapan bir program da iyi olurdu, ancak ideal değildir.
- Siyah beyaz bir görüntünün, renkli bir görüntüden daha küçük bir alana daha fazla bilgi alabileceğini görebilirsiniz. Öte yandan, uygulanabilir olduğu görüntü türlerini sınırlayabilir; yüzler siyah beyaz olarak güzel çıkıyor, ancak soyut tasarımlar çok iyi sonuç vermeyebilir.
- Çıktı görüntüsünün girişten daha küçük olması ve kabaca aynı oranda olması mükemmeldir. Resmi orijinal ile karşılaştırmak için ölçeklendirmeniz gerekiyorsa sorun değil; önemli olan nasıl göründüğüdür.
- Programınız aslında Twitter üzerinden geçip yaralanmadan çıkabilecek çıktılar üretmelidir. Desteklenen karakter kümesiyle ilgili herhangi bir belge bulamadığım için bu kuraldan ziyade sadece bir kılavuzdur, ancak muhtemelen kontrol karakterlerinden, korkak görünmez birleştirme karakterlerinden, özel kullanım karakterlerinden ve benzerlerinden kaçınmalısınız.
Puanlama tablosu
Kabul edilen çözümümü seçerken çözümleri nasıl sıralayacağım konusunda genel bir rehber olarak, çözümleri 25 puanlık bir ölçekte değerlendireceğimizi söyleyelim (bu çok kaba ve hiçbir şeyi doğrudan puanlamayacağım, sadece kullanarak bu temel bir kılavuz olarak):
- Kodlama şemasının çok çeşitli giriş görüntüleri ne kadar iyi oluşturduğuna dair 15 puan . Bu öznel, estetik bir yargı
- 0 hiç işe yaramadığı, her seferinde aynı görüntüyü geri verdiği anlamına gelir
- 5, kodu çözülmüş sürüm çirkin görünse de birkaç görüntüyü kodlayabileceği anlamına gelir ve daha karmaşık görüntülerde hiç çalışmayabilir
- 10, çok çeşitli görüntüler üzerinde çalıştığı ve zaman zaman ayırt edilebilir olabilecek hoş görünümlü görüntüler ürettiği anlamına gelir
- 15, bazı görüntülerin mükemmel kopyalarını ürettiği ve hatta daha büyük ve daha karmaşık görüntüler için bile tanınabilir bir şey verdiği anlamına gelir. Ya da, belki de oldukça tanınabilir olan görüntüleri yapmaz, ancak orijinalden açıkça türetilen güzel görüntüler üretir.
- Unicode karakter setinin akıllı kullanımı için
3 puan
- İzin verilen karakter kümesinin tamamını kullanmak için 0 puan
- Twitter üzerinden veya daha çeşitli durumlarda aktarım için güvenli olan sınırlı bir karakter kümesi kullanmak için 1 puan
- Yalnızca Han ideografları veya yalnızca sağdan sola karakterler gibi tematik bir karakter alt kümesi kullanmak için 2 nokta
- Okunabilir metin oluşturmak veya söz konusu resme benzeyen karakterler kullanmak gibi gerçekten düzgün bir şey yapmak için 3 puan
- Akıllı algoritmik yaklaşımlar ve kod stili için
3 puan
- Görüntüyü küçültmek, piksel başına 1 bit olarak işlemek ve base64 kodlamak için 1000 satır kodlu bir şey için 0 puan
- Standart bir kodlama tekniği kullanan ve iyi yazılmış ve kısa olan bir şey için 1 puan
- Nispeten yeni bir kodlama tekniği tanıtan veya şaşırtıcı derecede kısa ve temiz bir şey için 2 puan
- Gerçekten iyi sonuçlar veren bir astar için 3 puan veya grafik kodlamada yeni bir çığır açan bir şey için (bu, yeni bir zemini kırmak için az sayıda puan gibi görünüyorsa, bu iyi bir sonucun muhtemelen estetik için yüksek bir puan alacağını unutmayın. de)
- Hız için 2 puan . Diğer her şey eşit, daha hızlı daha iyidir, ancak yukarıdaki kriterler hızdan daha önemlidir
- Özgür yazılımı tercih ettiğim için 1 puan , çünkü özgür yazılımı tercih ediyorum (C # 'in Mono üzerinde çalıştığı sürece hala bu nokta için uygun olacağını unutmayın, aynı şekilde MATLAB kodu GNU Octave üzerinde çalışıyorsa da uygun olacaktır)
- Tüm kuralları takip etmek için 1 puan . Bu kurallar biraz büyük ve karmaşık hale geldi, bu yüzden muhtemelen küçük bir detayı yanlış yapan iyi cevapları kabul edeceğim, ancak aslında tüm kuralları takip eden herhangi bir çözüme ekstra bir puan vereceğim.
Referans resimler
Bazı insanlar bazı referans resimler istediler. İşte deneyebileceğiniz birkaç referans görüntüsü; daha küçük sürümler burada gömülüdür, hepsi ihtiyacınız varsa görüntünün daha büyük sürümlerine bağlanır:
Ödül
Ben yukarıdaki kriterler temelinde, en iyi sevdiğim çözüm için 500 rep lütuf (artı 50 StackOverflow başladı). Tabii ki, burada da herkesi favori çözümlerine oy vermeye teşvik ediyorum.
Son başvuru tarihi ile ilgili not
Bu yarışma ödül bitene kadar devam edecek, 30 Mayıs Cumartesi günü 18.00 civarında. Kesin zamanın biteceğini söyleyemem; 17: 00-17: 00 arasında herhangi bir yerde olabilir. 2 PM tarafından gönderilen tüm kayıtlara bakacağımı garanti edeceğim ve 16 PM tarafından gönderilen tüm kayıtlara bakmak için elimden geleni yapacağım; bundan sonra çözümler sunulursa, kararımı vermeden önce onlara adil bir göz atma şansım olmayabilir. Ayrıca, ne kadar erken gönderirseniz, en iyi çözümü seçmeme yardımcı olmak için oylama şansınız o kadar artar, bu yüzden son teslim tarihine kadar değil, daha erken göndermeyi deneyin.
Unicode notları
Unicode karakterlerin tam olarak hangi karakterlere izin verildiği konusunda da karışıklıklar oldu. Mümkün Unicode kod noktalarına aralığıdır U+0000
için U+10FFFF
. Herhangi bir açık veri alışverişinde Unicode karakter olarak hiçbir zaman geçerli olmayan bazı kod noktaları vardır; bunlar karakter olmayanlar ve yedek kod noktalarıdır . Noncharacters tanımlanan Unidode standart 5.1.0 Bölüm 16.7 değerleri olarak U+FFFE
, U+FFFF
, U+
nFFFE
, U+
n,FFFF
burada n bir 1
- 10
onaltılı, ve aralık U+FDD0
-U+FDEF
. Bu değerlerin uygulamaya özgü dahili kullanım için kullanılması amaçlanmıştır ve uyumlu uygulamalar bu karakterleri kendileri tarafından işlenen metinden çıkarabilir. Tanımlanan Vekil kod noktaları, The Unicode Standard 5.1.0 3.8 bölümüne olarak U+D800
- U+DFFF
UTF-16 temel Multilingual düzlemi ötesine karakter kodlaması için kullanılır; bu nedenle, bu kod noktalarını doğrudan UTF-16 kodlamasında temsil etmek imkansızdır ve bunları başka herhangi bir kodlamada kodlamak geçersizdir. Böylece, bu yarışma amacıyla, bir dizi herhangi bir fazla 140 Unicode kod noktaları dizisi görüntüleri kodlayan herhangi bir program sağlayacak U+0000
- U+10FFFF
yukarıda tarif edildiği gibi bütün noncharacters ve vekil çiftleri hariç.
Yalnızca atanmış karakterleri ve daha sonra atanmış karakterlerin akıllı alt kümelerini kullanan veya kullandıkları karakter kümesiyle ilginç bir şey kullanan daha iyi çözümleri tercih edeceğim . Atanan karakterlerin listesi için bkz. Unicode Karakter Veritabanı ; bazı karakterlerin doğrudan, bazıları ise yalnızca aralığın başlangıcı ve sonu olarak listelendiğini unutmayın. Ayrıca yedek kod noktalarının veritabanında listelendiğini, ancak yukarıda belirtildiği gibi yasaklandığını unutmayın. Çıkardığınız metni daha ilginç hale getirmek için karakterlerin belirli özelliklerinden yararlanmak istiyorsanız , adlandırılmış kod bloklarının listesi ve çeşitli karakter özellikleri gibi çeşitli karakter bilgileri veritabanları vardır..
Twitter destekledikleri karakter setini tam olarak belirtmediğinden, bazı karakterler fazladan sayıldığı veya belirli karakterler çıkarıldığı için aslında Twitter ile çalışmayan çözümlere karşı açık olacağım. Tüm kodlanmış çıkışların Twitter veya identi.ca gibi başka bir mikroblog servisi aracılığıyla zarar görmeden aktarılması tercih edilir, ancak zorunlu değildir . Twitter varlığının <,> ve & kodladığını ve dolayısıyla bunları sırasıyla 4, 4 ve 5 karakter olarak saydığını belirten bazı belgeler gördüm, ancak bunu kendim test etmedim ve JavaScript karakter sayacı görünmüyor onları bu şekilde saymak.
İpuçları ve Linkler
- Kurallardaki geçerli Unicode karakterlerin tanımı biraz karmaşıktır. CJK Birleşik İdeograflar (U + 4E00 – U + 9FCF) gibi tek bir karakter bloğu seçmek daha kolay olabilir.
- Görüntü manipülasyonunuz için ImageMagick veya Python Imaging Library gibi mevcut görüntü kitaplıklarını kullanabilirsiniz .
- Unicode karakter kümesini ve çeşitli kodlamalarını anlamak için yardıma ihtiyacınız varsa, bu hızlı kılavuza veya Linux ve Unix'teki UTF-8 hakkındaki ayrıntılı SSS'ye bakın .
- Çözümünüzü ne kadar erken alırsanız, ben (ve oy kullanan diğer insanlar) buna o kadar çok zaman ayırmak zorunda kalacaksınız. Geliştirirseniz çözümünüzü düzenleyebilirsiniz; Çözümlerime son baktığımda ödülümü en son sürüme dayandıracağım.
- Ayrıştırmak ve yazmak için kolay bir görüntü formatı istiyorsanız (ve sadece mevcut bir formatı kullanmak istemiyorsanız), PPM formatını kullanmanızı öneririm . Çalışması çok kolay olan metin tabanlı bir biçimdir ve ImageMagick'i ona dönüştürmek için kullanabilirsiniz .