Cinquenta Tons de Cinza

92

Meninos e meninas estão animados para ver Fifty Shades of Grey na tela prateada, nós apenas queremos codificar sem nos incomodar, então aqui está um desafio para escolher nosso cérebro.

Voce tem que:

  • Imprima na tela cinquenta quadrados preenchidos com um tom diferente de cinza
  • Se o seu idioma de escolha não possuir recursos de processamento de imagem , você poderá gerar um arquivo de imagem
  • Os quadrados devem estar visíveis, pelo menos 20 x 20 pixels
  • Você não pode usar números aleatórios, a menos que tenha certeza de que cada tom é único.
  • Você não pode se conectar a nenhum serviço em nenhuma rede
  • Você não pode ler nenhum arquivo no seu programa.
  • Você não pode usar nenhuma biblioteca fora das bibliotecas padrão do seu idioma preferido.

Este é o código de golfe, então o código mais curto vence.

jsedano
fonte
21
Eles estavam nos incomodando?
Hobbies de Calvin
6
Objeção: título enganoso!
George Chalhoub
23
Veremos uma submissão do Piet ?
Random # 16/02
8
Não as imagens que pensei que estaríamos gerando para um concurso de 50 tons de cinza.
corsiKa
3
@randomra pergunte e você receberá: codegolf.stackexchange.com/questions/45736/fifty-shades-of-grey/…
captncraig

Respostas:

24

MATLAB, 24 bytes

Segunda tentativa, agora realmente em conformidade com as regras.

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

O 'I' significa 'InitialMagnification', mas aparentemente o Matlab completará automaticamente os nomes nos pares nome / valor. Claro que é um bom truque de golfe!

insira a descrição da imagem aqui

Sanchises
fonte
59

Mathematica, 30 bytes

Aqui está outra abordagem do Mathematica:

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

insira a descrição da imagem aqui

ou

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

insira a descrição da imagem aqui

O primeiro simplesmente cria uma matriz

{{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}}

e o segundo

{{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}}

Em seguida, ArrayPlotplota-os como uma grade e, por padrão, usa a escala de cinza para visualizar os valores.

Martin Ender
fonte
Adorável uso de ArrayPlot.
21815
4
Engraçado, o MatrixPlot parece usar cores por padrão. Por sorte, esse desafio é que o ArrayPlot use a escala de cinza e é uma letra menor que o MatrixPlot.
Omar
Você poderia fazer ArrayPlot@{Range@50}, que é de apenas 20 bytes.
Chip Hurst
@ChipHurst, quando faço isso, o tamanho padrão é muito pequeno para atender aos requisitos de 20x20 pixels.
Martin Ender
36

CJam - 23 (sem saída gráfica real)

Como o CJam não pode desenhar na tela (ainda?), Escrevi um programa que gera uma imagem no formato pgm simples .
Salve a saída em um arquivo chamado 50.pgm e abra com um visualizador / editor de imagens.

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

Experimente online

O resultado fica assim:

50.png

Explicação:

"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
fonte
3
Então, ser feliz incrementa os elementos !?
Caridorc
7
@Caridorc de matrizes contendo números, sim. E estar triste os diminui: p
aditsu
Você não seguir as especificações do PGM:No line should be longer than 70 characters.
kiwixz
@iKiWiXz atualizado
aditsu
1
@iKiWiXz Deve, não deve. As linhas podem ser mais longas que isso, mas os programas que geram imagens PGM devem tentar mantê-las com menos de 70 caracteres.
FUZxxl
30

Mathematica 72 61 59 43 35 34 bytes

Versão atual (34 bytes)

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

posição de largada 2


Versão anterior (59 bytes), graças a Martin Büttner.

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

Bordas azuis adicionadas para destacar a posição dos quadrados.

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

azul

Número de quadrados:

    Length[%[[1]]]

50.


Primeira tentativa (72 bytes)

Se os quadrados puderem se sobrepor. Como observa Zgarb, existe uma possibilidade remota de que um quadrado oculte outro.

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

insira a descrição da imagem aqui

DavidC
fonte
Estou supondo que um quadrado possa, em princípio, abranger outro completamente, para que menos de 50 fiquem visíveis?
Zgarb
2
Definitivamente, a resposta mais esteticamente agradável.
1777 Dan
30

