Kurierannahme

13

Kurierannahme

Das Programm muss eine beliebige Zeichenfolge als Eingabe akzeptieren und ein Pixelbild ausgeben, das die Eingabezeichenfolge in Courier anzeigt. Alle Buchstaben, die ein "Loch" (wie abdegopqABDPQRusw.) enthalten, das von schwarzen Pixeln umgeben ist, müssen ebenfalls schwarz ausgefüllt werden.

Eingang

Das Programm muss in der Lage sein, beliebige ASCII-Zeichenfolgen als Eingabe zu akzeptieren. Die Eingabe kann beliebig sein, solange sich der Programmcode selbst nicht ändern muss, um eine andere Eingabe zu akzeptieren. (Ausgenommen zB der Dateiname der zu lesenden Datei.) Keine Standard-Regelungslücken. Sie können davon ausgehen, dass jede Eingabe mindestens einen druckbaren Buchstaben enthält.

Ausgabe

Die Ausgabe muss eine schwarzweiße (keine graue) Pixelgrafik sein, die die in Courier geschriebene Zeichenfolge (in Schwarz, Hintergrundweiß) mit den angegebenen 'Löchern' zeigt. Die Schriftgröße der gesamten Zeichenfolge muss konstant sein (das heißt, keine unterschiedliche Skalierung für die einzelnen Buchstaben), sodass die Buchstaben in voller Größe (z. B. ABCDEFGHIJKLMNOPRSTUVWXYZaber j und Q sind größer) mindestens 10 Pixel hoch sein müssen. (Sie müssen es nicht in eine Datei schreiben, jede Art von Anzeige ist in Ordnung, solange sie als Pixelgrafik generiert wird, wie z. B. Leinwand in JavaScript.) Bitte posten Sie diese Grafik mit Ihrer Antwort.

Der Zugriff auf die Bibliotheken courier.ttf / font ist zulässig.

Das Programm muss auch die Anzahl der schwarzen Pixel zählen und diese in die Konsole oder in die am Ende bevorzugte Ausgabemethode schreiben.

Ergebnis

Die Punktzahl wird wie folgt bewertet: Der vollständige Programmcode muss als Eingabezeichenfolge für Ihr Programm verwendet werden. Die Anzahl der schwarzen Pixel entspricht Ihrer Punktzahl. Programmcode, der nicht druckbare oder nicht ASCII-Zeichen enthält, ist nicht zulässig. (Sowie Standardlücken.) Je niedriger die Punktzahl, desto besser.

Fehler
quelle
Die Ausgabe wird als s / w angegeben, daher sind keine grauen Pixel zulässig. Und danke, dass Sie nach der Kodierung gefragt haben, diese ist aufgrund der Schriftart auf ASCII beschränkt.
Fehler
1
Es gibt mindestens zwei schwerwiegende Probleme, die geklärt werden müssen. Erstens ist nicht klar, ob dem Programm Zugriff auf eine Courier.ttf und auf Schriftbibliotheken gewährt wird, die sie verwenden können. Zweitens, haben Sie ernsthaft vor, Programme zu verbieten, die keine Nicht-ASCII-Zeichen enthalten?
Peter Taylor
Ja, der Zugriff auf Courier.ttf und Schriftbibliotheken ist zulässig. Andernfalls wäre dies nicht sinnvoll. Vielen Dank. Ich konnte keine Hauptsprache finden, die sich auf Nicht-ASCII-Zeichen stützt. Kennen Sie Sprachen, die Nicht-ASCII-Zeichen benötigen?
Fehler
1
@flawr APL. In Mathematica können Sie einige Dinge mit Unicode-Zeichen verkürzen.
Martin Ender
Ist ImageMagick erlaubt?
Digital Trauma

Antworten:

12

Mathematica, 4864 Pixel

l = ImageData[Binarize[Rasterize[Style[j, FontSize -> 15]], .71]]
i = {{1, 1}}
While[Length[i] > 1 - 1,
 {r, c} = j = i[[1]]; l[[r, c]] = 2; i = i[[2 ;; -1]];
 If[FreeQ[i, {r, c} = J = j + #] && l[[r, c]] == 1, 
    i = i~Join~{J}] & /@
  {{1, 1 - 1}, {1 - 1, 1}, {-1, 1 - 1}, {1 - 1, -1}}
 ]
Image[l = l /. 1 -> 1 - 1 /. 2 -> 1]
Count[l, 1 - 1, {2}]

Hier ist das Bild:

Bildbeschreibung hier eingeben

Wenn Sie in Mathematica ein "Programm" schreiben, schreiben Sie einfach einen Ausschnitt. Dies erwartet also, dass die Eingabe in gespeichert ist, jund das letzte, was zurückgegeben wird, sind das Bild und die Anzahl. Dies spuckt auch eine Reihe von Fehlern aus, da ich keine Grenzen überprüfe l, aber es erzeugt trotzdem das gewünschte Ergebnis.

wo %bezieht sich auf die letzte Ausgabe.

Vielen Dank an Geobits für die Idee zum Algorithmus. Ich fülle das Bild von der oberen linken Ecke mit einer ungültigen Intensität und ersetze dann alle verbleibenden weißen Pixel durch schwarze Pixel und die ungültigen durch weiße.

Beachten Sie, dass die FreeQÜberprüfung nicht erforderlich ist, damit das Programm ordnungsgemäß funktioniert, sondern in angemessener Zeit beendet wird. Wenn ich es weglassen würde, würde ich tatsächlich 300 Pixel weniger erzielen.

Martin Ender
quelle
Die Zählung sollte Teil des Programms selbst sein! Ansonsten ist es eine gute Lösung, haben Sie berechnet, welche Buchstaben (als Variablennamen) die geringste Anzahl von Pixeln verwenden?
Fehler
@flawr ja :) (jetzt für alle von ihnen) (Fixing die Zählung in einer Sekunde)
Martin Ender