Привет Мир Радуга


11

Работа с цветами в языках без разметки часто усложняет ситуацию. Я хотел бы увидеть некоторые варианты использования цвета на разных языках.

Цель этого конкурса - вывести «Hello World» в семи цветах радуги.

Согласно Википедии, это 7 цветов.

Red      #FF0000 (RGB: 255, 0, 0)
Orange   #FF7F00 (RGB: 255, 127, 0)
Yellow   #FFFF00 (RGB: 255, 255, 0)
Green    #00FF00 (RGB: 0, 255, 0)
Blue     #0000FF (RGB: 0, 0, 255)
Indigo   #6600FF (RGB: 111, 0, 255)
Violet   #8B00FF (RGB: 143, 0, 255)

Правила

  1. Программа должна вывести «Hello World». (Не обязательно должен быть текст, но он должен быть различим как «Hello World»)
  2. Каждая буква должна быть разного цвета.
  3. Цвета могут быть в любом порядке.
  4. Вы должны использовать каждый из семи цветов хотя бы один раз. (Вы можете использовать больше, чем данные цвета)
  5. Не использовать языки разметки в любом случае .

Победителем становится тот, у кого наименьшее количество символов И кто следует правилам

Бонус -1 персонаж, если написано в DART

Я выберу победителя 11 января (если я помню; D).

Удачи

ПОБЕДИТЕЛЬ (ы)

Я ошибся D :, обновил победителей.

Первый. stranac - Python, 60 символов

Второй. Илмари - Каронен Perl + GD, 146 символов

Самая короткая длина с соблюдением всех правил.

Брауни указывает на JiminP для ответа DART.

Ответы:


7

Питон, 60 символов

Сейчас используются 7 цветов и «правильные».

Использует escape-последовательности ANSI. Подчеркивание есть только для того, чтобы не было невидимого пространства.

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

for p in zip(range(7)*2,'Hello_World'):print'\033[3%im%s'%p,

И скриншот, как того требует MrZander: введите описание изображения здесь


Я сделал ошибку? Пожалуйста, опубликуйте скриншот, подтверждающий, что вы правильно использовали все цвета. «8 цветов от черного до белого» не звучит так, как будто использовались 7 требуемых цветов.
MrZander

@MrZander: я обновил свой ответ, и надеюсь, что теперь он вас радует. Кстати, вы уверены, что 6-й цвет, который вы предоставили, является правильным? Это почти так же, как 7-й.
stranac

Взял это прямо из Википедии ... Я не эксперт по цвету, ха-ха.
MrZander

2
Это зависит от пользовательской палитры для работы. Например, Hон печатается с использованием escape-кода для черного цвета, поэтому он не виден на большинстве терминалов.
Хаммар

12

Mathematica

ImageMultiply[ColorNegate[Graphics[Text[Style["Hello World",30]],ImageSize->190]],ColorData["Rainbow","Image"]]

Я знаю, я знаю, это не соответствует правилам ... но мне пришлось попробовать поиграть с функциями обработки изображений Mathematica.

Снимок экрана:

Привет мир!!!!!!!


10

Haskell, 88 символов

f(c,n)=putStr$"\27["++show n++"m"++[c]
main=mapM_ f$zip"Hello World\n"$35:cycle[31..36]

Снимок экрана

Обратите внимание, что здесь используются цвета терминала ANSI, из которых только 6, и они могут не совпадать с точными данными (это зависит от настроек терминала), поэтому я немного изменю правила здесь.

Немного более длинная версия с почти правильными цветами, 107 символов

Эта версия использует цвета xterm вместо цветов ANSI. Это не зависит от каких-либо пользовательских палитр и использует самые близкие цвета, которые я мог найти в 256-цветовой палитре xterm.

f(c,n)=putStr$"\27[38;5;"++show n++"m"++[c]
main=mapM_ f$zip"Hello World\n"$cycle[196,208,226,46,21,57,93]

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


7

Питон, 261 символ

