Визуализация слов


20

Учитывая слово, состоящее только из строчных букв, сделайте следующее:

  1. Для каждой буквы получите простую факторизацию ее положения в алфавите.
  2. Для каждого простого множителя p нарисуйте ромб с длиной стороны p и вставьте букву в середине ромба.
  3. Самый большой бриллиант находится посередине, последующие более мелкие бриллианты (от самых больших до самых маленьких) чередуются между переходом на дно или верх.

Примечание: Для получения письма использовать боковую длину 1.

Пример: кошка

  • с : 3 = 3
  • а : 1 = 1
  • т : 20 = 5 * 2 * 2

Диаграмма:

                 .
                . .
               . t .
                . .
                 .
                 .
                . .
   .           .   .
  . .         .     .
 .   .   .   .       .
.  c  . .a. .    t    .
 .   .   .   .       .
  . .         .     .
   .           .   .
                . .
                 .
                 .
                . .
               . t .
                . .
                 .

Пример: собака

  • д : 4 = 2 * 2
  • o : 15 = 5 * 3
  • г : 7 = 7

Диаграмма:

                         .
                        . .
           .           .   .
          . .         .     .
         .   .       .       .
  .     .     .     .         .
 . .   .       .   .           .
. d . .    o    . .      g      .
 . .   .       .   .           .
  .     .     .     .         .
  .      .   .       .       .
 . .      . .         .     .
. d .      .           .   .
 . .       .            . .
  .       . .            .
         .   .
        .  o  .
         .   .
          . .
           .

Бонус -20%, если ваша программа выводит текстовый файл с именем «[your-word] .txt». Затем введите реальное слово (или фразу, написанную строчными буквами без пробелов) длиной не менее 20 букв, но еще никто не выбрал, и вставьте вывод между a <pre>и a </pre>в свой ответ.


Ваши примеры, кажется, используют бриллианты размера p + 1 точек ...
Jaykul

3
@Jaykul Хороший вопрос. Длина стороны определяется количеством пробелов между точками.
геокавель

Ответы:


8

Matlab, 466 393 - 20% = 314,4 байта

Гольф: (Может сэкономить еще несколько байтов, в том числе благодаря помощи @ AndreasDeak!)

function q(W);function z=g(l,c);[x,y]=ndgrid(abs(-l:l));z=0*y;z(~x&~y)=c;z(x+y==l)=46;end;w=W-96;n=numel(w);R=n*26;C=1;A=zeros(2*R);for k=1:n;f=sort(factor(w(k)));C=C+max(f)+1;d=-1;r=R;for F=fliplr(f);v=-F:F;while norm(A(r+v,v+C));r=r+d;end;A(r+v,v+C)=g(F,W(k));d=-d;end;C=C+max(f);end;A=A(find(sum(A,2)),find(sum(A)));f=fopen([W,'.txt'],'w');for k=1:size(A,1);fprintf(f,[A(k,:),'\n']);end;end

Он также должен работать в Octave (opensource), но только с большим количеством предупреждений. Используйте эту версию, если вы хотите попробовать ее в октаве (вывод на консоль, а не в файл):

function q(W);function z=g(l,c);[x,y]=ndgrid(abs(-l:l));z=0*y;z(~x&~y)=c;z(x+y==l)=46;end;w=W-96;n=numel(w);R=n*26;C=1;A=zeros(2*R);for k=1:n;f=sort(factor(w(k)));C=C+max(f)+1;d=-1;r=R;for F=fliplr(f);v=-F:F;while norm(A(r+v,v+C));r=r+d;end;A(r+v,v+C)=g(F,W(k));d=-d;end;C=C+max(f);end;A=A(find(sum(A,2)),find(sum(A)));disp([A,'']);end

Разгромил и объяснил:

function q(W)
function z=g(l,c) %get a square matrix for one prime factor
[x,y]=ndgrid(abs(-l:l));
z=0*y;
z(~x&~y)=c;    %character in the middle
z(x+y==l)=46;  %dots
end;
w=W-96;                %convert word to the corresponding indices                  
n=numel(w);
R=n*26;                %keeps track of the main row 
C=1;                   %keeps track of the current column
A=zeros(2*R);          %make a 'canvas' matrix that is way to big 
for k=1:n;
    f=sort(factor(w(k)));          %get all the factors of current character
    C=C+max(f)+1;                  %update current column
    d=-1;                          %search direction
    r=R;
    for F=fliplr(f);              
        v=-F:F;
        while norm(A(r+v,v+C));    %go up or down until there is enough space to write the prime factor
            r=r+d;
        end;
        A(r+v,v+C)=g(F,W(k));     %insert all the prime factors
        d=-d;
    end;
    C=C+max(f);
end;
A=A(find(sum(A,2)),find(sum(A))); %truncate all the unneccessary padding
f=fopen([W,'.txt'],'w');     %write to file
for k=1:size(A,1);
    fprintf(f,[A(k,:),'\n']);
end;

end

