Lima puluh corak abu-abu

92

Anak laki-laki dan perempuan sangat senang melihat Fifty Shades of Grey di layar perak, kami hanya ingin kode tanpa merasa terganggu, jadi inilah tantangan untuk memilih otak kita.

Kamu harus:

  • Cetak di layar lima puluh kotak diisi masing-masing dengan warna abu-abu yang berbeda
  • Jika bahasa pilihan Anda tidak memiliki kemampuan pemrosesan gambar , Anda dapat menampilkan file gambar
  • Kotak harus terlihat, setidaknya 20 x 20 piksel
  • Anda tidak dapat menggunakan angka acak kecuali Anda memastikan setiap warna unik.
  • Anda tidak dapat terhubung ke layanan apa pun melalui jaringan apa pun
  • Anda tidak dapat membaca file apa pun di program Anda.
  • Anda tidak dapat menggunakan perpustakaan apa pun dari perpustakaan standar bahasa pilihan Anda.

Ini kode golf sehingga kode terpendek menang.

jsedano
sumber
21
Apakah mereka mengganggu kita?
Hobi Calvin
6
Keberatan: judul yang menyesatkan!
George Chalhoub
23
Akankah kita melihat kiriman Piet ?
randomra
8
Bukan gambar yang saya pikir akan kami hasilkan untuk kontes abu-abu 50 tingkat.
corsiKa
3
@randomra bertanya dan Anda akan menerima: codegolf.stackexchange.com/questions/45736/fifty-shades-of-grey/…
captncraig

Jawaban:

24

MATLAB, 24 byte

Upaya kedua, sekarang benar-benar sesuai dengan aturan.

imshow(0:1/49:1,'I',2e3)

'I' adalah singkatan dari 'InitialMagnification', tetapi tampaknya Matlab akan melengkapi nama secara otomatis dalam pasangan nama / nilai. Tentu itu trik golf yang bagus!

masukkan deskripsi gambar di sini

Sanchises
sumber
59

Mathematica, 30 byte

Berikut ini adalah pendekatan Mathematica lainnya:

