Нарисуйте случайный ASCII Art Quilt


31

Для этой задачи художественное стеганое одеяло 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 вашего языка.)

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


мы можем принять входные данные как случайное начальное число?
Разрушаемый Лимон

Ответы:


15

CJam, 61 60 58 55 54 52 51 байт

Немного укорочено с помощью Sp3000 и Optimizer.

"=-/</-///"{C*1{"<\/>"%1$W%\_W%er}:F~+mrC<1FN}%s3F(

Проверьте это здесь.

объяснение

Как обычно с этими симметричными ASCII-задачами, я создаю один квадрант, а затем расширяю его до полной степени с помощью двух соответствующих операций зеркального отображения.

Для этого объяснения я должен начать с функции F, которую я определяю где-то по пути, потому что она используется в трех местах для трех разных вещей:

{"<\/>"%1$W%\_W%er}:F

Это ожидает целое число в верхней части стека и строку под ним. Его цель - перевернуть строку, а также поменять местами некоторые символы, чтобы получить правильное отражение. Целое число - либо 1или, 3и указывает, 1следует ли поменять местами ( 3) скобки и косые черты или ( ) поменять только скобки. Вот как это работает:

"<\/>"            "Push a string with all four relevant characters.";
      %           "% applied to a string and an integer N (in any order) selects every
                   Nth character, starting from the first. So with N = 1 this just
                   leaves the string unchanged, but with N = 3 it returns a string
                   containing only < and >.";
       1$         "Copy the string we want to mirror.";
         W%       "% also takes negative arguments. Giving it -1 reverses the string.";
           \_     "Swap the two strings and duplicate the <\/> or <> string.";
             W%   "Reverse that one. Due to the symmetry of this string, we'll now
                   have the characters to be swapped at corresponding indices.";
               er "Perform element-wise transliteration on the reversed input string
                   to complete the mirroring operation.";

Теперь для остальной части кода:

"=-/</-///"                            "This string encodes the 9 different line types.
                                        Note that for the /\ and <> lines we only use
                                        one of the characters. This idea is due to
                                        Sp3000. Thanks! :)";
           {                   }%      "Map this block onto the characters.";
            C*                         "Repeat the character 12 times, turning it into
                                        a string.";
              1{...}:F~                "Define and call F on the resulting string. The
                                        reversal doesn't do anything, but the character
                                        swapping creates strings containing both \/ and
                                        <>.";
                       +mr             "Add the two halves together and shuffle them.";
                          C<           "Truncate to 12 characters. We've now got our
                                        random half-lines.";
                            1F         "Call F again to mirror the half-line.";
                              N        "Push a newline.";
                                 s     "Join all those separate strings together by
                                        converting the array to a string.";
                                  3F   "Perform one more mirroring operation on the
                                        half-quilt, but this time only swap < and >.
                                        This yields the correct full quilt, except
                                        there are two newlines in the centre.";
                                    (  "This slices the leading newline off the second
                                        half and pushes it onto the stack.";

Две половины и эта новая строка затем автоматически печатаются в конце программы.


12

Python 3, 257 229 192 185 176 149 143 байта

from random import*
k,*L=80703,
while k:s=eval("''"+".join(sample('--==<>\/'[k%4*2:][:2],2))"*12);L=[s]+L+[s[::(-1)**k]];k//=4
*_,=map(print,L)

С помощью @xnor мы наконец-то догнали JS!

Пример вывода:

========================
------------------------
///////////\/\\\\\\\\\\\
>><<<>><<<><><>>><<>>><<
/\/\\/\/\\/\/\//\/\//\/\
------------------------
//\\////\\/\/\//\\\\//\\
/////\\\/\/\/\/\///\\\\\
/\\//\\/////\\\\\//\\//\
\//\\//\\\\\/////\\//\\/
\\\\\///\/\/\/\/\\\/////
\\//\\\\//\/\/\\////\\//
------------------------
\/\//\/\//\/\/\\/\/\\/\/
>><<<>><<<><><>>><<>>><<
\\\\\\\\\\\/\///////////
------------------------
========================

объяснение

(Немного устарел, позже обновлю)

"444046402"кодирует строки, причем каждая цифра относится к начальному индексу соответствующей подстроки из 2 символов '--==\/<>'. Каждый отдельный ряд строится наизнанку путем повторного перетасовки двух символов (с использованием sample(...,2), random.shuffleк сожалению, на месте) и объединения строк.

Упрощенный пример того, как может выглядеть расширение для четвертой строки:

''.join(['<','>']).join(['>','<']).join(['>','<']).join(['<','>']).join(['>','<'])

что даст ><>><><<><:

               ''
    <>         .join(['<','>'])
   >  <        .join(['>','<'])
  >    <       .join(['>','<'])
 <      >      .join(['<','>'])
>        <     .join(['>','<'])

Общее стеганое одеяло также выстроено изнутри, так как строительство начинается с 9-го / 10-го ряда, работающего наружу. Для этого мы начнем с пустого списка L, в который мы добавляем строки вперед и назад по мере прохождения через

L=[s]+L+[[s,s[::-1]][n<"5"]]

n<"5"Условие , чтобы проверить , есть ли у нас строка , состоящая из ><, и в этом случае мы добавляемая идентичную строку в заднюю части , в противном случае его обратное.

Наконец, *_,=это принудительная оценка, mapтак что печать происходит, и это просто более короткий способ сделать print("\n".join(L)).

Долгое время у меня была функция

g=lambda s:s.translate({60:62,62:60,92:47,47:92})

который берет строку и конвертирует /\><в \/<>соответственно, но мне наконец удалось избавиться от нее :)