C=((255,0,0),(255,127,0),(255,255,0),(0,255,0),(0,0,255),(111,0,255),(143,0,255))
print'P3 67 5 255'
for i in range(335):print'%d %d %d'%(C+C[2:])[i%67/6]if 0x4f7c938a00e7df7d12208a8aa0220820a34413d154044105f7e8828a28808820828cf04f39100e0417d1>>i&1 else'0 0 0'

Реализует спецификацию точно, генерируя изображение в ppm. Вот результат, преобразованный в gif и увеличенный в 4 раза:

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


Хе-хе, мило. Мне понадобилось много времени, чтобы понять.
cemper93

2
n=255;C=((n,0,0),(n,127,0),(n,n,0),(0,n,0),(0,0,n),(111,0,n),(143,0,n))
Стивен Румбальский

7

Perl -> ANSI терминал, 53 символа

s//Hello World/;s/./\e[3${[5,(1..6)x2]}[pos]m$&/g;say

Это приводит к тому же результату, что и решение Hamke's Haskell . Он использует say, поэтому требует Perl 5.10+ и -M5.010(или -E) переключатель. Для старых версий замените sayна print. Тривиальное односимвольное сокращение может быть достигнуто путем замены \eбуквенным символом ESC, но это усложнит чтение и редактирование кода.

Редактировать: Добавлены два символа, чтобы точно соответствовать выводу Хаммара, и чтобы фактически показать все шесть возможных цветов терминала. (В более ранней версии единственным символом, напечатанным цветом 6 = голубой, был пробел.)

Снимок экрана:

Привет мир


Изменить 2: Если разрешено использование пользовательской палитры терминалов (и подчеркивания для пробела), то я могу легко воспроизвести точные цвета, указанные в спецификации, всего с 50 символами:

$_=Hello_World;s/./\e[3${[(0..6)x2]}[pos]m$&/g;say

Снимок экрана:

Привет мир


3

Perl -> HTML, 99 символов

@c=(("00")x5,77,(ff)x5,77)x2;print"<font color=#",@c[$i+8,$i+4,$i++],">$_"for split//,"Hello World"

Снимок экрана:

Привет мир

HTML, вероятно, не пройдет никаких валидаторов, но должен быть понятен практически всеми браузерами. Этот код не дает точные цвета RGB, которые вы перечислили, но он очень близок. В частности, цвета букв:

H  Red           #FF0000
e  Orange        #FF7700
l  Yellow        #FFFF00      
l  Chartreuse    #77FF00
o  Green         #00FF00
  (Spring green  #00FF77)
W  Cyan          #00FFFF
o  Sky blue      #0077FF
r  Blue          #0000FF
l  Indigo        #7700FF
d  Violet        #FF00FF

Вывод выглядит намного лучше на черном фоне, но явная печать <body bgcolor=black>стоила бы мне 28 дополнительных символов. Вы можете изменить настройки браузера, чтобы добиться того же эффекта. :-)


3
Возможно, я не был достаточно конкретен с правилом 5. Я не хотел, чтобы разметка использовалась в сочетании с другим языком. Но в любом случае очень креативный код.
MrZander

3

Perl + GD, 146 символов

Согласно комментариям к моему другому ответу , вот решение, которое напрямую создает файл изображения с использованием библиотеки GD:

use GD'Simple;move{$m=new GD'Simple 70,12}2,12;s//Hello World/;s/./fgcolor$m(((0)x5,127,(255)x5,127)x2)[$i+8,$i+4,$i++];string$m$&/eg;print$m->png

И вот вывод:

Привет мир

Опять же, использование черного фона выглядело бы лучше, но стоило бы мне 29 символов ( $m->bgcolor(0,0,0);$m->clear;).

Изменить: выяснил, как сбрить 20 символов с помощью (ab), используя косвенную запись объекта и несколько других настроек. Новый код выдает предупреждение, но все равно работает нормально.


Это больше похоже на это;)
MrZander

Пока что это самое низкое количество символов, которое соответствует всем правилам до точки.
MrZander

3

Постскриптум 155 143

Это зависит от способности Ghostscript «выяснить», что Palatino является сокращением от Palatino-Roman.