ArrayPlot[#+5#2&~Array~{5,10}]

masukkan deskripsi gambar di sini

atau

ArrayPlot[5#+#2&~Array~{10,5}]

masukkan deskripsi gambar di sini

Yang pertama hanya menciptakan sebuah array

{{6, 11, 16, 21, 26, 31, 36, 41, 46, 51}, 
 {7, 12, 17, 22, 27, 32, 37, 42, 47, 52}, 
 {8, 13, 18, 23, 28, 33, 38, 43, 48, 53}, 
 {9, 14, 19, 24, 29, 34, 39, 44, 49, 54}, 
 {10, 15, 20, 25, 30, 35, 40, 45, 50, 55}}

dan yang kedua

{{6, 7, 8, 9, 10},
 {11, 12, 13, 14, 15},
 {16, 17, 18, 19, 20},
 {21, 22, 23, 24, 25},
 {26, 27, 28, 29, 30},
 {31, 32, 33, 34, 35},
 {36, 37, 38, 39, 40},
 {41, 42, 43, 44, 45},
 {46, 47, 48, 49, 50},
 {51, 52, 53, 54, 55}}

Kemudian, ArrayPlotplot mereka sebagai kisi dan, secara default, menggunakan skala abu-abu untuk memvisualisasikan nilai.

Martin Ender
sumber
Penggunaan indah ArrayPlot.
DavidC
4
Itu lucu, MatrixPlot tampaknya menggunakan warna secara default, beruntung untuk tantangan ini bahwa ArrayPlot menggunakan skala abu-abu dan satu huruf lebih pendek dari MatrixPlot.
Omar
Anda bisa melakukannya ArrayPlot@{Range@50}, yang hanya 20 byte.
Chip Hurst
@ChipHurst ketika saya melakukan itu, ukuran standar terlalu kecil untuk memenuhi persyaratan 20x20 piksel.
Martin Ender
36

CJam - 23 (tidak ada output grafis aktual)

Karena CJam tidak dapat menggambar di layar (belum?), Saya menulis sebuah program yang menampilkan gambar dalam format pgm biasa .
Simpan output ke file bernama 50.pgm dan buka dengan penampil gambar / editor.

"P2"1e3K51_,1>K*$K*~]N*

Cobalah online

Hasilnya terlihat seperti ini:

50.png

Penjelasan:

"P2"     push "P2" (netpbm magic number)
1e3K     push 1000 and K=20 (image size)
51       push 51 (value of white)
_,       duplicate 51 and convert to an array [0 1 2 ... 50]
1>       remove 0 (slice from 1)
K*       repeat the array 20 times
$        sort, to get [(20 1's) (20 2's) ... (20 50's)]
K*       repeat the array 20 times
~        dump the elements on the stack
]        put everything from the stack in an array
N*       join with newlines
aditsu
sumber
3
Jadi dengan senang hati meningkatkan elemen !?
Caridorc
7
@Caridorc dari array yang berisi angka, ya. Dan menjadi sedih menurunkan mereka: p
aditsu
Anda tidak mengikuti spesifikasi PGM:No line should be longer than 70 characters.
kiwixz
@iKiWiXz diperbarui
aditsu
1
@ iKiWiXz Seharusnya, tidak harus. Garis mungkin lebih panjang dari itu tetapi program yang menghasilkan gambar PGM harus mencoba untuk mempertahankannya di bawah 70 karakter.
FUZxxl
30

Mathematica 72 61 59 43 35 34 byte

Versi saat ini (34 byte)

GrayLevel[#/50]~Style~50 &~Array~50    

kisi2


Versi sebelumnya (59 byte), terima kasih kepada Martin Büttner.

Graphics[{GrayLevel[#/50],Cuboid@{#~Mod~9,#/9}}&/@Range@50]

Batas biru ditambahkan untuk menyorot posisi kotak.

Graphics[{EdgeForm[Blue], GrayLevel[#/50], Cuboid@{#~Mod~9, #/9}} & /@Range@50]

biru

Jumlah kotak:

    Length[%[[1]]]

50


Upaya pertama (72 byte)

Jika kotak bisa tumpang tindih. Seperti dicatat Zgarb, ada kemungkinan jauh bahwa satu kotak akan menyembunyikan yang lain.

  Graphics@Table[{GrayLevel@k,Cuboid[{0,15}~RandomReal~2]},{k,.4,.89,.01}]

masukkan deskripsi gambar di sini

DavidC
sumber
Saya menduga bahwa satu bujur sangkar pada prinsipnya dapat mencakup yang lain sepenuhnya, sehingga kurang dari 50 akan terlihat?
Zgarb
2
Jelas jawaban yang paling menyenangkan secara estetika.
Dan
30

Sage - 26 24 35 29 karakter

matrix(5,10,range(50)).plot()

Ini terlihat seperti ini:

5x10 warna abu-abu

Usaha-usaha sebelumnya : pertama aku Matrix([range(50)]).plot(), lalu matrix_plot([range(50)]). Ini terlihat seperti ini:

50 warna abu-abu

Pengguna @ flawr menunjukkan bahwa kuadrat yang dihasilkan dengan pengaturan default terlalu kecil. Menambahkan figsizeopsi memperbaikinya, tetapi 6 karakter lebih panjang dari versi 5x10 di bagian atas jawaban ini:

matrix_plot([range(50)],figsize=20)
Omar
sumber
Sepertinya 51 warna dan kotak terlihat lebih kecil dari 20x20px, apakah lebih besar saat diproduksi oleh program Anda?
flawr
Saya tidak berpikir output ekstra dilarang, @ flawr, saya tidak repot menghapus frame, tanda centang dan angka juga. Anda mungkin benar tentang kotak yang terlalu kecil, saya akan periksa.
Omar
Argh! @ flawr benar kotak lebih kecil dari 20px oleh 20px.
Omar
Saya akan mengatakan output ekstra harus dilarang. Pertanyaannya menentukan '50', bukan '50 atau lebih '.
Joe
1
Apakah saya mengerti dengan benar, @ Jo, bahwa Anda tidak keberatan dengan frame dan angka di luar frame, hanya ke jumlah kotak? Jika itu masalahnya, ganti 50 dengan 49.
Omar
23

R, 47 42 39 38 37 36 35 byte

Dengan asumsi mereka diizinkan untuk tumpang tindih, ini berfungsi. Symbolsmembutuhkan vektor yang menampung ukuran untuk setiap kotak, dan saya menghemat ruang dengan menggunakan kembali vektor yang sama untuk semua parameter fungsi. Kotak terbesar selalu selebar 1 inci. Dengan kisaran 50:99 sebagai bilangan bulat, kuadrat terkecil akan memiliki lebar sekitar setengah inci, jadi 36 piksel pada 72 dpi.

symbols(x,,,x<-50:99,bg=gray(x/99))

Terima kasih kepada semua orang atas komentar dan sarannya, saya cukup baru untuk R jadi ini semua sangat mendidik.

baru dan ditingkatkan?

Versi sebelumnya:

symbols(x,sq=x<-50:99,bg=gray(x/99))            #36
x=50:99;symbols(x,sq=x,bg=gray(x/99))           #37
x<-50:99;symbols(x,sq=x,bg=gray(x/99))          #38
x<-1:50;symbols(x,sq=x/x,bg=gray(x/50))         #39
x<-1:50/50;symbols(x,sq=x/x,bg=rgb(x,x,x))      #42
x<-1:50/50;symbols(x,squares=x/x,bg=rgb(x,x,x)) #47

Gambar sebelumnya: 50 warna R

freekvd
sumber
Bisa menghemat lebih banyak dengansymbols(x<-50:99,sq=x,bg=gray(x/99))
MickyT
Minus dua! Terima kasih @MickyT, saya pikir itu sudah dilakukan.
freekvd
1
@freekvd Secara umum, tergantung pada urutan di mana argumen diakses di dalam fungsi (karena argumen malas dievaluasi). Anda dapat menguji ini dengan memiliki f = function (a, b) { a; b}dan kemudian menelepon f(x <- 5, x). Ini berfungsi seperti yang diharapkan. Setelah Anda membalikkan argumen dalam fdefinisi (dan rm(x)), itu tidak berfungsi lagi.
Konrad Rudolph
1
Sepertinya evaluasi dimulai pada sq = x, jadi saya dapat memotong char lain dengan ini. Terima kasih @KonradRudolph
freekvd
1
Kurangi 1 bytesymbols(x,,,x<-50:99,bg=gray(x/99))
Vlo
21

Jawa - 180

Cukup mudah, hanya menggambar kotak.

import java.awt.*;void f(){new Frame(){public void paint(Graphics g){for(int i=1;i<51;g.setColor(new Color(328965*i)),g.fillRect(i%8*20,i++/8*20,20,20))setSize(600,600);}}.show();}

masukkan deskripsi gambar di sini

Dengan jeda baris:

import java.awt.*;
    void f(){
        new Frame(){
            public void paint(Graphics g){
                for(int i=1;
                    i<51;
                    g.setColor(new Color(328965*i)),
                    g.fillRect(i%8*20,i++/8*20,20,20))
                    setSize(600,600);
            }
        }.show();
    }
Geobit
sumber
Jika ada yang keberatan dengan kotak terakhir secara teknis putih, hanya mengubah pengali warna ke 263172. Jumlah byte yang sama, saya hanya berpikir itu terlihat lebih baik dengan cara ini.
Geobits
Saya pikir Anda juga bisa menggunakan int i;alih-alih int i=1tetapi kemudian menggunakan ++ipada penggunaan pertama ialih-alih i++dalam kejadian terakhir, akan menghemat 2 byte. BTW: Aku bahkan tidak tahu kamu bisa membuat program java tanpa class MyClass ... public static void main(... !!!
flawr
@ flawr Nah, Java tidak akan menginisialisasi variabel lokal ke nilai default. Mungkin berhasil jika saya memindahkannya di luar fungsi. Jika saya memberikan program lengkap, saya akan mencobanya (ini hanya fungsi, ditambah impor yang diperlukan). Terima kasih, meskipun :)
Geobits
2
@ flawr Jika itu adalah program lengkap maka ya, Anda akan membutuhkannya. Ini hanya fungsi , karena pertanyaannya tidak menentukan.
Geobits
1
@ AJMansfield saya tahu, tapi saya mempertimbangkan Memproses bahasa yang berbeda, dan saya suka bermain golf di Jawa.
Geobits
17

BBC BASIC, 57

FORn=51TO2STEP-1VDU19;-1,n,n,n:RECTANGLEFILL0,0,n*20NEXT

Kuadrat harus setidaknya 20 piksel tetapi tidak ada yang mengatakan bahwa mereka harus memiliki ukuran yang sama, jadi saya kira ini memenuhi syarat.

Dimungkinkan untuk mempersingkat ini dengan menggunakan kode VDU tingkat rendah. Tetapi mengubah dari pola ini ke pola yang kurang menarik sepertinya tidak akan membuatnya lebih pendek.

masukkan deskripsi gambar di sini

Level River St
sumber
2
Ingat singkatan BBC Basic Anda? F., N., S., V. -> F.n=51TO2S.-1V.19;-1,n,n,n:RECTANGLEFILL0,0,n*20N.
SeanC
@SeanCheshire bbcbasic.co.uk/bbcwin/bbcwin.html mendukung singkatan tersebut, saya tidak pernah berpikir untuk memeriksanya! Cara Anda diperhitungkan sebagai 50. Ukuran file yang dilogenisasi adalah 41 byte (setiap kata kunci tokenisied ke satu byte di luar rentang ASCII) meskipun saya tidak sering menghitung seperti itu. Saya akan menggunakan tip Anda di masa depan!
Level River St
17

ipython 2, 54 byte

Yang terbaik yang bisa saya lakukan adalah dengan program ipython. Memulai ipython dengan ipython -pylabdan menjalankan program ini akan menampilkan grafik dengan 50 nuansa abu-abu dalam 50 kotak:

t=arange(50);c=t/50.;scatter(t%5,t,500,zip(c,c,c),'s')

Keluaran:

grey50

Solusi 2:

Berikut adalah program lain (61 byte):

imshow(arange(50).reshape(5,10)*.02,'Greys',None,1,'nearest')

yang menampilkan jendela berikut:

grey50b

Ksatria Logika
sumber
1
Namun perhatikan bahwa ipython bukan bahasa dan apa yang Anda gunakan adalah Python library matplotlib, yang merupakan lib eksternal.
Stefano Sanfilippo
15

JavaScript ( 72 , 70 , 67 byte)

72: asli (meminjam &#9632;penggunaan pintar dari jawaban Sphinxxx ):

for(i=90;i>40;)document.write('<font color=#'+i+i+i--+' size=7>&#9632;')

70: mencuri tanpa malu-malu dari Ismael Miguel (yang pantas menerima suara), yang lebih pendek untuk loop dan memungkinkan browser untuk memperbaiki karena kurangnya # melanjutkan kode warna ...

for(i=60;--i>9;)document.write('<font color='+i+i+i+' size=7>&#9632;')

67 byte (65 karakter): menukar entitas untuk karakter unicode:

for(i=60;--i>9;)document.write('<font color='+i+i+i+' size=7>■')

JcT
sumber
Saya pikir Anda harus mulai i=51. Jika saya menghitung dengan benar, hanya ada 49 kotak?
flawr
1
Saya sangat suka jawaban Anda! Tuan yang terkasih, mengapa saya tidak memikirkannya? Beri +1 pada yang satu ini! Saya akan mengurangi yang ini for(i=0;i++<50;)document.write('<font color=#'+i+i+i+' size=7>&#9632;')atau yang serupa. Belum diuji tetapi mungkin berhasil!
Ismael Miguel
1
Karena Anda mencuri dari saya, setidaknya mencuri dengan benar. Hapus #karakter untuk memiliki solusi panjang 70-byte.
Ismael Miguel
1
Saya baru saja akan merekomendasikan itu. Standarnya menghitung byte, tetapi Anda harus menggunakan karakter Unicode karena byte masih lebih sedikit.
NinjaBearMonkey
1
Apakah pertanyaannya persis 50 kotak? :) (Solusi lain juga menggambar hal-hal ekstra.) Dengan itu dan unicode literal, turun ke 65 byte (63 karakter): for(i=90;i;)document.write('<font color=#'+i+i+i--+' size=7>■')- TETAPI setidaknya pada pengaturan default browser saya (OSX / Chrome) kotaknya sedikit lebih kecil dari 20x20 piksel, jadi solusi berbasis ■ ini dipertanyakan.
tuomassalo
13

C ++, 98 83 karakter

Oke, Anda akan membutuhkan emulator terminal yang mendukung warna asli. Untuk mac os ada build malam hari dari iTerm2, misalnya. Untuk unix saya percaya konsole mendukungnya. Berikut daftar, untuk berjaga-jaga: https://gist.github.com/XVilka/8346728#now-supporting-truecolor

Kompilasi dengan g ++ (\ e bergantung pada kompiler).

Agar kotak memiliki area yang cukup, Anda harus mengubah ukuran font terminal Anda.

#include <cstdio>
int main(){for(int i=51;i--;)printf("\e[48;2;%i;%i;%im ",i,i,i);}

Menggunakan pustaka C sebagai ganti C ++ memungkinkan untuk mencukur beberapa karakter.

C, 61 58 karakter

Ini adalah program yang sama tetapi dalam C, yang mengasumsikan deklarasi fungsi yang tidak diketik untuk mengembalikan int, dan yang tidak perlu menyertakan beberapa fungsi pustaka standar, seperti dalam hal ini, printf. Disarankan oleh @cartographer. Tiga karakter lebih sedikit berkat @ user3601420

main(i){for(i=51;i--;)printf("\e[48;2;%i;%i;%im ",i,i,i);}

Kompilasi dengan beberapa peringatan (untuk mengasumsikan tipe pengembalian utama menjadi int dan untuk secara implisit termasuk deklarasi printf).

rorlork
sumber
2
Jika Anda mengalihkan ini ke C, Anda dapat menjatuhkan menyertakan dan intdi depan utama dan mengkompilasinya dengan hanya beberapa peringatan dengan gcc.
kartografer
Ya, tapi itu bahasa lain. Bagaimanapun, saya akan menambahkannya, terima kasih!
rorlork
1
Anda dapat menghapus beberapa karakter dari versi C jika Anda membuat iargumen pertama menjadi utama, seperti pada:main(i){for(i=51;i--;)printf(...
Functino
Hanya satu karakter tambahan yang menjadikannya standar: \e\33
Holger
Ini golf kode!
rorlork
11

Python 2, 125 115 104 byte

from turtle import*
shape("square")
bk(500)
ht()
pu()
exec'color((xcor()/2e3+.5,)*3);stamp();fd(21);'*50

Output sampel:

masukkan deskripsi gambar di sini

Penyu tua yang baik. Ini adalah satu-satunya metode yang dapat saya pikirkan dalam Python yang mencetak gambar ke layar hanya menggunakan perpustakaan standar.

Bentuk penyu persegi hanya 21 sampai 21, yang sangat nyaman. Ini bisa dilihat dengan menggali melalui turtle.py:

"square" : Shape("polygon", ((10,-10), (10,10), (-10,10), (-10,-10)))

Jika Anda memiliki monitor beresolusi tinggi atau tidak keberatan beberapa kotak berada di luar layar, maka ini adalah 93 byte:

from turtle import*
shape("square")
ht()
pu()
exec'color((xcor()/2e3,)*3);stamp();fd(21);'*50

Demo

(Demo ini menggunakan Skulpt dengan mengadaptasi snippet yang ditemukan di sini . Ini hanya termasuk untuk memberikan gambaran tentang apa yang dilakukan kode - saya harus memodifikasi beberapa bit untuk membuatnya bekerja.)

Sp3000
sumber
Ah saya mengerti bagaimana Anda menyadari skulpt telah diperbarui. Terima kasih untuk ini, saya mungkin akan menggunakannya untuk memperbarui cuplikan.
ArtOfCode
11

J ( 43 41 40 38 33 29 karakter)

Setelah saran dari randomra .

1!:2&4'P2 ',":(,*:,],*:#?~)50

Solusi ini tidak menampilkan apa pun karena pustaka standar J tidak mengandung rutinitas GUI. Sebagai gantinya, saya menghasilkan gambar dan menulisnya ke output standar. Outputnya diacak, memastikan semua corak berbeda. Berikut adalah beberapa contoh output dan gambar dikonversi ke png dan diputar 90 ° untuk memudahkan penglihatan:

50 warna abu-abu

FUZxxl
sumber
Mendorong 50dari header ke bagian dihasilkan dengan menggunakan 50 * 50 kotak menghemat 1 byte: 1!:2&4'P2 50 2500 ',":(,*:#i.)50.
randomra
Itu ide yang rapi.
FUZxxl
Terlebih lagi: dorong semua nomor 1!:2&4'P2 ',":(,*:,],*:#i.)50untuk 29 karakter! Btw plotbukan bagian dari perpustakaan J standar?
randomra
@randomra plotadalah salah satu paket tambahan yang dapat Anda unduh dari manajer paket. Saya tidak akan melihatnya sebagai bagian dari perpustakaan standar .
FUZxxl
10

Excel vba, 81

Di jendela langsung:

for i=1 to 9:for j=1 to 9:k=i+j*10:cells(i,j).interior.color=rgb(k,k,k):next:next

pada lembar aktif:

81 warna hanya kode sebanyak 50

{81 shades hanya kode sebanyak 50}

SeanC
sumber
Nah, beberapa orang mengartikan "50" berarti tepat 50. Dalam hal ini, mungkin satu karakter lagi untuk mendapatkan 50 = 10 * 5 daripada mendapatkan 81 = 9 * 9.
Omar
@Omar, 0 hingga 9 dan 1 hingga 5 akan menghasilkan tepat 50 dalam jumlah karakter yang sama .... Ini juga berarti saya dapat menulis sekuel juga, dalam jumlah byte yang sama - 0 hingga 9 dua kali
SeanC
1
Oh, 0 hingga 9! Saya pikir itu untuk cells(i,j)Anda butuhkan i>0dan j>0.
Omar
@Omar, sial, kau benar. Saya tidak bisa menggunakan nol
SeanC
1
Sedikit lebih pendek (61)For i=1 To 50:Cells(i,1).Interior.Color=RGB(i*5,i*5,i*5):Next
OldCurmudgeon
8

R ,3732 karakter 1 :

image(t(1:50),c=gray.colors(50))

Namun, tampilan untuk ini terlihat ... meh (gambar diputar 90 ° agar lebih sesuai dengan teks; dikompresi, panjang sisi persegi asli> 20px):

membosankan

Berikut adalah versi yang lebih bagus yang memplot kotak dalam urutan acak di dalam matriks (50 karakter):

image(matrix(sample(1:50),10),c=gray.colors(50))

menarik!

(Dan ya, tiga kotak yang berdekatan dengan warna yang tampaknya identik sebenarnya adalah tiga warna abu-abu yang berbeda.)

1 Ya, jawaban R lainnya,dan bahkan tidak terpendek(sekarang yang terpendek untuk R) - permintaan maaf. Saya hilang cukup render di R.

Konrad Rudolph
sumber
1
Bagaimana Anda memperbaiki rasio aspek?
koekenbakker
? Pada dasarnya sama dengan versi kedua @ 37image(matrix(1:50,5),c=gray(1:50/51))
Vlo
@ Koekenbakker Ini tidak diperbaiki, saya secara manual menyesuaikan jendela output. Ini tidak sempurna tapi kode tidak menghasilkan kotak untuk jendela tertentu, dan kode lain di sini memiliki masalah yang sebanding.
Konrad Rudolph
8

Matlab 35 berkat sanchis

imshow(int8(ones(20,1)*(0:.05:51)))

Matlab 36

imshow(uint8(ones(20,1)*(0:.05:51)))

Menampilkan 50 kotak diisi dengan nilai abu-abu 1 hingga 50 dan 2 persegi panjang tambahan diisi dengan nilai abu-abu 0 dan 51:

masukkan deskripsi gambar di sini

Matlab, 45

imshow(uint8(ones(20,1)*floor(1:0.05:50.95)))
Steffen
sumber
Anda dapat mencukur 1 byte kekalahan dengan menggunakan int8 bukan uint8.
Sanchises
solusi sanchises lebih baik!
Memming
@Memming Ini bergantung pada beberapa fitur yang tidak jelas (tidak terdokumentasi?) Yang hanya saya temukan dengan mencobanya untuk hal itu. Berikan kredit Steffen jika sudah jatuh tempo :)
Sanchises
@TheBestOne / JaBe: Jawaban Anda sebenarnya tidak berfungsi karena tidak menampilkan kotak. Steffen menggunakan int8 untuk membulatkan nilai 1000 atau lebih menjadi 50 kotak.
Sanchises
7

JavaScript, 87 90 byte

for(i=90;i>40;)document.write('<p style=background:#'+i+i+i--+';height:9ex;width:9ex>')

Output ini kuadratkan ke HTML, karena itu adalah satu-satunya metode output grafis JavaScript. Terima kasih kepada edc65 untuk mencukur 3 byte.

NinjaBearMonkey
sumber
1
Hemat 3 byte: for(i=90;i>40;)document.write('<p style=background:#'+i+i+i--+';height:9ex;width:9ex>'). Tidak dapat menggunakan satu digit karena abu-abu tidak akan unik (# 111 warna sama dengan # 111111)
edc65
Anda bisa menggunakan unit lain. 1cmatau 1 9mmakan lebih baik dan lebih banyak didukung. Tanpa mengubah jumlah byte Anda.
Ismael Miguel
7

PHP, 96 88 74 byte

Terima kasih kepada Ismael Miguel karena telah menghemat 22 byte!

for($i=60;--$i>9;)echo"<p style=background:#$i$i$i;height:9mm;width:9mm>";

Menulis 50 <p>detik dengan tinggi dan lebar 9mm (yang seharusnya lebih besar dari 20px pada sebagian besar layar), saling ditumpuk, semuanya dengan sedikit perbedaan warna.

Hasil yang dihasilkan (gambar diperbesar dan diputar 90 °):

Hasil

ProgramFOX
sumber
7

Matlab - 33 byte

surf(meshgrid(1:7)),colormap gray

Meskipun perintah verbose, hasilnya masih cukup kompak. Ini terlihat sedikit lebih baik jika Anda mengganti surfdengan surfacetetapi biaya 3 karakter.

Jika Anda tidak melihat kotak abu-abu ke-50 itu karena itu sedikit lebih besar dari yang lain!

Dennis Jaheruddin
sumber
Gunakan ndgrid! (Kurang dari 2 byte). Dan, apakah setiap kotak abu-abu yang berbeda ?
Luis Mendo
7

Javascript (77 71 byte):

Jawaban ini tidak lagi berbasis IE11. Ini berfungsi karena browser mengubah kode warna yang buruk menjadi kode yang dapat digunakan (dengan menambahkan #nomornya).

Ini kodenya:

for(i=59;i-->9;)document.write("<hr color="+i+i+i+" size=20 width=20>")

Firefox masih memiliki kebiasaan membuat lingkaran.

(Suntingan kecil: Diubah for(i=61;i-->9;)menjadi for(i=59;i-->9;)karena menghasilkan 52 kotak)


Jawaban lama:

Ini didasarkan pada jawaban PHP saya , dan menggunakan cara yang hampir sama untuk membuat kotak:

for(i=51;i--;)document.write("<hr color=rgb("+[i,i,i]+") size=20 width=20>");

Bukan jawaban terpendek, tetapi perlu ditambahkan di sini.


Solusi ini tidak kompatibel dengan Chrome (menghasilkan banyak warna hijau) dan Firefox (hasil yang sama, tetapi menghasilkan lingkaran? OO WTH?)

Karena ini adalah kode-golf, solusi yang bekerja dengan versi tertentu atau perangkat lunak tertentu dapat diterima.

Ismael Miguel
sumber
2
Mungkin hanya saya, tetapi menjalankan cuplikan kode ini sebagian besar menghasilkan lingkaran hijau dan biru. Saya melihat @ MartinBüttner mengalahkan saya untuk komentar ini sehingga bukan hanya saya ...
MrLemon
@ McLemon Saya kira chrome tidak suka RGB -.- Tapi itu berfungsi pada IE11. Karena saya tidak mencoba membuat solusi lintas-browser, ini dapat diterima. Saya akan menambahkan ini ke jawabannya.
Ismael Miguel
@ IsmaelMiguel Tidak apa-apa kurasa. Tapi hanya untuk kejelasan, saya menggunakan FF sekarang. Dapat mengkonfirmasi itu berfungsi pada IE11.
MrLemon
@MrLemon Berhasil di IE11, sejak saya mencoba di rumah. Saya dapat memberikan layar cetak jika diperlukan. Firefox membuat lingkaran dengan itu. Saya tidak tahu bagaimana caranya. Tidak ada cara untuk mengembalikannya. Saya mengharapkan IE untuk memiliki kebiasaan, bukan Firefox.
Ismael Miguel
Firefox tampaknya menempatkan setengah lingkaran di ujungnya <hr>, mungkin untuk membuatnya terlihat lebih halus. Tidak tahu apa yang terjadi dengan warna. Pokoknya minta +1 saya untuk membingungkan saya.
MrLemon
7

Piet- 2 * 103 = 206

Ini unik karena kode sumber dan hasilnya memenuhi tantangan:

piet

Sebagian besar dekoratif, jadi saya hanya menghitung dua baris teratas, yang berdiri sendiri saja. Output ppm skala abu-abu seperti yang dilakukan beberapa orang lain.

captncraig
sumber
6

JavaScript - 70 byte

for(i=51;i-=1;)document.write('<a style=opacity:'+i/50+'>&#9632;</a>')

Sphinxxx
sumber
6
Ukuran kotak lebih kecil dari 20 piksel
edc65
1
Maka Anda perlu menyesuaikan ukuran font browser Anda;)
Sphinxxx
1
Anda harus menggunakan font:3em aatau font-size:3em. Saya downvoting yang ini karena ukuran kotak. Sampai kamu memperbaikinya.
Ismael Miguel
3
Anda bisa menggunakan i--bukan i-=1.
flawr
1
Anda dapat menggunakan <b>tag. Itu tidak akan mengubah kode dengan cara apa pun, kecuali memastikan bahwa teks akan menjadi hitam. Ini bukan persyaratan, tetapi mungkin ide yang bagus.
Ismael Miguel
6

Memproses, 66 karakter:

size(1000,20);for(int i=0;i<981;i+=20){fill(i/4);rect(i,0,20,20);}

nuansa abu-abu dalam Pemrosesan

Kevin Workman
sumber
6

PHP (62 60 63 72 71 62 59 byte):

Saya telah membuat yang terpendek yang dapat saya temukan:

for($i=59;$i-->9;)echo"<hr color=$i$i$i size=20 width=20>";

Ini persis kode yang sama dengan jawaban Javascript saya (dengan 71 byte) .

Tapi JAUH lebih pendek!

Ini memiliki kekhasan di Firefox: alih-alih kuadrat, Firefox membuat lingkaran ! (Go kegilaan!)
Othen dari itu, semua browser menghasilkan warna yang tepat (bahkan dengan hilang #pada coloratribut).


Pengiriman dan daftar perubahan tidak valid :

Jawaban lama, dengan 62 byte.

while($i++<51)echo"<hr color=rgb($i,$i,$i) size=20 width=20>";

Semua warna selaras sempurna.

Solusi ini tidak akan berfungsi untuk Chrome (akan menghasilkan kotak dengan banyak warna) dan Firefox (yang membuat lingkaran ya. Lingkaran dengan <hr>! Penggaris horizontal adalah lingkaran di Firefox!).
Anda dapat mengujinya di IE11 dan itu harus baik-baik saja.


(cukup dihapus dari atas)

Saya telah memperhatikan sesuatu yang mengerikan: Itu menghasilkan #111bukan #010101untuk beberapa warna.

Ini berarti bahwa beberapa warna berulang.

Karena itu, saya harus mengorbankan beberapa byte:

<?while(f>$c=dechex(65-$i++))echo"<hr color=#$c$c$c size=20 width=20>";

Menghasilkan 50 warna dengan urutan sempurna, dari yang lebih terang ke yang lebih gelap.

Karena titik yang benar dibuat oleh @ edc65 , saya harus menambahkan width=20, untuk menghasilkan kotak yang sempurna .

Mengurangi satu byte lebih dengan mengganti f!=$cdengan f>$c, yang bekerja dengan sempurna.


Versi final, tanpa width=20:

<?while(f!=$c=dechex(65-$i++))echo"<hr color=#$c$c$c size=20>";

Ini tidak valid karena diperlukan untuk kotak keluaran.
Ini menghasilkan nuansa dari terang ke gelap.


Dikurangi 1 byte dengan beralih ke whileloop, seperti ini:

<?while($c=dechex(50-$i++))echo"<hr color=#$c$c$c size=20>";

Solusi pertama:

<?for($i=50;$c=dechex($i--);)echo"<hr color=#$c$c$c size=20>";

Ini tidak memiliki nuansa yang tertata rapi, tetapi ada 50 yang berbeda.

Tidak ada yang menyatakan bahwa mereka harus dipesan, tetapi ada persyaratan ukuran.

Saya harap saya bisa mengurangi lebih banyak.

Anda dapat mengujinya di http://writecodeonline.com/php/ (klik "Tampilkan sebagai HTML").

Ismael Miguel
sumber
5

CSS (87 karakter)

Gunakan animasi;)

:after{content:'\25A0';font:9em z;animation:g 8s steps(50)}@keyframes g{to{color:#fff}}

Versi runnable lebih panjang karena Webkit masih membutuhkan awalan vendor. :(

:after{content:'\25A0';font:9em z;-webkit-animation:g 8s steps(50);animation:g 8s steps(50)}@-webkit-keyframes g{to{color:#fff}}@keyframes g{to{color:#fff}}

Jika kami diizinkan <a>elemen acak dan kosong , kami bisa mendapatkannya hanya 72 karakter:

a{padding:3em;animation:g 8s steps(50)}@keyframes g{to{background:#000}}

Lihat? CSS adalah bahasa pemrograman yang sah!

Casey Chu
sumber
4

R, 36 byte

Saya bisa membuat jawaban freekvd lebih pendek sepele.

x=9:59/59;symbols(x,sq=x,bg=gray(x))

Keluaran

(Maaf karena tidak membuat komentar di bawah solusinya. Stackexchange tidak mengizinkan saya untuk memberikan komentar, memilih dll).

Bertemu
sumber
Bukankah ini menghasilkan 51 kotak?
MickyT
Ini membuat kuadrat terkecil dengan lebar kurang dari 20 piksel? Tergantung pada dpi Anda, tetapi kuadrat terbesar adalah 1 inci sehingga gambar 72 dpi akan memiliki kuadrat terkecil dari 11 piksel.
freekvd
Meskipun jika Anda membuatnya 1:99 Anda bisa berpendapat bahwa 50 kotak terbesar memenuhi kriteria.
freekvd
4

PostScript, 34 byte

Dalam penyandian ISO-Latin-1:

20’›‡üˆì0{’81e3’6’–10’k0ˆ                   (note, this is a Line Feed)
’c’§}’H

Ini setara dengan biner untuk:

20 setlinewidth 1020 -20 0 { dup 1e3 div setgray 10 moveto 0 10 lineto stroke } for

(Ini mengasumsikan bahwa Anda menggunakannya pada perangkat yang memiliki setidaknya 1000 poin [= 10 inci = 25,4 cm] lebar.)

AJMansfield
sumber
Beri kami serangkaian oktet yang disandikan hex (yaitu:) 0f 4e 75 a3 ....
haneefmubarak
@haneefmubarak saya akan, saya hanya perlu pulang sehingga saya dapat menggunakan program pegolf saya. (Pemadat postscript online sepertinya tidak pernah berfungsi.)
AJMansfield
@haneefmubarak OK, diperbarui dengan representasi langsung dari file, meskipun bukan oktet hex. (Saya akan menambahkannya nanti setelah saya dapat menggunakan program konverter nyata.)
AJMansfield
4

DrRacket - 83

Hanya demi menjalankan DrRacket 1 tahun setelah "Pengantar Desain Program Sistematik".

EDIT :

(require htdp/image)(map(λ(i)(rectangle 50 50'solid(make-color i i i)))(range 50))
Ming-Tang
sumber
Simpan beberapa karakter: beralih dari 2htdp/imageke htdp/image, ganti string "solid"ke simbol 'solid. Untuk penghematan yang lebih besar, ubah (range 9 209 4)ke (range 50): nuansa abu-abu hanya perlu berbeda, tidak mudah dibedakan dengan mata manusia!
Omar
Anda dapat menyimpan beberapa karakter menggunakan for/set:(require htdp/image)(for/set([i 50])(rectangle 50 50'solid(make-color i i i)))
Alexis King
4

C # - 173

Menggunakan LINQPAD

var b=new Bitmap(1000,20);var g=Graphics.FromImage(b);for(int i=0;i<50;i++)g.FillRectangle(new SolidBrush(Color.FromArgb(i*5,i*5,i*5)),new Rectangle(i*20,0,20,20));b.Dump();

Diperluas :

var b = new Bitmap(1000, 20);
var g = Graphics.FromImage(b);
for (int i = 0; i < 50; i++)
    g.FillRectangle(new SolidBrush(Color.FromArgb(i * 5, i * 5, i * 5)), new Rectangle(i * 20, 0, 20, 20));
b.Dump();

Keluaran :

keluaran

jzm
sumber
Saran: for(int i=0;i<250;i+=5)dan kemudian FromArgb(i,i,i)dan Rectangle(i*4,0,20,20)memberikan 168
Thomas Weller
Selain itu, FillRectangle()memiliki kelebihan yang mengambil koordinat persegi panjang secara langsung, sehingga Anda dapat menghapus new Rectangle()dan pergi dengan 153
Thomas Weller
4

JavaScript, 152 byte.

Oke, jadi mungkin ini bukan solusi terbaik tapi ini milik saya.

function b(a){c=document
e=c.createElement('p')
with(e.style){background="rgb("+[a,a,a]+")"
width=height="20px"}c.body.appendChild(e)
a<245&&b(a+5)}b(0)

Ini adalah output dengan css float left (hanya supaya lebih mudah untuk menghitung kotak) dan tanpa:

dengan css float

tanpa css mengapung

Devon Taylor
sumber
2
Anda dapat menyimpan beberapa byte dengan menggunakan nama variabel satu huruf, menjatuhkan semua varkata kunci dan menghapus spasi yang tidak perlu. Harap sertakan juga nama bahasa dan jumlah byte dalam jawaban Anda.
ProgramFOX
Terima kasih atas masukannya. Saya mengurangi ruang putih dan menambahkan jumlah byte tetapi saya tidak yakin apa yang Anda maksud dengan menjatuhkan varkata kunci.
Devon Taylor
Lupakan. Saya merasa bodoh.
Devon Taylor
Gunakan c+=5sebagai ganti c=c+5. Anda juga dapat menyimpan 2 karakter dengan meletakkan n=c.toString()di akhir baris sebelumnya, dan kemudian baris itu di akhir baris sebelumnya lagi. Jadi baris kedua Anda adalahfunction w(){if(c<250){n=c.toString()
mbomb007
Juga, saya cukup yakin Anda dapat menghilangkan pxuntuk tinggi dan lebar.
mbomb007