Запрашиваемое слово: (а здесь в виде файла: (сильно уменьшить): supercalifragilisticexpialidocious.txt )

                       , , ,                   
                      , , , , , ,                  
                     , , , , , ,                 
                    , , , , , ,                
                   , , , , , ,               
                  , , , , , ,              
                 , , , , , ,             
                , , , , , ,            
               , , , , , ,           
              , , , , , , ,          
             , , , , , , , ,         
            , , , , , , , , , т. , , , ,        
           , , , , , , , , , , , , , , , , , , , , , , , , ,       
          , , , , , , , р . , л , р . , , , л , , , , Икс . , , , л , , , ,      
         , , , , , п . , , , , , , , , , , , , , , , , , , п . , , , , , , , ,     
        , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,    
       , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,   
      , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,  
     , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,
    , s .. u .. p .. e .. r .. c ..a .. l .. i .. f .. r ..a .. g .. i .. l .. i .. s. . т .. я .. с .. е .. х .. р .. я ..а .. л .. я .. д .. о .. с .. я .. о .. ты .. с ,
     , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,
      , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,  
       , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,   
        , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,    
         , , , , , п . , , , , , , , , , , , , , , , , , , , , , , , , , , , , п . , , , , , , , день , , , , , , , ,     
          , , , , , , , , , л , , , ф. , , , , , , , л , , , , , , , , Икс . , , , , , л , , , , , , , , , , , ,      
           , , , , , р . , , , я , , , р . , , я , , , я , , , , , я , , , , я , , , я , , , , я , , , , ,       
            , , , , , , , , , , , , , , , , , , , , т. , , , , , , , , , , , , , , , , , ,        
             , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , о , , , о , , , ,         
              , , , , , п . , , , , , , , , , , , , п . , , , , , , , , , , ,          
               , , , ты , , , , , Икс . , , , , , , , ты , ,           
                , , , , , , , , , , , , , , , ,            
                 , , , , , , , , , , ,             
                  , , , , , , , ,              
                   , , , , , ,               
                    , , , , , ,                
                     , , , , , ,                 
                      , , , , , ,                  
                       , , ,                   

Не будет A=A(find(sum(A,2)),find(sum(A)));достаточно для удаления прокладки за один шаг?
Андрас Дик

Я на самом деле получил отличные результаты, когда вставил выходной текст между двумя <pre>тегами. Почему бы тебе не попробовать это!
геокавель

Вы уверены, что вам нужно sort(factor())? MATLAB, factorкажется, уже отсортированы. И вы можете определить переменную для max(f), так как вы, кажется, используете это же количество дважды.
Андрас Дик