Sábio - 26 24 35 29 caracteres

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

Se parece com isso:

5x10 tons de cinza

Tentativas anteriores : Primeiro eu tive Matrix([range(50)]).plot(), então matrix_plot([range(50)]). Eles se pareciam com isso:

50 tons de cinza

O usuário @flawr apontou que os quadrados produzidos com as configurações padrão são muito pequenos. A adição de uma figsizeopção o corrige, mas são 6 caracteres a mais que a versão 5x10 na parte superior desta resposta:

matrix_plot([range(50)],figsize=20)
Omar
fonte
Parece 51 tons e os quadrados parecem menores que 20x20px, é maior quando produzido pelo seu programa?
flawr
Eu não acho que a saída extra seja proibida, @flawr, também não me incomodei em remover o quadro, as marcas de escala e os números. Você pode estar certo sobre os quadrados serem muito pequenos, vou verificar.
Omar
Argh! @ flawr está certo, os quadrados são menores que 20 px por 20 px.
Omar
Eu diria que saída extra deve ser proibida. A pergunta especifica '50', não '50 ou mais '.
21415 Joe Joe
1
Estou entendendo corretamente, @ Joe, que você não se opõe ao quadro e aos números fora do quadro, apenas ao número de quadrados? Se for esse o caso, substitua 50 por 49. #
Omar
23

R, 47 42 39 38 37 36 35 bytes

Supondo que eles possam se sobrepor, isso funciona. Symbolsrequer um vetor que contém o tamanho de cada quadrado e estou economizando espaço reutilizando o mesmo vetor para todos os parâmetros de função. A maior praça é sempre 1 polegada de largura. Com 50:99 como o intervalo de números inteiros, o menor quadrado terá cerca de meia polegada de largura, portanto, 36 pixels a 72 dpi.

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

Obrigado a todos pelos comentários e sugestões, sou muito novo no R, então tudo isso é muito educativo.

novo e melhorado?

Versões prévias:

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

Imagem anterior: 50 tons de R

freekvd
fonte
Poderia salvar um pouco mais comsymbols(x<-50:99,sq=x,bg=gray(x/99))
MickyT
Menos dois! Obrigado @MickyT, eu pensei que já estava feito.
Freekvd
1
@freekvd Em geral, depende da ordem em que os argumentos são acessados dentro da função (já que os argumentos são avaliados preguiçosamente). Você pode testar isso tendo f = function (a, b) { a; b}e depois ligando f(x <- 5, x). Isso funciona conforme o esperado. Depois de reverter os argumentos na fdefinição (e rm(x)), ele não funciona mais.
21415 Konrad Rudolph
1
Parece que a avaliação começa em sq = x, para que eu possa aparar outro caractere com isso. Obrigado @KonradRudolph
freekvd
1
symbols(x,,,x<-50:99,bg=gray(x/99))
Reduzido
21

Java - 180

Bem simples, apenas desenhando caixas.

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

insira a descrição da imagem aqui

Com quebras de linha:

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();
    }
Geobits
fonte
Se alguém objetar tecnicamente a última caixa em branco, basta alterar o multiplicador de cores para 263172. Contagem de mesmos bytes, acho que fica melhor assim.
Geobits 16/02
Eu acho que você também poderia usar em int i;vez de, int i=1mas depois usar ++ino primeiro uso de e inão i++na última ocorrência, economizaria 2 bytes. BTW: Eu nem sabia que você pode fazer um programa em java sem class MyClass ... public static void main(... !!!
flawr
@flawr Nah, o Java não inicializa variáveis ​​locais para os valores padrão. Pode funcionar se eu o movi para fora da função. Se eu estivesse dando um programa completo, tentaria dessa maneira (isso é apenas uma função, mais a importação necessária). Obrigado, apesar de :)
Geobits
2
@ flawr Se fosse um programa completo, sim, você precisaria disso. Esta é apenas uma função , pois a pergunta não especifica.
Geobits
1
@AJMansfield Eu sei, mas considero Processar uma linguagem diferente e gosto de jogar golfe em Java Java.
Geobits
17

