Schreiben Sie ein Programm, das die RGB-Farbe eines bestimmten Pixels auf dem Bildschirm druckt.
Das Programm sollte eine Zeile von stdin im Format lesen x,y
, wobei x und y Ganzzahlen ohne Vorzeichen sind. Das Pixel (0,0) ist das Pixel oben links auf dem Bildschirm.
Das Programm sollte dann eine Zeile an stdout im Format ausgeben RRR,GGG,BBB
, die die Farbe des Pixels bei ( x
, y
) darstellt.
RRR
, GGG
Und BBB
sollte Gleitkommazahlen zwischen 0 und 1 sein OR ganze Zahlen im Bereich [0, 255]. Führende Nullen spielen zum Beispiel keine Rolle: beide 074
und 74
sind akzeptabel.
Undefiniertes Verhalten
Es ist in Ordnung, dass das Programm unter den folgenden Bedingungen ein undefiniertes Verhalten zeigt (Absturz, falsche Ausgabe usw.):
- Der Benutzer gibt eine Zeichenfolge, eine vorzeichenbehaftete Ganzzahl, einen Gleitkommawert oder einen anderen ungültigen Datentyp ein
- Die Benutzereingabe hat nicht das Format
x,y
- Das angegebene Pixel befindet sich außerhalb des Bildschirms
Anmerkungen:
- Das Programm kann das Pixel bei den angegebenen Koordinaten nicht ändern.
- Wenn Sie mehrere Monitore haben, spielt es keine Rolle, auf welchem Monitor sich das Pixel befindet, solange bei jeder Programmausführung derselbe Monitor verwendet wird.
Die Antwort mit den wenigsten Bytes gewinnt.
RRR
,GGG
undBBB
sein Gleitpunkte zwischen 0 und 1? Normalerweise sind sie ganze Zahlen im Bereich[0,255]
. Ich würde vorschlagen, beides zuzulassen.RRR
,GGG
undBBB
in der Spezifikation, aberR
,G
,B
0, 0, 0
, wodurch der Zweck der Herausforderung zunichte gemacht wird.Antworten:
Java 10 (Lambda-Funktion),
10575 BytesEine Funktion, die zwei Ganzzahlparameter verwendet und einen String zurückgibt
RRR,GGG,BBB
, wobei die Farben Ganzzahlen im Bereich sind[0, 255]
.-30 Bytes dank @LukeStevens, indem die
java.awt.Color
Standardausgabe verwendettoString()
und so geändert wird, dass nur die Ziffern und Kommas übrig bleiben.Erläuterung:
HINWEIS: Die Standardimplementierung
toString()
von war meines Wissens injava.awt.Color
allen JVM-Versionen immer dieselbe, kann sich jedoch möglicherweise in Zukunft ändern. Ich habe es sowohl in Java 8 als auch in Java 10 getestet und es ist zurückgekehrt"java.awt.Color[r=#,g=#,b=#]"
.Aber da die Herausforderung lautet:
x,y
von STDINR,G,B
an STDOUTR
,G
,B
als Punkte im Bereich Schwimm[0.0, 1.0]
Der Code wird viel ausführlicher:
Java 10 (Vollprogramm), 266 Bytes
Erläuterung:
quelle
x->y->(new java.awt.Robot().getPixelColor(x,y)+"").replaceAll("[^\\d,]","")
75 BytestoString()
vonjava.awt.Color
. Vielen Dank!toString()
Weg zu implementieren ... ;-) Außer ich musste eine IDE herunterladen, um all das zu tun: Ich benutze jetzt nur TIO :(Color::toString
ist , dass die Implementierung nach eigenem Ermessen erfolgt. Es kann daher sinnvoll sein, anzugeben, welche JVM für die Tests verwendet wurde (dies funktioniert wie bei OpenJDK und Oracle JDK)." "
mit","
dem strengen einzuhaltenRRR,GGG,BBB
Format (nichtRRR GGG BBB
).6502 Maschinencode (C64),
280260 ByteIch habe erwartet, dass dies in viel weniger Bytes möglich sein wird, aber leider ... nun, seit ich fertig bin und es jetzt sowieso poste. Zumindest hat das restriktive Format bei einer Sache geholfen: Ähnliches wie
stdin
(Eingabe von einem aktuellen Gerät) gibt es nur auf dem C64 im Textmodus, da das Betriebssystem nur diesen Modus unterstützt - daher müssen keine anderen Modi des Grafikchips berücksichtigt werden .Hinweis zur Ausgabe der Farbwerte: Der C64-Grafikchip verwendet keine RGB-Farben, sondern erzeugt direkt ein Videosignal mit YUV-Farben und einer festen 16-Farben-Palette. Ich benutzen gerundete Werte der colodore Umwandlung in RGB mit „default“ Monitoreinstellungen hier.
-20 Bytes : Bessere Ausgaberoutine, Codierung der 3-Zeichen-Ausgabe pro Farbkanal in einem einzelnen Byte.
Zum Kommentar: Es ist theoretisch möglich, mit dem Standard-C64-Betriebssystem sogar den mehrfarbigen Zeichenmodus des VIC zu verwenden, es ist jedoch eine benutzerdefinierte Schriftart erforderlich, die mit nur 4 horizontalen Pixeln mit doppelter Breite tatsächlich lesbar ist. Nicht ganz unmöglich, aber sehr unwahrscheinlich. Ebenso verlängert Farbmodus (oder erweiterten Hintergrundmodus, die die gleiche ist) könnte mit dem C64 O verwendet wird, erfordert jedoch direkt auf den Grafikchip neu zu konfigurieren. Ich entscheide mich, all diese Möglichkeiten im Sinne des Code-Golfspiels hier zu ignorieren: Es ist nicht die Standardumgebung, die Sie auf einem Commodore 64 mit laufendem Standardbetriebssystem finden. Was mit dem Standard-Betriebssystem möglich ist, ist das Umschalten zwischen zwei integrierten Schriftarten (Umschalt + Commodore-Taste). Das Programm berücksichtigt dies.
Online-Demo
Verwendung: um
SYS49152
zu beginnen.Kommentierte Demontage :
quelle
cc65
.. durchaus möglich :) aber zumindest der kompilierte Code wird größer sein :)TI-BASIC (TI-83/84 +), 22 Bytes
Da der Bildschirm schwarzweiß ist, müssen wir nur testen, ob das angegebene Pixel ein- oder ausgeschaltet ist, und dies auf schwarzes oder weißes RGB abbilden. Außerdem sind die Pixel nur über Zeilen und Spalten in dieser Reihenfolge zugänglich, weshalb die Koordinaten umgekehrt werden.
quelle
Bash, 103/86 Bytes
Mit einer strengen Interpretation der Spezifikation (Eingabe von STDIN und Ausgabe von STDOUT sind beide durch Kommas getrennt):
Mit einem lockeren Eingabeformat (plus-getrennte Eingabe als Befehlszeilenargument, durch Leerzeichen getrennte Ausgabe:
Hängt von Imagemagick, Awk und Coreutils ab.
quelle
TI-Nspire-Assembly - 112 Byte
Dieses Programm gibt Ganzzahlen im Bereich von 0 bis 31 für R und B und 0 bis 63 für G aus, da das Gerät nativ einen RGB565-Framebuffer verwendet. Es verwendet serielle für die Ein- und Ausgabe.
Quelle:
quelle
Bash unter Linux mit xserver, 30 Bytes
Unter Verwendung der Idee, die in meinem Kommentar zur Frage vorgestellt wurde, sollte diese Lösung die Anzeigeausgabe vollständig ausschalten und dann das Echo wiedergeben, dass der Bildschirm tatsächlich schwarz ist.
Ich habe auch darüber nachgedacht
xbacklight =0
, aber das ändert nichts an den Pixelfarben.quelle
Python 2 + PIL-Bibliothek,
9691 BytesImplementiert die Spezifikation buchstäblich wie gewünscht. Nur Windows - funktioniert nicht unter Linux und erzeugt zusätzliche Ausgabe (Alpha-Wert) auf Mac.
quelle
from PIL import ImageGrab as i
→from PIL import*
,i.grab
→ImageGrab.grab
.__import__('...')
Weg nicht auch zum Laufen bringen konnte .Mathematica, 69 Bytes
Nur die Funktion ist 34 Bytes.
CurrentScreenImage[]~PixelValue~#&
Nimmt Eingaben in der Form {x, y} vor.
Das Bild ist das Zusammenführen von Bildern auf allen Monitoren. Wenn Sie einen bestimmten Bildschirm wünschen, verwenden Sie den Integer-Index - z
CurrentScreenImage[1]
Das vollständige Programm genau wie angegeben ist 69 Bytes
CurrentScreenImage[]~PixelValue~ToExpression["{"<>InputString[]<>"}"]
quelle
AutoHotKey, 113 Bytes
Verwenden Sie Dialogfelder anstelle von stdin / stdout.
quelle
Bash + Coreutils + Scrot + Netpbm, 90 Bytes
Lose E / A-Version
Nimmt
x
undy
als separate Befehlszeilenargumente.Drucke
r
,g
,b
wie Ints 0-255 auf getrennten LeitungenBash + Coreutils + Scrot + Netpbm + BC + Sed, 172 Bytes
Strikte E / A-Version
Eingabe auf stdin als
x,y
Ausgabe auf stdout als
r.rr,g.gg,b.bb
(kein Zeilenumbruch).quelle
TI-BASIC (TI-83/84 +), 15 Bytes
Nimmt eine Ganzzahl von
Ans
und eine von der Eingabeaufforderung.rand(3)
Erstellt eine Liste mit 3 Zufallszahlen ungleich Null, sodass das Produkt Null ist, wenn das Pixel dunkel ist.quelle