Для этой задачи художественное стеганое одеяло ASCII будет представлять собой блок текста шириной 24 символа и высотой 18 строк, содержащий символы =-<>/\
в виде лоскутного рисунка, который является симметричным по горизонтали и вертикали.
Пример стеганого одеяла:
========================
------------------------
//\\//\\\//\/\\///\\//\\
<<><<>>>>><<>><<<<<>><>>
/\\/\\\\/\/\/\/\////\//\
------------------------
/\/////\\///\\\//\\\\\/\
\///\/\/\\\\////\/\/\\\/
\///\/\/\\\\////\/\/\\\/
/\\\/\/\////\\\\/\/\///\
/\\\/\/\////\\\\/\/\///\
\/\\\\\//\\\///\\/////\/
------------------------
\//\////\/\/\/\/\\\\/\\/
<<><<>>>>><<>><<<<<>><>>
\\//\\///\\/\//\\\//\\//
------------------------
========================
Все одеяла имеют одинаковую форму:
- Они всегда 24 на 18.
- Верхняя строка (строка 1) и нижняя строка (строка 18)
=
полностью пересекаются. - Линии 2, 6, 13 и 17
-
полностью пересекаются. - Строки 4 и 15 представляют собой одинаковую случайную горизонтально симметричную диаграмму
<
и>
. - Все другие линии (3, 5, 7, 8, 9, 10, 11, 12, 14, 16) заполняются
/
и\
в совершенно случайным образом так, чтобы вся квилт остается горизонтально и вертикально симметричны .
Обратите внимание, что при складывании стеганого одеяла ровно пополам, по вертикали или по горизонтали, формы символов точно совпадают. Не путайте это с персонажами, совпадающими. например, строка 3 и строка 16 не идентичны, они являются вертикальными зеркальными изображениями.
Вызов
Напишите программу или функцию, которая будет печатать или возвращать случайное художественное одеяло ASCII.
Из-за большого количества жестко закодированных линий и симметрии единственная реальная случайность возникает из первых 12 символов в строках 3, 4, 5, 7, 8, 9:
- Первые 12 символов в строке 4 должны иметь длину 12 символов любой строки
<
и>
. - Первые 12 символов в строках 3, 5, 7, 8, 9 должны иметь длину строки символов 12
/
и\
(независимо друг от друга). - Эти случайные строки затем зеркально отражаются для создания всего стеганого одеяла.
Самый короткий ответ в байтах побеждает. Tiebreaker - более ранний пост.
Вы можете использовать генераторы псевдослучайных чисел. (Нет, вам не нужно доказывать, что все строки из 12 символов <>
или /\
могут быть сгенерированы с помощью PRNG вашего языка.)
Вывод может дополнительно содержать завершающий символ новой строки, но не должен содержать пробелов или других символов, кроме того, что необходимо для стеганого одеяла.
Ответы:
CJam,
61605855545251 байтНемного укорочено с помощью Sp3000 и Optimizer.
Проверьте это здесь.
объяснение
Как обычно с этими симметричными ASCII-задачами, я создаю один квадрант, а затем расширяю его до полной степени с помощью двух соответствующих операций зеркального отображения.
Для этого объяснения я должен начать с функции
F
, которую я определяю где-то по пути, потому что она используется в трех местах для трех разных вещей:Это ожидает целое число в верхней части стека и строку под ним. Его цель - перевернуть строку, а также поменять местами некоторые символы, чтобы получить правильное отражение. Целое число - либо
1
или,3
и указывает,1
следует ли поменять местами (3
) скобки и косые черты или ( ) поменять только скобки. Вот как это работает:Теперь для остальной части кода:
Две половины и эта новая строка затем автоматически печатаются в конце программы.
источник
Python 3,
257229192185176149143 байтаС помощью @xnor мы наконец-то догнали JS!
Пример вывода:
объяснение
(Немного устарел, позже обновлю)
"444046402"
кодирует строки, причем каждая цифра относится к начальному индексу соответствующей подстроки из 2 символов'--==\/<>'
. Каждый отдельный ряд строится наизнанку путем повторного перетасовки двух символов (с использованиемsample(...,2)
,random.shuffle
к сожалению, на месте) и объединения строк.Упрощенный пример того, как может выглядеть расширение для четвертой строки:
что даст
><>><><<><
:Общее стеганое одеяло также выстроено изнутри, так как строительство начинается с 9-го / 10-го ряда, работающего наружу. Для этого мы начнем с пустого списка
L
, в который мы добавляем строки вперед и назад по мере прохождения черезn<"5"
Условие , чтобы проверить , есть ли у нас строка , состоящая из><
, и в этом случае мы добавляемая идентичную строку в заднюю части , в противном случае его обратное.Наконец,
*_,=
это принудительная оценка,map
так что печать происходит, и это просто более короткий способ сделатьprint("\n".join(L))
.Долгое время у меня была функция
который берет строку и конвертирует
/\><
в\/<>
соответственно, но мне наконец удалось избавиться от нее :)источник
Python 2, 300 байт
Эта программа использует
join, lambda, replace, sample, import
и другие подробные функции, поэтому она не получит никаких наград за гольф.Код до того, как авто-гольфист получил его:
Пример вывода:
источник
APL (
5358)Это не совсем симметричное , как я думал , что это было, к сожалению. Исправление обошлось мне в 5 персонажей и теперь я вне игры.
Объяснение:
L←+,3-⌽
: L - функция, которая возвращает свой аргумент, за которым следует 3 - обратный аргументL{L?12⍴2}¨⍳9
: сгенерировать 9 строк из 12 случайных значений из [1,2] плюс их обратное, затем обратное из этих 9 строк732451451260688⊤⍨18/8
: создать список0 2 4 6 4 2 4 4 4 4 4 4 2 4 _7_ 4 2 0
(вот где чертова асимметричность)+
: для каждой строки добавьте соответствующий номер к каждому значению↑
: формат как матрица'==--/\<><'[
...]
: для каждого из чисел в матрице выберите символ из строки в этой позицииВыход:
источник
<>
линии не являются вертикально симметричными, так как вы используете свою таблицу подкачки при создании вертикального зеркала. (Спасибо за публикацию вывода, кстати, помогает понять, работает ли APL намного проще; p)<
в конец строки и увеличивая вторую строку еще раз, меняя ее дважды). Даже не пришлось все это пересматривать, хотя теперь это уже не победит. (Возможно, в следующий раз я не должен был публиковать результаты: P)PHP,
408,407,402,387, 379 байтЯ не очень хороший игрок в гольф, но эта проблема звучит весело, поэтому я попробовал.
Код без правил
У разглаженной версии есть небольшой бонус: вы можете передать ей целое число, чтобы посеять
rand()
и получить одно и то же лоскутное одеяло каждый раз за семя:Это приводит, например, к этому прекрасному плетеному одеялу ручной работы:
Редактировать : Оказывается, моя первая версия не вернула правильное одеяло. И я исправил это. Забавно, но исправление еще короче.
источник
['/','<','\\','>','a','b']
можно заменить на['/','<','\\','>',a,b]
(обратите внимание на пропущенные кавычки вокругa
иb
),@$s
можно заменить на$s
, вы можете хранитьstr_repeat('-',12)
иstr_repeat('=',12)
в глобальных переменных / константах,for($b=8;$b>=0;$b--)
можно заменить наfor($b=9;$b--;)
,str_repeat
а повторные функции можно сократить, дав их имя для глобальной переменной (напримерglobal$R,$V;$R=str_repeat;$V=strrev;$V($R('=',12))
:) и newlines (\n
) может быть заменено многострочной строкой.strrev
без изменений, убрал 1 пробел и несколько небольших изменений.<>><><
линии) были одинаковыми.JavaScript (ES6) 169
195 201Отредактируйте 6 байтов, сохраненных thx @nderscore. Осторожно, символ новой строки внутри обратных кавычек является значительным и считается.
Edit2 упрощенное построение строк, нет необходимости
reverse
иconcat
Запустите сниппет для тестирования (в Firefox)
источник
z
. Переместить определениеQ
внутриMath.random
вызова. Заменить'\n'
шаблоном строки новой строки.|0
целочисленное приведение не требуется, так как значения будут записаны позже.for(_ of-z+z)
значит?z
не является числовым, поэтому -z - это NaN (не число). NaN, преобразованный в строку, равен «NaN», а 3 знака + 9 символов равны 12.Рубин,
162155Мне нравится этот, потому что он научил меня злоупотреблять обратными слешами в строковых литералах и
String#tr
. В противном случае код не очень умный, просто компактный.источник
/
ina
иb
. Первое,tr
вероятно, также может обойтись без скобок. Односимвольные строки, такие как'='
могут быть написаны?=
. И.join
может быть заменен*
.join
синоним экономят мне 6 байтов. Я не могу убрать скобки,x+x.reverse.tr(a,b)
потому что+
имеет приоритет над,
. Я также на самом деле не избегаю косых черт в своих строках - мне не удается избежать одной обратной косой черты в каждой. Второе\
необходимоb
из-за способаtr
работы, хотя теперь я понимаю, что первое\
вa
излишне, так что есть еще один байт.Пиф, 57
59 61Большое спасибо @Jakube за то, что они предложили эти 57-байтовые версии.
Алгоритм очень похож на Мартина. (Пересмотрено) Объяснение впереди.
Попробуйте онлайн
Объяснение:
источник
"<>"
на-GK
J"\<>/"K"\/"L+b_mXdK_Kbjbym+d_XdJ_JmsmOk12[\=\-K-JKK\-KKK
или уменьшитьJ"\<>/"K"\/"jbu++HGXHK_Km+d_XdJ_JmsmOk12[KKK\-K-JKK\-\=)Y
J
5654 байтаИспользование:
1 байт благодаря @FUZxxl.
Объяснение в ближайшее время.
Попробуйте это онлайн здесь.
источник
5 1 3 1 5 1 1 1
на(3(2})8$5,3#1)
.Python
295287227 байтНе так здорово, но я все равно выложу:
Если вы хотите объяснения, просто спросите меня.
источник
=
и-
вd
.Javascript ( ES7 Draft )
174168146Некоторое вдохновение взято от @ edc65
Изменить: Спасибо edc65 за некоторые идеи по оптимизации построения строк.
Демонстрация: ( только Firefox )
комментарии:
источник
Pharo 4, 236
или отформатирован нормально:
Объяснение:
Строка
s:='====----/\/\/<><<>'
вместе с блокомf:=[:c|s at:(s indexOf:c)+i]
здесь как для бросания символов, так и для изменения шаблонов ...Для i = 1 он выполняет горизонтальную реверсию (
/
<->\
,<
<->>
).Для i = 3 он выполняет вертикальную реверсию (
/
<->\
)Для i = 1 или 2 atRandom, он подбрасывает среди
/
или\
,<
или>
'=-/</-///'
кодирует тип символа,c
который будет кормить блокf
для 9 первых строк.#() , '=-/</-///'
является уловкой конкатенации для преобразования String в Array и, таким образом, для сбора в Array.Остальное - простая конкатенация после применения горизонтальной / вертикальной симметрии.
источник
Скрип 4.X, 247
Или в формате:
Пояснения:
s:='==--/\<>'.
очевидно, кодирует четыре возможных пары.r:=(1<<108)atRandom.
бросить 108 бит (в LargeInteger) для 9 строк * 12 столбцов (мы бросаем == и - излишне, но производительность не является нашей проблемой).h:=''
это строка, в которой мы будем объединять (художник Шлемеля, потому что поток будет слишком дорогостоящим в символах).(16to:0by:-2),(0to:16by:2)do:[:i|
перебирает строки (* 2)(11to:0by:-1),(0to:11) do:[:j|
перебирает столбцы28266
является магическим числом, кодирующим пару, которая будет использоваться в первых 9 строках.Это битовая комбинация
00 01 10 11 10 01 10 10 10
, где 00 кодирует '==', 01 '-', 10 '/ \' и 11 '<>'.101
магическое число, кодирующее горизонтальную и вертикальную реверсию.Это битовый паттерн
0000 0000 0110 1010
, кодирующая, когда инвертировать (1) или нет (0) первый (0) или второй (1) символ каждой пары '==' '-' '/ \' и '<>', для вертикальной симметрии и горизонтальной симметрии.n:=3 bitAnd: 28266>>i
дает кодировку пары символов для строки i / 2 (0 для «==», 1 для «-», 2 для «/ \» и 3 для «<>»).(r-1 bitAt: 6*i+j+1)
выберите случайный бит для строки i / 2 столбца j (1 - ранг младшего бита, поэтому мы имеем +1, k случайных бросков в интервале [1, k], таким образом, мы имеем -1).(101 bitAt: 3-n*4+m+p)
выберите бит обращения: (3-n) * 4 - смещение для группы из 4 битов, соответствующих коду пары n, m - смещение по вертикали (0 для первых 9, 2 для последних 9 строк), p - это смещение горизонтальной реверсии (0 для первых 12, 1 для последних 12 столбцов) +1, поскольку младший разрядный разряд равен 1.bitXor:
выполняет реверсию (отвечает на смещение 0 или 1) иs at:2*n+1+bitXor_offset
выбирает правильный символ в s.Но
(A>>a)+(B>>b) bitAnd: 1
стоит меньше байтов, чем(A bitAt:a+1)bitXor:(B bitAt:b+1)
при этом переписан bitXor и смещение +1 на p пропало ...h,#[13]
это уродливый скрип, мы можем объединить строку с помощью ByteArray (содержащий код возврата каретки).источник