Hintergrund
ASCII-Kunst ist das Erstellen von Bildern mithilfe von ASCII-Text, um Formen zu bilden.
Aliasing ist der Effekt, der durch die großen "Pixel" der ASCII-Grafik erzeugt wird, die der Größe der Zeichen entsprechen. Das Bild wird blockig und schwer zu sehen. Anti-Aliasing entfernt diesen Effekt, indem ein Farbverlauf erstellt und die harten Kanten der ASCII-Grafik geglättet werden.
Die Herausforderung
Ihre Herausforderung besteht darin, das kürzestmögliche Programm zu schreiben, das ein Stück ASCII-Kunst aufnimmt und eine Version ausgibt, die geglättet wurde.
Welche Art von Anti-Aliasing?
Alle ASCII-Zeichen bestehen aus zwei Arten von Symbolen: Leerzeichen und Nicht-Leerzeichen. Für jedes Nicht-Whitespace-Zeichen muss Ihr Programm ermitteln, ob es sich an einer Position befindet, an der ein Anti-Aliasing erforderlich ist. Wenn dies der Fall ist, müssen Sie es durch das richtige Zeichen ersetzen. Ist dies nicht der Fall, bleibt der Charakter derselbe.
Woher weißt du, ob ein Charakter geglättet werden muss? Die Antwort hängt von den Zeichen ab, die unmittelbar über, unter, links und rechts vom Zeichen stehen ( nicht von den Diagonalen ). Hier ist ein Diagramm , wenn Anti-Aliasing erforderlich ist, wo ?
und x
für jede Nicht-Leerzeichen stehen kann.
x? -> d?
? ?
?x -> ?b
? ?
? ?
?x -> ?F
? ?
x? -> Y?
x -> ; Note: This character has been changed from _ to ;
? ?
? ?
x -> V
?x -> ?>
x? -> <?
x -> @
Eingabe (und Beispiel für eine Pre-Anti-Aliasing-ASCII-Grafik)
Zuerst gibt es zwei Eingabezeilen (für STDIN), eine Zahl H, gefolgt von einer Zahl W. Dann gibt es H Zeilen mit jeweils genau W Zeichen (ohne die neue Zeile). Diese folgenden Zeilen sind ASCII-Zeichen, die geglättet werden müssen. Hier ist eine Beispieleingabe (nicht schön, aber ein Test):
7
9
888888
888888
999 98 7
666666
666666
6666
6
Ausgabe (und Beispiel Anti-Alias-Art)
Ihr Programm sollte die ASCII-Grafik (mit den gleichen Abmessungen), die mit Anti-Alias versehen wurde, an STDOUT ausgeben. Hier ist der Ausgang für den obigen Eingang. Beachten Sie, wie die Umrandungszeichen als angrenzende Leerzeichen behandelt werden.
d8888>
d8888F
<99 98 @
Y6666b
Y6666>
Y66F
V
Dies sieht möglicherweise nicht so gut aus (aufgrund des Abstands zwischen den Zeilen im Codeblock), bei größeren ASCII-Grafiken sieht es besser aus, und die Qualität hängt von der genauen verwendeten Schriftart ab.
Ein anderes Beispiel
Eingang
12
18
xx xxx xxx
xxxx xxx xxx
xxxxxx xxx xxx
xxx xxx xxx xxx
xxxx xxx xxx xxx
xxxxxx xxx xxx
xxxx xxx xxx
x xx xxx xxx x
xx xxx xxx xx
xxx xxx xxx xxx
xxxx xxx xxx xx
xxxxx xxx xxx x
Ausgabe
db <xb <xb
dxxb Yxb Yxb
dxxxxb Yxb Yxb
dxx xxb xxb xxb
Yxxb xxF xxF xxF
YxxxxF dxF dxF
YxxF dxF dxF
; YF dxF dxF ;
xb dxF dxF dx
xxb <xF <xF <xx
xxxb Yxb Yxb Yx
Yxxx> Yx> Yx> V
Regeln, Einschränkungen und Hinweise
Ihr Programm sollte nur in druckbaren ASCII-Zeichen geschrieben sein, damit wir Kunst aus den Programmen machen können. Ansonsten gelten die Standard-Code-Golf-Regeln.
quelle
_
ist geworden,;
weil es besser funktioniert.Antworten:
Ruby,
180168 ZeichenEine weitere Ruby-Implementierung, die einen Zip-Ansatz verfolgt. Sie können das zweite Beispiel online sehen .
Bearbeiten: Mit werden
readlines
12 Zeichen gespeichert.quelle
Ruby
275265263261258254244243214212207Beispiel 1: http://ideone.com/PfNMA
Beispiel 2: http://ideone.com/sWijD
quelle
0..h-1
kann geschrieben werden als0...h
. 3)G=[];h.times{G<<gets}
kann so geschrieben werdenG=readlines
, ähnlich wie in Ihrem C # -Code. 4) Nach Schritt 3 wird die Variable h unbrauchbar, die Werte von h und w werden nur einmal verwendet undh=gets.to_i;w=gets.to_i;H=(0..h-1);W=(0..w-1)
können als geschrieben werdenH=0...gets.to_i;W=0...gets.to_i
. 5) In diesem Falland
kann als geschrieben werden&&
, was die Leerzeichen nicht benötigt. 6) Sie haben eine extra; und Sie haben die Zeilenumbrüche am Ende der Datei gezählt, die nicht erforderlich sind. Dies bedeutet 214 Zeichen: ideone.com/CiW0lH=0..gets.to_i
als ich den Code schrieb, aber es schien nicht zu funktionieren (offensichtlich muss es aus anderen Gründen gewesen sein).map
anstelle voneach
2)z=->...
anstelle von verwendendef z...end
.map
anstelle dereach
Änderung übernommen. Für die Lambda - Syntax, aber ich denke , dass die Nutzungen erfordern würde ,z
von der Form zu sein ,z.call(args)
stattz(args)
, so dass ein Bit auf die Zeichenzahl hinzufügen. Bitte lassen Sie mich wissen, wenn ich etwas vermisse.[]
Verwendung zu verwenden.Javascript, 410 Zeichen:
ungolfed:
Original,
440 Zeichen:NB Ich habe angenommen, dass die ersten beiden Eingabezeilen tatsächlich irrelevant sind und die Größe der folgenden Zeilen korrekt ist. Ich rechne auch damit, dass ich vielleicht noch ein paar Zeichen abschneiden kann, wenn ich die Chance bekomme!
quelle
m={22:"b",28:"d",13:"Y",7:"F",20:";",5:"V",6:">",12:"<",4:"@"}
dann der Index des convert m mitparseInt()
:m[parseInt(y[d](''),2)]
. Dies reduziert die Größe auf 373 Zeichen.Python, 259 Zeichen
Das Programm liest die Eingabe in eine einzelne Zeichenfolge
I
(mit Leerzeichen zwischen den Zeilen), komprimiert eine Liste mit 5 Tupeln, die das Zeichen und seine vier umgebenden Zeichen enthalten, und sucht dann das Ergebniszeichen mithilfe der Zeichenfolgenindizierung.quelle
PHP -
359330282268257 Zeichenquelle
\r\n
. Ich habe meinen Code aktualisiert, um mit EOL im Unix-Stil zu arbeiten\n
.Python,
246241WC und Test an Probe 2, mit der Ausgabe der Ruby-Lösung oben:
quelle
C #
591563quelle