Ich mochte immer Bildschirme voller zufällig gefärbter Pixel. Sie sind interessant anzusehen und die Programme, die sie zeichnen, machen Spaß.
Die Herausforderung
Füllen Sie Ihren Bildschirm oder ein Grafikfenster mit farbigen Pixeln.
Die Regeln
- Ihr Programm muss die gleiche Chance haben, alle Farben (dh den Bereich
#000000
bis#FFFFFF
) oder alle Farben auszuwählen, die auf Ihrem System angezeigt werden können. - Ihr Programm muss weiterhin zufällige Pixel anzeigen, bis es manuell gestoppt wird (es kann nicht alleine beendet werden).
- Pixel können beliebig groß sein, sofern Ihre Ausgabe mindestens 40x40 "Pixel" hat.
- Ihr Programm muss mit einer solchen Geschwindigkeit ausgeführt werden, dass es jedes Pixel auf dem Bildschirm / Fenster mindestens einmal ersetzen kann, nachdem es drei Minuten lang ausgeführt wurde.
- Ihr Programm muss wirklich zufällige Farben und Punkte zum Ersetzen auswählen , dh zufällig, wobei alle Punkte / Farben gleich wahrscheinlich sind. Es kann nicht nur zufällig aussehen . Es muss ein pRNG oder besser verwendet werden, und die Ausgabe kann nicht jedes Mal dieselbe sein.
- Ihr Programm muss die gleiche Chance haben, bei jeder Iteration alle Farben auszuwählen .
- Ihr Programm darf nur ein Pixel auf einmal ersetzen.
- Ihr Programm kann weder das Internet noch Ihr Dateisystem (
/dev/random
und/dev/urandom
ausgenommen) verwenden.
Beispiel
Ihre Ausgabe könnte wie folgt aussehen, wenn Sie zu einem zufälligen Zeitpunkt gestoppt wird:
Der Gewinner
Die kürzeste Antwort in jeder Sprache gewinnt. Habe Spaß!
It must use a pRNG or better
Antworten:
Minecraft 1.12 Redstone-Befehlsblöcke,
4.3552.872 Bytes(Größe wird durch die Größe der gespeicherten Strukturblockdatei bestimmt.)
Hier ist eine vollständige YouTube-Übersicht , aber ich werde versuchen, den folgenden Code zu skizzieren.
Setup-Routine:
Dadurch wird das 40x40-Raster der Minecraft-Rüstungsstände aufgebaut. Rüstungsstände sind notwendig, da Minecraft keine Möglichkeit hat, Variablen in Weltkoordinaten zu setzen . Die Problemumgehung besteht also darin, sich auf die Position dieser Rüstungsstand-Einheiten zu beziehen .
Dieser benannte Rüstungsständer ist im Grunde unser "Cursor", um alle Rüstungsständer zu platzieren, die wir brauchen werden. Der Redstone-Block im letzten Schritt "treibt" Blöcke in der Nähe an (einschließlich unserer Befehlsblöcke), also startet die nächste Schleife:
Zu diesem Zeitpunkt ist unser Raster vollständig:
Zufällige Farbauswahl
Die violetten Repeater in der Mitte dieses Bildes wählen mit dem folgenden Befehl eine zufällige Farbe:
Das "@r []" ist die magische Sauce, es wählt eine zufällige Entität in der Welt aus, die den gegebenen Bedingungen entspricht . In diesem Fall findet es einen Rüstungsständer in einem Umkreis von 9 Blöcken und wir haben 16 Rüstungsständer aufgestellt, einen für jede Wollfarbe. Unter der ausgewählten Farbe wird ein Redstone-Block platziert (der die beiden Befehlsblöcke auf beiden Seiten antreibt).
Zufällige Pixelauswahl
Das Platzieren des Redstone-Blocks unter der ausgewählten Wollfarbe löst zwei weitere Befehlsblöcke aus:
In dieser ersten Zeile wird mit demselben Befehl magic @r ein beliebiger Panzerungsstand auf der gesamten Karte ausgewählt (ohne Radiusbeschränkung, einschließlich des Gitters 40 x 40) und eine Wolle der ausgewählten Farbe über dem Kopf platziert. Das X bestimmt die Farbe und reicht von 0 bis 15. Der zweite Befehl entfernt den Redstone-Block, damit er wieder einsatzbereit ist.
Ich habe 5 violette Repeaterblöcke und Redstone arbeitet 20-mal pro Sekunde in "Ticks", also platziere ich 100 Pixel pro Sekunde (abzüglich einiger Farbüberlappungen). Ich habe es zeitlich festgelegt und normalerweise bekomme ich das gesamte Raster in ca. 3 Minuten abgedeckt.
Das hat Spaß gemacht, ich werde versuchen, nach anderen Herausforderungen zu suchen, die auch in Minecraft funktionieren könnten. Vielen Dank an lorgon111 für seine YouTube Command Block Tutorial-Serie .
BEARBEITEN: Die Größe der gespeicherten Struktur wurde erheblich reduziert (jetzt bei 2.872 gespeicherten Bytes) :
Getestet, indem die gespeicherte Struktur in eine neue Welt gezogen wird, funktioniert immer noch alles wie geplant.
EDIT 2 : Schreibgeschützter Dropbox-Link zur NBT-Strukturdatei
Zu Fuß durch ist in meinem YouTube-Video , aber hier sind die Schritte:
\structures
Ordner, den Sie unter der aktuellen Weltspeicherung erstellt haben./give @p structure_block
und/tp @p -12, 56, -22
springen Sie an die richtige Stelle, um anzufangen.quelle
shortest answer in each language wins
und dies ist die kürzeste Antwort in Minecraft: P haben eine zusätzliche +15sh + ffmpeg, 52 Bytes
Zählt ffmpeg als Esolang? : D
Leider ist pix_fmt erforderlich, da ffmpeg standardmäßig yuv420p ist. Das scheitert an der Anforderung, dass "jede mögliche Pixelfarbe gleich wahrscheinlich sein muss". Praktischerweise
cif
handelt es sich um eine Verknüpfung für eine relativ große Videogröße, die weniger Speicherplatz als "40x40" benötigt.Es ist nicht überraschend, dass die Optimierung dieses Gifs mit Gifsicle absolut nichts bewirkt hat. Es ist 4MiB.
quelle
C auf POSIX,
98969592 Bytes-3 danke an Tas
Dabei werden 16 Farben (dunkelgrau, rot, grün, blau, orange, cyan, lila, hellgrau, schwarz, pink, hellblau, gelb, hellcyan, magenta, weiß) ausgewählt und direkt auf das Terminal gedruckt.
Beachten Sie, dass bei einer zu langsamen GPU möglicherweise der gesamte Bildschirm gleichzeitig aktualisiert wird. Es geht tatsächlich Pixel für Pixel, aber C ist schnell.
Alternative Lösung, die die Farben deutlicher macht:
Beweise, dass es Pixel für Pixel geht (Screenshot aus einem alternativen Programm):
Wow, das sieht fast dreidimensional aus ...
quelle
;
, um richtig zu kompilieren, aber ansonsten scheint es großartig zu funktionieren! B-)while
zu gewechselt habefor
.#define r rand()
und dannr%40, r%40, r%2, r%8
JS + HTML
162 + 32 (194)124 + 13 (137) BytesVielen Dank an Luke und andere Kommentatoren, die mir viele Bytes erspart haben.
quelle
<canvas id=c>
sollte es ausreichen, da ich denke, dass die Standardgröße für dascanvas
-Element ist300 x 150 px
und so Ihre "Ansichtsfenstergröße" von übersteigt99 x 99 px
. Wie auch immer, schöne Lösung.2d
. (Ich weiß nicht, wie ich das formatieren soll, aber wenn "2d" ein Vorlagenliteral ist, werden keine Klammern benötigt.) (Meine vorherigen Vorschläge werden gelöscht.)with
Anweisung, um alle Instanzen vonb.
:r=n=>n*Math.random()|0 setInterval("with(c.getContext`2d`)fillStyle='#'+r(2**24).toString(16),fillRect(r(99),r(99),1,1)")
MATL, 28 Bytes
Probieren Sie es bei MATL Online aus . Ich habe
.5Y.
dieser Version eine halbe Sekunde Pause ( ) hinzugefügt .Erläuterung
quelle
TI-BASIC (nur 84 + C (S) E),
37-35ByteAufgrund von Hardwareeinschränkungen stürzt dies schließlich ab, da jedes Mal, wenn ein Programm in einem Programm in TI-BASIC verschachtelt ist , 15 KB RAM zugewiesen werden, um ein Lesezeichen im übergeordneten Programm zu behalten. Dies würde auf einem "theoretischen" Rechner mit unendlichem RAM gut funktionieren, aber wenn wir wollen, dass er auf einem realen Rechner auf unbestimmte Zeit ausgeführt wird, können wir ihn einfach
While 1
für weitere 2 Bytes in eine Schleife packen:Die Taschenrechner der TI-83-Familie mit Farbbildschirmen (TI 84 + CE und CSE) unterstützen 15 Farben. Sie haben Farbcodes
10
durch24
. Dies durchläuft alle Pixel in einem5!
Quadrat von 120 x 120 ( ) und weist jedem Pixel eine zufällige Farbe zu.Ergebnis:
quelle
5!
wenn ich 120 Pixel Pixel im Glossar erklärt wollte.For(
ist 1 Byte,Pxl-On(
ist 1 Byte,randInt(
ist 2 Bytes, etc.MATLAB, 56 Bytes
Die Ausgabe sieht wie im Bild unten aus. Es ändert sich jeweils ein "Pixel", und nur eine der RGB-Farben ändert sich.
Warum? Die Farben in MATLAB werden als 3D-Matrix dargestellt, eine Ebene für R, G und B. Der obige Code ändert nur eine der Ebenen pro Iteration. Alle Pixel und alle Ebenen können geändert werden. Wenn Sie also etwas warten, sind alle Farben an allen Positionen gleichermaßen möglich.
Fügen Sie
pause(t)
innerhalb der Schleife hinzu, umt
Sekunden zwischen den einzelnen Bildern zu pausieren .Sie müssen es mit Ctrl+ stoppen C.
quelle
where
Your program must have an equal chance of picking all colors/points each iteration
. Erfüllt Ihr Programm dies?Bash + Coreutils,
5956 Bytes\e[48;5;COLORm
ist die Fluchtsequenz zur Hintergrundfarbe.Jedes "Pixel" hat die Chance, jedes Mal im Bereich [0..16777215] zu sein.
quelle
jot
for((;;)){ printf "\e[48;5;`jot -r 1 0 16777215`m ";}
Javascript + HTML 118 + 13 (131 Byte)
#7
keine gültige Farbe ist, oder#777
und#777777
haben die gleiche Farbe (2x die Chancen)quelle
Excel VBA,
13110285 BytesAnonyme VBE-
A1:AN40
Direktfensterfunktion, die eine Hilfsfunktion (siehe unten) verwendet, um ein Array von Zellen mit zufälligen Farben in den Bereich des Objekts activesheet auszugeben.Hinweis: Diese Lösung ist auf 32-Bit-Installationen von MS Excel (und damit von Office insgesamt) beschränkt, da
8^8
sie nicht mit 64-Bit-Versionen von VBA kompiliert werden könnenBeispielausgabe
Vorherige Version
Hilfsfunktion
Gibt ein zufälliges int im Bereich von [0,255] aus
quelle
C #,
369288287 Bytes88 Bytes dank @CodyGray eingespart.
Ein vollständiges Programm, das den Griff auf den Bildschirm und seine Größe legt und dann zufällig Pixel darauf zeichnet. Beachten Sie, dass dies Ihre Grafikkarte möglicherweise zum Stillstand bringt, wenn sie ausgeführt wird. Auch wenn der Bildschirm oder ein Steuerelement zu irgendeinem Zeitpunkt eine Neulackierung beschließt, gehen die Pixel verloren und müssen neu gezeichnet werden.
Hinweis: Wenn Sie das Fenster laufen lassen und den Fokus behalten möchten, müssen Sie entweder Alt + F4 drücken oder die Schließen-Taste drücken, wenn Sie den Bildschirm nicht sehen können.
Ich konnte diese Arbeit mit ScreenToGif nicht aufzeichnen, da dies ein erneutes Malen erzwang, damit die Pixel entfernt wurden. Hier ist jedoch ein Screenshot davon, der nach ca. 10-15 Sekunden noch läuft, und ich glaube, ich habe meinen PC möglicherweise zum Stillstand gebracht! Die Lücke in der oberen rechten Ecke ist die Stelle, an der der Bildschirm ein Neulackieren erzwang, als ich den Screenshot machte.
Voll / Formatierte Version:
Eine Version für
308227226 Bytes, die nur den Bereich 0-40 verwendet:Beispielausgabe für dieses Beispiel:
quelle
Graphics.FromHwnd((IntPtr)0)
würde auch funktionieren und wäre viel kürzer als P / InvokingGetDC
. Natürlich ist Ihr Code immer noch wie der von Tas und verliert Ressourcen wie durchgeknallt, weshalb er Ihre Maschine nach nur kurzer Laufzeit zum Stillstand bringt.GetDC
kommt nicht zurück,IntPtr.Zero
also wird das Senden anFromHdc
nicht funktionieren.FromHdc
, ich schlage vor, dass Sie anrufenFromHwnd
. Beachten Sie, dass Sie beim AufrufenGetDC
des DC für ein Fensterhandle einen NULL-Zeiger (0) als Fensterhandle übergeben.C # -Konsole,
233220189188 BytesVerwendet "all" (Windows) 16 Konsolenfarben.
Vielen Dank, dass das Feature Klassen in C # über die
using
Direktive aliasisieren kann.Bearbeiten Sie # 1
Einige Leerzeichen entfernt.
Nullen aus Random.Next () entfernt
Ging zu
namespace system{...}
Bearbeiten Sie # 2
Die Mindestgröße des Rasters beträgt 40x40
Ein Byte, indem Random in für den Schleifenkopf deklariert wird
Aus
public
der Main-Methode entferntBearbeiten Sie # 3
Es stellt sich heraus, dass
using C=Console;
es nicht das Beste ist, was es gibt.using static Console
ist der VB.Net-Methode zum "Importieren" von Klassen sehr ähnlichIch gebe auf: TheLethalCoder hat das möglich gemacht
Ursprünglicher Code zum Anpassen der Fenstergröße bei 207 Bytes:
Original Bild:
quelle
namespace System
sollte Bytes sparen,r.Next
kann die Null entfernen, ich glaube, irrelevanten Leerraum entfernen,namespace System{}
kürzer ist alsusing System;
. Möchtest du das erklären?Main
. Unbegründete Erinnerungen sind die besten!Verarbeitung, 90 Bytes
erweitert und kommentiert:
Idealerweise könnte ich einen Pixelindex anstelle von x, y verwenden, aber der
pixels[]
Zugriff auf Processing erfordertloadPixels()
Pre undupdatePixels()
Post, daher die Verwendung vonset()
.point()
würde auch funktionieren, hat aber mehr Zeichen und benötigtstroke()
. Der zufällige Bereich ist eigentlich 99x99, um ein paar Bytes zu sparen (anstatt 100x100), aber das sollte 40x40 mit jedem Pixel in einem solchen Bereich abdecken, der ersetzt werden soll.Perlin- Rauschen () wird anstelle von random () verwendet , um es pseudozufällig und ein Byte kürzer zu halten. Der Wert wird einmal berechnet, aber zweimal verwendet: einmal für die Zufallsposition und dann erneut für die Farbe.
Die Farbe ist tatsächlich
ARGB
(00000000 bis FFFFFFFF) (nicht RGB) (Bonuspunkte?: D).quelle
set()
ist ein sehr ordentlicher Trick und kann sehr nützlich sein für Tipps zum Golfen in der VerarbeitungPython, 133 Bytes
Ich bin mir nicht ganz sicher, ob dies den Spezifikationen entspricht, da es sich um eine Leinwand mit einer Größe von 40 x 40 handelt.
Probieren Sie es online aus - Version ohne
eval
, was in Trinket nicht funktioniertquelle
colormode
ist1.0
nicht255
.colormode
und es hätte nichts davon: /dot(1,R(0,255),R(0,255),R(0,255))
nicht?dot
soll akzeptieren(width,*color)
. Es ist nicht Python: pJavaScript mit Canvas
340 316324 BytesVollversion
quelle
Verarbeitung, 112 Bytes
Ich kann nicht garantieren, dass jedes Pixel alle 3 Minuten ersetzt wird, aber wenn ich es mir anschaue, scheint es so zu sein. Wenigstens die Wahrscheinlichkeit, dass ein Pixel von insgesamt 1600 fehlt und ein zufälliges 30-mal pro Sekunde aktualisiert wird, was insgesamt 5400 Aktualisierungen pro 3 Minuten entspricht, macht es unwahrscheinlich, dass ein Pixel übersehen wird.
Ungolfed:
Das Programm ist wirklich unkompliziert. Öffnen Sie ein Fenster mit einer Größe von 40 x 40 Pixel, und jeder Frame (Standard: 30 pro Sekunde) erhält eine zufällige Farbe. Zeichnen Sie einen Punkt an einer zufälligen Koordinate zwischen 0 und dem Parameter. 40 für Pixelkoordinaten, 255 für Farben.
quelle
size(40,40);
und ändernpoint
zupoint(random(99),random(99));
? (oder 100 stattdessen, wenn 99 nicht funktioniert)size
Funktion MUSS die erste Codezeile in der Setup-Funktion sein (Gründe, warum dies kompliziert ist), daher kann ich das nicht umgehen. Ich kann alle Vorkommen von 40 auf 99 ändern, ich habe es einfach nicht getan, da es mir keinen Platz gespart hat. Ich habe hauptsächlich die Mindestgröße gewählt, um die Wahrscheinlichkeit zu erhöhen, dass jedes Pixel in einem Zeitraum von 3 Minuten aktualisiert wirdsetup()
Funktion in der neuesten Version von Processing auf meinem Computer funktioniert einwandfrei.HTML + SVG + PHP, 245 Bytes
Erweitert
Beispiel für die Ausgabe ohne Meta-Tag und in einer höheren Version
quelle
C ++ unter Windows, 125 Byte
Zeilenumbrüche erforderlich und in der Byteanzahl enthalten.
Endlos wiederholbar, wählt zufällig eine Position zwischen 0 und 255 (einschließlich) für Zeilen- und Spaltenwerte aus, weist zufällige R-, G- und B-Werte zwischen 0 und 255 (einschließlich) zu
quelle
#include
s weglassen können. (Und ja, es gibt nicht-Visual Studio C-Compiler für Windows.)Python 3.6 + Tkinter, 281 Byte
quelle
tkinter
es sich um eine Standardbibliothek handelt, müssen Sie sie nicht in den Header aufnehmenc.create_image((20,20),i) File "C:\Python36\lib\tkinter\__init__.py", line 2483, in create_image return self._create('image', args, kw) File "C:\Python36\lib\tkinter\__init__.py", line 2474, in _create *(args + self._options(cnf, kw)))) _tkinter.TclError: unknown option "pyimage1"
JavaScript (ES7) + HTML mit SVG, 129 + 10 = 139 Byte
SVG-Version, stark inspiriert von @ Octopus
<canvas>
Ansatz .JS
HTML
Da das Stack-Snippet das Skript gerne durch Parsen des
<rect>
Tags unterbricht , ist hier ein CodePen .quelle
6502 Assembly, 92 Bytes
Ausgabe:
Erläuterung:
quelle
LOGO, 71 Bytes
Die einzige Sprache, die ich kenne, die nicht esoterisch / speziell für das Codegolfing konzipiert ist und
forever
Funktion hat. Irgendeine Idee von dermap
Seite?quelle
shortC ,
6656 Bytes-10 Bytes danke an Dr. Rand. : P
Kein TIO-Link, da Sie offensichtlich nicht auf die Art von Terminal drucken können, die online erforderlich ist.
quelle
Perl (on * nix), 69 Bytes
Das
\x1b
s sind buchstäbliche Escape-Zeichen.Verlässt sich auf
stty
Befehle und funktioniert gut unter OS X.Ähnlich wie bei anderen Ansätzen, aber ich mochte die Kombination aller Parameter in einem Aufruf, um zu glauben
printf
, ich würde teilen. Tötet mein Terminal.Doppelt so viele Pixel, 83 Bytes
Dieser Ansatz verwendet einen Unicode-Block
▄
und eine zufällige Vordergrund- und Hintergrundfarbe, die ein quadratischeres Pixel ergibt. Tötet auch mein Terminal, sieht aber cooler aus.quelle
\e
. Und auf StackExchange kann dies durch dargestellt werden␛
.-e
! Ich muss auch die Byteanzahl des mit Unicode erhöhen. Hoppla! Danke für die Erinnerung!Bash, 104 Bytes
Das
\e
s sind buchstäbliche Escape-Zeichen.Dies sind so ziemlich alle Übersetzungen meines Perl-Beitrags, aber unter Verwendung der Bash-Fork-Bomb-Syntax! Ich fürchte, nicht so clever wie der andere Bash-Eintrag, der direkt auf das Display schreibt.
Mehr Pixel, 130 Bytes
Wie bei meiner Perl-Antwort wird ein Unicode-Zeichen für den Vordergrund verwendet und der Hintergrund jedes Pixels wird ebenfalls eingefärbt.
quelle
"\e[48;5;%im"
. Warum sind die 48 und 5 notwendig?\e[48;2;RRR;GGG;BBBm
nur sehr wenige Terminalemulatoren zu verwenden, die dies unterstützen ... :(38;5
kennzeichnet auch den Vordergrund und48;5
spendet den Hintergrund. misc.flogisoft.com/bash/tip_colors_and_formattingx86-Maschinensprache (Real-Modus) für IBM PC,
20 bis19 ByteDies erfordert einen Prozessor mit der
rdrand
Anweisung und einen VGA-Adapter (real oder emuliert). Das Obige kann in einen Startblock oder eine MS-DOS * .COM-Datei kopiert werden.Um dies auszuprobieren, kompilieren Sie Folgendes und speichern Sie die Ausgabe in einer Datei wie
floppy.img
und starten Sie das Image auf einer virtuellen Maschine.quelle
Super Chip (48), 12 Bytes
Der genaue Name ist mir nicht bekannt, aber ich musste ihn wegen der 40x40 Pixel-Beschränkung anstelle von normalem Chip-8 verwenden.
quelle
QBIC , 34 Bytes
Leider legt QBIC standardmäßig keinen
SCREEN
Modus fest, sodass einige Bytes verbraucht werden .PSET
ist ein unzulässiger Befehl im grafischen Standardkontext von QBIC.Erläuterung
Beispielausgabe
@Anonymous hat einen Fehler in der
rnd()
Funktion von QBIC gefunden . Fixing, dass die Ausgabe unten gibt. Vielen Dank!quelle
FUNCTION getRandomNumber! (Bottom!, Top!) ↵ RANDOMIZE TIMER 'this sets the random number generator ↵ IF Bottom > Top THEN ... END IF ↵ getRandomNumber = INT((Top - Bottom + 1) * RND + Bottom) ↵ END FUNCTION
Ihre Zufallszahlen sind nur Hashes der aktuellen Zeit.6502 Assembly, 582 Bytes
Puh, das hat Spaß gemacht. Funktioniert mehr oder weniger wie meine Applesoft BASIC-Lösung.
quelle
Powershell,
128126124 Bytes-2 Bytes danke @Veskah
Ausgabe:
VS-Code-Ausgabe:
quelle