Losowe pikowanie


20

Twoje zadanie jest proste: napisz program, który zamieni losowe piksele w czarny prostokąt 16 x 8 pikseli (szerokość według wysokości) na biały piksel.

Otwory muszą być jednakowo losowe i należy wyprowadzać obraz 16 x 8 pikseli z wstawionymi białymi pikselami.

Zamień tylko 1 piksel na kolumnę (16 wszystkich zastąpionych pikseli)

Nie pobierasz żadnych danych wejściowych i nie możesz polegać na tym, że obraz jest przechowywany w innym miejscu na komputerze.

To jest więc wygrywa program z najkrótszą liczbą bajtów!


1
Czy wyjście powinno się zmieniać podczas wielokrotnego uruchamiania programu?
Quentin,

@Quentin tak, powinno
GracefulLemming

Odpowiedzi:


7

MATL , 15 14 13 bajtów

8tE2$r&S1=3YG

Przykład (z kompilatorem MATL działającym na MATLAB):

wprowadź opis zdjęcia tutaj

Lub spróbuj w MATL Online! (Jeśli nie uruchomi się za pierwszym razem, naciśnij ponownie „Uruchom” lub odśwież stronę). Zauważ, że obraz jest skalowany przez interpretera online dla lepszej wizualizacji.

To jest port mojej odpowiedzi Octave / MATLAB (patrz wyjaśnienie tam). Oto równoważne stwierdzenia:

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

6

Pyth - 16 15 bajtów

Wysyła obraz do o.png.

.wCm.S+255mZ7y8

Przykładowy obraz:


3

Octave / MATLAB, 48 37 35 bajtów

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

Przykład (w Octave):

wprowadź opis zdjęcia tutaj

Wyjaśnienie

           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, 85 100 bajtów

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);}

Zapisuje plik obrazu PGM na standardowe wyjście (wywołuje go za pomocą prog >out.pgm).

Nie golfił i wyjaśnił:

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);
}

Aktualizacje:

  • OP wyjaśnił, że wyjście powinno się zmieniać przy każdym wykonaniu, tracąc 15 bajtów do srand(time(0))( :()

3

Przetwarzanie, 74 73 bajtów

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

Przykładowe dane wyjściowe:

wprowadź opis zdjęcia tutaj

Wyjaśnienie

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

Ruby, 61 bajtów

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

Jest to pełny program, który wysyła obraz w formacie netpbm na standardowe wyjście.

Przykładowe dane wyjściowe:

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 bajtów

Generuje to plik PBM zapisany na standardowe wyjście.

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

Wypróbuj online!

Wyjaśnienie

Trzy górne linie składają się na generator liczb losowych, przechowujący 16 losowych liczb 3-bitowych (tj. W zakresie 0–7) w dziesiątej linii pola gry. Linia czwarta wypisuje nagłówek PBM, a ostatnia linia generuje piksele obrazu. Odbywa się to poprzez odliczanie 16 liczb losowych, gdy piksele są wyprowadzane - gdy liczba odpowiadająca określonej kolumnie osiągnie zero, wyprowadzamy 1 zamiast 0.

Próbka wyjściowa (powiększony):

Próbka wyjściowa


1

Mathematica, 77 60 bajtów

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

Przykładowe dane wyjściowe

wprowadź opis zdjęcia tutaj

Wyjaśnienie

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

Utwórz reguły zastępcze dla każdej kolumny; zamień losowo wybraną pozycję na 1.

... ~SparseArray~{8,16}

Utwórz SparseArrayz rozmiarem o rozmiarze 8x16. Tło jest 0domyślnie. (8x16, ponieważ Mathematica najpierw liczy rzędy)

Image[ ... ]

Przekształć SparseArrayw Imageobiekt.

Wersja 77-bajtowa

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

1

HTML + JavaScript, 148 bajtów

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 bajtów

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

Używa pakietu pngdo wyjścia do pliku.
Przykładowe dane wyjściowe:

wprowadź opis zdjęcia tutaj


0

QBasic, 59 bajtów

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

Całkiem proste. Jest -.5to potrzebne, ponieważ PSETw przypadku argumentów niecałkowitych używa się zaokrąglania do najbliższego zamiast floor lub obcinania (i -.5jest on krótszy niż INT()).

Obraz, o którym mowa, jest wyświetlany w lewym górnym rogu okna wyjściowego. Przykład (przycięty):16 losowych kropek


0

Java, ( czy to w ogóle ma znaczenie Bajtów, AKA 244 + 18 import = 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();}

Był niepewny, ponieważ układ współrzędnych zawiera okienko okna ramki ... Musisz buforować o co najmniej 26 bajtów lub nic się nie pokazuje, stąd x=50bit.


Wiem, że minęło trochę czasu, ale możesz zagrać w golfa do 238 bajtów: 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();}(Dokonane zmiany: usunięto statyczne; Java 8 lambda; niektóre intusunięto; i=16ponownie użyto; włóż rzeczy do pętli for, aby usunąć nawiasy i ;)
Kevin Cruijssen

0

Postscript (65 bajtów)

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

Wersja bez golfa:

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

Chip-8, 12 bajtów

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

Rysuje obraz na ekranie.


0

Tcl / Tk, 163

Dwa różne podejścia renderują w tym samym zakresie bajtów:

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

wprowadź opis zdjęcia tutaj


0

VBA Excel, 86 105 bajtów

za pomocą natychmiastowego okna

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

To rozwiązanie niestety nie powoduje, że komórki arkusza aktywnego stają się kwadratowe, jak jest to wymagane w przypadku rozwiązań pikselowych Excel VBA - Bardziej trafnym rozwiązaniem byłobyCells.RowHeight=42:[A1:P8].Interior.Color=0:For x=0To 15:[A1].Offset(Rnd*7,x).Interior.Color=-1:Next
Taylor Scott

ah tak, zapomniałem. Pamiętam, że dostosowałem to ręcznie. Dzięki :)
remoel

(i możesz użyć -1zamiast vbWhite- pełnego wyjaśnienia, dlaczego tutaj )
Taylor Scott,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.