BBC BASIC, 57

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

Os quadrados devem ter pelo menos 20 pixels, mas não há nada a dizer que eles devem ter o mesmo tamanho, então acho que isso se qualifica.

Pode ser possível reduzi-lo usando mais códigos VDU de baixo nível. Mas a mudança desse padrão para um menos interessante provavelmente não o tornará mais curto.

insira a descrição da imagem aqui

Level River St
fonte
2
Lembre-se de suas abreviações da BBC Basic? F., N., S., V. -> F.n=51TO2S.-1V.19;-1,n,n,n:RECTANGLEFILL0,0,n*20N.
SeanC 17/02
@SeanCheshire bbcbasic.co.uk/bbcwin/bbcwin.html suporta essas abreviações, nunca pensei em verificar! Seu caminho conta como 50. O tamanho do arquivo tokenizado é de 41 bytes (cada palavra-chave tokenizada em um único byte fora do intervalo ASCII), embora eu não conte dessa maneira com frequência. Vou usar sua dica no futuro!
Level River St
17

ipython 2, 54 bytes

O melhor que pude fazer foi com um programa ipython. Iniciar o ipython ipython -pylabe executar este programa mostrará um gráfico com 50 tons de cinza em 50 quadrados:

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

Resultado:

grey50

Solução 2:

Aqui está outro programa (61 bytes):

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

que exibe a seguinte janela:

grey50b

Cavaleiro Lógico
fonte
1
No entanto, observe que o ipython não é uma linguagem e o que você usou é a biblioteca Python matplotlib, que é uma biblioteca externa.
Stefano Sanfilippo
15

JavaScript ( 72 , 70 , 67 bytes)

72: original (emprestando o &#9632;uso inteligente da resposta do Sphinxxx ):

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

70: roubando descaradamente Ismael Miguel (que merece os votos), um loop for mais curto e permitindo que o navegador corrija a falta de # continuar o código de cores ...

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

67 bytes (65 caracteres): trocando a entidade pelo caractere unicode:

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

JcT
fonte
Eu acho que você deveria começar i=51. Se contei corretamente, existem apenas 49 quadrados?
flawr
1
Eu realmente gosto da sua resposta! Caro senhor, por que eu não pensei nisso? +1 neste! Eu reduziria este para for(i=0;i++<50;)document.write('<font color=#'+i+i+i+' size=7>&#9632;')ou similar. Não testado, mas pode funcionar!
Ismael Miguel
1
Desde que você está roubando de mim, pelo menos roube adequadamente. Remova o #caractere para ter uma solução de 70 bytes.
Ismael Miguel
1
Eu estava prestes a recomendar isso. O padrão é contar bytes, mas você deve usar o caractere Unicode porque ainda há menos bytes.
21415 NinjaBearMonkey #
1
A pergunta dizia exatamente 50 quadrados? :) (As outras soluções também atraem coisas extras.) Com isso e o literal unicode, até 65 bytes (63 caracteres): for(i=90;i;)document.write('<font color=#'+i+i+i--+' size=7>■')- MAS, pelo menos nas configurações padrão do meu navegador (OSX / Chrome), a caixa é um pouco menor que 20x20 de qualquer maneira, portanto, essas soluções baseadas em ■ são questionáveis.
21815 tuomassalo
13

C ++, 98 83 caracteres

Ok, então você precisará de um emulador de terminal que suporte cores verdadeiras. Para mac os, há as construções noturnas do iTerm2, por exemplo. Para o unix, acredito que o konsole o suporta. Aqui está uma lista, apenas no caso: https://gist.github.com/XVilka/8346728#now-supporting-truecolor

Compile com g ++ (\ e depende do compilador).

Para que os quadrados tenham área suficiente, você precisará alterar o tamanho da fonte do terminal.

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

O uso de bibliotecas C em vez de C ++ permite raspar alguns caracteres.

C, 61 58 caracteres

Este é o mesmo programa, mas em C, que assume declarações de funções não tipadas para retornar int e que não precisa incluir inclusões para algumas das funções padrão da biblioteca, como neste caso, printf. Sugerida por @cartographer. Três caracteres a menos graças a @ user3601420

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

