На XKCD № 99 с заголовком «Binary Heart» показано простое изображение из нулей и единиц, причем некоторые цифры окрашены в красный цвет.
Красное сердце видно невооруженным глазом, но сообщение, скрытое в двоичной последовательности, - нет. Если вы удалите все пробелы и символы новой строки и интерпретируете двоичную последовательность как 8-битный ASCII-код, вы получите сообщение:
iloveyOuilOveyouiloveyOuilOveyOuiloveyouilOveyouilOveyOuilOv
Мило верно?
Pssst ... Строка не является чистым повторением строки.
Ваша задача состоит в том, чтобы создать это двоичное изображение с 21 цифрой в поперечнике и 23 цифрами вниз. Должен быть ровно один пробел между каждой цифрой в каждой строке и одна новая строка для каждой новой строки. Обратите внимание, что последние биты - это только начало буквы e
, так 21*23
как не делятся на 8. Эти биты тоже должны быть правильными.
Функция или программа не должны принимать никаких данных. Начальные и конечные пробелы и новые строки принимаются.
Результат вашего кода должен выглядеть так:
0 1 1 0 1 0 0 1 0 1 1 0 1 1 0 0 0 1 1 0 1
1 1 1 0 1 1 1 0 1 1 0 0 1 1 0 0 1 0 1 0 1
1 1 1 0 0 1 0 1 0 0 1 1 1 1 0 1 1 1 0 1 0
1 0 1 1 0 1 0 0 1 0 1 1 0 1 1 0 0 0 1 0 0
1 1 1 1 0 1 1 1 0 1 1 0 0 1 1 0 0 1 0 1 0
1 1 1 1 0 0 1 0 1 1 0 1 1 1 1 0 1 1 1 0 1
0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 1 0 0 0 1 1
0 1 1 1 1 0 1 1 1 0 1 1 0 0 1 1 0 0 1 0 1
0 1 1 1 1 0 0 1 0 1 0 0 1 1 1 1 0 1 1 1 0
1 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 1 0 0 0 1
0 0 1 1 1 1 0 1 1 1 0 1 1 0 0 1 1 0 0 1 0
1 0 1 1 1 1 0 0 1 0 1 0 0 1 1 1 1 0 1 1 1
0 1 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 1 0 0 0
1 1 0 1 1 1 1 0 1 1 1 0 1 1 0 0 1 1 0 0 1
0 1 0 1 1 1 1 0 0 1 0 1 1 0 1 1 1 1 0 1 1
1 0 1 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 1 0 0
0 1 0 0 1 1 1 1 0 1 1 1 0 1 1 0 0 1 1 0 0
1 0 1 0 1 1 1 1 0 0 1 0 1 1 0 1 1 1 1 0 1
1 1 0 1 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 1 0
0 0 1 0 0 1 1 1 1 0 1 1 1 0 1 1 0 0 1 1 0
0 1 0 1 0 1 1 1 1 0 0 1 0 1 0 0 1 1 1 1 0
1 1 1 0 1 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 1
0 0 0 1 0 0 1 1 1 1 0 1 1 1 0 1 1 0 0 1 1
Это код гольф, поэтому самый короткий ответ (в байтах) выигрывает.
Leaderboard
источник
O
S из строки вывода ASCII!Ответы:
Желе ,
363332 байтаСпасибо @JonathanAllan за игру в 3 байта!
Попробуйте онлайн!
Как это устроено
Основная ссылка
выполняется niladically (то есть, без каких-либо аргументов) при запуске программы. Его возвращаемое значение будет напечатано неявно.
найти индексы цитируемых символов на кодовой странице желе и интерпретировать их как цифры биективного базового числа 250. Это дает целое число 13021639057551959994 .
преобразует сгенерированное целое число в двоичное. В результате получается битовый массив 1011010010110110001001111011101100110010101111001010011110111010, который соответствует кодировке UTF-8 строки ilOveyOu , сдвинутой на один бит влево.
Сдвиг необходим, потому что
B
не может вернуть битовый массив с начальным 0 . Другие варианты включают отрицание двоичных цифр или вычисление квадрата в обратном порядке, но этот подход экономит один байт.формирует сгенерированный массив, например, в диапазоне от 1 до 484 , то есть повторяет содержимое массива столько раз, сколько необходимо для достижения длины 484 .
Это еще один бит, который нам нужен, чтобы учесть сдвиг. Мы могли бы удалить первый бит сейчас, но сделать это позже означает, что все биты, которые должны быть заменены, лежат на четных индексах, что позволяет нам сохранить вышеупомянутый байт.
принимает кодовые точки символов между
“
и‘
( [10, 58, 74, 138, 154, 186] ), затем «снимает их», т. е. умножает их на 2 ( [20, 116, 148, 276, 308, 372 ] ).условно отрицает биты в этих индексах. Это соответствует изменениям O / O в исходной схеме.
В заключение,
удаляет массив битов (удаляя первый бит), разделяет оставшийся массив на строки из 21 элемента и печатает полученную матрицу в виде сетки.
источник
O
по умолчанию, я думаю, что это делает это:“ỊḂr×C)ḃȯ’B¬ṁ483¬“Œ` ° @‘+\¤¦s21G
Желе ,
41 40 3533 байтаСпасибо @Dennis за то, что сделали конец
ṖṖCG
! (дополнитьC
=1-x
вместо логического нет¬
)TryItOnline
Как?
«Цветная» версия, 77 байт
TryItOnline
У желе отсутствует цветопередача, но мне все равно это легче увидеть (я дальтоник) ...
Как?
источник
¬
, последние четыре байта могут статьṖṖCG
. :)complement
?На самом деле, 58 байт
Попробуйте онлайн!
объяснение
Здесь есть три основные части, поэтому я собираюсь разбить их соответствующим образом.
Часть 1. Построение строки base-256
На самом деле мы собираемся построить двоичную строку в обратном порядке, чтобы воспользоваться структурой на основе стека (LIFO) и избежать сложностей с ведущими нулями в двоичной строке. Таким образом, целевой двоичной строкой является
110011011101111001000110110100101101010111011110010100111101010011001101110111100100011011010010110101011101111011010011110101001100110111011110010001101101001011010101110111101101001111010100110011011101111011000110110100101101010111011110010100111101010011001101110111100100011011010010110101011101111001010011110101001100110111011110110001101101001011010101110111101101001111010100110011011101111001000110110100101101010111011110010100111101010011001101110111101100011011010010110
, что эквивалентно20083405242288679348048842451418880256193335738939042905519679590571514414673488599852759703515507690399267425671627412178904636115120346432419478
десятичному. В base-256 ( для преобразования используется таблица символов CP437 ) соответствующая строка имеет вид♠n≥6û«≥₧ªn≥6û«÷₧ªn≥6û«÷₧ªn÷6û«≥₧ªn≥6û«≥₧ªn÷6û«÷₧ªn≥6û«≥₧ªn÷6û
. Чтобы создать исходную двоичную строку, мы создаем строку base-256 (используя преимущества шаблона в ней) и выполняем базовые преобразования в десятичную и двоичную.Строка base-256 имеет следующий формат (для ясности добавлены пробелы и символы новой строки):
Таким образом, каждая из 7 средних секций может быть сформирована с помощью каркаса
«%s₧ªn%s6û
и заменой%s
частей либо на,≥
либо на÷
.Конкретная последовательность
≥
s и÷
s нам нужна≥≥÷≥÷÷≥≥≥÷÷≥≥÷
. Так как нам нужно это как список строк длиной 1, наивным способом представления этого будет"≥≥÷≥÷÷≥≥≥÷÷≥≥÷"#
(нажать строку, превратить ее в список). Тем не менее, мы можем сделать немного лучше. Интерпретируя эту строку как двоичное число (где≥
представляет1
и÷
представляет0
), мы получаем13542
в десятичном виде. Преобразовав это обратно в двоичный файл (используя традиционные1
s и0
s) и индексировав в строку длины 2, мы можем получить список, используя на один байт меньше, чем простой метод.Часть 2. Преобразование в двоичный файл
Эта часть намного проще. Если бы на самом деле была возможность напрямую конвертировать base-256 в двоичный файл, мы бы использовали это. К сожалению, это не так, поэтому нам придется использовать десятичный формат в качестве промежуточного формата.
В
,
следующем коде представлен код из Части 1 - для пояснения я заменил код Части 1 на,,
чтобы прочитать вывод из Части 1 из STDIN. Это не часть фактического окончательного кода.Часть 3: Форматирование
Если бы задача состояла в том, чтобы просто вывести двоичную строку как есть, мы были бы готовы. Тем не менее, у нас еще есть некоторое форматирование, чтобы получить двоичную строку в прямоугольнике 21 x 23.
Как и во второй части,
,
представляет собой результат предыдущей части и не является частью реального кода.Для тех, кто следит за домом, это эквивалентный код Python 3 (481 байт):
источник
JavaScript (ES6),
169...136135 байтСохраненные 2 байта благодаря Andrakis
сохраненных 4 байта благодаря Хеди
сохраненному
-5 байт благодаря NeilЦветная версия, 249 байт (237 байт JS + 12 байт CSS)
Код JS выводит искусство ASCII с жирными метками для сердца. 12 байт CSS требуется для раскрашивания в красный цвет. (Это число байтов справедливо?)
источник
s=>s.replace(/./g,'$& ')
. Я работал над идентичным решением.s.replace(/./g,'$& ')
быть замененоs.split``.join` `
?[...s].join` `
replace(/./g,(c,i)=>c+=++i%21?' ':'\n')
(очевидно, используя буквальный перевод строки там) сохраняет еще один байт. Вполне возможно, есть еще лучший способ выразить эту идею.05AB1E ,
775453444341 байтИспользует кодировку CP-1252 .
объяснение
Попробуйте онлайн!
источник
Sðý42ô»
кS21ô»
, так как»
соединяет внутренние списки пробелами неявно (и•1žä¿*•
теперь должно быть•Å¾$6•
, так как целые числа кодируются в базе-255 теперь вместо базы-214).CJam , 48 байтов
Сотрудничество с @MartinEnder, который забрал хитрые 3 байта со
"uilvey"3/
строкой. Онлайн переводчик .источник
Javascript ES6 REPL ,
124121119113 байтовСохранено 6 байт благодаря @ETHproductions
Это полная программа, которую можно вставить в REPL / консоль для получения правильного результата.
Показать фрагмент кода
Более многословный
Цветное JavaScript только сердце, 281 байт
Это работает путем переключения цветов каждые n бит и использует возможность console.log для регистрации цветов
Цветное CSS-сердце, 229 + 12 байт
Если использование css разрешено, цветное сердце может быть уменьшено до 229 байтов кода JavaScript и 12 байтов CSS
Показать фрагмент кода
источник
a
и просто использоватьnum>>i/64&1
в обоих местах, экономя 1 байт. Кроме того, так++i%21==0?newline:space
же, как++i%21?space:newline
.i=0,r=''
наi=r=''
;''
автоматически приводится к 0.MATL,
5655 байтПопробуйте онлайн
объяснение
источник
PowerShell v2 +, (UTF-16) 300 байт
Исправлено ошибочное количество байтов благодаря @Mego
Не самый короткий, но другой подход. Я вручную взял каждую строку и разделил их на пары по 9 (11) разрядов. Преобразовал каждое из этих двоичных значений в
char
(Примечание: PowerShell использует UTF-16 по умолчанию, а не UTF-8) и поместил его в строку. Это'...'
в начале.Затем мы разбираем
-split
строки длиной 2 и перебираем каждую пару. Эти пары разбиваются наchar
-array via$_[0,1]
, и каждая из них приводится к типу int+$_
и[convert]
редактируется в двоичный файл (,2
)String
. Это-join
объединено в одну строку, затемPadLeft
нужно получить правильную длину, затем каждый элемент - это-replace
d с самим собой и пробел'$1 '
.Все эти строки остаются в конвейере, и вывод неявен, по умолчанию
Write-Output
вставляется новая строка между элементами.источник
len("'ږƍƕ๓ƺ֥˄ϝӊ༭ǝ֥ţϝɥޔǮƱϝIJ˲ӷʴ˘ͻ֙ץŻŬɻˌʼֽ͖ҶɻŦʼʞݖɛĽƳ'-split'(..)'-ne''|%{(-join($_[0,1]|%{[convert]::ToString(+$_,2)})).PadLeft(21,'0')-replace'(.)','$1 '}".encode('utf-16be'))
/// , 237 байт
Попробуйте онлайн!
источник
Python 3,
147144 байтаПроверьте это на Ideone
Инициализирую
i
к0
в объявлении функции, а затем повторяет это 23 раз:делает всю двоичную строку без пробелов (см ниже);
разрезает ряд изнутри использования
[i:i+21]
;вставляет пробелы с
' '.join(...)
;печать; и
увеличивается
i
на 21 сi+=21
Чтобы сделать всю двоичную строку:
она повторяется
"ilOveyOu"
восемь раз; при необходимостизаменяется
O
наo
(по индексам[2,14,18,34,38,46]
);- - - это достигается с помощью
chr(j+30)in' ,0@DL'
сохранения 3 байтов,преобразует каждый символ в его порядковый номер;
приводит каждый ординал к двоичной строке (
'0bxxxxxxx'
);удаляет ведущие
'0b'
из каждого использования[2:]
;дополняет каждый с
'0'
; иобъединяет все это с
''.join(...)
источник
i=0\nexec(...)
илиi=0;exec(...)
за 137 байт.exec("...")
кexec"..."
иprint(...)
кprint...
PHP + HTML + CSS, 173 байта, цветные 367 байтов
Только CLI PHP 173 байта
соответствует типу содержимого спецификации bounty text / html
b{all:unset;color:red}
а неb{all:unset;color:#911;background:red}
в первой версииPHP + HTML + CSS, 392 байта
сердце красное + черное, которое выглядит более симпатичным
Может быть, позвонить номер цвета в части CSS
добавить это, прежде чем это выглядит лучше
Выведите первую версию, это самый уродливый HTML-код в моей жизни
красно-черное сердце
375 байт для создания HTML-страницы напрямую с PHP
источник
color:#911;background:red
сcolor:red;
делает его соответствуют стандарту баунти спецификации, а также экономия нескольких байт.Powershell, 110 байт
Объяснение:
Первая строка скрипта берет подстроки и вставляет
O
между ними букву . Результатом является строкаuiloveyOuilOveyouiloveyOuilOveyOuiloveyouilOveyouilOveyOuilOvey
. Обратите внимание, что первый и последний символы являются избыточными.Цикл выводит все необходимые
(8..490)
биты из символов строки, а также пробел или перевод строки.Загадка получателя валентинки
Можно видеть, что маленький и большой символ
O
сами составляют битовую кодировку. Всего 15 символов (битов). Есть только один раздел на биты для получения символов ASCII:oOOooOOO
+ooOoOOO[o]
. Пришлось добавить маленькое,o
а0
не в конце. Это символы ASCII:g.
Кто этот загадочный
g.
?источник
PHP, 121 байт
сломать
источник
q / kdb +,
10793855553 байтаРешение:
Пример:
Объяснение:
Примечания:
источник
Python 3, 199 байт:
источник
Python 3, 170 байт
делает строковое повторение «Il% svey% su», повторяет его требуемое количество раз, затем использует кортеж для подстановки всех o в. Затем он преобразует его в двоичный, использует модуль textwrap, преобразует каждый элемент нового список в список, объединяет с пробелом, затем добавляет 0 1 1, потому что это кажется заглушкой или чем-то
источник
Mathematica, 123 байта (275 с цветом)
Я не уверен, если
Grid
вместо вывода строки все в порядке (если нет, то это неконкурентная запись).Ч / Б
цвет
источник
grid
в виде обычного текста и вставить его в блокнот? На что это похоже? Разделенный пробелом (один пробел) с символами новой строки, как показано на рисунке?Ruby 142 байта
(Чуть больше) разборчиво:
Я еще не нашел способа сжать исходный текст в более лаконичную форму в Ruby - в нем есть несколько замечательных функций для манипуляции со строками, но во всех попытках я использовал больше символов, чем сама строка. Любые указатели оценили, это мой первый Code Golf на StackOverflow!
источник
a
), затем делаетеa+a+a
...? Еще лучше, если Ruby поддерживает умножение строкa*count
,!a+a+a
, что так)o
на заглавнуюO
!Ржавчина, 195 байт
Ungolfed:
источник
C (gcc) , 102 байта
Наезжать
Попробуйте онлайн!
источник
K (ок) ,
5048 байтовРешение:
Попробуйте онлайн!
Объяснение:
Порт моего Q / KDB + решения .
Примечания:
источник
2 14 18 34 38 46
->0x020e1222262e
Pyth, 47 байтов
Попробуйте это онлайн здесь .
источник
/// , 220 байт
Попробуйте онлайн!
источник
C ++ 11, неконкурентный,
726687636 байт (* требуется NIX или W10 порог 2)Я знаю, что это может быть лучше в гольф. Я хочу увидеть короткий ответ C ++, черт побери!
Я также, вероятно, допустил несколько ошибок, когда кодировал секцию сердца.
Вывод (цвета фиксированы):
источник
Python, 473 байта
Цветные!
источник
str.translate
может быть лучшим выборомFEU , 360 байт
Просто тупое сжатие
источник