Пятьдесят оттенков серого


92

Мальчики и девочки очень рады видеть « Пятьдесят оттенков серого» на серебряном экране, мы просто хотим кодировать, не беспокоясь, поэтому перед нами стоит задача поразмыслить.

Вы должны:

  • Распечатайте на экране пятьдесят квадратов, каждый из которых имеет свой оттенок серого.
  • Если вашему языку не хватает возможностей для обработки изображений , вы можете вывести файл изображения
  • Квадраты должны быть видны, не менее 20 х 20 пикселей
  • Вы не можете использовать случайные числа, если не уверены, что каждый оттенок уникален.
  • Вы не можете подключиться к какой-либо службе через сеть
  • Вы не можете читать файлы в вашей программе.
  • Вы не можете использовать любые библиотеки из стандартных библиотек вашего языка по вашему выбору.

Это кодовый гольф, поэтому выигрывает самый короткий код.


21
Они беспокоили нас?
Увлечения Кэлвина

6
Возражение: вводящее в заблуждение название!
Джордж Чалхуб

23
Мы увидим представление Питом ?
Рандомра

8
Не те картинки, которые, как я думал, мы будем создавать для конкурса из 50 оттенков серого.
CorsiKa

3
@randomra спросите, и вы получите: codegolf.stackexchange.com/questions/45736/fifty-shades-of-grey/…
captncraig

Ответы:


24

MATLAB, 24 байта

Вторая попытка, теперь фактически соответствует правилам.

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

«I» означает «InitialMagnification», но, очевидно, Matlab будет автоматически заполнять имена в парах «имя / значение». Конечно, это хорошая игра в гольф!

введите описание изображения здесь


59

Mathematica, 30 байт

Вот еще один подход Mathematica:

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

введите описание изображения здесь

или же

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

введите описание изображения здесь

Первый просто создает массив

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

а второй

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

Затем ArrayPlotстроит их в виде сетки и по умолчанию использует оттенки серого для визуализации значений.


Прекрасное использование ArrayPlot.
DavidC

4
Забавно, но MatrixPlot, по-видимому, использует цвета по умолчанию, к счастью для этой задачи ArrayPlot использует оттенки серого и на одну букву короче, чем MatrixPlot.
Омар

Вы можете сделать ArrayPlot@{Range@50}, что составляет всего 20 байтов.
Чип Херст

@ChipHurst, когда я это делаю, размер по умолчанию слишком мал, чтобы соответствовать требованию 20x20 пикселей.
Мартин Эндер

36

CJam - 23 (без фактического графического вывода)

Поскольку CJam не может рисовать на экране (пока?), Я написал программу, которая выводит изображение в простом формате pgm .
Сохраните вывод в файл с именем 50.pgm и откройте с помощью средства просмотра / редактирования изображений.

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

Попробуйте онлайн

Результат выглядит так:

50.png

Объяснение:

"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

3
Так быть счастливым увеличивает элементы !?
Caridorc

7
@Caridorc массивов, содержащих числа, да. И печаль сводит их на нет: p
aditsu

Вы не следуете спецификации PGM:No line should be longer than 70 characters.
kiwixz

@iKiWiXz обновлено
aditsu

1
@iKiWiXz Должен, не должен. Строки могут быть длиннее, но программы, которые генерируют изображения PGM, должны стараться, чтобы их длина не превышала 70 символов.
FUZxxl

30

Mathematica 72 61 59 43 35 34 байта

Текущая версия (34 байта)

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

СЕТКА2


Более ранняя версия (59 байт), благодаря Мартину Бюттнеру.

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

Синие границы добавлены, чтобы выделить положение квадратов.

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

синий

Количество квадратов:

    Length[%[[1]]]

50


Первая попытка (72 байта)

Если квадраты могут перекрываться. Как отмечает Згарб, существует небольшая вероятность того, что один квадрат будет скрывать другой.

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

введите описание изображения здесь