Compila com alguns avisos (por assumir o tipo de retorno do main como int e incluir implicitamente a declaração de printf).

rorlork
fonte
2
Se você alternar para C, você pode soltar a inclusão e a intfrente do main e compilar com apenas alguns avisos com o gcc.
cartógrafo
Sim, mas isso seria outro idioma. De qualquer forma, vou acrescentar, obrigado!
rorlork
1
Você pode remover alguns caracteres da versão C se você fizer io primeiro argumento principal, como em:main(i){for(i=51;i--;)printf(...
Functino 17/02/2015
Apenas um caractere adicional para torná-lo padrão: \e\33
Holger
Isso é código-golfe!
rorlork
11

Python 2, 125 115 104 bytes

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

Saída de amostra:

insira a descrição da imagem aqui

Boa e velha tartaruga. Este foi o único método que eu consegui pensar no Python que imprime imagens em uma tela usando apenas as bibliotecas padrão.

O formato quadrado da tartaruga é de 21 por 21, o que é muito conveniente. Isso pode ser visto pesquisando turtle.py:

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

Se você tem um monitor de alta resolução ou não se importa de alguns quadrados fora da tela, são 93 bytes:

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

Demo

(Esta demonstração usa o Skulpt adaptando o snippet encontrado aqui . Ele está incluído apenas para ter uma idéia do que o código faz - tive que modificar alguns bits para fazê-lo funcionar.)

Sp3000
fonte
Ah, eu vejo como você percebeu que o skulpt foi atualizado. Obrigado por isso, provavelmente vou usá-lo para atualizar o snippet.
ArtOfCode
11

J ( 43 41 40 38 33 29 caracteres)

Após sugestões de randomra .

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

Esta solução não exibe nada, pois a biblioteca padrão de J não contém rotinas da GUI. Em vez disso, giro uma imagem e a escrevo na saída padrão. A saída é aleatória, garantindo que todas as tonalidades sejam distintas. Aqui está um exemplo de saída e a imagem convertida em png e girada em 90 ° para facilitar a visualização:

50 tons de cinza

FUZxxl
fonte
Empurrando a 50partir do cabeçalho na parte gerada usando 50 * 50 quadrados economiza um byte: 1!:2&4'P2 50 2500 ',":(,*:#i.)50.
Random # 16/02
Essa é uma ideia interessante.
FUZxxl
Ainda mais: empurre todos os números 1!:2&4'P2 ',":(,*:,],*:#i.)50por 29 caracteres! Btw plotnão faz parte da biblioteca J padrão?
Aleatório
O @randomra ploté um dos pacotes auxiliares que você pode baixar do gerenciador de pacotes. Eu dificilmente veria isso como parte da biblioteca padrão .
FUZxxl
10

Excel vba, 81

Na janela imediata:

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

na planilha ativa:

81 tons é tanto código quanto 50

{81 tons é tanto código quanto 50}

SeanC
fonte
Bem, algumas pessoas estão interpretando o "50" como exatamente 50. Nesse caso, provavelmente é mais um caractere para obter 50 = 10 * 5 do que para obter 81 = 9 * 9.
Omar
@Omar, 0 a 9 e 1 a 5 produzirão exatamente 50 no mesmo número de caracteres .... Isso também significa que também posso escrever a sequência, no mesmo número de bytes - 0 a 9 duas vezes
SeanC
1
Oh, 0 a 9! Eu pensei que para o que cells(i,j)você precisava i>0e j>0.
Omar
@ Omar, caramba, você está certo. Eu não poderia usar zero
SeanC
1
Um pouco mais curto (61) #For i=1 To 50:Cells(i,1).Interior.Color=RGB(i*5,i*5,i*5):Next
18715 OldCurmudgeon
8

R ,37.32 caracteres 1 :

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

No entanto, a exibição para isso parece… meh (a imagem girou 90 ° para se ajustar melhor ao texto; comprimento do lado quadrado original compactado> 20px):

entediante

Aqui está uma versão melhor que plota os quadrados em ordem aleatória dentro de uma matriz (50 caracteres):

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

emocionante!

(E sim, os três quadrados adjacentes de cores aparentemente idênticas são na verdade três tons diferentes de cinza.)

1 Sim, outra resposta R,e nem mesmo o mais curto(agora o mais curto para R) - desculpas. Estava faltando uma renderização bonita em R.

Konrad Rudolph
fonte
1
Como você corrigiu a proporção?
21815 koekenbakker
? Basicamente, o mesmo que a segunda versão @ 37image(matrix(1:50,5),c=gray(1:50/51))
Vlo 17/02/2015
@koekenbakker Não está corrigido, estou ajustando manualmente a janela de saída. Não é perfeito, mas o código faz produzir quadrados para uma determinada janela e outro código aqui tem problemas comparáveis.
21415 Konrad Rudolph
8

Matlab 35 graças a sanchises

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

Matlab 36

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

Exibe 50 quadrados preenchidos com os valores de cinza 1 a 50 e 2 retângulos adicionais preenchidos com os valores de cinza 0 e 51:

insira a descrição da imagem aqui

Matlab, 45

imshow(uint8(ones(20,1)*floor(1:0.05:50.95)))
Steffen
fonte
Você pode cortar um byte enorme usando 1 int8 em vez de uint8.
Sanchises
a solução da sanchises é melhor!
Memming
@Memming Ele depende de algum recurso obscuro (não documentado?) Que eu só descobri tentando ao máximo. Dar crédito Steffen foram é devido :)
Sanchises
@TheBestOne / JaBe: Sua resposta realmente não funciona, pois não exibe quadrados. Steffen usa int8 para arredondar os valores de aproximadamente 1000 para 50 quadrados.
Sanchises
7

JavaScript, 87 90 bytes

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

Isso gera quadrados para o HTML, porque é realmente o único método de saída gráfica do JavaScript. Graças ao edc65 por remover 3 bytes.

NinjaBearMonkey
fonte
1
Salve 3 bytes: for(i=90;i>40;)document.write('<p style=background:#'+i+i+i--+';height:9ex;width:9ex>'). Não é possível usar um único dígito porque cinzas não seria única (# 111 mesma cor # 111111)
edc65
Você pode usar outras unidades. 1cmou 1 9mmseria melhor e mais amplamente suportado. Sem alterar sua contagem de bytes.
Ismael Miguel
7

PHP, 96 88 74 bytes

Obrigado a Ismael Miguel por salvar 22 bytes!

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

Grava 50 <p>s com 9 mm de altura e largura (que deve ser maior que 20 px na maioria das telas), empilhados um sobre o outro, todos com uma pequena diferença de tonalidade.

Resultado gerado (a imagem é reduzida e girada 90 °):

Resultado

ProgramFOX
fonte
7

Matlab - 33 bytes

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

Apesar dos comandos detalhados, o resultado ainda é bastante compacto. Parece um pouco melhor se você substituir surfcom surface, mas que custa 3 caracteres.

Se você não perceber o 50º quadrado cinza, é porque ele é um pouco maior que os outros!

Dennis Jaheruddin
fonte
Use ndgrid! (2 bytes a menos). E cada quadrado tem um cinza diferente ?
Luis Mendo
7

Javascript (77 71 bytes):

Esta resposta não é mais baseada no IE11. Funciona porque o navegador converte os códigos de cores incorretos em códigos utilizáveis ​​(adicionando #ao número).

Aqui está o código:

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

O Firefox ainda tem a peculiaridade de fazer círculos.

(Edição pequena: alterada for(i=61;i-->9;)para for(i=59;i-->9;)porque estava produzindo 52 quadrados)


Resposta antiga:

Isso é baseado na minha resposta PHP e usa quase as mesmas maneiras de fazer os quadrados:

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

Não é a resposta mais curta, mas vale a pena adicionar aqui.


Esta solução não é compatível com o Chrome (produz várias cores verdes) e Firefox (o mesmo resultado, mas produz círculos? OO WTH?)

Como se trata de código-golfe, uma solução que trabalha com uma versão específica ou um software específico é aceitável.

Ismael Miguel
fonte
2
Pode ser apenas eu, mas a execução desse snippet de código produz principalmente círculos verdes e azuis. Vejo @ MartinBüttner bater-me a este comentário por isso não é só comigo ...
MrLemon
@ MrLemon Eu acho que o chrome não gosta de RGB -.- Mas funciona no IE11. Como não estou tentando criar uma solução entre navegadores, isso é aceitável. Vou adicionar isso à resposta.
Ismael Miguel
@IsmaelMiguel Está tudo bem, eu acho. Mas, por uma questão de clareza, estou no FF agora. Pode confirmar que ele funciona no IE11.
21815 MrLemon #
@ MrLemon Funciona no IE11, desde que tentei em casa. Posso fornecer a tela de impressão, se necessário. O Firefox faz círculos com ele. Não faço a menor ideia de como. Não há como revertê-lo. Eu estava esperando que o IE tivesse as peculiaridades, não o Firefox.
Ismael Miguel
O Firefox parece colocar semicírculos nas extremidades <hr>, provavelmente para torná-lo mais suave. Nenhuma pista sobre o que acontece com as cores. De qualquer forma, tenho o meu +1 por me confundir.
MrLemon
7

Piet- 2 * 103 = 206

Isso é único, pois o código fonte e a saída cumprem o desafio:

piet

A maior parte é decorativa, então contei apenas as duas primeiras fileiras, que ficam sozinhas bem. Produz um ppm em escala de cinza como alguns outros já fizeram.

captncraig
fonte
6

JavaScript - 70 bytes

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

Sphinxxx
fonte
6
O tamanho da caixa é menor que 20 pixels
edc65
1
Então você precisa ajustar o tamanho da fonte do seu navegador;)
Sphinxxx 16/15
1
Você tem que usar font:3em aou font-size:3em. Estou com uma votação negativa devido ao tamanho das caixas. Até você consertar.
Ismael Miguel
3
Você pode usar em i--vez de i-=1.
flawr
1
Você pode usar a <b>tag. Não mudará o código de forma alguma, exceto garantindo que o texto fique em preto. Isso não é um requisito, mas pode ser uma boa ideia.
Ismael Miguel
6

Processando, 66 caracteres:

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

tons de cinza em Processamento

Kevin Workman
fonte
6

PHP (62 60 63. 72 71 62 59 bytes):

Eu fiz o menor que pude encontrar:

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

Este é exatamente o mesmo código da minha resposta Javascript (com 71 bytes) .

Mas MUITO mais curto!

Isso tem uma peculiaridade no Firefox: em vez de quadrados, o Firefox faz círculos ! (Entre na loucura!)
Além disso, todos os navegadores produzem a cor certa (mesmo com a falta #no coloratributo).


Envios e log de alterações inválidos :

Resposta antiga, com 62 bytes.

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

Todos os tons estão perfeitamente alinhados.

Essa solução não funcionará no Chrome (produzirá quadrados com várias cores) e no Firefox (que cria círculos OO Sim, circula com <hr>! A régua horizontal é um círculo no Firefox!).
Você pode testá-lo no IE11 e deve ficar bem.


(simplesmente removido de cima)

Eu notei algo horrível: estava produzindo em #111vez de #010101algumas cores.

Isso significava que algumas cores estavam se repetindo.

Portanto, tive que sacrificar alguns bytes:

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

Produz as 50 tonalidades em perfeita ordem, de mais clara a mais escura.

Devido a um argumento correto feito por @ edc65 , eu tive que adicionar width=20, para produzir quadrados perfeitos .

Reduzido mais um byte, substituindo f!=$cpor f>$c, que funciona perfeitamente.


Versão final, sem width=20:

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

Isso é inválido porque é necessário gerar quadrados.
Isso produz os tons de mais claro para mais escuro.


Redução de 1 byte alternando para um whileloop, assim:

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

Primeira solução:

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

Isso não tem os tons ordenadamente ordenados, mas existem 50 diferentes.

Não há nada afirmando que eles devem ser pedidos, mas há um requisito de tamanho.

Espero poder reduzir muito mais.

Você pode testá-lo em http://writecodeonline.com/php/ (clique em "Exibir como HTML").

Ismael Miguel
fonte
5

CSS (87 caracteres)

Usa animação;)

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

A versão executável é mais longa, pois o Webkit ainda precisa do prefixo do fornecedor. :(

: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}}

Se for permitido um <a>elemento vazio e aleatório, podemos reduzi-lo para apenas 72 caracteres:

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

Vejo? CSS é uma linguagem de programação legítima!

Casey Chu
fonte
4

R, 36 bytes

Eu posso diminuir a resposta do freekvd trivialmente.

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

Resultado

(Desculpe por não fazer um comentário sob a solução dele. O Stackexchange ainda não me permite fazer comentários, votar etc.).

Conheceu
fonte
Isso não produz 51 quadrados?
MickyT
Isso torna o menor quadrado com menos de 20 pixels de largura? Depende do seu dpi, mas o quadrado maior é de 1 polegada; portanto, uma imagem de 72 dpi terá um quadrado menor de 11 pixels.
Freekvd
Embora se você fizer 1:99, poderá argumentar que as 50 maiores praças atendem aos critérios.
Freekvd
4

PostScript, 34 bytes

Na codificação ISO-Latin-1:

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

Este é o equivalente binário a:

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

(Isso pressupõe que você o esteja usando em um dispositivo com pelo menos 1000 pontos [= 10 polegadas = 25,4 cm] de largura.)

AJMansfield
fonte
Dê-nos uma série de octetos codificados em hexadecimal (ou seja:) 0f 4e 75 a3 ....
21115 haneefmubarak
@haneefmubarak Eu vou, eu só preciso chegar em casa para poder usar meu programa de golfista. (O compactador PostScript on-line não é nunca parecem funcionar.)
AJMansfield
@haneefmubarak OK, atualizado com uma representação direta do arquivo, embora não sejam os octetos hexadecimais. (Vou acrescentar que mais tarde, quando eu posso usar o programa conversor real.)
AJMansfield
4

DrRacket - 83

Apenas para ativar o DrRacket 1 ano após "Introdução ao desenho sistemático de programas".

EDIT :

(require htdp/image)(map(λ(i)(rectangle 50 50'solid(make-color i i i)))(range 50))
Ming-Tang
fonte
Salve alguns caracteres: alterne de 2htdp/imagepara htdp/image, altere a string "solid"para o símbolo 'solid. Para uma economia maior, altere (range 9 209 4)para (range 50): os tons de cinza precisam ser distintos, não fáceis de distinguir pelo olho humano!
Omar
Você pode salvar alguns caracteres usando for/set:(require htdp/image)(for/set([i 50])(rectangle 50 50'solid(make-color i i i)))
Alexis King
4

C # - 173

Usando 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();

Expandido :

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

Saída :

resultado

jzm
fonte
Sugestão: for(int i=0;i<250;i+=5)e, em seguida, FromArgb(i,i,i)e Rectangle(i*4,0,20,20)dá 168
Thomas Weller
Além disso, FillRectangle()tem uma sobrecarga que leva o retângulo coordena directamente, para que possa remover o new Rectangle()e fugir com 153
Thomas Weller
4

JavaScript, 152 bytes.

Ok, talvez essa não seja a melhor solução, mas aqui está a minha.

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)

Aqui está a saída com o flutuador css à esquerda (para facilitar a contagem dos quadrados) e sem:

com css float

sem css float

Devon Taylor
fonte
2
Você pode salvar alguns bytes usando nomes de variáveis ​​de uma letra, vareliminando todas as palavras-chave e removendo espaços em branco desnecessários. Além disso, inclua o nome do idioma e a contagem de bytes na sua resposta.
ProgramFOX
Obrigado pela contribuição. Reduzi o espaço em branco e adicionei a contagem de bytes, mas não sei ao certo o que você quer dizer com soltar as varpalavras - chave.
Devon Taylor
Deixa pra lá. Eu me sinto estúpido.
Devon Taylor
Use em c+=5vez de c=c+5. Além disso, você pode salvar 2 caracteres colocando n=c.toString()no final da linha anterior e, em seguida, essa linha no final da linha anterior novamente. Portanto, sua segunda linha seriafunction w(){if(c<250){n=c.toString()
mbomb007 20/02
Além disso, tenho certeza de que você pode omitir pxa altura e a largura.
mbomb007