Привіт, світова веселка


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 :, оновлено переможців.

1-й. stranac - Python, 60 символів

2-й. Ільмарі - Каронен Перл + ГД, 146 символів

Найкоротша довжина з дотриманням усіх правил.

Брауні вказує на JiminP для відповіді DART.

Відповіді:


7

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

Зараз використовуємо 7 кольорів та "правильні".

Використовує послідовності втечі. Підкреслення є просто так, що це не невидимий пробіл.

Ця версія друкує деякі додаткові пробіли через те, як працює друк python, але ці пробіли зберігають досить багато символів, тож мені добре, що вони знаходяться там.

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

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


Я помилився? Будь ласка, опублікуйте скріншот, який підтверджує, що ви правильно використовували всі кольори. "8 кольорів від чорного до білого" не здається, що використовували 7 необхідних кольорів.
MrZander

@MrZander: Я оновив свою відповідь, і сподіваюсь, вона зараз вам сподобається. Btw, ти впевнений, що вказаний 6-й колір правильний? Це майже те саме, що і 7-е.
странак

Узяв це прямо з Вікіпедії ... Я не знавець кольорів.
MrZander

2
Це покладається на власну палітру для роботи. Наприклад, Hдрукується з використанням евакуаційного коду для чорного кольору, тому його не можна побачити на більшості терміналів.
хаммар

12

Математика

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

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

Знімок екрана:

Привіт Світ!!!!!!!


10

Хаскелл, 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

Це дає такий самий вихід, як і рішення Haskell Hammar . Він використовує say, тому потребує perl 5.10+ та перемикач -M5.010(або -E). Для старих перлов замініть sayна print. Тривіального скорочення одного символу можна досягти, замінивши \eбуквальний символ ESC, але це ускладнить читання та редагування коду.

Редагувати: Додано два знаки, щоб точно відповідати результатам Hammar і фактично показати всі шість можливих кольорів терміналу. (У попередній версії єдиним символом, надрукованим кольором 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 "з'ясувати", що Палатіно короткий для Палатино-Римського.

/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
Я гадаю, "Таймс" коротший, але ... ну.
luser droog

Вкрав кілька своїх ідей ...
Thomas W.

3

Деякі різні підходи до цього

PostScript

Перший: найкоротший ( 89 ):

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

Виведений результат

Без гольфу:

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

Це безперервно змінює колір у напрямку x за допомогою кольорового простору 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" супроводжується кодованим відтінком.

Без гольфу:

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

TODO : Щось не зовсім в порядку з кольорами.


2

Деякі обман, але вирішують проблему

Bash + Ruby (потрібен 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++]}"));}

Чи є спосіб розфарбувати тексти без використання мови розмітки? Я не можу перевірити полотна ...


Oooo ... +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.