Спецификация говорит, что пока она может генерировать все возможные ковры, это нормально.

6

Python 2, 300 байт

Эта программа использует join, lambda, replace, sample, importи другие подробные функции, поэтому она не получит никаких наград за гольф.

from random import*
f=lambda a,b,t:t.replace(a,'*').replace(b,a).replace('*',b)
k=lambda a:''.join(sample(a*12,12))
c='-'*24
e=k('<>')
h=e+f('<','>',e[::-1])
j=[d+f('/','\\',d[::-1])for d in[k('\\/')for i in'quilt']]
g=['='*24,c,j[0],h,j[1],c]+j[2:]
print'\n'.join(g+[f('/','\\',d)for d in g[::-1]])

Код до того, как авто-гольфист получил его:

from random import *

change = lambda a,b,t: t.replace(a,'*').replace(b,a).replace('*',b)
pick = lambda a: ''.join(sample(a*12, 12))

innerline = '-' * 24
line4h = pick('<>')
line4 = line4h + change('<', '>', line4h[::-1])
diag = [d + change('/', '\\', d[::-1]) for d in [pick('\\/') for i in 'quilt']]

quilt = ['='*24, innerline, diag[0], line4, diag[1], innerline] + diag[2:]
print '\n'.join(quilt + [change('/', '\\', d) for d in quilt[::-1]])

Пример вывода:

========================
------------------------
\\\\/\////\\//\\\\/\////
<><<>>>><><><><><<<<>><>
/\\\\////\\\///\\\\////\
------------------------
\\\\//\///\\//\\\/\\////
//\//\\\\/\/\/\////\\/\\
\/\\\\/\//\/\/\\/\////\/
/\////\/\\/\/\//\/\\\\/\
\\/\\////\/\/\/\\\\//\//
////\\/\\\//\\///\//\\\\
------------------------
\////\\\\///\\\////\\\\/
<><<>>>><><><><><<<<>><>
////\/\\\\//\\////\/\\\\
------------------------
========================

9
Не самая короткая, но эй, с еще 7 байтами у вас есть программа, достойная вашего имени : D
Увлечения Кэлвина

Я вижу что ты тут делал.
Логика Найт

2
Авто-игрок в гольф? Разве никто не получил время для игры в гольф вручную?
Ларс Эберт

5
Вы знаете нас хакеров. Если мне придется выполнять 3-минутное задание более одного раза, я потрачу 10 часов на написание программы для ее автоматизации. Я все об эффективности ;-)
Logic Knight

6

APL ( 53 58)

Это не совсем симметричное , как я думал , что это было, к сожалению. Исправление обошлось мне в 5 персонажей и теперь я вне игры.

L←+,3-⌽⋄'==--/\<><'[↑(732451451260688⊤⍨18/8)+L{L?12⍴2}¨⍳9]

Объяснение:

  • 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(вот где чертова асимметричность)
  • +: для каждой строки добавьте соответствующий номер к каждому значению
  • : формат как матрица
  • '==--/\<><'[... ]: для каждого из чисел в матрице выберите символ из строки в этой позиции

Выход:

========================
------------------------
///////\\///\\\//\\\\\\\
<<><<><><<<<>>>><><>><>>
\\\\\//\/\\\///\/\\/////
------------------------
/\///\\/\/\/\/\/\//\\\/\
\////////\//\\/\\\\\\\\/
\\/\\\//\///\\\/\\///\//
//\///\\/\\\///\//\\\/\\
/\\\\\\\\/\\//\////////\
\/\\\//\/\/\/\/\/\\///\/
------------------------
/////\\/\///\\\/\//\\\\\
<<><<><><<<<>>>><><>><>>
\\\\\\\//\\\///\\///////
------------------------
========================

1
У меня было +1, потому что алгоритм, который вы разместили, был интересным и оригинальным, но я только что заметил, что ваши <>линии не являются вертикально симметричными, так как вы используете свою таблицу подкачки при создании вертикального зеркала. (Спасибо за публикацию вывода, кстати, помогает понять, работает ли APL намного проще; p)
FryAmTheEggman

@FryAmTheEggman: дерьмо, не заметил этого. Мне, вероятно, придется отказаться от всего алгоритма сейчас, так как есть одна строка, которая не похожа на другие. Что ж, спасибо, что сказали мне, а не просто понизили голосование.
марин

@FryAmTheEggman: ну, это исправлено (добавив еще один <в конец строки и увеличивая вторую строку еще раз, меняя ее дважды). Даже не пришлось все это пересматривать, хотя теперь это уже не победит. (Возможно, в следующий раз я не должен был публиковать результаты: P)
marinus

2
Это решение довольно умное, вы можете оставить +1 :)
FryAmTheEggman

@ Calvin'sHobbies: исправить одно, сломать другое. Теперь это действительно исправлено.
марин

6

PHP, 408 , 407 , 402 , 387 , 379 байт

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

