Ваша задача состоит в том, чтобы воспринимать ввод как строку текста и выводить его следующим образом.
Ввод, вывод
На входе будет строка, содержащая только печатные символы ASCII. Первый или последний символы никогда не будут пробелами, и никогда не будет двух пробелов подряд. Он всегда будет длиной не менее двух символов.
Ваш вывод должен быть такой же строкой, преобразованной в цвета радуги, как будет описано ниже. Вывод может быть в виде изображения (сохранен в файл или каким-либо другим образом сделан доступным), или он может просто отображать результат на экране (как это делает эталонная реализация ниже).
преобразование
Чтобы определить, каким цветом должна стать каждая буква в строке, используйте следующий алгоритм. Обратите внимание, что каждая буква имеет свой индивидуальный цвет . Это не градиент!
Если этот символ пробел:
- ... это не имеет значения, потому что пространства не могут ... иметь цвет в любом случае. Просто выведите пробел.
Иначе:
Let
i
= индекс этого символа в строке (на основе 0, так что для самой первой буквы это0
), не считая пробелов. Например, в строкеfoo bar
это значение будет4
дляa
. Другими словами, это то, сколько непробелов было встречено до сих пор.Let
n
= количество непробелов в строке.Цвет этой буквы теперь может быть выражен в цилиндрической системе координат HSL как [hue = (
i
/n
) * 360 °, насыщенность = 100%, яркость = 50%].
Обратите внимание, что эти направления подразумевают, что выходные данные для foo
и f oo
должны быть точно такими же, за исключением добавления пробела после f
. То есть все буквы должны сохранять одинаковые цвета.
Дополнительные правила для процесса преобразования описаны ниже, в разделе « Правила ».
Ссылочная реализация
Это написано на JavaScript, и вы можете попробовать его, нажав кнопку «Запустить фрагмент кода».
window.addEventListener('load', function() {
addRainbow('Your challenge is to take input as a line of text and ' +
'output it like this.');
});
// append this text rainbow-ified to the argument (document.body by default)
function addRainbow(text, el) {
(el || document.body).appendChild(makeRainbow(text));
}
// returns a <div> that contains the text in a rainbow font
function makeRainbow(text) {
var div = document.createElement('div');
var letterCount = text.replace(/ /g, '').length, spaceCount = 0;
text.split('').forEach(function(letter, idx) {
if (letter == ' ') ++spaceCount;
div.appendChild(makeLetter(letter, (idx - spaceCount) / letterCount));
});
return div;
}
// returns a <span> that contains the letter in the specified color
function makeLetter(letter, hue) {
hue = Math.floor(hue * 360);
var span = document.createElement('span');
span.appendChild(document.createTextNode(letter));
span.style.color = 'hsl(' + hue + ', 100%, 50%)';
return span;
}
правила
При вычислении значения оттенка буквы вы почти наверняка получите десятичное (нецелое) число. Вы можете округлить это до ближайшего целого числа, поставить пол, взять потолок или просто не округлить вообще.
Размер шрифта должен быть читабельным. Здесь это определяется как размер шрифта 10pt или больше.
Вы можете использовать холст фиксированной ширины или «область рисования» для вывода текста, но он должен уметь соответствовать примеру, приведенному в самом первом предложении этого поста.
Подсчет очков - это код-гольф , поэтому победит самый короткий код в байтах.
Ответы:
Perl, 95
Код 92 байта + 3 для
-p
Этот скрипт использует приближение цветов, доступных терминалу (максимум 256), в настоящее время включающее только несколько цветовых точек, выбранных из этого списка , так что, скорее всего, это не спецификация, но в любом случае это было весело! Я отфильтровал список, чтобы показать только цвета с
S
иL
значениями100%
и50%
соответственно, затем отсортировал по оттенкам, упаковал числа в строку и выбрал цвета из этого списка.Эта реализация включает в себя непечатные символы! Украл @ edc65 идею только заменить
\S
вместо.
простого, но умного!HexDump:
Обратитесь к hexdump, скопировав приведенный выше текст и запустив:
вставка в данные и нажатие Ctrl+ D.
Запустите с помощью:
Это производит вывод как:
источник
Python 2: 240 с использованием PIL и colorsys lib
Пример вывода:
Спасибо @agtoever и @Trang Oul за некоторые советы по игре в гольф, а также @Mauris за указание места.
Чтобы добавить шрифты истинного типа, необходимо настроить размер шрифта, включая горизонтальное смещение и изменение цвета в зависимости от длины.
Шрифт, который я использовал, доступен здесь : В результате (верхняя часть просто печатает строку, нижняя - для каждой буквы):
источник
as P
и выпишиPIL
дважды и выиграй одного персонажа. Изменениеimg
кi
и выиграть 4 больше символов.255
в переменную, замените все вхождения и используйте в(a,)*3
качестве белого цвета. Заменитьfloat(j)
на(j+.0)
.float(j)
на1.*j
u=len(s) a=255
=>u,a=len(s),255
). Уберите[]
скобкиtuple
, они не нужны. Замените цикл на понимание списка (метод будет оцениваться как побочный эффект).JavaScript (ES6), 114
117 125Edit2 Сохранено 3 байта thx @Dom Hastings Редактировать неверный HTML, но все равно работает.
Обычное примечание: тестовый запуск фрагмента в браузере, совместимом с EcmaScript 6 (в частности, не Chrome, не MSIE. Я тестировал на Firefox)
источник
)
после своегоhsl(
заявления, поскольку оно по-прежнему работает для меня в Firefox!${c}'
чтобы'+c
сохранить еще 2 ... Лучше вернуться к моей!Python 3, 131 байт
Симуляция на ответ Дому Гастингса, но реализована на python.
Струна
'|\x82\x88\x8ejF"#$%\x1f\x19\x137[\x7f~}'
была построена из списка[124,130,136,142,106,70,34,35,36,37,31,25,19,55,91,127,126,125]
цветовых кодов терминала для отображения по порядку. Они были отфильтрованы, поэтому они включают только цвета с насыщенностью 100% и значением 50%. Затем список был отсортирован, поэтому правильные оттенки отображались первыми.Принимает ввод из стандартного ввода и возвращает его в стандартный вывод.
Ваш терминал, который вы используете, ДОЛЖЕН поддерживать управляющие коды ANSI для правильной работы.
Или сокращенная версия с буквенными байтовыми символами (неправильно вставлена):
Литеральный hexdump:
Спасибо @swstephe за сохранение 9 байтов (а также за то, что я заметил, что мой подсчет байтов был совсем немного неправильным)!
источник
PHP, 165 байт
Запустить с вводом в качестве параметра "s"
HTML-код недействителен, но он должен отображаться во всех основных браузерах (протестировано в Chrome и Firefox)
источник
PHP 4.1,
112103102 байтаЯ использовал ответ @DankMemes в качестве отправной точки. С тех пор я реализовал массу изменений, в том смысле, что код отличается.
Реализация похожа, код совершенно другой.
Чтобы использовать его, просто установите значение в SESSION / GET / POST / COOKIE с именем
s
.Результат выполнения этой функции в тестовом предложении:
источник