Pixel aléatoire poussant


20

Votre tâche est simple: écrire un programme qui remplacera des pixels aléatoires dans un rectangle noir 16px * 8px (largeur par hauteur) par un pixel blanc.

Les trous doivent être uniformément aléatoires et vous devez sortir l'image 16px par 8 px avec les pixels blancs insérés.

Remplacez seulement 1 pixel par colonne (16 pixels remplacés au total)

Vous ne prenez aucune entrée et vous ne pouvez pas compter sur l'image stockée ailleurs sur l'ordinateur.

Il s'agit de donc le programme avec le plus petit nombre de victoires!


1
La sortie doit-elle changer lors de l'exécution du programme plusieurs fois?
Quentin

@Quentin yes it should
GracefulLemming

Réponses:


7

MATL , 15 14 13 octets

8tE2$r&S1=3YG

Exemple (avec le compilateur MATL exécuté sur MATLAB):

entrez la description de l'image ici

Ou essayez-le sur MATL Online! (S'il ne s'exécute pas la première fois, appuyez à nouveau sur "Exécuter" ou actualisez la page). Notez que l'image est mise à l'échelle par l'interpréteur en ligne pour une meilleure visualisation.

Il s'agit d'un portage de ma réponse Octave / MATLAB (voir l'explication ici). Voici les déclarations équivalentes:

MATL        Octave / MATLAB
----        ---------------
8tE         8,16
2$r         rand(...)
&S          [~,out]=sort(...)
1=          ...==1 
3YG         imshow(...)

6

Pyth - 16 15 octets

Sort l'image vers o.png.

.wCm.S+255mZ7y8

Exemple d'image:


3

Octave / MATLAB, 48 37 35 octets

[~,z]=sort(rand(8,16));imshow(z==1)

Exemple (sur Octave):

entrez la description de l'image ici

Explication

           rand(8,16)                  % 8×16 matrix of random values with uniform
                                       % distribution in (0,1)
[~,z]=sort(          );                % Sort each column, and for each output the
                                       % indices of the sorting. This gives an 8×16
                                       % matrix where each column contains a random
                                       % permutation of the values 1,2,...,8 
                              z==1     % Test equality with 1. This makes all values 
                                       % except 1 equal to 0
                       imshow(    )    % Show image, with grey colormap

3

C, 85100 octets

main(c){char a[138]="P5 16 8 1 ";for(srand(time(0)),c=17;--c;a[9+c+(rand()&112)]=1);write(1,a,138);}

Écrit un fichier image PGM sur stdout (appelez-le avec prog >out.pgm).

Non golfé et expliqué:

main(c) {
    // A buffer large enough to contain the whole image,
    // pre-filled with the PGM header.
    // This is a binary greyscale (P5) image with only two levels (1),
    // Because a binary bitmap would require pixel packing.
    char a[138] = "P5 16 8 1 ";

    // c iterates from 16 to 1 over the columns
    for(
        srand(time(0)), c = 17;
        --c;

        // (rand() % 8) * 16 is equivalent to (rand() & 7) << 4
        // Since all bits are equally random, this is equivalent
        // to rand() & (7 << 4), that is rand() & 112.
        // This picks a pixel from the first column, which is then
        // offset to the correct column by c - 1 + 10
        // (10 is the length of the header).
        a[9 + c + (rand() & 112)] = 1
    )
        ; // Empty for body

    // Write the whole buffer to stdout
    write(1,a,138);
}

Mises à jour:

  • OP a précisé que la sortie devrait changer à chaque exécution, perdu 15 octets à srand(time(0))( :()

3

Traitement, 74 73 octets

fill(0);rect(0,0,15,7);stroke(-1);for(int i=0;i<16;)point(i++,random(8));

Exemple de sortie:

entrez la description de l'image ici

Explication

fill(0);               //sets the fill colour to black
rect(0,0,15,7);        //draws a 16*8 black rectangle
stroke(-1);            //set stroke colour to white
for(int i=0;i<16;)     // for-loop with 16 iterations
 point(i++,random(8)); //  draw a point at x-coordinate i and a random y coordinate
                       //  the colour of the point is white since that is the stroke colour

2

Rubis, 61 octets

puts'P116 8';puts Array.new(16){[*[1]*7,0].shuffle}.transpose

Il s'agit d'un programme complet qui génère l'image au format netpbm sur stdout.

Exemple de sortie:

puts'P116 8';   # output the netpbm header (P1 for black and white, 16x8)
puts            # then output the data as follows:
Array.new(16){  # make a 16-element array and for each element,
[*[1]*7,0]      # generate the array [1,1,1,1,1,1,1,0] (1=black 0=white)
.shuffle}       # shuffle the array
.transpose      # transpose the rows/columns of the 2d array (so that each column
                # has one white pixel)

2

Befunge, 90 octets

Cela génère un fichier PBM écrit sur stdout.

>030#v_\2*>>?1v
:v9\$<^!:-1\<+<
|>p1+:78+`!
>"P",1..8.28*8*v
.1-\88+%9p:!#@_>1-::88+%9g:!!

Essayez-le en ligne!

Explication

Les trois premières lignes composent le générateur de nombres aléatoires, stockant 16 nombres aléatoires de 3 bits (c'est-à-dire dans la plage 0-7) sur la dixième ligne du champ de jeu. La ligne quatre écrit l'en-tête PBM, et la dernière ligne génère ensuite les pixels de l'image. Cela se fait en comptant les 16 nombres aléatoires lors de la sortie des pixels - lorsque le nombre correspondant à une colonne particulière atteint zéro, nous émettons un 1 plutôt qu'un 0.

Exemple de sortie (zoomée):

Exemple de sortie


1

Mathematica, 77 60 octets

Image[{RandomInteger@7+1,#}->1&~Array~16~SparseArray~{8,16}]

Exemple de sortie

entrez la description de l'image ici

Explication

{RandomInteger@7+1,#}->1&~Array~16

Établissez des règles de remplacement pour chaque colonne; remplacer une position sélectionnée au hasard par 1.

... ~SparseArray~{8,16}

Créez un SparseArrayavec une taille 8x16 à partir des règles de remplacement. L'arrière-plan est 0par défaut. (8 x 16 car Mathematica compte d'abord les lignes)

Image[ ... ]

Convertissez le SparseArrayen un Imageobjet.

Version 77 octets

ReplacePixelValue[Image@(a=Array)[0&~a~16&,8],{#,RandomInteger@7+1}->1&~a~16]

1

HTML + JavaScript, 148 octets

c=O.getContext`2d`;for(x=16;x--;){r=Math.random()*8|0;for(y=8;y--;)c.fillStyle=y-r?'#000':'#fff',c.fillRect(x,y,1,1)}
<canvas id=O width=16 height=8>


0

R, 76 octets

a=matrix(0,8,16);for(i in 1:16)a[sample(1:8,1),i]=1;png::writePNG(a,'a.png')

Utilise le package pngpour sortir dans un fichier.
Exemple de sortie:

entrez la description de l'image ici


0

QBasic, 59 octets

RANDOMIZE TIMER
SCREEN 9
FOR x=0TO 15
PSET(x,RND*8-.5)
NEXT

Assez simple. Le -.5est nécessaire car PSETavec des arguments non entiers, il utilise l'arrondi au plus proche au lieu de floor ou truncate (et -.5est plus court que INT()).

L'image en question est affichée dans le coin supérieur gauche de la fenêtre de sortie. Un exemple (recadré):16 points aléatoires


0

Java, ( cela importe-t-il même les octets, importation AKA 244 + 18 = 262)

import java.awt.*;static void l(){new Frame(){public void paint(Graphics g){int x=50;int i=16;g.setColor(Color.BLACK);g.fillRect(x,x,16,8);g.setColor(Color.WHITE);for(;i>0;i--){int y=(int)(Math.random()*8);g.drawLine(x+i,x+y,x+i,x+y);setVisible(1>0);}}}.show();}

Était bizarre parce que le système de coordonnées comprend le volet de la fenêtre de trame ... Vous devez donc mettre en mémoire tampon au moins 26 octets ou rien ne s'affiche, d'où le x=50bit.


Je sais que ça fait longtemps, mais vous pouvez le jouer à 238 octets: import java.awt.*;v->{new Frame(){public void paint(Graphics g){int x=50,i=16,y;g.setColor(Color.BLACK);g.fillRect(x,x,i,8);for(g.setColor(Color.WHITE);i>0;g.drawLine(x+i,x+y,x+i--,x+y),setVisible(1>0))y=(int)(Math.random()*8);}}.show();}(Modifications apportées: statique supprimé; Java 8 lambda; certains intsupprimés; i=16réutilisés; mettez des choses dans la boucle for pour supprimer les crochets et ;)
Kevin Cruijssen

0

Postscript (65 octets)

0 0íkà0ícà8íc0 8ícííB1à1íù16{0 randàíj0.5í©ík1 0íÖíß1 0í≠}íÉ

Version non golfée:

0 0 moveto
16 0 lineto
16 8 lineto
0 8 lineto
closepath
fill
1 1 1 setrgbcolor
16{0 rand 16 mod 0.5 sub moveto 1 0 rlineto stroke 1 0 translate}repeat

0

SmileBASIC, 30 octets

FOR I=0TO 15GPSET I,RND(8)NEXT

0

Puce-8, 12 octets

0xA201 'Load sprite at address 201 (which is the second byte of this instruction)
0xC007 'Set register 0 to a random number from 0 to 7 (rnd & 0x7)
0xD101 'Draw sprite. x = register 1, y = register 0, height = 1
0x7101 'Add 1 to register 1
0x3110 'If register 1 is not 16...
0x1202 'Jump to second instruction

Dessine l'image à l'écran.


0

Tcl / Tk, 163

Deux approches différentes rendent le même octet:

grid [canvas .c -w 16 -he 8 -bg #000 -highlightt 0]
.c cr i 8 4 -i [set p [image c photo -w 16 -h 8]]
set x 0
time {$p p #FFF -t $x [expr int(rand()*8)];incr x} 16

grid [canvas .c -w 16 -he 8 -bg #000 -highlightt 0]
.c cr i 8 4 -i [set p [image c photo -w 16 -h 8]]
time {$p p #FFF -t [expr [incr x]-1] [expr int(rand()*8)]} 16

entrez la description de l'image ici


0

VBA Excel, 86 105 octets

en utilisant la fenêtre immédiate

Cells.RowHeight=42:[a1:p8].interior.color=0:for x=0to 15:[a1].offset(rnd*7,x).interior.color=vbwhite:next

Cette solution ne fait malheureusement pas le carré des cellules de la feuille active, comme cela est requis pour les solutions pixel art Excel VBA - Une solution plus valable seraitCells.RowHeight=42:[A1:P8].Interior.Color=0:For x=0To 15:[A1].Offset(Rnd*7,x).Interior.Color=-1:Next
Taylor Scott

ah oui j'ai oublié. Je me souviens l'avoir ajusté manuellement. Merci :)
remoel

(et vous pouvez utiliser -1au lieu de vbWhite- explication complète des raisons ici )
Taylor Scott
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.