1000語に相当する画像の場合、140文字でどのくらいの画像を収めることができますか?
注:それだけです。バウンティの締め切りはここにあり、いくつかの厳しい審議の後、Boojumのエントリは、Sam Hocevarのエントリをかろうじて取り除いたと判断しました。それらを書く機会があったら、私はより詳細なメモを投稿します。もちろん、誰もが自由に気軽に解決策を提出し、人々が投票できるように解決策を改善してください。応募してくださった皆様、ありがとうございました。私はそれらすべてを楽しんだ。これは私が走るのがとても楽しかったです、そしてそれが参加者と観客の両方にとって楽しいことを願っています。
画像をTwitterのコメントに圧縮しようとするこの興味深い投稿に出くわしました。そのスレッド(およびRedditのスレッド)の多くの人々が、さまざまな方法について提案をしてくれました。ですから、それは良いコーディング課題になると思います。人々がお金を自分の口に置くことを許可し、エンコーディングに関する彼らのアイデアがあなたが利用できる限られたスペースでより詳細にどのようにつながることができるかを示してください。
画像を140文字のTwitterメッセージにエンコードし、再度画像にデコードするための汎用システムを考え出すことをお勧めします。Unicode文字を使用できるので、1文字あたり8ビットを超えます。ただし、Unicode文字を使用できる場合でも、画像を非常に小さなスペースに圧縮する必要があります。これは確かに非可逆圧縮になるため、各結果の見栄えについて主観的な判断が必要になります。
オリジナルの作者であるQuasimondoがエンコーディングから得た結果は次のとおりです(画像はCreative Commons Attribution-Noncommercialライセンスの下でライセンスされています):
あなたはもっとうまくできますか?
ルール
- プログラムには、エンコーディングとデコーディングの 2つのモードが必要です。
- エンコードするとき:
- プログラムは、選択した任意の適切なラスターグラフィック形式のグラフィックを入力として受け取る必要があります。ImageMagickでサポートされているラスター形式はすべて妥当と見なされます。
- プログラムは、140以下のUnicodeコードポイントで表現できるメッセージを出力する必要があります。140コード範囲内の点
U+0000
-U+10FFFF
非文字を除く、( 、、U+FFFE
N、Nここで、Nである- 進数、およびレンジ- )とサロゲートコードポイント(- )。選択した任意の適切なエンコーディングで出力できます。GNUでサポートされているエンコーディングはすべて妥当と見なされ、プラットフォームのネイティブエンコーディングまたはロケールエンコーディングが適切な選択となるでしょう。詳細については、以下のUnicodeノートを参照してください。U+FFFF
U+
FFFE
U+
FFFF
1
10
U+FDD0
U+FDEF
U+D800
U+DFFF
iconv
- デコード時:
- プログラムは、エンコードモードの出力を入力として受け取る必要があります。
- プログラムは、上記で定義されているように、選択した任意の適切な形式で画像を出力する必要がありますが、出力のベクトル形式も問題ありません。
- 画像出力は入力画像の近似である必要があります。入力画像に近づくほど、良い結果になります。
- デコードプロセスは、上記で指定された出力以外のエンコードプロセスの他の出力にアクセスできない場合があります。つまり、画像をどこかにアップロードして、ダウンロードするためのデコードプロセスのURLなど、ばかげたものを出力することはできません。
ユーザーインターフェイスの一貫性を保つために、プログラムは次のように動作する必要があります。
- プログラムは、適切なインタープリターを備えたプラットフォームで実行可能に設定できるスクリプト、または実行可能ファイルにコンパイルできるプログラムでなければなりません。
- プログラムでは、最初の引数として、
encode
またはdecode
モードを設定する必要があります。 プログラムは、次の1つ以上の方法で入力を受け取る必要があります(ファイル名を受け取る方法を実装する場合、ファイル名が欠落している場合は、stdinおよびstdoutから読み書きすることもできます)。
標準入力から入力を受け取り、標準出力に出力を生成します。
my-program encode <input.png >output.txt my-program decode <output.txt >output.png
2番目の引数で指定されたファイルから入力を受け取り、3番目の引数で指定されたファイルに出力を生成します。
my-program encode input.png output.txt my-program decode output.txt output.png
- あなたの解決策として、投稿してください:
- コード全体、または他の場所でホストされているコードへのリンク(非常に長い場合、またはコンパイルするために多くのファイルが必要な場合など)。
- コードからすぐに分からない場合、またはコードが長く、人々が要約に興味がある場合の、その機能の説明。
- 元の画像、圧縮後のテキスト、およびデコードされた画像を含むサンプル画像。
- 他の誰かが考えていたアイデアに基づいて構築している場合は、それらを挙げてください。他人のアイデアを洗練させようとすることは問題ありませんが、それらをアトリビューションする必要があります。
ガイドライン
これらは基本的に、違反する可能性のあるルール、提案、またはスコアリング基準です。
- 美学は重要です。私は判断し、他の人が以下に基づいて判断することを提案します:
- 出力イメージの見た目、および元のイメージの見た目。
- テキストの見栄え。あなたが本当に賢い圧縮スキームを持っているなら、完全にランダムなゴブルディゴックは問題ありませんが、私はまた、画像を多言語の詩、またはそのような何かに変える答えも見たいです。元のソリューションの作者は漢字だけを使用することを決定したことに注意してください。
- 興味深いコードと巧妙なアルゴリズムは常に優れています。私は要点まで短く、明確なコードが好きですが、本当に巧妙で複雑なアルゴリズムでも、良い結果が得られる限り問題ありません。
- 速度も重要ですが、画像を圧縮するジョブがどれほど優れているかほど重要ではありません。何日も遺伝的アルゴリズムを実行するものよりも、10分の1秒で画像を変換できるプログラムが欲しいです。
- 品質が合理的に同等である限り、長いソリューションよりも短いソリューションを優先します。簡潔さは美徳です。
- プログラムは、Mac OS X、Linux、またはWindowsで自由に利用できる実装を持つ言語で実装する必要があります。プログラムを実行できるようにしたいのですが、MATLABなどでのみ実行できる優れたソリューションがある場合は、それで問題ありません。
- プログラムはできるだけ一般的なものにする必要があります。可能な限り多くの異なる画像で機能するはずですが、他の画像よりも良い結果が得られる場合もあります。特に:
- プログラムにいくつかの画像を組み込み、それを照合して参照を書き込んだ後、デコード時に照合画像を生成するのはかなり不十分であり、少数の画像しかカバーしません。
- シンプルでフラットな幾何学的形状の画像を取得してそれらをいくつかのベクトルプリミティブに分解できるプログラムはかなり気の利いたものですが、特定の複雑さを超える画像で失敗した場合、おそらく一般的ではありません。
- 特定の固定アスペクト比の画像のみを取得でき、それらをうまく使用できるプログラムも問題ありませんが、理想的ではありません。
- 白黒の画像は、カラー画像よりも小さなスペースに多くの情報を取り込むことができます。一方、それはそれが適用できる画像のタイプを制限するかもしれません。顔は白黒でうまく写りますが、抽象的なデザインではうまくいかない場合があります。
- ほぼ同じ比率でありながら、出力画像が入力よりも小さい場合は、まったく問題ありません。画像を拡大して元の画像と比較する必要がある場合は問題ありません。それがどのように見えるかが重要です。
- プログラムは、実際にTwitterを通過して無傷で出力できる出力を生成する必要があります。サポートされている文字の正確なセットに関するドキュメントが見つからなかったため、これは規則ではなくガイドラインにすぎませんが、制御文字、ファンキーな非表示の組み合わせ文字、私用文字などは避ける必要があります。
ルーブリックの採点
承認済みのソリューションを選択するときにソリューションをランク付けする方法の一般的なガイドとして、おそらく25ポイントスケールでソリューションを評価することになります(これは非常に大雑把であり、直接使用するだけではなく、これを基本的なガイドラインとして):
- エンコーディングスキームが広範囲の入力画像をどれだけうまく再現するかについて15ポイント。これは主観的で審美的な判断です
- 0はまったく機能しないことを意味します。毎回同じ画像が返されます。
- 5は、いくつかの画像をエンコードできることを意味しますが、デコードされたバージョンは見苦しく、より複雑な画像ではまったく機能しない可能性があります
- 10は、広範囲の画像で機能し、見分けが付くことがある心地よい画像を生成することを意味します
- 15は、一部のイメージの完全な複製を生成し、さらに大きくて複雑なイメージの場合でも、認識可能なものを提供することを意味します。または、おそらくそれはかなり認識できる画像を作成しませんが、オリジナルから明らかに派生した美しい画像を生成します。
- Unicode文字セットを上手に使用するための
3つのポイント
- 許可された文字のセット全体を単純に使用する場合は0ポイント
- Twitterや他のさまざまな状況で安全に転送できる限られた文字セットを使用する場合の1ポイント
- 漢字表意文字や右から左への文字のみなど、テーマ別の文字サブセットを使用するための2ポイント
- 読みやすいテキストを生成したり、問題の画像のように見える文字を使用したりするなど、本当にきちんとした処理を行うための3つのポイント
- 巧妙なアルゴリズムアプローチとコードスタイルの
3つのポイント
- 画像を縮小し、1ピクセルあたり1ビットとして扱い、base64エンコードするだけの1000行のコードの場合は0ポイント
- 標準のエンコーディング手法を使用し、よく記述された簡潔なものに対して1ポイント
- 比較的新しいエンコーディング手法を導入したもの、または驚くほど短くてクリーンなものの2ポイント
- 実際に良好な結果を生み出す1つのライナー、またはグラフィックエンコーディングの新境地を開くものの3ポイント(これが新境地を開拓するためのポイント数が少ないように思われる場合、この良品の結果は美学のスコアが高い可能性が高いことを覚えておいてください同様に)
- 2点スピードは。他のすべてが等しい、より速い方が良いですが、上記の基準はすべて速度よりも重要です
- 1点フリー(オープンソース)ソフトウェアで実行する場合はは、フリーソフトウェアを好むからです(C#がMonoで実行されている限り、C#もこのポイントの対象となります。同様に、MATLABコードがGNU Octaveで実行される場合も対象となります)。
- 1点すべてのルールを実際に遵守した場合は。これらのルールは少し大きく複雑になっているため、細かい点が1つ間違っているという他の点では良い答えを受け入れますが、実際にすべてのルールに従っている解決策については、もう1つポイントを挙げます。
参考画像
一部の人々はいくつかの参照画像を求めています。あなたが試すことができるいくつかの参照画像を以下に示します。小さいバージョンがここに埋め込まれています。必要な場合、それらはすべて大きいバージョンのイメージにリンクしています。
賞
500 repの報奨金を提供しています I上記の基準に基づいて、最高のようなことを(プラス50のそのStackOverflowのキック)ソリューションのために。もちろん、私は他のすべての人にも、ここでお気に入りのソリューションに投票することをお勧めします。
締め切りについて
このコンテストは、賞金がなくなるまで、5月30日土曜日の午後6時頃まで開催されます。コンテストの正確な終了時刻はわかりません。午後5時から7時の間にあるかもしれません。午後2時までに送信されたすべてのエントリを確認することを保証し、午後4時までに送信されたすべてのエントリを確認するために最善を尽くします。その後に解決策が提出された場合、決定を下さなければならない前に、公正に検討する機会がないかもしれません。また、提出が早ければ早いほど、最善の解決策を私が選択できるように投票できる可能性が高くなります。そのため、締め切り間際ではなく、早期に提出してください。
Unicodeノート
どのUnicode文字が許可されているかについて、いくつかの混乱もありました。可能なUnicodeコードポイントの範囲はU+0000
にU+10FFFF
。オープンなデータ交換でUnicode文字として使用することが決して有効ではないいくつかのコードポイントがあります。これらは非文字と代理コードポイントです。Noncharactersは、で定義されているUnidode標準5.1.0節16.7値としてU+FFFE
、U+FFFF
、U+
NFFFE
、U+
NFFFF
ここで、Nであります1
- 。これらの値は、アプリケーション固有の内部使用のために使用されることを意図しており、適合アプリケーションは、それらによって処理されるテキストからこれらの文字を取り除く場合があります。で定義されている代理コードポイント10
進数、および範囲U+FDD0
-U+FDEF
Unicode Standard 5.1.0セクション3.8 as U+D800
–はU+DFFF
、UTF-16のBasic Multilingual Planeを超えて文字をエンコードするために使用されます。したがって、これらのコードポイントをUTF-16エンコーディングで直接表すことは不可能であり、他のエンコーディングでそれらをエンコードすることは無効です。したがって、このコンテストの目的のために、画像を範囲内の140以下のUnicodeコードポイントのシーケンスにエンコードするすべてのプログラムを許可しますU+0000
–U+10FFFF
上記で定義された全てnoncharactersとサロゲートペアを除きます。
私は割り当てられた文字のみを使用するソリューション、および割り当てられた文字の巧妙なサブセットを使用するか、それらが使用する文字セットで何か面白いことをするより良いソリューションを好みます。割り当てられた文字のリストについては、Unicode文字データベースを参照してください。一部の文字は直接リストされていますが、一部は範囲の開始と終了としてのみリストされていることに注意してください。また、サロゲートコードポイントはデータベースにリストされていますが、上記のように禁止されていることに注意してください。出力するテキストをより興味深いものにするために文字の特定のプロパティを利用したい場合は、名前付きコードブロックのリストなど、利用可能な文字情報のさまざまなデータベースがあります。やさまざまな文字プロパティます。
Twitterはサポートする正確な文字セットを指定していないため、特定の文字が余分にカウントされる、または特定の文字が削除されるため、Twitterで実際に機能しないソリューションについては寛大になります。すべてのエンコードされた出力がTwitterやidenti.caなどの別のマイクロブログサービスを介して無傷で転送できることが望ましいですが、必須ではありません。Twitterエンティティが<、>、&をエンコードするため、これらをそれぞれ4、4、5文字としてカウントすることを示すドキュメントをいくつか見ましたが、私は自分でテストしていないため、JavaScript文字カウンターが表示されないようですそれらをそのように数える。
ヒントとリンク
- ルールでの有効なUnicode文字の定義は少し複雑です。CJK統一表意文字(U + 4E00–U + 9FCF)などの単一の文字ブロックを選択する方が簡単な場合があります。
- 画像操作には、ImageMagickやPython Imaging Libraryなどの既存の画像ライブラリを使用できます。
- Unicode文字セットとそのさまざまなエンコーディングを理解するのに助けが必要な場合は、このクイックガイドまたはLinuxおよびUnixのUTF-8に関するこの詳細なFAQを参照してください。
- ソリューションを早期に導入するほど、私(および他の人々が投票)が検討する必要がある時間が長くなります。ソリューションを改善すれば、ソリューションを編集できます。ソリューションを最後に確認するときは、最新のバージョンに基づいて賞金を計算します。
- 簡単な画像形式を解析して書き込む(そして既存の形式だけを使いたくない)場合は、PPM形式の使用をお勧めします。これはテキストベースのフォーマットで、非常に扱いやすく、ImageMagickを使用して変換できます。