Nachdem ich einige Zeit mit Stack Exchange verbracht habe, kann ich die meisten Sites in den Hot Network Questions an ihrem kleinen Symbol (das auch ihr Favicon ist ) erkennen, aber sicherlich nicht an allen. Lassen Sie uns ein Programm schreiben, das kann! Sie müssen Code schreiben, der die Site bestimmt, vorausgesetzt, einer der (derzeit) 132 Favoriten, einschließlich Stack Overflow in Japanisch (das sich noch in der privaten Beta befindet):
Ich habe eine ZIP-Datei mit all diesen Bildern als PNGs auf GitHub hochgeladen . Klicken Sie auf die Schaltfläche "Raw", um es herunterzuladen. Die Reihenfolge der obigen Symbole entspricht der alphabetischen Reihenfolge der Dateinamen in der Zip-Datei.
Die entsprechenden Site-Namen (in dieser Reihenfolge) sind:
Anmerkungen:
- Ich habe das
®
vonLEGO® Answers
und entferntExpressionEngine® Answers
, damit Sie sich keine Sorgen um Unicode machen müssen. - Ich habe aus dem gleichen Grund englische Namen für die Stapelüberläufe in Japanisch und Portugiesisch verwendet.
- Die Ikonen der Geowissenschaften und der spanischen Sprache sind nicht zu unterscheiden. Wenn Sie eines dieser Symbole verwenden, gibt Ihr Code möglicherweise eine dieser Sites (Ihrer Wahl) zurück. Gleiches gilt für Magento und Martial Arts .
Regeln
Sie können ein Programm oder eine Funktion schreiben, die
- Erhält den (lokalen) Dateinamen des Bildes über STDIN, Kommandozeilenargument oder Funktionsargument oder erhält den Inhalt der Bilddatei über STDIN
- Gibt den Namen der Site wie oben aufgeführt an STDOUT zurück oder druckt ihn aus.
Ihr Code muss alle 132 Sites korrekt erkennen (mit der oben genannten Ausnahme).
Sie dürfen keine Annahmen über den Dateinamen machen (so wie er heißt codegolf.png
). Sie können davon ausgehen, dass das Bild die Abmessungen 16x16 hat und dass es sich tatsächlich um eines der oben genannten 132 Bilder handelt. Die oben genannten Bilder sind alle PNGs. Sie können jedoch auch jedes andere geeignete Raster-Grafikformat verwenden. Sie müssen die Bilder jedoch selbst konvertieren. Sie sollten keine Annahmen über den tatsächlichen Bytestrom der Bilddatei treffen, außer dass es sich um ein gültiges Bild in dem von Ihnen gewählten Format handelt. Insbesondere wenn es mehrere Möglichkeiten gibt, dasselbe Bild in Ihrem Format zu codieren (z. B. indem Sie irrelevante Felder zum Header-Bereich hinzufügen), muss Ihr Code für alle von ihnen funktionieren. Kurz gesagt, Ihr Code sollte sich nur auf die Pixelwerte selbst stützen, nicht auf Details der Datei, die ihn codiert.
Sie dürfen wie gewohnt keine Daten aus dem Internet holen. Sie müssen den Aufstellungsort vom Bild alleine feststellen.
Sie können integrierte Funktionen oder Funktionen von Drittanbietern verwenden, um die Bilddatei zu lesen und eine Liste der Farbwerte abzurufen. Sie dürfen jedoch keine anderen vorhandenen Bildverarbeitungsfunktionen verwenden.
Dies ist Codegolf, daher gewinnt die kürzeste Antwort (in Bytes).
quelle
pngcrush
gibt es keine.Antworten:
Python 3.x + Kissen,
230118941878 BytesDie Idee ist, das Bild zu hacken und die entsprechende Zeichenfolge aus einem Wörterbuch zu finden (genau wie bei anderen Antworten).
Der Schlüsselcode lautet:
Wir öffnen die Datei und konvertieren sie dann in eine 1024-Byte-Zeichenfolge mit RGBA-Werten. Mit ein wenig Experimentieren stellen wir fest, dass die ADLER-32-Prüfsumme von jedem sechsten Byte dieser Byte-Zeichenfolge für diese 132 Bilder eindeutig ist. Und dann weitere Tests zeigen, dass unter Berücksichtigung des Moduls von 2003 der Prüfsumme das kleinste Wörterbuch ergibt.
Das ursprüngliche Wörterbuch sieht folgendermaßen aus:
Wir haben festgestellt, dass alle Site-Namen keine Nummern enthalten. Daher können wir das gesamte Wörterbuch zu einer einzigen Zeichenfolge zusammenfassen:
Verwenden Sie dann den regulären Ausdruck, um z. B.
1969(\D+)
den Site-Namen zu extrahieren. Diese riesige Zeichenfolge wird dann komprimiert, um Speicherplatz zu sparen (lassen Sie die Komprimierungsengine das mehrfache Auftreten von "Sprache" bemerken) und schließlich mit Base-85 codiert.Da es jetzt auch als Kolmogorov-Komplexität gekennzeichnet ist , handelt es sich hier um eine 2394-Byte- Lösung, die keine Komprimierung verwendet (zlib wird weiterhin für adler32 importiert).
quelle
.tobytes()
die Pixeldaten (16 × 16 × 4 = 1024), so dass es auf dem Bild beruht. Die Datei muss jedoch in RGBA vorliegen.C #, 2760 Bytes
Meine Lösung verwendet kein Hashing, sondern untersucht die einzelnen Pixel des Bildes und entscheidet darauf basierend. Ich habe festgestellt, dass es ausreicht, die blaue Komponente von image modulo 9 zu untersuchen. Die Idee ist, wiederholt anhand des Werts von pixel.B% 9 zu teilen.
Mithilfe eines Skripts habe ich das folgende monströse Programm (5197 Byte) generiert, das das Problem mithilfe eines binären Entscheidungsbaums löst:
Einige Benutzer haben in ihren Lösungen integrierte Komprimierungsfunktionen verwendet. Ich habe mein eigenes Skript erstellt, in dem häufig verwendete Teilzeichenfolgen identifiziert und durch einzelne Kurzzeichen ersetzt werden. Der Code wird in die folgende 2502 Bye-Zeichenfolge komprimiert:
Das zur Dekomprimierung benötigte Wörterbuch ist nur 108 Byte groß:
Das Wörterbuch verwendet Semikolons als Trennzeichen und enthält einzelne Zeichen, gefolgt von deren Dekomprimierung. Um zu dekomprimieren, wird ":" zuerst durch "&" und dann durch "<" durch "%!", "|" Ersetzt. von "ic" und so weiter. Die Dekomprimierung eines Strings c kann auf ganz kurze Weise ausgedrückt werden:
Nach der Dekomprimierung benutze ich etwas Reflection Black-Magic, um den Code im laufenden Betrieb zu kompilieren und auszuführen:
Beachten Sie, dass die hier zur Erläuterung verwendeten Beispiele sich geringfügig von denen unterscheiden, die in der 2876-Byte-Lösung verwendet werden.
quelle
Node.js,
3178313026672608 BytesBerechnet den SHA1-Hash der Bilddaten jeder Datei und indiziert die Site-Namen unter Verwendung der Bytes 16 bis 19 des Hex-Digests.
Indiziert die Site-Namen mit den Bytes 12 bis 16 des Hex-Digests des SHA1-Hash jeder Datei. Es kann eine kürzere Kombination geben, die nur 3 Bytes des Hex-Digests verwendet.quelle
h="17352368".match(/.{4}/g)
(die 4-Zeichen-Hashes, in ein Array aufgeteilt),s="MathOverflow;StackOverflow in Portuguese".split(";")
(Namen durch ein; getrennt) und fügen Sie alles erneut zusammen:t={}h.forEach(function(k,i){t[k]=s[i]})
(ergibt dasselbe Objekt wie Ihr Code). Es gibt 132 Semikolons. Selbst wenn Sie zu einem 2-Byte-Zeichen wechseln (OP sagt, dass die Site-Namen keinen Unicode enthalten sollten), sparen Sie Platz. Zusätzlich zu dieser zusätzlichen Speicherung können Sie die Optimierung von @manatwork hinzufügen.split()
s: us eine einzelne Zeichenfolge wie "1234Site; 5678Other" ersparen. Angenommen, es kommt nicht zu einem Konflikt zwischen Hash-Fragmenten und Site-Namen,match()
wird dies von einer einzigenfunction $(e){r=require;return"8d4fAcademia;3a6dAndroid Enthusiasts;5caeAnime & Manga;804cAsk Different;bef3Arduino".match(r("crypto").createHash("sha1").update(r("fs").readFileSync(e)).digest("hex").slice(12,16)+"([^;]+)")[1]}
Python 2.7,
1906 -1889 BytesDiese Lösung verwendet CRC32 für die Pixeldaten, um einen eindeutigen zweistelligen Basis-95-Identifikator zu erstellen. Der Index des Bezeichners wird dann verwendet, um die Antwortzeichenfolge nachzuschlagen.
Das Knifflige dabei war, eine Kombination von Hash-Funktionen zu finden, die 132 (oder 131) kleine, aber eindeutige Bezeichnungen ergeben würde. Ich habe ein paar Optionen ausprobiert, bevor ich mich für diese entschieden habe. Es scheint ziemlich kompakt zu sein.
Das Programm verwendet Python PIL, um die Pixeldaten aus der Datei zu lesen.
Python 2.7 2150 Bytes
Dies ist eine Version ohne Komprimierungs- oder Codierungsbibliotheken. Die Stapelaustauschliste wird mit einer einfachen Austauschmethode komprimiert. Die Zeichen, die nicht im Text verwendet werden:
werden verwendet, um gemeinsame Stringsegmente zu halten. Der Text wird mit der
for k,v in [(v[0],v[1:]) for v in K.split('|')]:T=T.replace(k,v)
Linie dekomprimiert . Die Indizierungstabelle für zwei Zeichen ist dieselbe wie im obigen Programm.quelle
C #, 2672 Bytes
Die Tabelle (Zeichenfolge) von Labels und partiellen SHA-Hashes wird komprimiert, um einige Bytes zu sparen. Das ursprüngliche Wörterbuch sieht folgendermaßen aus:
quelle
var
sollte ein paar Bytes speichern. 2) Was ist mit dem Stringbuilder? Ich sehe es nicht gebraucht. 3)StreamReader.ReadToEnd
könnte auch ein bisschen helfen.