Я предполагаю, что один квадрат может в принципе полностью покрыть другой, чтобы было видно менее 50?
Згарб

2
Определенно самый эстетически приятный ответ.
Дан

30

Мудрец - 26 24 35 29 персонажей

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

Это выглядит так:

5х10 оттенков серого

Предыдущие попытки : сначала у меня было Matrix([range(50)]).plot(), потом matrix_plot([range(50)]). Это выглядело так:

50 оттенков серого

Пользователь @flawr указал, что квадраты, созданные с настройками по умолчанию, слишком малы. Добавление figsizeопций исправляет это, но оно на 6 символов длиннее, чем версия 5x10 в верхней части этого ответа:

matrix_plot([range(50)],figsize=20)

Похоже, 51 оттенок и квадраты меньше, чем 20x20px, это больше, когда создается вашей программой?
flawr

Я не думаю, что дополнительный вывод запрещен, @flawr, я не удосужился удалить рамку, отметки и цифры. Возможно, вы правы, что квадраты слишком малы, я проверю.
Омар

Argh! Правильно @flawr, квадраты меньше 20px на 20px.
Омар

Я бы сказал, что дополнительный вывод должен быть запрещен. В вопросе указано «50», а не «50 или более».
Джо,

1
Правильно ли я понимаю, @Joe, что ты не возражаешь против фрейма и чисел вне фрейма, только против количества квадратов? Если это так, просто замените 50 на 49.
Омар

23

R, 47 42 39 38 37 36 35 байт

Предполагая, что они могут перекрываться, это работает. Symbolsтребуется вектор, который содержит размер для каждого квадрата, и я экономлю пространство, повторно используя один и тот же вектор для всех параметров функции. Самый большой квадрат всегда шириной 1 дюйм. С диапазоном целых чисел 50:99 наименьший квадрат будет иметь ширину около половины дюйма, то есть 36 пикселей при 72 dpi.

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

Спасибо всем за комментарии и предложения, я довольно плохо знаком с R, так что все это очень познавательно.

новый и улучшенный?

Предыдущие версии:

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

Предыдущее изображение: 50 оттенков R


Могли бы сэкономить еще немного сsymbols(x<-50:99,sq=x,bg=gray(x/99))
MickyT

Минус два! Спасибо @MickyT, я думал, что это уже сделано.
freekvd

1
@freekvd В общем случае это зависит от порядка доступа к аргументам внутри функции (поскольку аргументы вычисляются лениво). Вы можете проверить это, имея, f = function (a, b) { a; b}а затем позвонив f(x <- 5, x). Это работает как ожидалось. Как только вы измените аргументы в fопределении (и rm(x)), это больше не будет работать.
Конрад Рудольф

1
Похоже, оценка начинается с sq = x, поэтому я могу обрезать еще один символ с этим. Спасибо @KonradRudolph
freekvd

1
Сокращение на 1 байтsymbols(x,,,x<-50:99,bg=gray(x/99))
Vlo

21

Ява - 180

Довольно просто, просто рисуя коробки.

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

введите описание изображения здесь

С переносами строк:

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

Если кто-то возражает против того, чтобы последний блок был технически белым, просто измените множитель цвета на 263172. Тот же счетчик байтов, я просто думаю, что так будет выглядеть лучше.
Geobits

Я думаю, что вы также можете использовать int i;вместо, int i=1но затем использовать ++iпри первом использовании, iа не i++в последнем случае, сэкономит 2 байта. Кстати, я даже не знал, что вы можете сделать Java-программу без class MyClass ... public static void main(... !!!
flawr

@flawr Нет, Java не будет инициализировать локальные переменные значениями по умолчанию. Это может сработать, если я переместу его за пределы функции. Если бы вместо этого я давал полную программу, я бы попробовал ее таким образом (это всего лишь функция плюс необходимый импорт). Спасибо, хотя :)
Geobits

2
@flawr Если бы это была полная программа, тогда да, вам это нужно. Это просто функция , так как вопрос не уточняется.
Geobits