<?$a=str_replace;$b=str_repeat;function a($l,$a,$b){while(strlen($s)<$l){$s.=rand(0,1)?$a:$b;}return$s;}$c=[$b('=',12),$b('-',12),a(12,'/','\\'),a(12,'<','>'),a(12,'/','\\'),$b('-',12)];while(count($c)<9){$c[]=a(12,'/','\\');}for($d=9;$d--;){$c[$d].=strrev($a(['/','<','\\','>',1,2],[1,2,'/','<','\\','>'],$c[$d]));$c[]=$a(['/','\\',1],[1,'/','\\'],$c[$d]);}echo implode("
",$c);

Код без правил

<?php

    function randomString($length, $a, $b) {
        $string = '';
        while(strlen($string) < $length) {
            $string .= rand(0, 1) ? $a : $b;
        }
        return $string;
    }

    if(isset($argv[1])) {
        srand(intval($argv[1]));
    }

    $lines = [
        str_repeat('=', 12),
        str_repeat('-', 12),
        randomString(12, '/', '\\'),
        randomString(12, '<', '>'),
        randomString(12, '/', '\\'),
        str_repeat('-', 12)
    ];
    while(count($lines) < 9) {
        $lines[] = randomString(12, '/', '\\');
    }

    for($index = count($lines); $index--;) {
        $lines[$index] .= strrev(str_replace(['/', '<', '\\', '>', 1, 2], [1, 2, '/', '<', '\\', '>'], $lines[$index]));
        $lines[] = str_replace(['/', '\\', 1], [1, '/', '\\'], $lines[$index]);
    }

    echo implode("\n", $lines) . "\n";

?>

У разглаженной версии есть небольшой бонус: вы можете передать ей целое число, чтобы посеять rand()и получить одно и то же лоскутное одеяло каждый раз за семя:

php quilt.php 48937

Это приводит, например, к этому прекрасному плетеному одеялу ручной работы:

========================
------------------------
/\\\////\\\/\///\\\\///\
><>><>><<<><><>>><<><<><
/\\\///\//\/\/\\/\\\///\
------------------------
/\\/\\\/\\/\/\//\///\//\
/\\\\/\//\\/\//\\/\////\
\/\\/\/\////\\\\/\/\//\/
/\//\/\/\\\\////\/\/\\/\
\////\/\\//\/\\//\/\\\\/
\//\///\//\/\/\\/\\\/\\/
------------------------
\///\\\/\\/\/\//\///\\\/
><>><>><<<><><>>><<><<><
\///\\\\///\/\\\////\\\/
------------------------
========================

Редактировать : Оказывается, моя первая версия не вернула правильное одеяло. И я исправил это. Забавно, но исправление еще короче.


1
Вы можете сделать много вещей для игры в гольф: ['/','<','\\','>','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) может быть заменено многострочной строкой.
Исмаэль Мигель

Вот более короткая версия: pastebin.com/2TabUqbA (373 байта). Я изменил несколько советов: удалил глобальные переменные, оставил strrevбез изменений, убрал 1 пробел и несколько небольших изменений.
Исмаэль Мигель

4
Я думаю, вам нужно, чтобы строка 4 и строка 15 ( <>><><линии) были одинаковыми.
Логика Найт

1
Извините, вот решение длиной 357 байт: pastebin.com/TugNDjjL Я забыл уменьшить некоторые вещи.
Исмаэль Мигель

@IsmaelMiguel Спасибо за вашу помощь. Я воспользовался некоторыми вашими советами, но некоторые из них приводят к тому, что выдается уведомление.
Ларс Эберт

4

JavaScript (ES6) 169 195 201

Отредактируйте 6 байтов, сохраненных thx @nderscore. Осторожно, символ новой строки внутри обратных кавычек является значительным и считается.

Edit2 упрощенное построение строк, нет необходимости reverseиconcat

F=(o='')=>[...z='/\\/-/<\\-='].map((c,i,_,y=[z,'\\/\\-\\>/-='],q=[for(_ of-z+z)Math.random(Q=k=>q.map(v=>r=y[v^!k][i]+r+y[v^k][i],r='')&&r+`
`)*2])=>o=Q()+o+Q(i!=5))&&o

Запустите сниппет для тестирования (в Firefox)

F=(o='')=>[...z='/\\/-/<\\-='].map((c,i,_,y=[z,'\\/\\-\\>/-='],q=[for(_ of-z+z)Math.random(Q=k=>q.map(v=>r=y[v^!k][i]+r+y[v^k][i],r='')&&r+`
`)*2])=>o=Q()+o+Q(i!=5))&&o

Q.innerHTML=F()
<pre id=Q style='font-size:9px;line-height:9px'>


1
-6 байт: убрать скобки вокруг определения z. Переместить определение Qвнутри Math.randomвызова. Заменить '\n'шаблоном строки новой строки. |0целочисленное приведение не требуется, так как значения будут записаны позже.
nderscore

Что это for(_ of-z+z)значит?
Дерек 朕 會 功夫

@Derek Мне нужно повторить 12 раз, и лучшее, что у меня есть, это строка из 9 символов. zне является числовым, поэтому -z - это NaN (не число). NaN, преобразованный в строку, равен «NaN», а 3 знака + 9 символов равны 12.
edc65

4

Рубин, 162 155

Мне нравится этот, потому что он научил меня злоупотреблять обратными слешами в строковых литералах и String#tr. В противном случае код не очень умный, просто компактный.

a='/\\'
b='\\\/'
t=Array.new(9){x=''
12.times{x+=a[rand(2)]}
x+x.reverse.tr(a,b)}
t[0]=?=*24
t[1]=t[5]=?-*24
t[3].tr!a,'<>'
puts t,((t.reverse*'
').tr a,b)

2
Добро пожаловать в раздел «Программирование головоломок и обмен стеками Code Golf»! Вот несколько советов по Ruby: я не думаю, что вам нужно избегать использования /in aи b. Первое, trвероятно, также может обойтись без скобок. Односимвольные строки, такие как '='могут быть написаны ?=. И .joinможет быть заменен *.
Мартин Эндер,

@ MartinBüttner Спасибо за прием и советы! Символьные литералы и joinсиноним экономят мне 6 байтов. Я не могу убрать скобки, x+x.reverse.tr(a,b)потому что +имеет приоритет над ,. Я также на самом деле не избегаю косых черт в своих строках - мне не удается избежать одной обратной косой черты в каждой. Второе \необходимо bиз-за способа trработы, хотя теперь я понимаю, что первое \в aизлишне, так что есть еще один байт.
езраст

3

Пиф, 57 59 61

J"\<>/"K"\/"L+b_mXdK_Kbjbym+d_XdJ_JmsmOk12[\=\-K-JKK\-KKK

J"\<>/"K"\/"jbu++HGXHK_Km+d_XdJ_JmsmOk12[KKK\-K-JKK\-\=)Y

Большое спасибо @Jakube за то, что они предложили эти 57-байтовые версии.

Алгоритм очень похож на Мартина. (Пересмотрено) Объяснение впереди.

Попробуйте онлайн

Объяснение:

=G"\<>/"                            : Set G to be the string "\<>/"
K"\/"                               : Set K to be the string "\/"
Jm+d_XdG_GmsmOk12[\=\-K"<>"K\-KKK;  : Set J to be the top half of the carpet
                 [\=\-K"<>"K\-KKK;  : Make a list of possible chars for each row
          msmOk12                   : for each element of that list,
                                    : make a list of 12 randomly chosen characters
                                    : from it, then join them
Jm+d_XdG_G                          : for each element of that list,
                                    : make a new list with the old element,
                                    : and its horizontal reflection
jb+J_mXdK_KJ                        : Print the whole carpet
     mXdK_KJ                        : For each element of J make its vertical reflection

Очень хорошо. Не должен был бросить в полотенце. 1 символ спасет, заменив "<>"на-GK
Jakube

И еще один с использованием лямбда J"\<>/"K"\/"L+b_mXdK_Kbjbym+d_XdJ_JmsmOk12[\=\-K-JKK\-KKKили уменьшитьJ"\<>/"K"\/"jbu++HGXHK_Km+d_XdJ_JmsmOk12[KKK\-K-JKK\-\=)Y
Jakube

@Jakube Спасибо! Оба из них довольно умные оптимизации. Мне очень нравится, как лямбда позволяет поставить список в конец.
FryAmTheEggman

2

J 56 54 байта

'=/\<>--></\'{~(-,|.)0,(3(2})8$5,3#1)+(,1-|.)"1?8 12$2

Использование:

   '=/\<>--></\'{~(-,|.)0,(3(2})8$5,3#1)+(,1-|.)"1?8 12$2
========================
------------------------
///\\\\/\///\\\/\////\\\
><<><><>><>><<><<><><>><
\\/\//\\/\//\\/\//\\/\//
------------------------
\/\/\//////\/\\\\\\/\/\/
/\/\\//\//\\//\\/\\//\/\
//\\\\/////\/\\\\\////\\
\\////\\\\\/\/////\\\\//
\/\//\\/\\//\\//\//\\/\/
/\/\/\\\\\\/\//////\/\/\
------------------------
//\/\\//\/\\//\/\\//\/\\
><<><><>><>><<><<><><>><
\\\////\/\\\///\/\\\\///
------------------------
========================

1 байт благодаря @FUZxxl.

Объяснение в ближайшее время.

Попробуйте это онлайн здесь.


Сохранить один символ: заменить 5 1 3 1 5 1 1 1на (3(2})8$5,3#1).
FUZxxl

@FUZxxl Отлично! Я попробовал массу альтернатив, но не нашел этого. (CJam сбежал в счете за одну ночь, поэтому J не достигнет их.: P)
randomra

1

Python 295 287 227 байт

Не так здорово, но я все равно выложу:

from random import*
m,d=[],dict(zip("\/<>=-","/\><=-"))
v=lambda w:[d[x]for x in w]
for e in '=-/>/-///':f=[choice([e,d[e]])for x in[0]*12];t=''.join(f+v(f[::-1]));print t;m+=''.join(e=='/'and v(t)or t),
print'\n'.join(m[::-1])

Если вы хотите объяснения, просто спросите меня.


@ Sp3000 Спасибо за указание, я исправил. Жаль, что это произошло, если еще дольше ...
Def

Вот куча гольфов, которые слишком длинны, чтобы вписаться в комментарий. Вы могли бы быть в состоянии получить это еще больше, если вы положите =и -в d.
Sp3000

@ Sp3000 Большое спасибо за все советы. Многое из этого было довольно очевидно (пробелы, удаление в обратном порядке), так как я не лучший игрок в гольф (и код, и irl), но я тоже выучил немного нового питона (так что еще раз спасибо). Удаление оператора if путем включения = и - в dict оказалось очень хорошей идеей. PS Не могли бы вы объяснить, как в столь малом количестве кода создается рекурсивное лоскутное одеяло (дешифрование translate - отстой)
Def

1

Javascript ( ES7 Draft ) 174 168 146

Некоторое вдохновение взято от @ edc65

Изменить: Спасибо edc65 за некоторые идеи по оптимизации построения строк.

F=(o='')=>[for(i of'555357531')(z=[for(_ of c='==--/\\<>golf')Math.random(r=x=>z.reduce((s,y)=>c[w=i^y^x]+s+c[w^1],'')+`
`)*2],o=r()+o+r(i<7))]&&o

Демонстрация: ( только Firefox )

F=(o='')=>[for(i of'555357531')(z=[for(_ of c='==--/\\<>golf')Math.random(r=x=>z.reduce((s,y)=>c[w=i^y^x]+s+c[w^1],'')+`
`)*2],o=r()+o+r(i<7))]&&o

document.write('<pre>' + F() + '</pre>');


комментарии:

// define function, initialize output to ''
F = (o = '') =>
    // loop through character indexes of first 9 lines
    [
        for (i of '555357531')(
            // build array of 12 random 0/1's, initialize character list
            z = [
                for (_ of c = '==--/\\<>golf')
                    Math.random(
                        // define function for generating lines
                        // if x is true, opposite line is generated
                        r = x =>
                            z.reduce(
                                (s, y) => 
                                    c[w = i ^ y ^ x] + s + c[w ^ 1],
                                ''
                            ) + `\n`
                    ) * 2
            ],
            // build new lines and wrap output in them
            // x true in the second line for indexes < 7 (not character '>')
            o = r() + o + r(i < 7)
        )
    ]
    // return output
    && o

1
Смотрите мои правки, это тоже хорошо для вашего решения
edc65

@ edc65 хорошая идея! Я реализовал нечто подобное сейчас.
nderscore

0

Pharo 4, 236

|s i f v h|s:='====----/\/\/<><<>'.f:=[:c|s at:(s indexOf:c)+i].v:=#(),'=-/</-///'collect:[:c|h:=(String new:12)collect:[:x|i:=2atRandom.f value:c].i:=1.h,(h reverse collect:f)].i:=3.String cr join:v,(v reverse collect:[:k|k collect:f])

или отформатирован нормально:

|s i f v h|
s:='====----/\/\/<><<>'.
f:=[:c|s at:(s indexOf:c)+i].
v:=#() , '=-/</-///'
  collect:[:c|
    h:=(String new:12)collect:[:x|i:=2atRandom.f value:c].
    i:=1.
    h,(h reverse collect:f)].
i:=3.
String cr join:v,(v reverse collect:[:k|k collect:f])

Объяснение:

Строка s:='====----/\/\/<><<>'вместе с блоком f:=[:c|s at:(s indexOf:c)+i]здесь как для бросания символов, так и для изменения шаблонов ...

  • Для i = 1 он выполняет горизонтальную реверсию ( /<-> \, <<-> >).

  • Для i = 3 он выполняет вертикальную реверсию ( /<-> \)

  • Для i = 1 или 2 atRandom, он подбрасывает среди /или \, <или>

'=-/</-///'кодирует тип символа, cкоторый будет кормить блок fдля 9 первых строк.

#() , '=-/</-///' является уловкой конкатенации для преобразования String в Array и, таким образом, для сбора в Array.

Остальное - простая конкатенация после применения горизонтальной / вертикальной симметрии.

========================
------------------------
\\/\/\\\\/\/\/\////\/\//
>>>><><><>><><<><><><<<<
\/\/\//\///\/\\\/\\/\/\/
------------------------
/\//\/\/////\\\\\/\/\\/\
\\//\//\\\/\/\///\\/\\//
////\\/\/\//\\/\/\//\\\\
\\\\//\/\/\\//\/\/\\////
//\\/\\///\/\/\\\//\//\\
\/\\/\/\\\\\/////\/\//\/
------------------------
/\/\/\\/\\\/\///\//\/\/\
>>>><><><>><><<><><><<<<
//\/\////\/\/\/\\\\/\/\\
------------------------
========================

0

Скрип 4.X, 247

|r s h m n p|s:='==--/\<>'.r:=(1<<108)atRandom.h:=''.m:=0.(16to:0by:-2),(0to:16by:2)do:[:i|n:=3bitAnd:28266>>i.p:=0.(11to:0by:-1),(0to:11)do:[:j|h:=h,(s at:n*2+1+(r-1>>(6*i+j)+(101>>(3-n*4+m+p))bitAnd:1)).j=0and:[p:=1]].i=0and:[m:=2].h:=h,#[13]].h

Или в формате:

|r s h m n p|
s:='==--/\<>'.
r:=(1<<108)atRandom.
h:=''.
m:=0.
(16to:0by:-2),(0to:16by:2) do:[:i|
  n:=3 bitAnd: 28266>>i.
  p:=0.
  (11to:0 by:-1),(0to:11) do:[:j|
    "h:=h,(s at:n*2+1+((r-1bitAt:6*i+j+1)bitXor:(101bitAt:3-n*4+m+p))). <- originally"
    h:=h,(s at:n*2+1+(r-1>>(6*i+j)+(101>>(3-n*4+m+p))bitAnd:1)).
    j=0and:[p:=1]].
  i=0and:[m:=2].
  h:=h,#[13]].
h

Пояснения:

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 (содержащий код возврата каретки).

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