Wenn ein Bild 1000 Wörter wert ist, wie viel von einem Bild können Sie in 140 Zeichen passen?
Hinweis : Das ist es Leute! Die Bounty-Frist ist da, und nach einigen harten Überlegungen habe ich entschieden, dass Boojums Eintrag Sam Hocevars kaum übertrifft . Ich werde detailliertere Notizen veröffentlichen, sobald ich die Gelegenheit hatte, sie aufzuschreiben. Natürlich sollte sich jeder frei fühlen, weiterhin Lösungen einzureichen und Lösungen zu verbessern, über die die Menschen abstimmen können. Vielen Dank an alle, die eingereicht und eingereicht haben; Ich habe sie alle genossen. Das Laufen hat mir sehr viel Spaß gemacht und ich hoffe, es hat sowohl den Teilnehmern als auch den Zuschauern Spaß gemacht.
Ich bin auf diesen interessanten Beitrag gestoßen, in dem versucht wurde, Bilder in einen Twitter-Kommentar zu komprimieren, und viele Leute in diesem Thread (und einem Thread auf Reddit ) hatten Vorschläge, wie Sie dies tun könnten. Ich denke, es wäre eine gute Herausforderung beim Codieren. Lassen Sie die Leute ihr Geld dort einsetzen, wo ihr Mund ist, und zeigen Sie, wie ihre Ideen zur Codierung auf dem begrenzten Platz, den Sie zur Verfügung haben, zu mehr Details führen können.
Ich fordere Sie auf, ein Allzwecksystem zu entwickeln, mit dem Bilder in Twitter-Nachrichten mit 140 Zeichen codiert und erneut in ein Bild decodiert werden können. Sie können Unicode-Zeichen verwenden, sodass Sie mehr als 8 Bit pro Zeichen erhalten. Selbst wenn Sie Unicode-Zeichen zulassen, müssen Sie Bilder auf kleinstem Raum komprimieren. Dies wird sicherlich eine verlustbehaftete Komprimierung sein, und daher muss subjektiv beurteilt werden, wie gut jedes Ergebnis aussieht.
Hier ist das Ergebnis, das der ursprüngliche Autor, Quasimondo , aus seiner Codierung erhalten hat (das Bild ist unter einer Creative Commons Attribution-Noncommercial-Lizenz lizenziert ):
Kannst du es besser machen?
Regeln
- Ihr Programm muss zwei Modi haben: Codierung und Decodierung .
- Bei der Codierung :
- Ihr Programm muss eine Grafik in einem angemessenen Raster- Grafikformat Ihrer Wahl als Eingabe verwenden . Wir werden sagen, dass jedes von ImageMagick unterstützte Rasterformat als angemessen gilt.
- Ihr Programm muss eine Nachricht ausgeben, die in 140 oder weniger Unicode-Codepunkten dargestellt werden kann. 140 Codepunkte im Bereich
U+0000
-U+10FFFF
, ohne nicht-Zeichen (U+FFFE
,U+FFFF
,U+
nFFFE
,U+
nFFFF
, wo n ist1
-10
hexadezimal, und der BereichU+FDD0
-U+FDEF
) sowie Ersatzcodepunkte (U+D800
-U+DFFF
). Es kann in einer angemessenen Codierung Ihrer Wahl ausgegeben werden. Jede von GNUiconv
unterstützte Codierung wird als angemessen angesehen, und Ihre native Plattform- oder Gebietsschema-Codierung ist wahrscheinlich eine gute Wahl. Weitere Informationen finden Sie in den folgenden Unicode-Hinweisen .
- Beim Dekodieren :
- Ihr Programm sollte die Ausgabe Ihres Codierungsmodus als Eingabe verwenden .
- Ihr Programm muss ein Bild in einem angemessenen Format Ihrer Wahl ausgeben, wie oben definiert, obwohl die Ausgabevektorformate ebenfalls in Ordnung sind.
- Die Bildausgabe sollte eine Annäherung an das Eingabebild sein; Je näher Sie dem Eingabebild kommen, desto besser.
- Der Decodierungsprozess hat möglicherweise keinen Zugriff auf eine andere Ausgabe des Codierungsprozesses als die oben angegebene Ausgabe. Das heißt, Sie können das Bild nicht irgendwo hochladen und die URL für den Dekodierungsprozess zum Herunterladen oder ähnliches ausgeben.
Aus Gründen der Konsistenz der Benutzeroberfläche muss sich Ihr Programm wie folgt verhalten:
- Ihr Programm muss ein Skript sein, das auf einer Plattform mit dem entsprechenden Interpreter als ausführbar festgelegt werden kann, oder ein Programm, das zu einer ausführbaren Datei kompiliert werden kann.
- Ihr Programm muss entweder als erstes Argument
encode
oderdecode
zum Festlegen des Modus verwenden. Ihr Programm muss auf eine oder mehrere der folgenden Arten Eingaben vornehmen (wenn Sie die implementieren, die Dateinamen verwendet, können Sie auch von stdin und stdout lesen und schreiben, wenn Dateinamen fehlen):
Nehmen Sie Eingaben von Standard-In und erzeugen Sie Ausgabe von Standard-Out.
my-program encode <input.png >output.txt my-program decode <output.txt >output.png
Nehmen Sie Eingaben aus einer im zweiten Argument genannten Datei und erzeugen Sie Ausgaben in der im dritten Argument genannten Datei.
my-program encode input.png output.txt my-program decode output.txt output.png
- Für Ihre Lösung schreiben Sie bitte:
- Ihr vollständiger Code und / oder ein Link dazu, der an anderer Stelle gehostet wird (wenn er sehr lang ist oder viele Dateien zum Kompilieren benötigt oder so).
- Eine Erklärung, wie es funktioniert, wenn es nicht sofort aus dem Code ersichtlich ist oder wenn der Code lang ist und die Leute an einer Zusammenfassung interessiert sind.
- Ein Beispielbild mit dem Originalbild, dem zu komprimierenden Text und dem dekodierten Bild.
- Wenn Sie auf einer Idee aufbauen, die jemand anderes hatte, schreiben Sie ihn bitte zu. Es ist in Ordnung zu versuchen, die Idee eines anderen zu verfeinern, aber Sie müssen ihn zuschreiben.
Richtlinien
Dies sind im Grunde genommen Regeln, gegen die verstoßen werden kann, Vorschläge oder Bewertungskriterien:
- Ästhetik ist wichtig. Ich werde urteilen und vorschlagen, dass andere Leute urteilen, basierend auf:
- Wie gut das Ausgabebild aussieht und wie sehr es dem Original ähnelt.
- Wie schön der Text aussieht. Völlig zufälliges Gobbledigook ist in Ordnung, wenn Sie ein wirklich cleveres Komprimierungsschema haben, aber ich möchte auch Antworten sehen, die Bilder in mehrsprachige Gedichte verwandeln, oder so etwas Kluges. Beachten Sie, dass der Autor der ursprünglichen Lösung beschlossen hat, nur chinesische Schriftzeichen zu verwenden, da dies so besser aussah.
- Interessanter Code und clevere Algorithmen sind immer gut. Ich mag kurzen, präzisen und klaren Code, aber auch wirklich clevere, komplizierte Algorithmen sind in Ordnung, solange sie gute Ergebnisse liefern.
- Geschwindigkeit ist ebenfalls wichtig, wenn auch nicht so wichtig wie die Komprimierung des Bildes. Ich hätte lieber ein Programm, das ein Bild in einer Zehntelsekunde konvertieren kann, als etwas, das tagelang genetische Algorithmen ausführt.
- Ich werde kürzere Lösungen längeren vorziehen, solange sie in ihrer Qualität einigermaßen vergleichbar sind. Prägnanz ist eine Tugend.
- Ihr Programm sollte in einer Sprache implementiert sein, die unter Mac OS X, Linux oder Windows frei verfügbar ist. Ich würde gerne die Programme ausführen können, aber wenn Sie eine großartige Lösung haben, die nur unter MATLAB oder so läuft , ist das in Ordnung.
- Ihr Programm sollte so allgemein wie möglich sein. Es sollte für so viele verschiedene Bilder wie möglich funktionieren, obwohl einige möglicherweise bessere Ergebnisse erzielen als andere. Bestimmtes:
- Es ist ziemlich lahm, ein paar Bilder in das Programm eingebaut zu haben, mit denen es übereinstimmt und auf die es verweist, und dann beim Entschlüsseln das passende Bild zu erzeugen. Es deckt nur wenige Bilder ab.
- Ein Programm, das Bilder von einfachen, flachen, geometrischen Formen aufnehmen und in ein Vektorprimitiv zerlegen kann, ist ziemlich geschickt, aber wenn es bei Bildern ab einer bestimmten Komplexität fehlschlägt, ist es wahrscheinlich nicht allgemein genug.
- Ein Programm, das nur Bilder mit einem bestimmten festen Seitenverhältnis aufnehmen kann, aber gute Arbeit damit leistet, wäre ebenfalls in Ordnung, aber nicht ideal.
- Möglicherweise stellen Sie fest, dass ein Schwarzweißbild mehr Informationen auf kleinerem Raum als ein Farbbild liefert. Auf der anderen Seite kann dies die Bildtypen einschränken, auf die es anwendbar ist. Gesichter kommen in Schwarz und Weiß gut zur Geltung, aber abstrakte Designs schneiden möglicherweise nicht so gut ab.
- Es ist vollkommen in Ordnung, wenn das Ausgabebild kleiner als das Eingabebild ist und ungefähr das gleiche Verhältnis aufweist. Es ist in Ordnung, wenn Sie das Bild vergrößern müssen, um es mit dem Original zu vergleichen. Wichtig ist, wie es aussieht.
- Ihr Programm sollte eine Ausgabe produzieren, die tatsächlich über Twitter gesendet werden kann und unversehrt bleibt. Dies ist nur eine Richtlinie und keine Regel, da ich keine Dokumentation zu den genauen unterstützten Zeichensätzen finden konnte, aber Sie sollten wahrscheinlich Steuerzeichen, funky unsichtbare Kombinationszeichen, Zeichen für den privaten Gebrauch und dergleichen vermeiden.
Bewertungsrubrik
Nehmen wir als allgemeinen Leitfaden für die Einstufung von Lösungen bei der Auswahl meiner akzeptierten Lösung an, dass ich wahrscheinlich Lösungen auf einer 25-Punkte-Skala bewerten werde (dies ist sehr grob und ich werde nichts direkt bewerten, nur mit dies als grundlegende Richtlinie):
- 15 Punkte dafür, wie gut das Codierungsschema eine Vielzahl von Eingabebildern wiedergibt. Dies ist ein subjektives, ästhetisches Urteil
- 0 bedeutet, dass es überhaupt nicht funktioniert, es gibt jedes Mal das gleiche Bild zurück oder so
- 5 bedeutet, dass einige Bilder codiert werden können, obwohl die decodierte Version hässlich aussieht und bei komplizierteren Bildern möglicherweise überhaupt nicht funktioniert
- 10 bedeutet, dass es mit einer Vielzahl von Bildern arbeitet und angenehm aussehende Bilder erzeugt, die gelegentlich unterscheidbar sein können
- 15 bedeutet, dass es perfekte Nachbildungen einiger Bilder erzeugt und selbst bei größeren und komplexeren Bildern etwas erkennbares ergibt. Oder es macht vielleicht keine Bilder, die gut erkennbar sind, sondern schöne Bilder, die eindeutig vom Original abgeleitet sind.
- 3 Punkte für die geschickte Verwendung des Unicode-Zeichensatzes
- 0 Punkte für die einfache Verwendung des gesamten Satzes zulässiger Zeichen
- 1 Punkt für die Verwendung eines begrenzten Satzes von Zeichen, die für die Übertragung über Twitter oder in einer größeren Vielfalt von Situationen sicher sind
- 2 Punkte für die Verwendung einer thematischen Teilmenge von Zeichen, z. B. nur Han-Ideogramme oder nur Zeichen von rechts nach links
- 3 Punkte, um etwas wirklich Ordentliches zu tun, z. B. lesbaren Text zu generieren oder Zeichen zu verwenden, die wie das betreffende Bild aussehen
- 3 Punkte für clevere algorithmische Ansätze und Codestil
- 0 Punkte für 1000 Codezeilen, um das Bild zu verkleinern, als 1 Bit pro Pixel zu behandeln und base64 zu codieren
- 1 Punkt für etwas, das eine Standardcodierungstechnik verwendet und gut geschrieben und kurz ist
- 2 Punkte für etwas, das eine relativ neuartige Codierungstechnik einführt oder das überraschend kurz und sauber ist
- 3 Punkte für einen Einzeiler, der tatsächlich gute Ergebnisse liefert, oder etwas, das neue Wege in der Grafikcodierung beschreitet (wenn dies wie eine geringe Anzahl von Punkten für Neuland erscheint, denken Sie daran, dass ein so gutes Ergebnis wahrscheinlich eine hohe Punktzahl für die Ästhetik hat auch)
- 2 Punkte für Geschwindigkeit. Wenn alles andere gleich ist, ist schneller besser, aber die oben genannten Kriterien sind alle wichtiger als die Geschwindigkeit
- 1 Punkt für die Ausführung auf freier (Open Source) Software, da ich freie Software bevorzuge (beachten Sie, dass C # für diesen Punkt weiterhin berechtigt ist, solange es auf Mono ausgeführt wird, ebenso wäre MATLAB-Code zulässig, wenn es auf GNU Octave ausgeführt wird).
- 1 Punkt für die tatsächliche Einhaltung aller Regeln. Diese Regeln sind etwas umfangreich und kompliziert geworden, daher werde ich wahrscheinlich ansonsten gute Antworten akzeptieren, bei denen ein kleines Detail falsch ist, aber ich werde jeder Lösung, die tatsächlich allen Regeln folgt, einen zusätzlichen Punkt geben
Referenzbilder
Einige Leute haben nach Referenzbildern gefragt. Hier sind einige Referenzbilder, die Sie ausprobieren können. Hier sind kleinere Versionen eingebettet, die alle auf größere Versionen des Bildes verweisen, wenn Sie diese benötigen:
Preis
Ich biete eine Prämie von 500 Wiederholungen (plus die 50, die StackOverflow einsetzt) für die Lösung an, die mir am besten gefällt, basierend auf den oben genannten Kriterien. Natürlich ermutige ich alle anderen, auch hier über ihre Lieblingslösungen abzustimmen.
Hinweis zur Frist
Dieser Wettbewerb läuft, bis das Kopfgeld aufgebraucht ist, am Samstag, den 30. Mai, gegen 18 Uhr. Ich kann nicht genau sagen, wann es enden wird. Es kann zwischen 17 und 19 Uhr sein. Ich werde garantieren, dass ich alle bis 14 Uhr eingereichten Beiträge einsehen werde, und ich werde mein Bestes tun, um alle bis 16 Uhr eingereichten Beiträge zu prüfen. Wenn danach Lösungen eingereicht werden, habe ich möglicherweise keine Chance, sie fair zu betrachten, bevor ich meine Entscheidung treffen muss. Je früher Sie einreichen, desto größer ist auch die Chance, dass Sie abstimmen können, um mir bei der Auswahl der besten Lösung zu helfen. Versuchen Sie also, früher als rechtzeitig einzureichen.
Unicode-Notizen
Es gab auch einige Unklarheiten darüber, welche Unicode-Zeichen genau zulässig sind. Der Bereich möglicher Unicode-Codepunkte liegt U+0000
bei U+10FFFF
. Es gibt einige Codepunkte, deren Verwendung als Unicode-Zeichen in einem offenen Datenaustausch niemals gültig ist. das sind die noncharacters und die Surrogat - Codepunkte . Noncharacters ist in dem definierten Unidode Norm 5.1.0 Abschnitt 16.7 als die Werte U+FFFE
, U+FFFF
, U+
nFFFE
, U+
nFFFF
, wo n ist 1
- 10
hexadezimal, und der Bereich U+FDD0
-U+FDEF
. Diese Werte sind für die anwendungsspezifische interne Verwendung vorgesehen, und konforme Anwendungen können diese Zeichen aus dem von ihnen verarbeiteten Text entfernen. Ersatzcodepunkte, die im Unicode Standard 5.1.0 Abschnitt 3.8 als U+D800
- definiert sind U+DFFF
, werden zum Codieren von Zeichen verwendet, die über die mehrsprachige Grundebene in UTF-16 hinausgehen. Daher ist es unmöglich, diese Codepunkte direkt in der UTF-16-Codierung darzustellen, und es ist ungültig, sie in einer anderen Codierung zu codieren. Für den Zweck dieses Wettbewerbs erlaube ich daher jedem Programm, das Bilder in eine Folge von nicht mehr als 140 Unicode-Codepunkten aus dem Bereich codiert U+0000
- U+10FFFF
mit Ausnahme aller oben definierten Nichtzeichen und Ersatzpaare.
Ich werde Lösungen bevorzugen , die nur zugewiesene Zeichen verwenden, und noch bessere, die clevere Teilmengen von zugewiesenen Zeichen verwenden oder mit dem von ihnen verwendeten Zeichensatz etwas Interessantes tun. Eine Liste der zugewiesenen Zeichen finden Sie in der Unicode- Zeichendatenbank . Beachten Sie, dass einige Zeichen direkt aufgeführt sind, während andere nur als Anfang und Ende eines Bereichs aufgeführt sind. Beachten Sie auch, dass Ersatzcodepunkte in der Datenbank aufgeführt sind, jedoch wie oben erwähnt verboten sind. Wenn Sie bestimmte Eigenschaften von Zeichen nutzen möchten, um den von Ihnen ausgegebenen Text interessanter zu gestalten, stehen verschiedene Datenbanken mit Zeicheninformationen zur Verfügung, z. B. eine Liste benannter Codeblöcke und verschiedene Zeicheneigenschaften.
Da Twitter nicht den genauen Zeichensatz angibt, den sie unterstützen, werde ich bei Lösungen, die mit Twitter nicht funktionieren, nachsichtig sein, da bestimmte Zeichen zusätzlich zählen oder bestimmte Zeichen entfernt werden. Es wird bevorzugt, aber nicht benötigt, dass alle codierten Ausgaben unbeschadet über Twitter oder einen anderen Microblogging-Dienst wie identi.ca übertragen werden können . Ich habe einige Dokumentationen gesehen, die besagen, dass Twitter-Entitäten <,> und & codieren und diese daher als 4, 4 bzw. 5 Zeichen zählen, aber ich habe das nicht selbst getestet, und ihr JavaScript-Zeichenzähler scheint nicht zu sein um sie so zu zählen.
Tipps & Links
- Die Definition gültiger Unicode-Zeichen in den Regeln ist etwas kompliziert. Die Auswahl eines einzelnen Zeichenblocks, z. B. CJK Unified Ideographs (U + 4E00 - U + 9FCF), ist möglicherweise einfacher.
- Sie können vorhandene Bildbibliotheken wie ImageMagick oder Python Imaging Library für Ihre Bildbearbeitung verwenden.
- Wenn Sie Hilfe zum Verständnis des Unicode-Zeichensatzes und seiner verschiedenen Codierungen benötigen, lesen Sie diese Kurzanleitung oder diese ausführlichen FAQ zu UTF-8 unter Linux und Unix .
- Je früher Sie Ihre Lösung erhalten, desto mehr Zeit muss ich (und andere abstimmende Personen) damit verbringen. Sie können Ihre Lösung bearbeiten, wenn Sie sie verbessern. Ich werde mein Kopfgeld auf die neueste Version stützen, wenn ich die Lösungen zum letzten Mal durchschaue.
- Wenn Sie ein einfaches Bildformat zum Parsen und Schreiben wünschen (und nicht nur ein vorhandenes Format verwenden möchten), würde ich die Verwendung des PPM-Formats empfehlen . Es ist ein textbasiertes Format, mit dem man sehr einfach arbeiten kann, und Sie können ImageMagick verwenden , um es zu konvertieren.