1
@ AJMansfield Я знаю, но я рассматриваю обработку на другом языке, и мне нравится играть в гольф на Java Java.
Geobits

17

BBC BASIC, 57

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

Квадраты должны быть не менее 20 пикселей, но нечего сказать, что они должны быть одинакового размера, поэтому я думаю, что это подходит.

Может быть возможно сократить это путем использования большего количества кодов VDU низкого уровня. Но переход от этого шаблона к менее интересному вряд ли сделает его короче.

введите описание изображения здесь


2
Помните ваши основные сокращения BBC? Ф., Н. С., В. -> F.n=51TO2S.-1V.19;-1,n,n,n:RECTANGLEFILL0,0,n*20N.
SeanC

@SeanCheshire bbcbasic.co.uk/bbcwin/bbcwin.html поддерживает эти сокращения, я никогда не думал проверять! Ваш путь считается равным 50. Размер файла токена составляет 41 байт (каждое ключевое слово маркируется на один байт вне диапазона ASCII), хотя я не часто так считаю. Я буду использовать ваш совет в будущем, хотя!
Уровень Река Св

17

ipython 2, 54 байта

Лучшее, что я мог сделать, - это программа ipython. При запуске ipython ipython -pylabи выполнении этой программы будет показан график с 50 оттенками серого в 50 квадратах:

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

Выход:

grey50

Решение 2:

Вот еще одна программа (61 байт):

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

это отображает следующее окно:

grey50b


1
Однако обратите внимание, что ipython не является языком, и вы использовали библиотеку Python matplotlib, которая является внешней библиотекой.
Стефано Санфилиппо

15

JavaScript ( 72 , 70 , 67 байт)

72: оригинал (заимствуя умное &#9632;использование из ответа Sphinxxx ):

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

70: бесстыдно воровать у Исмаила Мигеля (который заслуживает голосов), короче за цикл и позволяющего браузеру исправить # отсутствие цветового кода ...

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

67 байт (65 символов): замена объекта на символ юникода:

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


Я думаю, вы должны начать с i=51. Если я посчитал правильно, то осталось всего 49 квадратов?
flawr

1
Мне очень нравится ваш ответ! Дорогой лорд, почему я не думал об этом? +1 на этот! Я бы уменьшил этот до for(i=0;i++<50;)document.write('<font color=#'+i+i+i+' size=7>&#9632;')или аналогичный. Не проверено, но это может сработать!
Исмаэль Мигель

1
Так как ты крадешь у меня, по крайней мере, укради правильно. Удалите #символ, чтобы получить решение длиной 70 байт.
Исмаэль Мигель

1
Я как раз собирался рекомендовать это. По умолчанию считается число байтов, но вы должны использовать символ Unicode, потому что он по-прежнему меньше байтов.
NinjaBearMonkey

1
В вопросе говорилось ровно 50 квадратов? :) (Другие решения также привлекают дополнительные вещи.) С этим и литералом Юникода, до 65 байтов (63 символа): for(i=90;i;)document.write('<font color=#'+i+i+i--+' size=7>■')- НО, по крайней мере, в настройках моего браузера по умолчанию (OSX / Chrome), поле немного меньше, чем 20x20 пикселей в любом случае, так что эти решения на основе сомнительны.
Туомассало

13

C ++, 98 83 символа

Итак, вам понадобится эмулятор терминала, который поддерживает настоящие цвета. Например, для Mac OS существуют ночные сборки iTerm2. Я считаю, что для Unix это поддерживает консоль. Вот список, на всякий случай: https://gist.github.com/XVilka/8346728#now-supporting-truecolor

Компилировать с помощью g ++ (\ e зависит от компилятора).

Чтобы квадраты имели достаточную площадь, вам придется изменить размер шрифта вашего терминала.

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

Использование библиотек C вместо C ++ позволяет сбрить некоторые символы.

C 61 58 символов