1
@geokavel Я полагаю, что вы смотрите на это с другой стороны :) Из [Библии] (en.wikipedia.org): MATLAB -> «Первый выпуск - 1984», GNU Octave -> Первый выпуск - 1988 ». Как Может быть, Mathworks позволяет копировать свой коммерческий продукт с такими незначительными деталями? Или, если вы только что имели в виду, почему это все еще выгодно: я уверен, что доступные наборы инструментов и функции MATLAB превосходят Octave (хотя синтаксис Octave иногда богаче! Не говоря уже о скорости (я думаю).
Андрас Дик

1
@geokavel Как сказал AndrasDeak: Octave - клон Matlab, но, к сожалению, не идеальный, так как разработчики также пытались улучшить язык. Вот немного измененная версия, которая также работает в онлайн-переводчике: goo.gl/Jk7mpV
flawr

6

Funciton , неконкурентный, 29199 байт

Мне понравился этот вызов, потому что он подчеркнул острую нехватку некоторых очень полезных библиотечных функций. Я включу все эти функции здесь (и в число байтов), потому что я написал их после того, как этот вызов был опубликован.

Полный исходный код в одном файле

объяснение

Как всегда, получите лучший рендеринг, выполнив javascript:(function(){$('pre,code').css({lineHeight:5/4});})()в консоли браузера.

ɹ Обратный

Как вы можете знать или не знать, Funciton поставляется с библиотекой, полной функций для списков , которые представляют собой значения, закодированные в одном огромном целом числе, а также отдельной библиотекой для вычислений с отложенным вычислением. , которые используют лямбда-выражения (анонимные функции) в чтобы быть ленивым. Конечно, есть также библиотека для функций обработки строк.

Для этой задачи мне понадобилась функция, чтобы перевернуть строку, и функция, чтобы перевернуть лениво вычисленную последовательность. Удивительно, но у меня был только один для списков - именно тот, который мне не нужен. Итак, вот обратные функции для ленивых последовательностей ( ɹ) и для строк ( ):

              ╓───╖             ╔════╗ ┌────╖        ╓───╖
              ║ ɹ ║             ║ 21 ╟─┤ >> ╟──┐     ║ ⇄ ║
              ╙─┬─╜             ╚════╝ ╘═╤══╝  │     ╙─┬─╜      ┌──┐
          ┌─────┴─────┐                ┌─┴─╖   ├───────┴────────┤  │
        ┌─┴─╖ ┌───╖   │                │ ⇄ ║   │   ╔════╗ ┌───╖ │  │
      ┌─┤   ╟─┤ ɹ ╟─┐ │                ╘═╤═╝   │   ║ −1 ╟─┤ ≠ ╟─┴┐ │
      │ └─┬─╜ ╘═══╝ │ │                ┌─┴─╖ ┌─┴─╖ ╚════╝ ╘═╤═╝  │ │
      │   │   ┌───╖ │ │                │ ‼ ╟─┤ ? ╟──────────┤    │ │
      │   └───┤ ʬ ╟─┘ │                ╘═╤═╝ ╘═╤═╝  ╔═══╗ ┌─┴─╖  │ │
      │       ╘═╤═╝   │                ┌─┴─╖ ╔═══╗  ║ 0 ╟─┤ ≠ ╟──┘ │
      │ ╔═══╗ ┌─┴─╖   │              ┌─┤ ʃ ╟─╢ 1 ║  ╚═╤═╝ ╘═══╝    │
      └─╢ 0 ╟─┤ ? ╟───┘              │ ╘═╤═╝ ╚═══╝    │            │
        ╚═══╝ ╘═╤═╝                  │   └────────────┘            │
                │                    └─────────────────────────────┘

Используемые ленивые последовательности ʬ, которые «добавляют элемент в конец ленивой последовательности». Используемая строка ʃ(подстрока) и (конкатенация строки).

простые числа

Хотя я мог бы выполнить простое факторирование, просто пытаясь разделить n на все факторы по порядку, я решил, что мне нужна библиотечная функция, которая генерирует простые числа. Следующая функция принимает целое число n и реализует сито Эратосфена для генерации всех простых чисел вплоть до n . Он делает это как ленивую последовательность, поэтому генерирует столько простых чисел, сколько вы на самом деле оцениваете.

                                       ╓───╖
                                       ║ Ṗ ║
                                 ╔═══╗ ╙─┬─╜
                                 ║ 0 ║ ┌─┴─╖
                                 ╚═╤═╝ │ ♭ ║
                          ╔═══╗ ┌──┴─╖ ╘═╤═╝
                          ║ 2 ╟─┤ Ṗp ╟───┘
                          ╚═══╝ ╘══╤═╝
    ┌──────────────┐               │
    │              ├─────────────────────────────────────────┐
    │            ┌─┴─╖                                       │
    │          ┌─┤ · ╟────────────────────────────┐   ╓┬───╖ │
    │          │ ╘═╤═╝                            ├───╫┘Ṗp ╟─┤
    │          │   │           ╔═══╗ ┌────╖     ┌─┴─╖ ╙─┬──╜ │
    │          │   │           ║ 1 ╟─┤ >> ╟─────┤ · ╟───┴─┐  │
    │          │   │  ┌───╖    ╚═══╝ ╘══╤═╝     ╘═╤═╝     │  │
    │          │ ┌─┴──┤ ♯ ╟─────┐    ┌──┴─╖ ┌───╖ │       │  │
    │          │ │    ╘═══╝ ┌─┐ │ ┌──┤ Ṗp ╟─┤ ♭ ╟─┴─┐     │  │
    │          │ │          ├─┘ └─┤  ╘══╤═╝ ╘═══╝ ┌─┘     │  │
    │          │ │        ╔═╧═╕ ┌─┴─╖ ┌─┴─╖     ┌─┴─╖     │  │
    │          │ └────────╢   ├─┤ · ╟─┤ ? ╟─────┤ · ╟─┐   │  │
    │          │ ┌───╖    ╚═╤═╛ ╘═╤═╝ ╘═╤═╝     ╘═╤═╝ │   │  │
    │        ┌─┴─┤ ♭ ╟─┐ ┌──┴─╖   │   ┌─┴─╖       │   │   │  │
    │        │   ╘═══╝ └─┤ Ṗp ╟───┘ ┌─┤ ? ╟───────┘   │   │  │
    │ ┌───╖  │  ╔════╗   ╘══╤═╝     │ ╘═╤═╝           │   │  │
  ┌─┴─┤ ÷ ╟──┘  ║ −1 ║   ┌──┴─╖   ╔═╧═╗ │            ┌┴┐  │  │
  │   ╘═╤═╝     ╚══╤═╝ ┌─┤ >> ╟─┐ ║ 0 ║              └┬┘  │  │
  │   ┌─┴─╖ ┌────╖ │   │ ╘════╝ │ ╚═══╝               │   │  │
  │   │ × ╟─┤ << ╟─┘ ┌─┴─┐    ╔═╧═╗                   │   │  │
  │   ╘═╤═╝ ╘══╤═╝  ┌┴┐ ┌┴┐   ║ 1 ╟───────────────────┴─┐ │  │
  └─────┘     ┌┴┐   └┬┘ └┬┘   ╚═══╝                     ├─┘  │
              └┬┘    │   └──────────────────────────────┘    │
             ┌─┴─╖ ┌─┴──╖                                    │
             │ ÷ ╟─┤ << ╟─┐                                  │
             ╘═╤═╝ ╘════╝ ├──────────────────────────────────┘
              ┌┴┐         │
              └┬┘         │
      ╔════╗ ┌─┴──╖       │
      ║ −1 ╟─┤ << ╟───────┘
      ╚════╝ ╘════╝

Вспомогательная функция Ṗp, принимает:

  • Счетчик хода, который просто продолжает уменьшаться, пока не достигнет 0.

  • Сито, бит которого установлен для каждого числа, которое, как известно, не является простым. Первоначально младший значащий бит представляет число 2, но мы сдвигаем это право с каждой итерацией.

  • Число n, которое указывает, какое число представлено младшим битом сита; это увеличивается с каждой итерацией.

На каждой итерации, если младший бит сита равен 0, мы находим простое число n . Затем мы используем формулу, которую я уже описал в разделе Заполнить строки, столбцы и диагонали сетки NxN, чтобы установить каждое n бит в сите, прежде чем переходить к следующей итерации.

премьер факторизация

                             ╓───╖
                             ║ Ḟ ║
                             ╙─┬─╜
                       ┌───────┴──────┐
                       │ ┌───╖ ┌────╖ │
                       └─┤ Ṗ ╟─┤ Ḟp ╟─┘
                         ╘═══╝ ╘═╤══╝
                                 │
               ┌────────────────────────────────────────────┐
               │                                     ╓┬───╖ │
       ┌───────┴─┐     ┌───────────────────────┐   ┌─╫┘Ḟp ╟─┘
       │ ╔═══╗ ┌─┴─╖ ┌─┴─╖ ┌───┐ ┌────╖      ┌─┴─╖ │ ╙────╜
       │ ║ 0 ╟─┤   ╟─┤ · ╟─┘┌┐ └─┤ Ḟp ╟──┐ ┌─┤ · ╟─┴──┐
       │ ╚═══╝ └─┬─╜ ╘═╤═╝  └┤   ╘═╤══╝  ├─┘ ╘═╤═╝    │
       │       ┌─┴─┐ ┌─┴─╖ ╔═╧═╕ ┌─┴─╖ ┌─┴─╖ ┌─┴──╖ ┌─┴─╖
       │       │   └─┤ · ╟─╢   ├─┤ ? ╟─┤ · ╟─┤ ÷% ╟─┤ · ╟─┐
       │       │     ╘═╤═╝ ╚═╤═╛ ╘═╤═╝ ╘═╤═╝ ╘═╤══╝ ╘═╤═╝ │
       │       │    ┌──┴─╖   │   ┌─┴─╖ ┌─┴─╖   └──────┘   │
       │       │    │ Ḟp ╟───┘ ┌─┤ ? ╟─┤ ≤ ║              │
       │     ┌─┴─╖  ╘══╤═╝     │ ╘═╤═╝ ╘═╤═╝              │
       └─────┤ · ╟─────┘     ╔═╧═╗ │   ╔═╧═╗              │
             ╘═╤═╝           ║ 0 ║     ║ 2 ║              │
               │             ╚═══╝     ╚═══╝              │
               └──────────────────────────────────────────┘

Это довольно просто. Просто переберите простые числа до n и посмотрите, какие из них делят n . Если кто-то делит n , не забудьте продолжить с тем же самым простым, чтобы мы возвращали его несколько раз, если он делит n несколько раз. Это возвращает пустую последовательность для любого числа меньше 2.

создать бриллиант

Эта функция генерирует один ромб с указанным символом и радиусом. Он использует только персонажа, чтобы поместить его в центр алмаза.

                                   ┌───╖
             ┌─────────────────────┤ ♯ ╟───────────┬─────────┐
             │ ┌───╖ ╔═══╗   ┌───┐ ╘═══╝           │         │
             └─┤ ♫ ╟─╢ 0 ║   │ ┌─┴─╖               │         │
               ╘═╤═╝ ╚═══╝   │ │ ʭ ╟───┐           │         │
               ┌─┴─╖   ┌─────┘ ╘═╤═╝   │           │         │
               │ ɱ ╟───┤ ┌───╖ ┌─┴─╖ ╔═══╗   ╓───╖ │         │
               ╘═╤═╝   └─┤ ɹ ╟─┤ ʓ ╟─╢ 1 ║ ┌─╢ ◇ ╟─┤         │
                 │ ╔═══╗ ╘═══╝ ╘═══╝ ╚═══╝ │ ╙───╜ │         │
                 │ ║ 0 ║                   │     ┌─┴─╖       │
                 │ ╚═╤═╝                   │     │ ♭ ║       │
               ╔═╧═╕ │   ╔════╗            │     ╘═╤═╝       │
           ┌───╢   ├─┘ ┌─╢ 21 ║          ┌─┴─╖   ┌─┴─╖     ┌─┴─┐
           │   ╚═╤═╛   │ ╚════╝ ┌────────┤ · ╟───┤ · ╟─┐ ┌─┴─╖ │
           │   ┌─┴─╖ ┌─┴──╖ ┌───┘        ╘═╤═╝   ╘═╤═╝ ├─┤ = ║ │
           │ ┌─┤ ‼ ╟─┤ >> ║ │              │     ┌─┴─╖ │ ╘═╤═╝ │
           │ │ ╘═══╝ ╘═╤══╝ │              │   ┌─┤ ? ╟─┘   │   │
           │ │   ┌───╖ │ ┌──┘              │   │ ╘═╤═╝     │   │
           │ └─┬─┤ ⇄ ╟─┘ │     ┌─────┐     │   │ ┌─┴─╖     │   │
           │   │ ╘═══╝ ┌─┴─╖ ┌─┴─╖ ┌─┴─╖ ┌─┴─╖ └─┤ · ╟──┬──┘   │
           │   └───────┤ · ╟─┤ ? ╟─┤ · ╟─┤ ‼ ║   ╘═╤═╝  │      │
           │           ╘═╤═╝ ╘═╤═╝ ╘═╤═╝ ╘═╤═╝   ┌─┴─╖  │      │
           │             └─────┘     └─┬───┘ ┌───┤ … ║  │      │
           │               ┌─────┐     │     │   ╘═╤═╝  │      │
           │            ╔══╧═╗ ┌─┴─╖ ┌─┴─╖ ┌─┴─╖ ╔═╧══╗ │      │
           │            ║ 32 ║ │ … ╟─┤ ‼ ╟─┤ ‼ ║ ║ 32 ║ │      │
           │            ╚════╝ ╘═╤═╝ ╘═══╝ ╘═╤═╝ ╚════╝ │      │
           │                   ┌─┴─╖       ╔═╧══╗       │      │
           │               ┌───┤ − ╟───┬─┐ ║ 46 ║       │      │
           │             ┌─┴─╖ ╘═══╝   │ │ ╚════╝       │      │
           └─────────────┤ · ╟─────────┘ └──────────────┘      │
                         ╘═╤═╝                                 │
                           └───────────────────────────────────┘

Это делает интенсивное использование ленивых последовательностей. Вот как это работает:

  • Генерация последовательности целых чисел от 0 до r (включительно).

  • Для каждого такого целого числа & alpha ; , генерировать строку , состоящую из ( г - & alpha ; ) пространств ( ), за которым следует точка, с последующим альфа пространств - если α = г , и в этом случае не генерируют один меньше места и добавить букву. Теперь у нас есть верхняя левая четверть алмаза.

  • К каждой из этих строк добавьте еще одну копию той же строки, но с обратными символами ( ) и затем первым символом, удаленным ( >> 21). Теперь у нас есть верхняя половина бриллианта.

  • Возьмите эту последовательность и добавьте к ней ту же последовательность, но в обратном порядке ( ɹ) и с первым удаленным элементом ( ʓ). Теперь у нас есть весь бриллиант.

Теперь у нас есть нити, из которых состоит бриллиант, но нам нужно немного больше информации. Нам нужно знать, где находится вертикальная середина алмаза. Изначально это, конечно, r , но как только мы добавим другие бриллианты сверху и снизу, нам нужно будет отслеживать положение «среднего» бриллианта, чтобы мы могли правильно выровнять другие стопки бриллиантов по вертикали. , То же самое касается горизонтальной протяженности алмаза (это необходимо при добавлении алмазов сверху и снизу). Я также решил следить за письмом; Мне это нужно, потому что в противном случае функция (о которой мы поговорим в следующем разделе) должна иметь четыре параметра, а Funciton допускает только три.

                             ┌─────────────────┐
                             │  ╓───╖          │
                             ├──╢ ◆ ╟──┐       │
                             │  ╙───╜  │       │
                             │   ┌─────┴───┐   │
                           ┌─┴─╖ │ ┌───╖ ┌─┴─╖ │
                         ┌─┤ · ╟─┴─┤ › ╟─┤ › ║ │
                         │ ╘═╤═╝   ╘═╤═╝ ╘═╤═╝ │
                         │ ┌─┴─╖     │   ┌─┴─╖ │
                         │ │ ◇ ╟─────────┤ › ╟─┘
                         │ ╘═╤═╝         ╘═══╝
                         └───┘

Мы используем API списка ( добавляет элементы в начало списка), чтобы создать структуру, содержащую [ x , y , c , q ], где x - это координата x горизонтального центра ромба, y - это y- координата базовой линии, c - буква, а q - ленивая последовательность строк. Эта структура будет теперь содержать все промежуточные этапы.

Добавить бриллианты по вертикали

Эта функция принимает существующий стек алмазов, радиус и логическое значение, указывающее, добавлять ли новый алмаз в верхнюю часть (true) или нижнюю (false).

                 ┌─────────────────────────────────────────────────┐
               ┌─┴─╖         ┌───────────────────────────┐ ┌───╖ ┌─┴─╖
           ┌───┤ · ╟─────────┘ ╔═══╗ ┌───────────────┐   ├─┤ ‹ ╟─┤ ‹ ║
           │   ╘═╤═╝           ║ 1 ║ │ ╓───╖         │   │ ╘═╤═╝ ╘═╤═╝
           │     │             ╚═╤═╝ └─╢ ⬗ ╟─┐       │ ┌─┴─╖ │   ┌─┴─╖
           │     │ ┌───╖ ┌───╖ ┌─┴──╖  ╙─┬─╜ │       └─┤ · ╟─┘ ┌─┤ ‹ ╟─┐
           │   ┌─┴─┤ + ╟─┤ ♯ ╟─┤ << ║    │   │         ╘═╤═╝   │ ╘═══╝ │
           │   │   ╘═╤═╝ ╘═══╝ ╘═╤══╝    │ ┌─┴─╖         │     │       │
           │   │   ┌─┴─╖         └───────┴─┤ · ╟───┐   ┌─┴─╖   │       │
           │   └───┤ ? ╟─┐                 ╘═╤═╝ ┌─┴───┤ · ╟─┐ │       │
           │       ╘═╤═╝ ├───────────────────┘   │     ╘═╤═╝ │ │       │
           │ ┌───╖ ┌─┴─╖ │               ┌─────┐ │ ┌───╖ │   │ │       │
           └─┤ › ╟─┤ › ║ │       ┌───╖ ┌─┴─╖   │ └─┤ − ╟─┘   │ │       │
             ╘═╤═╝ ╘═╤═╝ │     ┌─┤ ‼ ╟─┤ ‼ ║   │   ╘═╤═╝     │ │       │
               │   ┌─┴─╖ │     │ ╘═╤═╝ ╘═╤═╝ ┌─┴─╖ ┌─┴─╖     │ │       │
               ┌───┤ · ╟─┘     │ ┌─┴─╖   ├───┤ · ╟─┤ … ║     │ │       │
     ┌───┐     │   ╘═╤═╝       └─┤ · ╟───┘   ╘═╤═╝ ╘═╤═╝     │ │       │
     │ ┌─┴─╖ ┌─┴─╖ ┌─┴─╖         ╘═╤═╝         │  ╔══╧═╗     │ │       │
     │ │ ʭ ╟─┤ ? ╟─┤ › ╟─┐ ╔═══╗ ╔═╧═╕         │  ║ 32 ║     │ │       │
     │ ╘═╤═╝ ╘═╤═╝ ╘═══╝ │ ║ 0 ╟─╢   ├─────────┘  ╚════╝     │ │       │
     │ ┌─┘   ┌─┴─╖       │ ╚═══╝ ╚═╤═╛                       │ │       │
     │ └─┬───┤ ʭ ╟─┐   ┌─┴─╖     ┌─┴─╖                       │ │       │
     │ ┌─┴─╖ ╘═══╝ ├───┤ · ╟─────┤ ɱ ║                       │ │       │
     └─┤ · ╟───────┘   ╘═╤═╝     ╘═╤═╝                       │ │       │
       ╘═╤═╝             │       ┌─┴─╖                       │ │       │
         │               └─────┬─┤ ◇ ╟───────────────────────┘ │       │
         │                     │ ╘═══╝                       ┌─┴─╖     │
         │                     └─────────────────────────────┤ · ╟─────┘
         │                                                   ╘═╤═╝
         └─────────────────────────────────────────────────────┘

Это тоже довольно просто; использовать для распаковки структуры; использовать для генерации нового алмаза; используйте ɱ(map), чтобы добавить пробелы в начало и конец каждой строки нового ромба, чтобы все они имели одинаковую ширину; append ( ʭ) новые строки на старую (если снизу) или старую на новую (если сверху); и, наконец, использовать для построения структуры, содержащей все новые значения. В частности, если мы добавляем снизу, y не меняется, но если мы добавляем сверху, y должно увеличиваться на ♯(r << 1)( r - радиус нового алмаза).

сцепить стеки горизонтально

Это самая большая функция из всех. Я не буду отрицать, что это было довольно рискованно, чтобы получить это право. Он берет два стека и соединяет их горизонтально, соблюдая правильное вертикальное выравнивание.

                           ┌──────────────────────────────────┬───────────────────────┐
                           │     ┌──────────────────┐       ┌─┴─╖                   ┌─┴─╖
                           │     │    ┌───────────┐ └───────┤ · ╟───┬───────────────┤ · ╟─────────────┐
                           │     │  ┌─┴─╖         │         ╘═╤═╝   │               ╘═╤═╝             │
                           │     │  │ ‹ ╟───┐     │         ┌─┴─╖ ┌─┴─╖               │               │
                           │     │  ╘═╤═╝ ┌─┴─╖   └─────────┤ · ╟─┤ · ╟─────────┐     │               │
                           │     │    ├─┐ │ ‹ ╟───┐         ╘═╤═╝ ╘═╤═╝         │     │               │
                           │     │    └─┘ ╘═╤═╝ ┌─┴─╖ ╓───╖ ┌─┴─╖   │           │     │               │
                           │     │          │   │ ‹ ╟─╢ ❖ ╟─┤ ‹ ║   │           │     │               │
                           │     │          │   ╘═╤═╝ ╙───╜ ╘═╤═╝ ┌─┴─╖ ┌─┐     │     │               │
                           │     │          │     │           └───┤ ‹ ║ └─┤     │     │               │
                           │     │          │     │               ╘═╤═╝ ┌─┴─╖   │     │               │
                           │     │          │     │                 └───┤ ‹ ║   │     │               │
                           │     │          │     └─────────────────┐   ╘═╤═╝   │     │               │
                           │     │          │                     ┌─┴─╖ ┌─┴─╖ ┌─┴─╖ ┌─┴─╖             │
                           │     │          │      ┌──────────────┤ · ╟─┤ · ╟─┤ · ╟─┤ · ╟──────┐      │
                           │     │          └──────┤              ╘═╤═╝ ╘═╤═╝ ╘═╤═╝ ╘═╤═╝      │      │
                           │   ┌─┴─╖             ┌─┴─╖            ┌─┴─╖   │     │     │        │      │
                           │ ┌─┤ · ╟─────────────┤ · ╟────────────┤ · ╟───┘     │     │        │      │
                           │ │ ╘═╤═╝             ╘═╤═╝            ╘═╤═╝         │     │        │      │
                           │ │   │                 │         ┌────╖ │         ┌─┴─╖   │        │      │
       ╔═══╗ ┌────╖        │ │   │                 │       ┌─┤ << ╟─┴─────────┤ · ╟─┐ │        │      │
       ║ 1 ╟─┤ << ╟────────┘ │   │                 │       │ ╘═╤══╝           ╘═╤═╝ │ │        │      │
       ╚═══╝ ╘═╤══╝ ╔════╗   │   │               ┌─┴─╖     │ ┌─┴─╖              │   │ │     ┌──┴──┐   │
             ┌─┴─╖  ║ 32 ╟─┐ │   │ ┌─────────────┤ · ╟───┐ │ │ ♯ ║              │   │ │   ┌─┴─╖ ┌─┴─╖ │
             │ ♯ ║  ╚════╝ │ │   └─┤ ┌───╖       ╘═╤═╝   │ │ ╘═╤═╝ ┌───╖ ╔════╗ │   │ │ ┌─┤ ? ╟─┤ < ║ │
             ╘═╤═╝   ┌───╖ │ │     └─┤ − ╟─────────┴─┐   │ │   └───┤ … ╟─╢ 32 ║ │   │ │ │ ╘═╤═╝ ╘═╤═╝ │
               └─────┤ … ╟─┘ │       ╘═╤═╝         ┌─┴─╖ │ └───┐   ╘═╤═╝ ╚════╝ │   │ │ │ ┌─┴─╖   ├───┘
                     ╘═╤═╝   │ ┌───╖ ┌─┴─╖ ┌───────┤ · ╟─┴─┐ ╔═╧═╗ ┌─┴─╖ ┌──────┘   │ │ └─┤ · ╟───┘
                       │   ┌─┴─┤ ʭ ╟─┤ ȶ ║ │ ┌───╖ ╘═╤═╝   │ ║ 1 ║ │ ⁞ ║ │ ┌────────┘ │   ╘═╤═╝
                     ┌─┴─╖ │   ╘═╤═╝ ╘═╤═╝ └─┤ > ╟───┴─┐   │ ╚═══╝ ╘═╤═╝ │ │   ┌──────┘     └────┐
                     │ ⁞ ║ │   ┌─┴─╖ ┌─┴─╖   ╘═╤═╝     │ ┌─┴─╖ ┌───╖ │   │ │ ┌─┴─╖ ┌───╖ ┌───╖ ┌─┴─╖
                     ╘═╤═╝ └───┤ ? ╟─┤ · ╟─────┴─┐     │ │ − ╟─┤ ȶ ╟─┴─┐ │ │ │ + ╟─┤ ♯ ╟─┤ › ╟─┤ › ║
                     ┌─┴─╖     ╘═╤═╝ ╘═╤═╝       │     │ ╘═╤═╝ ╘═╤═╝   │ │ │ ╘═╤═╝ ╘═══╝ ╘═╤═╝ ╘═╤═╝
┌────────────────────┤ · ╟───────┴───┐ └─┐     ┌─┴─╖   └───┘   ┌─┴─╖   │ │ └───┘           │     │
│                    ╘═╤═╝         ┌─┴─╖ │   ┌─┤ · ╟───────────┤ · ╟───┘ │                       │
│ ┌────────────────┐   │   ┌───────┤ · ╟─┘   │ ╘═╤═╝           ╘═╤═╝     │                       │
│ │ ╔════╗ ┌───╖ ┌─┴─╖ └───┤ ┌───╖ ╘═╤═╝     │   │               │     ┌─┴───┐                   │
│ │ ║ 32 ╟─┤ ‼ ╟─┤ · ╟───┐ └─┤ ʭ ╟───┘       │   │             ┌─┴─╖ ┌─┴─╖ ┌─┴─╖                 │
│ │ ╚════╝ ╘═╤═╝ ╘═╤═╝   │   ╘═╤═╝     ┌─────┘   │             │ ʭ ╟─┤ · ╟─┤ ? ╟─┐               │
│ │        ┌─┴─╖ ╔═╧═╕ ╔═╧═╕ ┌─┴─╖   ┌─┴─╖       │             ╘═╤═╝ ╘═╤═╝ ╘═╤═╝ │               │
│ │        │ ‼ ╟─╢   ├─╢   ├─┤ ʑ ╟───┤ ʭ ║     ┌─┴─╖             └─────┘     │   │               │
│ │        ╘═╤═╝ ╚═╤═╛ ╚═╤═╛ ╘═╤═╝   ╘═╤═╝ ┌───┤ · ╟─────────────────────────┘   │               │
│ └──────────┘     │   ╔═╧═╗   │       ├───┘   ╘═╤═╝                             │               │
│                  └───╢ 0 ║ ┌─┴─╖   ┌─┴─╖       └───────────────────────────────┘             ┌─┴─╖ ╔═══╗
│                      ╚═══╝ │ ȶ ╟───┤ · ╟─────────────────────────────────────────────────────┤ › ╟─╢ 0 ║
│                            ╘═╤═╝   ╘═╤═╝                                                     ╘═══╝ ╚═══╝
│                            ┌─┴─╖   ┌─┴─╖
│                      ┌─────┤ ? ╟─┐ │ ɕ ║
│                    ┌─┴─╖   ╘═╤═╝ │ ╘═╤═╝
│            ┌───╖ ┌─┤ < ╟───┬─┘   │   │
└────────────┤ ɕ ╟─┤ ╘═══╝ ┌─┴─╖   │   │
             ╘═══╝ └───────┤ · ╟───┘   │
                           ╘═╤═╝       │
                             └─────────┘

Вот как это работает.

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

  • Значения y стеков говорят нам, что нужно «двигаться вниз» и на сколько. Добавьте соответствующую последовательность пробелов, усеченную ( ȶ) до нужной длины ( y1 - y2 или y2 - y1 в зависимости от ситуации).

  • Теперь определите длину каждой из последовательностей строк ( ɕ), которая сообщает нам их высоту. Узнайте, какой из них выше.

  • Добавьте последовательности бесконечного пространства в оба стека.

  • Используйте zip ( ʑ), чтобы соединить их. Для каждой пары строк объедините их ( ) вместе с дополнительным пробелом между ними.

  • Затем используйте ȶдля усечения результата до самой высокой высоты. Делая это поздно, нам не нужно заботиться о том, кому из них нужна прокладка.

Наконец, сгенерируйте структуру снова. На этом этапе нам больше не нужен символ в ромбах, поэтому мы устанавливаем его равным 0. Значение x просто суммируется и увеличивается (так что ширина стека все еще может быть вычислена как ♯(x << 1)). Значение y установлено на более высокое значение из двух.

Перебирать символы в строке

Это еще одна полезная функция, которую я добавлю в библиотеку. Учитывая строку, она дает вам ленивую последовательность, содержащую каждый код символа.

                                        ╓───╖
                                        ║ ↯ ║
                                        ╙─┬─╜
                           ┌──────────────┴────────────────┐
                           │      ┌─┐          ╔═══╗ ┌───╖ │
                           │      └─┤     ┌────╢ 0 ╟─┤ ≠ ╟─┴─┐
                    ┌──────┴─┐ ┌┐ ╔═╧═╕ ┌─┴─╖  ╚═══╝ ╘═╤═╝   │
                    │        ├─┤├─╢   ├─┤ ? ╟──────────┤     │
                    │        │ └┘ ╚═╤═╛ ╘═╤═╝ ╔════╗ ┌─┴─╖   │
                    │ ╔══════╧══╗ ┌─┴─╖   │   ║ −1 ╟─┤ ≠ ╟───┘
                    │ ║ 2097151 ║ │ ↯ ║       ╚════╝ ╘═══╝
                    │ ╚═════════╝ ╘═╤═╝
                    │             ┌─┴──╖ ╔════╗
                    └─────────────┤ >> ╟─╢ 21 ║
                                  ╘════╝ ╚════╝

andПри вводе строки с 2097151 возвращается первый символ. >>использование его на 21 удаляет его. Мы проверяем и 0 и -1 по причине, объясненной на странице esolangs ; это не относится к этой проблеме, но я хочу, чтобы библиотечная функция была правильной.

Character конвертировать персонажа в стек алмазов

Эта функция принимает один символ и возвращает структуру для вертикального стека, представляющего этот один символ.

                                   ╔════╗
                                   ║ 96 ║  ╓───╖
                                   ╚══╤═╝  ║ ⬖ ║
                        ┌───╖ ┌───╖ ┌─┴─╖  ╙─┬─╜
                    ┌───┤ ɗ ╟─┤ Ḟ ╟─┤ − ║    │
                    │   ╘═╤═╝ ╘═══╝ ╘═╤═╝    │
                    │   ┌─┴─╖         ├──────┘  ┌──┐
                    │   │ ɹ ║         │     ┌───┤  │
                    │   ╘═╤═╝   ┌─────┘     │   │  │
                  ╔═╧═╗ ┌─┴─╖ ┌─┴─╖         │  ┌┴┐ │
                  ║ 1 ╟─┤   ╟─┤ · ╟─────┐ ╔═╧═╕└┬┘ │
                  ╚═══╝ └─┬─╜ ╘═╤═╝   ┌─┴─╢   ├─┘ ┌┴┐
            ┌───────────┐ │     └─┐   │   ╚═╤═╛   └┬┘
          ┌─┴─╖         │ │ ┌───╖ │   └─┐ ╔═╧═╕ ┌──┴─╖ ╔═══╗
    ┌─────┤ · ╟───┐     │ └─┤ ◆ ╟─┘   ┌─┴─╢   ├─┤ << ╟─╢ 1 ║
 ┌──┴─┐   ╘═╤═╝   │     │   ╘═╤═╝     │   ╚═╤═╛ ╘════╝ ╚═╤═╝
 │ ┌──┴─╖ ┌─┴─╖ ╔═╧═╕ ╔═╧═╕ ┌─┴─╖   ┌─┴─╖ ┌─┴─╖        ┌─┴─╖
 │ │ >> ╟─┤ ⬗ ╟─╢   ├─╢   ├─┤ ʩ ╟───┤ · ╟─┤ ʑ ╟────────┤ ⸗ ║
 │ ╘══╤═╝ ╘═╤═╝ ╚═╤═╛ ╚═╤═╛ ╘═╤═╝   ╘═╤═╝ ╘═╤═╝        ╘═╤═╝
 │  ╔═╧═╗  ┌┴┐    │   ╔═╧═╗   │       └─────┘          ╔═╧═╗
 │  ║ 1 ╟─┐└┬┘    └───╢ 0 ║                            ║ 0 ║
 │  ╚═══╝ ├─┘         ╚═══╝                            ╚═══╝
 └────────┘

Эта функция интересна тем, что нам нужно было попеременно добавлять ромбы снизу и сверху. Вот как я это сделал:

  • Сначала вычтите 96 (так 'a'становится 1), получите простые множители (см. Выше), используйте ɗдля добавления элемента 1, если последовательность пуста, а затем в обратном порядке ( ɹ) в порядке.

  • Снимите первый элемент и вызовите для запуска стека.

  • Теперь используйте для генерации ленивую последовательность, которая просто чередует числа 0 и 1 бесконечно.

  • Используйте ʑ(zip) для этого и оставшихся простых факторов. Для каждого простого множителя сдвиньте его влево на 1 и orна 0/1. Теперь у нас есть последовательность, которая кодирует простые числа и верхнюю / нижнюю информацию.

  • Наконец, используйте ʩ(сложить влево / агрегировать). Начальное значение - это стек, который мы сгенерировали из первого элемента выше. Для каждого значения ν вызовите (добавьте новый ромб) с предыдущим стеком, Prime ( ν >> 1) и top или bottom ( ν & 1).

Program Основная программа

Здесь мы делаем основную работу.

                       ┌─────┐
                       │   ┌─┴─╖
                       │   │ ⬖ ║
               ╔═══╗ ╔═╧═╕ ╘═╤═╝
               ║ 0 ╟─╢   ├───┘
               ╚═╤═╝ ╚═╤═╛ ┌───╖ ┌───╖ ╔═══╗
                 └─┐   └───┤ ɱ ╟─┤ ↯ ╟─╢   ║
       ┌─────────┐ └─────┐ ╘═╤═╝ ╘═══╝ ╚═══╝
       │       ┌─┴─╖     │ ┌─┴─╖
       │   ┌───┤ · ╟───┐ └─┤   ╟─┐
       │   │   ╘═╤═╝   │   └─┬─╜ │
       │ ┌─┴─╖ ╔═╧═╕ ╔═╧═╕ ┌─┴─╖ │
       │ │ ❖ ╟─╢   ├─╢   ├─┤ ʩ ╟─┘
       │ ╘═╤═╝ ╚═╤═╛ ╚═╤═╛ ╘═╤═╝
       └───┘   ╔═╧═╗   │   ┌─┴─╖ ┌─┐
               ║ 0 ╟───┘ ┌─┤ ‹ ╟─┴─┘
               ╚═══╝     │ ╘═══╝
                       ┌─┴─╖ ┌─┐
                     ┌─┤ ‹ ╟─┴─┘
                     │ ╘═══╝
      ╔════╗ ┌───╖ ┌─┴─╖ ┌─┐
      ║ 10 ╟─┤ ʝ ╟─┤ ‹ ╟─┴─┘
      ╚════╝ ╘═╤═╝ ╘═══╝
               │

Сначала отобразите map ( ɱ) над символами входной строки ( ) и превратите каждый в стопку алмазов, используя . Снимите с него первый элемент и сложите ( ʩ) поверх остальных, чтобы объединить их все ( ). Наконец, распакуйте структуру, используя, чтобы добраться до последовательности строк, и соедините их все ( ʝ), используя 10 (символ новой строки) в качестве разделителя.

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

Входные данные:

crusaders

Вывод (потребовалось 9 секунд, чтобы вычислить; не могу опубликовать здесь из-за ограничения размера)

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