Учитывая слово, состоящее только из строчных букв, сделайте следующее:
- Для каждой буквы получите простую факторизацию ее положения в алфавите.
- Для каждого простого множителя p нарисуйте ромб с длиной стороны p и вставьте букву в середине ромба.
- Самый большой бриллиант находится посередине, последующие более мелкие бриллианты (от самых больших до самых маленьких) чередуются между переходом на дно или верх.
Примечание: Для получения письма использовать боковую длину 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>
в свой ответ.
Ответы:
Matlab,
466393 - 20% = 314,4 байтаГольф: (Может сэкономить еще несколько байтов, в том числе благодаря помощи @ AndreasDeak!)
Он также должен работать в Octave (opensource), но только с большим количеством предупреждений. Используйте эту версию, если вы хотите попробовать ее в октаве (вывод на консоль, а не в файл):
Разгромил и объяснил:
Запрашиваемое слово: (а здесь в виде файла: (сильно уменьшить): supercalifragilisticexpialidocious.txt )
источник
A=A(find(sum(A,2)),find(sum(A)));
достаточно для удаления прокладки за один шаг?<pre>
тегами. Почему бы тебе не попробовать это!sort(factor())
? MATLAB,factor
кажется, уже отсортированы. И вы можете определить переменную дляmax(f)
, так как вы, кажется, используете это же количество дважды.Funciton , неконкурентный, 29199 байт
Мне понравился этот вызов, потому что он подчеркнул острую нехватку некоторых очень полезных библиотечных функций. Я включу все эти функции здесь (и в число байтов), потому что я написал их после того, как этот вызов был опубликован.
Полный исходный код в одном файле
объяснение
Как всегда, получите лучший рендеринг, выполнив
javascript:(function(){$('pre,code').css({lineHeight:5/4});})()
в консоли браузера.①
ɹ
⇄
ОбратныйКак вы можете знать или не знать, Funciton поставляется с библиотекой, полной функций для списков , которые представляют собой значения, закодированные в одном огромном целом числе, а также отдельной библиотекой для вычислений с отложенным вычислением. , которые используют лямбда-выражения (анонимные функции) в чтобы быть ленивым. Конечно, есть также библиотека для функций обработки строк.
Для этой задачи мне понадобилась функция, чтобы перевернуть строку, и функция, чтобы перевернуть лениво вычисленную последовательность. Удивительно, но у меня был только один для списков - именно тот, который мне не нужен. Итак, вот обратные функции для ленивых последовательностей (
ɹ
) и для строк (⇄
):Используемые ленивые последовательности
ʬ
, которые «добавляют элемент в конец ленивой последовательности». Используемая строкаʃ
(подстрока) и‼
(конкатенация строки).②
Ṗ
простые числаХотя я мог бы выполнить простое факторирование, просто пытаясь разделить n на все факторы по порядку, я решил, что мне нужна библиотечная функция, которая генерирует простые числа. Следующая функция принимает целое число n и реализует сито Эратосфена для генерации всех простых чисел вплоть до n . Он делает это как ленивую последовательность, поэтому генерирует столько простых чисел, сколько вы на самом деле оцениваете.
Вспомогательная функция
Ṗp
, принимает:Счетчик хода, который просто продолжает уменьшаться, пока не достигнет 0.
Сито, бит которого установлен для каждого числа, которое, как известно, не является простым. Первоначально младший значащий бит представляет число 2, но мы сдвигаем это право с каждой итерацией.
Число n, которое указывает, какое число представлено младшим битом сита; это увеличивается с каждой итерацией.
На каждой итерации, если младший бит сита равен 0, мы находим простое число n . Затем мы используем формулу, которую я уже описал в разделе Заполнить строки, столбцы и диагонали сетки NxN, чтобы установить каждое n бит в сите, прежде чем переходить к следующей итерации.
③
Ḟ
премьер факторизацияЭто довольно просто. Просто переберите простые числа до n и посмотрите, какие из них делят n . Если кто-то делит n , не забудьте продолжить с тем же самым простым, чтобы мы возвращали его несколько раз, если он делит n несколько раз. Это возвращает пустую последовательность для любого числа меньше 2.
④
◇
◆
создать бриллиантЭта функция генерирует один ромб с указанным символом и радиусом. Он использует только персонажа, чтобы поместить его в центр алмаза.
Это делает интенсивное использование ленивых последовательностей. Вот как это работает:
Генерация последовательности целых чисел от 0 до r (включительно).
Для каждого такого целого числа & alpha ; , генерировать строку , состоящую из ( г - & alpha ; ) пространств (
…
), за которым следует точка, с последующим альфа пространств - если α = г , и в этом случае не генерируют один меньше места и добавить букву. Теперь у нас есть верхняя левая четверть алмаза.К каждой из этих строк добавьте еще одну копию той же строки, но с обратными символами (
⇄
) и затем первым символом, удаленным (>> 21
). Теперь у нас есть верхняя половина бриллианта.Возьмите эту последовательность и добавьте к ней ту же последовательность, но в обратном порядке (
ɹ
) и с первым удаленным элементом (ʓ
). Теперь у нас есть весь бриллиант.Теперь у нас есть нити, из которых состоит бриллиант, но нам нужно немного больше информации. Нам нужно знать, где находится вертикальная середина алмаза. Изначально это, конечно, r , но как только мы добавим другие бриллианты сверху и снизу, нам нужно будет отслеживать положение «среднего» бриллианта, чтобы мы могли правильно выровнять другие стопки бриллиантов по вертикали. , То же самое касается горизонтальной протяженности алмаза (это необходимо при добавлении алмазов сверху и снизу). Я также решил следить за письмом; Мне это нужно, потому что в противном случае функция
⬗
(о которой мы поговорим в следующем разделе) должна иметь четыре параметра, а Funciton допускает только три.Мы используем API списка (
›
добавляет элементы в начало списка), чтобы создать структуру, содержащую [ x , y , c , q ], где x - это координата x горизонтального центра ромба, y - это y- координата базовой линии, c - буква, а q - ленивая последовательность строк. Эта структура будет теперь содержать все промежуточные этапы.⑤
⬗
Добавить бриллианты по вертикалиЭта функция принимает существующий стек алмазов, радиус и логическое значение, указывающее, добавлять ли новый алмаз в верхнюю часть (true) или нижнюю (false).
Это тоже довольно просто; использовать
‹
для распаковки структуры; использовать◇
для генерации нового алмаза; используйтеɱ
(map), чтобы добавить пробелы в начало и конец каждой строки нового ромба, чтобы все они имели одинаковую ширину; append (ʭ
) новые строки на старую (если снизу) или старую на новую (если сверху); и, наконец, использовать›
для построения структуры, содержащей все новые значения. В частности, если мы добавляем снизу, y не меняется, но если мы добавляем сверху, y должно увеличиваться на♯(r << 1)
( r - радиус нового алмаза).⑥
❖
сцепить стеки горизонтальноЭто самая большая функция из всех. Я не буду отрицать, что это было довольно рискованно, чтобы получить это право. Он берет два стека и соединяет их горизонтально, соблюдая правильное вертикальное выравнивание.
Вот как это работает.
Во-первых, для каждого стека создайте бесконечную последовательность (
⁞
) строк, каждая из которых содержит пробелы (…
) в соответствии с шириной этого стека.Значения y стеков говорят нам, что нужно «двигаться вниз» и на сколько. Добавьте соответствующую последовательность пробелов, усеченную (
ȶ
) до нужной длины ( y1 - y2 или y2 - y1 в зависимости от ситуации).Теперь определите длину каждой из последовательностей строк (
ɕ
), которая сообщает нам их высоту. Узнайте, какой из них выше.Добавьте последовательности бесконечного пространства в оба стека.
Используйте zip (
ʑ
), чтобы соединить их. Для каждой пары строк объедините их (‼
) вместе с дополнительным пробелом между ними.Затем используйте
ȶ
для усечения результата до самой высокой высоты. Делая это поздно, нам не нужно заботиться о том, кому из них нужна прокладка.Наконец, сгенерируйте структуру снова. На этом этапе нам больше не нужен символ в ромбах, поэтому мы устанавливаем его равным 0. Значение x просто суммируется и увеличивается (так что ширина стека все еще может быть вычислена как
♯(x << 1)
). Значение y установлено на более высокое значение из двух.⑦
↯
Перебирать символы в строкеЭто еще одна полезная функция, которую я добавлю в библиотеку. Учитывая строку, она дает вам ленивую последовательность, содержащую каждый код символа.
and
При вводе строки с 2097151 возвращается первый символ.>>
использование его на 21 удаляет его. Мы проверяем и 0 и -1 по причине, объясненной на странице esolangs ; это не относится к этой проблеме, но я хочу, чтобы библиотечная функция была правильной.Character
⬖
конвертировать персонажа в стек алмазовЭта функция принимает один символ и возвращает структуру для вертикального стека, представляющего этот один символ.
Эта функция интересна тем, что нам нужно было попеременно добавлять ромбы снизу и сверху. Вот как я это сделал:
Сначала вычтите 96 (так
'a'
становится 1), получите простые множители (см.Ḟ
Выше), используйтеɗ
для добавления элемента 1, если последовательность пуста, а затем в обратном порядке (ɹ
) в порядке.Снимите первый элемент и вызовите
◆
для запуска стека.Теперь используйте
⸗
для генерации ленивую последовательность, которая просто чередует числа 0 и 1 бесконечно.Используйте
ʑ
(zip) для этого и оставшихся простых факторов. Для каждого простого множителя сдвиньте его влево на 1 иor
на 0/1. Теперь у нас есть последовательность, которая кодирует простые числа и верхнюю / нижнюю информацию.Наконец, используйте
ʩ
(сложить влево / агрегировать). Начальное значение - это стек, который мы сгенерировали из первого элемента выше. Для каждого значения ν вызовите⬗
(добавьте новый ромб) с предыдущим стеком, Prime (ν >> 1
) и top или bottom (ν & 1
).Program Основная программа
Здесь мы делаем основную работу.
Сначала отобразите map (
ɱ
) над символами входной строки (↯
) и превратите каждый в стопку алмазов, используя⬖
. Снимите с него первый элемент и сложите (ʩ
) поверх остальных, чтобы объединить их все (❖
). Наконец, распакуйте структуру, используя,‹
чтобы добраться до последовательности строк, и соедините их все (ʝ
), используя 10 (символ новой строки) в качестве разделителя.Пример вывода
Входные данные:
Вывод (потребовалось 9 секунд, чтобы вычислить; не могу опубликовать здесь из-за ограничения размера)
источник