Это та же самая программа, но на C, которая предполагает, что объявления нетипизированных функций возвращают int, и для которой не нужно включать некоторые стандартные библиотечные функции, как, например, в этом случае, printf. Предложено @cartographer. Три символа меньше благодаря @ user3601420

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

Компилируется с парой предупреждений (для предположения, что возвращаемый тип main равен int, и для неявного включения объявления printf).


2
Если вы переключите это на C, вы можете сбросить include и the intперед main и заставить их скомпилировать всего пару предупреждений с помощью gcc.
картограф

Да, но это был бы другой язык. В любом случае, я добавлю это, спасибо!
rorlork

1
Вы можете удалить несколько символов из версии C, если вы сделаете iпервый аргумент main, как в:main(i){for(i=51;i--;)printf(...
Functino

Только один дополнительный символ, чтобы сделать его стандартным: \e\33
Хольгер

Это код-гольф!
rorlork

11

Python 2, 125 115 104 байта

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

Образец вывода:

введите описание изображения здесь

Старая добрая черепаха. Это был единственный метод, который я мог придумать в Python, который печатал изображения на экране, используя только стандартные библиотеки.

Квадратная форма черепахи, случается, 21 на 21, что очень удобно. Это можно увидеть, покопавшись в turtle.py:

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

Если у вас монитор высокого разрешения или вы не возражаете против того, чтобы несколько квадратов были за кадром, то это 93 байта:

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

демонстрация

(Эта демонстрация использует Skulpt , адаптируя фрагмент, найденный здесь . Он включен только для того, чтобы дать представление о том, что делает код - мне пришлось изменить несколько бит, чтобы заставить его работать.)


Ах, я вижу, как вы поняли, скульпт обновился. Спасибо за это, я, вероятно, буду использовать его для обновления фрагмента.
ArtOfCode

11

J ( 43 41 40 38 33 29 символов)

После предложений от рандома .

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

Это решение ничего не отображает, так как стандартная библиотека J не содержит процедур GUI. Вместо этого я генерирую изображение и записываю его в стандартный вывод. Выходной сигнал рандомизирован, это гарантирует, что все оттенки различны. Вот пример выходных данных и изображение, преобразованное в png и повернутое на 90 ° для удобства просмотра:

50 оттенков серого


Толкая 50из заголовка в генерируемый с использованием части 50 * 50 квадратов сохраняет 1 байт: 1!:2&4'P2 50 2500 ',":(,*:#i.)50.
Рандомра

Это изящная идея.
FUZxxl

Еще больше: вставьте все числа в 1!:2&4'P2 ',":(,*:,],*:#i.)50течение 29 символов! Кстати plot, не является частью стандартной библиотеки J?
Рандомра

@randomra plot- один из вспомогательных пакетов, которые вы можете скачать из менеджера пакетов. Я бы вряд ли видел это как часть стандартной библиотеки .
FUZxxl

10

Excel vba, 81

В ближайшем окне:

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

на активном листе:

81 оттенка - это столько же кода, сколько 50

{81 оттенков - это столько же кода, сколько 50}


Ну, некоторые люди интерпретируют «50» как означающее ровно 50. В этом случае, вероятно, это еще один символ, чтобы получить 50 = 10 * 5, чем 81 = 9 * 9.
Омар

@Omar, от 0 до 9 и от 1 до 5 будут давать ровно 50 символов с одинаковым количеством символов .... Это также означает, что я тоже могу написать продолжение, с одинаковым количеством байтов - от 0 до 9 дважды
SeanC

1
Ох, от 0 до 9! Я думал , что для cells(i,j)вас нужно i>0и j>0.
Омар

@ Омар, блин, ты прав. Я не мог использовать ноль
SeanC

1
Немного короче (61)For i=1 To 50:Cells(i,1).Interior.Color=RGB(i*5,i*5,i*5):Next
OldCurmudgeon

8

R ,3732 символа 1 :

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

Тем не менее, дисплей для этого выглядит… ме (изображение повернуто на 90 °, чтобы лучше вписаться в текст; сжатый, исходная длина стороны квадрата> 20 пикселей):

скучный

Вот более приятная версия, которая отображает квадраты в случайном порядке внутри матрицы (50 символов):

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

захватывающе!

(И да, три смежных квадрата, казалось бы, одинаковых цветов на самом деле три разных оттенка серого.)

1 Да, еще один ответ R,и даже не самый короткий(сейчас самое короткое для R) - извинения. Мне не хватало красивого рендеринга в R.


1
Как вы исправили соотношение сторон?
koekenbakker

? В основном так же, как вторая версия @ 37image(matrix(1:50,5),c=gray(1:50/51))
Vlo

@koekenbakker Это не исправлено, я вручную настраиваю окно вывода. Это не идеальное , но код делает производить квадраты для данного окна, а другой код здесь имеет сходные проблемы.
Конрад Рудольф

8

Matlab 35 благодаря санчизам

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

Matlab 36

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

Отображает 50 квадратов, заполненных значениями серого от 1 до 50, и 2 дополнительных прямоугольника, заполненных значениями серого 0 и 51:

введите описание изображения здесь

Матлаб, 45

imshow(uint8(ones(20,1)*floor(1:0.05:50.95)))

Вы можете сбрить колоссальный 1 байт, используя int8 вместо uint8.
Sanchises

Решение Sanchises лучше!
Мемминг

@Memming Это зависит от какой-то непонятной (недокументированной?) Функции, которую я обнаружил, только попробовав ее. Дайте Штеффену должное, где бы это ни было :)
Sanchises

@TheBestOne / JaBe: Ваш ответ на самом деле не работает, так как он не отображает квадраты. Штеффен использует int8 для округления 1000 или около того значений до 50 квадратов.
Sanchises

7

JavaScript, 87 90 байт

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

Это выводит квадраты в HTML, потому что это действительно единственный метод графического вывода в JavaScript. Спасибо edc65 за сбривание 3 байта.


1
Сохранить 3 байта: for(i=90;i>40;)document.write('<p style=background:#'+i+i+i--+';height:9ex;width:9ex>'). Невозможно использовать однозначные цифры, потому что серые не будут уникальными (# 111 того же цвета, что и # 111111)
edc65

Вы можете использовать другие подразделения. 1cmили 1 9mmбудет лучше и получит более широкую поддержку. Без изменения вашего количества байтов.
Исмаэль Мигель

7

PHP 96 88 74 байта

Спасибо Исмаилу Мигелю за сохранение 22 байта!

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

Записывает 50 <p>секунд с высотой и шириной 9 мм (которые должны быть больше 20 пикселей на большинстве экранов), сложенных друг на друга, с незначительной разницей в оттенках.

Сгенерированный результат (изображение уменьшено и повернуто на 90 °):

Результат


7

Matlab - 33 байта

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

Несмотря на подробные команды, результат все еще довольно компактен. Это выглядит немного лучше , если вы замените surfс , surfaceно это стоит 3 символов.

Если вы не заметите 50-й серый квадрат, потому что он немного больше остальных!


Используйте ndgrid! (На 2 байта меньше). И каждый квадрат различен серым?
Луис Мендо

7

Javascript (77 71 байт):

Этот ответ больше не основан на IE11. Это работает, потому что браузер преобразует плохие цветовые коды в пригодные для использования (добавляя #к числу).

Вот код:

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

Firefox все еще обладает способностью делать круги.

(Малые изменения: Изменены for(i=61;i-->9;)в for(i=59;i-->9;)потому , что она производила 52 квадратов)


Старый ответ:

Это основано на моем ответе PHP и использует почти те же самые способы, чтобы сделать квадраты:

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

Не самый короткий ответ, но стоит добавить сюда.


Это решение не совместимо с Chrome (выдает несколько зеленых цветов) и Firefox (тот же результат, но выдает круги? OO WTH?)

Поскольку это код-гольф, приемлемо решение, работающее с определенной версией или конкретным программным обеспечением.


2
Это может быть только я, но выполнение этого фрагмента кода приводит в основном к зеленым и синим кружкам. Я вижу, @ MartinBüttner побил меня этим комментарием, так что это не только я ...
MrLemon

@MrLemon Я думаю, что Chrome не нравится RGB -.- Но он работает на IE11. Поскольку я не пытаюсь сделать кросс-браузерное решение, это приемлемо. Я добавлю это к ответу.
Исмаэль Мигель

@IsmaelMiguel Все в порядке, я думаю. Но просто для ясности, я сейчас на FF. Может подтвердить, что работает на IE11, хотя.
MrLemon

@MrLemon Это работает на IE11, так как я попробовал дома. Я могу предоставить принт-экран при необходимости. Firefox делает круги с ним. Я понятия не имею, как. Нет способа отменить это. Я ожидал, что у IE будут свои причуды, а не Firefox.
Исмаэль Мигель

Firefox, кажется, помещает полукруги на концах <hr>, вероятно, чтобы это выглядело более гладким. Понятия не имею, что происходит с цветами. Во всяком случае, мой +1 за то, что сбил меня с толку.
MrLemon

7

Пит-2 * 103 = 206

Это уникально тем, что исходный код и выходные данные выполняют задачу:

болтушка

Большая часть из них декоративная, поэтому я сосчитал только два верхних ряда, которые прекрасно стоят в одиночестве. Выводит ppm в градациях серого, как это сделали некоторые другие.


6

JavaScript - 70 байт

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


6
Размер блока меньше 20 пикселей
edc65

1
Затем вам нужно настроить размер шрифта вашего браузера;)
Sphinxxx

1
Вы должны использовать font:3em aили font-size:3em. Я понижаю этот из-за размера коробок. Пока вы не исправите.
Исмаэль Мигель

3
Вы можете использовать i--вместо i-=1.
flawr

1
Вы можете использовать <b>тег. Это никак не изменит код, за исключением того, что текст будет черным. Это не требование, но это может быть хорошей идеей.
Исмаэль Мигель


6

PHP (62 60 63 72 71 62 59 байт):

Я сделал самое короткое, что я мог найти:

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

Это точно такой же код, как и мой ответ на Javascript (с 71 байтом) .

Но НАМНОГО короче!

Это имеет причуду в Firefox: вместо квадратов Firefox делает круги ! (Go маразм!)
Othen , чем все браузеры производят правильный цвет (даже с недостающим #на colorатрибут).


Неверные представления и список изменений :

Старый ответ, с 62 байтами.

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

Все оттенки идеально выровнены.

Это решение не будет работать для Chrome (будет создавать квадраты с несколькими цветами) и Firefox (что делает круги oO Да, круги с <hr>! Горизонтальная линейка - это круг в Firefox!).
Вы можете проверить это на IE11, и это должно быть хорошо.


(просто снято сверху)

Я заметил что-то ужасное: он выводил #111вместо #010101некоторых цветов.

Это означало, что некоторые цвета повторялись.

Поэтому пришлось пожертвовать несколькими байтами:

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

Выводит 50 оттенков в идеальном порядке, от светлого к темному.

Из-за правильной точки, сделанной @ edc65 , мне пришлось добавить width=20, чтобы получить идеальные квадраты .

Уменьшен еще один байт путем замены f!=$cна f>$c, который работает отлично.


Финальная версия, без width=20:

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

Это неверно, потому что это необходимо для вывода квадратов.
Это выводит оттенки от светлого к темному.


Уменьшен 1 байт путем переключения на whileцикл, например так:

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

Первое решение:

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

Здесь нет аккуратно упорядоченных оттенков, но есть 50 различных.

Ничто не говорит о том, что они должны быть заказаны, но есть требование к размеру.

Я надеюсь, что смогу уменьшить это намного больше.

Вы можете проверить это на http://writecodeonline.com/php/ (нажмите «Показать как HTML»).


5

CSS (87 символов)

Использует анимацию;)

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

Выполняемая версия длиннее, поскольку Webkit все еще нуждается в префиксе поставщика. :(

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

Если нам разрешен случайный пустой <a>элемент, мы можем уменьшить его до 72 символов:

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

Видеть? CSS является законным языком программирования!


4

R, 36 байт

Я могу сделать ответ freekvd короче.

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

Выход

(Извините за то, что не сделал комментарий под его решением. Stackexchange пока не позволяет мне комментировать, голосовать и т.д.).


Разве это не производит 51 квадрат?
MickyT

Это делает наименьший квадрат шириной менее 20 пикселей? Это зависит от вашего dpi, но самый большой квадрат - 1 дюйм, поэтому изображение с 72 dpi будет иметь самый маленький квадрат 11 пикселей.
freekvd

Хотя, если вы сделаете 1:99, вы можете утверждать, что 50 самых больших квадратов соответствуют критериям.
freekvd

4

PostScript, 34 байта

В кодировке ISO-Latin-1:

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

Это двоичный эквивалент:

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

(Предполагается, что вы используете его на устройстве шириной не менее 1000 точек [= 10 дюймов = 25,4 см].)


Дайте нам серию шестнадцатеричных закодированных октетов (то есть:) 0f 4e 75 a3 ....
haneefmubarak

@haneefmubarak Я буду, мне просто нужно вернуться домой, чтобы я мог использовать свою программу для игры в гольф. (Кажется, что онлайн-
посткомпактный компакт-диск

@haneefmubarak OK, обновлено прямым представлением файла, хотя это не шестнадцатеричные октеты. (Я добавлю это позже, когда смогу использовать настоящую программу-конвертер.)
AJMansfield

4

DrRacket - 83

Просто ради увольнения DrRacket через 1 год после «Введение в разработку систематических программ».

РЕДАКТИРОВАТЬ :

(require htdp/image)(map(λ(i)(rectangle 50 50'solid(make-color i i i)))(range 50))

Сохраните пару символов: переключитесь с 2htdp/imageна htdp/image, измените строку "solid"на символ 'solid. Для больших сбережений, изменить (range 9 209 4)на (range 50): оттенки серого просто должны быть различны, не легко отличить друг от друга для человеческого глаза!
Омар

Вы можете сохранить несколько символов, используя for/set:(require htdp/image)(for/set([i 50])(rectangle 50 50'solid(make-color i i i)))
Алексис Кинг

4

C # - 173

Использование 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();

Расширен :

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

Выход :

выход


Предложение: for(int i=0;i<250;i+=5)а затем FromArgb(i,i,i)и Rectangle(i*4,0,20,20)дает 168
Томас Уэллер

Кроме того, FillRectangle()имеет перегрузку, которая принимает координаты прямоугольника напрямую, так что вы можете удалить new Rectangle()и уйти с 153
Томас Веллер

4

JavaScript, 152 байта.

Ладно, может быть, это не лучшее решение, но вот мое.

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)

Вот вывод с помощью css float left (просто для того, чтобы легче было считать квадраты) и без:

с плавающей точкой css

без поплавка css


2
Вы можете сохранить несколько байтов, используя однобуквенные имена переменных, отбрасывая все varключевые слова и удаляя ненужные пробелы. Также, пожалуйста, укажите название языка и количество байтов в своем ответе.
ProgramFOX

Спасибо за вклад. Я уменьшил пробел и добавил количество байтов, но я не уверен, что вы имеете в виду, отбрасывая varключевые слова.
Девон Тейлор

Неважно. Я чувствую себя глупо
Девон Тейлор

Используйте c+=5вместо c=c+5. Кроме того, вы можете сохранить 2 символа, поставив n=c.toString()в конце предыдущей строки, а затем снова эту строку в конце предыдущей строки. Таким образом, ваша вторая строка будетfunction w(){if(c<250){n=c.toString()
mbomb007

Кроме того, я уверен, что вы можете опустить pxвысоту и ширину.
mbomb007
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.