/h{c 1 1 sethsbcolor}def/c 0 def
200 400 moveto/Palatino 36 selectfont
h{32 ne{/c c .14 add dup 1 gt{1 sub}if def}if pop
h}(Hello World!)kshow

1
Я полагаю, «Времена» короче, но ... тьфу.
Люсер Дрог

Украл некоторые ваши идеи ...
Томас В.

3

Некоторые разные подходы к этому с

PostScript

Первый: самый короткий ( 89 ):

9 9 moveto/Courier 9 selectfont
0{pop pop 
dup 1 1 sethsbcolor
.07 add}( Hello World)kshow

Предоставленный результат

Un-golfed:

9 9 moveto
/Courier 9 selectfont
0                       % hue
{                       % hue c1 c2
  pop pop               % hue
  dup 1 1 sethsbcolor   % hue
  .07 add               % newHue
}( Hello World)kshow

Это непрерывно меняет цвет в направлении х, используя цветовое пространство hsb. (Идея использовать цвета hsb и kshow зачисляется luser droog - см. Его запись!) Он не использует точные семь цветов, заданные MrZander.

Ограничиваясь цветами MrZander, я получаю 141 символ:

9 9 moveto/Courier 9 selectfont(H e*l4l4oI  WIosrsl{d~)dup
0 2 20{2 copy
1 add get 32 sub 166 div 1 1 sethsbcolor
1 getinterval show
dup}for

Предоставленный результат

Это кодирует значение оттенка цветов MrZander как один байт в диапазоне ASCII для печати. Этот байт преобразуется в значение оттенка в диапазоне от 0 до 1 путем вычитания 32 и деления на 166. За каждым символом строки «Hello World» следует его закодированное значение оттенка.

Un-golfed:

9 9 moveto
/Courier 9 selectfont
(H e*l4l4oI  WIosrsl{d~)dup     % string string
0 2 20{                         % string string index
  2 copy                        % string string index string index
  1 add get                     % string string index hueChar
  32 sub 166 div                % string string index hueValue
  1 1 sethsbcolor               % string string index 
  1 getinterval                 % string substring
  show                          % string
  dup                           % string string
}for

ТОДО : Что-то не так с цветами.


2

Некоторые обманывают, но решают проблему

Баш + Рубин (нужен lolcatдрагоценный камень)

echo Hello World | lolcat -p 0.25

Радуга Привет, Мир


1

Дарт в HTML, 135 134-1 = 133

main(){for(var s="Hello World",i=0;i<11;print("<font color=#${'F00F60FB0FF06F00F00B606B00F60F90F'.substring(i*3,i*3+3)}>${s[i++]}"));}

Есть ли способ раскрасить текст без использования языка разметки? Я не могу проверить холсты ...


Оооо ... +1 даже с HTML
MrZander

1

Я знаю, что там написано «нет разметки в любом случае», но я бы хотел представить этот CSS из 468 символов:

<style>b{font-weight:normal}i{font-style:normal}u{text-decoration:none}b:after{content:'e';color:orange}b:before{content:'H';color:red}i:after,i:before{content:'l'}i:before{color:#ff0}i:after{color:#0f0}u:before{content:'o ';color:#66f}u:after{content:'W';color:blue}s{text-decoration:none}s:before{content:'o';color:#006}s:after{content:'r';color:#60f}p{display:inline}p:before{content:'l';color:#8b00ff}p:after{content:'d'}</style><b></b><i></i><u></u><s></s><p></p>

Ничего из стилизации не сделано с разметкой.


0

Рубин

Еще 242 процедурных способа:

require 'paint'

s = "HelloWorld"
out = ""
[
  '#FF0000',
  '#FF7F00',
  '#FFFF00',
  '#00FF00',
  "#00FFFF",
  "#5555FF",
  '#0000FF',
  '#000077',
  '#6600FF',
  '#8B00FF'
].each_with_index { |c, i| out << "#{Paint[s[i], c.dup]}" }
puts out

Если мне удастся придумать лучший способ создать цвета, я буду. Несколько из средних я просто сделал несколько проб и ошибок для получения близких цветов.

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