Идентификаторы представляют собой визуальные изображения значений хеш-функции, часто сделанные из симметричных компоновок геометрических фигур. Ваш аватар Stack Exchange по умолчанию является идентичным. Эта задача заключается в создании "wordenticons" , простых текстовых версий идентификаторов, которые применяются к строкам строчных букв, то есть словам.
Вызов
Напишите программу или функцию, которая принимает строку S и выводит ее wordenticon. S гарантированно не является пустым и содержит только строчные буквы английского алфавита az. При желании вы можете предположить, что S имеет завершающий символ новой строки.
Wordenticon S будет квадратной сеткой текста с длинами сторон, 2*length(S)
состоящими из пробелов (
), вертикальных полос ( |
) и горизонтальных полос ( ―
).
Чтобы создать Wordenticon из S, сформируйте квадратную сетку, где каждый столбец соответствует букве S (в обычном порядке чтения слева направо), а каждая строка соответствует букве S (в обычном порядке чтения сверху вниз). ).
Например, если S food
наша начальная сетка выглядит
food
f....
o....
o....
d....
где .
просто заполнитель.
Для каждой пустой точки (каждой .
) в сетке:
- Если буква столбца предшествует строке буквы в алфавитном порядке, заменить
.
с|
. - Если буква столбца приходит после строки буквы в алфавитном порядке, заменить
.
с―
. - Если столбцов и строк буквы одинаковы, заменить
.
с
Вот food
пример после каждого из этих шагов:
Добавление
|
:food f...| o|..| o|..| d....
Добавление
―
:food f.――| o|..| o|..| d―――.
Добавление
food f ――| o| | o| | d―――
Чтобы завершить работу, удалите лишнюю строку и столбец, содержащий слова
――|
| |
| |
―――
затем отразить все это горизонтально
――||――
| || |
| || |
――― ―――
и, наконец, отразить его снова вертикально
――||――
| || |
| || |
――― ―――
――― ―――
| || |
| || |
――||――
в результате 2*length(S)
получается текстовая сетка с длиной стороны, которая является окончательным wordenticon.
Примеры
Вот несколько дополнительных примеров Wordenticon. Обратите внимание, что у разных слов могут быть одинаковые вордентиконы, а некоторые вордентиконы могут быть полностью сделаны из пробелов (к сожалению, уценка не хочет их отображать).
food
――||――
| || |
| || |
――― ―――
――― ―――
| || |
| || |
――||――
mood
――||――
| || |
| || |
――― ―――
――― ―――
| || |
| || |
――||――
foof
―― ――
| || |
| || |
―― ――
―― ――
| || |
| || |
―― ――
fool
――――――
| || |
| || |
|―― ――|
|―― ――|
| || |
| || |
――――――
a [2*2 grid of spaces]
to
||
― ―
― ―
||
it
――
| |
| |
――
tt [4*4 grid of spaces]
abc
――――
| ―― |
|| ||
|| ||
| ―― |
――――
and
――――
| || |
|― ―|
|― ―|
| || |
――――
but
――――
| || |
|― ―|
|― ―|
| || |
――――
you
||||
― ―― ―
―| |―
―| |―
― ―― ―
||||
bob
― ―
| || |
― ―
― ―
| || |
― ―
cat
|――|
― ―― ―
|| ||
|| ||
― ―― ―
|――|
cart
|――――|
― ―――― ―
|| ―― ||
||| |||
||| |||
|| ―― ||
― ―――― ―
|――――|
todo
||||||
― | | ―
―― ―― ――
― | | ―
― | | ―
―― ―― ――
― | | ―
||||||
mice
||||||
― |||| ―
―― ―― ――
――| |――
――| |――
―― ―― ――
― |||| ―
||||||
zyxw
||||||
― |||| ―
―― || ――
――― ―――
――― ―――
―― || ――
― |||| ―
||||||
banana
|―|―||―|―|
― ― ― ― ― ―
|| | || | ||
― ― ― ― ― ―
|| | || | ||
― ― ― ― ― ―
― ― ― ― ― ―
|| | || | ||
― ― ― ― ― ―
|| | || | ||
― ― ― ― ― ―
|―|―||―|―|
codegolf
――――――――――――――
| ||| |||| ||| |
|― ―――――――――― ―|
|―| ―――――――― |―|
|―|| ――||―― ||―|
| ||| |||| ||| |
|―|||― || ―|||―|
|―||――― ―――||―|
|―||――― ―――||―|
|―|||― || ―|||―|
| ||| |||| ||| |
|―|| ――||―― ||―|
|―| ―――――――― |―|
|― ―――――――――― ―|
| ||| |||| ||| |
――――――――――――――
programming
―||―||||||||||||―||―
| || |||||||||||| || |
―― |―||||||||||||―| ――
――― ―|―――― ――――|― ―――
| || |||||||||||| || |
――――― ―――――――――― ―――――
―――|―| |―||―| |―|―――
―――|―| |―||―| |―|―――
―――|―|―― ―||― ――|―|―――
―――|―|||| || ||||―|―――
――― ―|―――― ――――|― ―――
――― ―|―――― ――――|― ―――
―――|―|||| || ||||―|―――
―――|―|―― ―||― ――|―|―――
―――|―| |―||―| |―|―――
―――|―| |―||―| |―|―――
――――― ―――――――――― ―――――
| || |||||||||||| || |
――― ―|―――― ――――|― ―――
―― |―||||||||||||―| ――
| || |||||||||||| || |
―||―||||||||||||―||―
abcdefghijklm
――――――――――――――――――――――――
| ―――――――――――――――――――――― |
|| ―――――――――――――――――――― ||
||| ―――――――――――――――――― |||
|||| ―――――――――――――――― ||||
||||| ―――――――――――――― |||||
|||||| ―――――――――――― ||||||
||||||| ―――――――――― |||||||
|||||||| ―――――――― ||||||||
||||||||| ―――――― |||||||||
|||||||||| ―――― ||||||||||
||||||||||| ―― |||||||||||
|||||||||||| ||||||||||||
|||||||||||| ||||||||||||
||||||||||| ―― |||||||||||
|||||||||| ―――― ||||||||||
||||||||| ―――――― |||||||||
|||||||| ―――――――― ||||||||
||||||| ―――――――――― |||||||
|||||| ―――――――――――― ||||||
||||| ―――――――――――――― |||||
|||| ―――――――――――――――― ||||
||| ―――――――――――――――――― |||
|| ―――――――――――――――――――― ||
| ―――――――――――――――――――――― |
――――――――――――――――――――――――
счет
Это код-гольф , выигрывает самый короткий код в байтах. Tiebreaker переходит к более раннему ответу.
Примечания
- Любой экземпляр горизонтальной черты (
―
) в вашем коде может быть посчитан как 1 байт вместо 3 байт UTF-8, которые он фактически занимает. (До десяти экземпляров.) - При желании вы можете использовать обычные тире (
-
) вместо горизонтальных полос (―
). - Удаление или добавление завершающих пробелов в строках wordenticon не допускается (даже если форма остается неизменной). Это должен быть точный
2*length(S)
текстовый квадрат длины стороны. - Выходной Wordenticon может опционально содержать один завершающий перевод строки.
programming
,and
и ,codegolf
но вы забылиpuzzles
...Ответы:
MATL,
2015 байтПопробуйте это на MATL Online
объяснение
источник
Java,
329305264259192 байтаБлагодаря:
StringBuilder
наString
.Golfed:
Ungolfed:
Определенно веселый. Первая попытка была функцией, которая была
O(n)
заменена на эту более простую форму после того, как я слишком расстроился.И, чтобы проверить:
источник
\u2015
. Использование горизонтальной черты (или просто тире) в необработанном коде - это нормально.String
вместоStringBuilder
ответа, он мог бы быть намного короче ... (хотя это может занять гораздо больше памяти)int
s в одной строке:int i,j,l=m.length();for(i=0;i<l;i++){...
Haskell, 93 байта
Пример использования:
Как это работает (примечание:
(f <*> g) x
определяется какf x (g x)
):Альтернативная версия: функция «найти замену»
((("- |"!!).fromEnum).).compare
также может быть записана какa#b|a<b='-'|a>b='|'|1<2=' '
и вызываться через(#)
для того же количества байтов.источник
Желе , 16 байт
Попробуйте онлайн!
Как это устроено
источник
JavaScript (ES6), 94 байта
Использование тире, потому что я обычно запускаю оболочку SpiderMonkey JS в Windows, и Unicode не работает, если я это делаю.
источник
[...s,s].reverse()
+1Pyth,
3130Тестирование
К сожалению не могу бросить
Q
s из-за нескольких раздвоений. До сих пор довольно простой алгоритм, count рассматривает горизонтальную полосу как 1 байт.источник
Haskell, 66 байт
источник
JavaScript ES6,
138126123 байтабольшая часть кода является отражением
источник
J
26 26байт6 байтов благодаря @Zgarb .
Предыдущий 26-байтовый ответ
Использует тот же алгоритм, что и ответ Денниса.
Использование:
(
>>
означает ввод (STDIN),<<
означает вывод (STDOUT))источник
' |-'{~3*@-/~@u:[,|.
Mathematica,
124110104102 байтаАнонимная функция. Символ Unicode - это U + F3C7 для
\[Transpose]
.источник
Javascript
146142132130124 байтовТестирование:
Спасибо за @HelkaHomba, за помощь в удалении как минимум 50 байтов, и @Downgoat за 3 байта!
источник
На самом деле, 53 байта
Еще раз, на самом деле слабые способности к обработке строк - это криптонит. Это все еще короче, чем Java, так что у меня есть, что хорошо, что хорошо.
Попробуйте онлайн!
Объяснение:
Код можно разделить на 3 отдельные части: код перевода, код обработки и код зеркального отображения. Для удобства чтения я собираюсь объяснить каждый раздел отдельно.
Код перевода (начинается со строки ввода
s
, в стеке):Обработка кода (начинается со списка
n**2
символов, соответствующего правому нижнему углу):Зеркальное отображение кода (начинается со
n**2+n
строки длиной, с точками, действующими как символы новой строки)источник
> <> , 109 байт
Ввод осуществляется через STDIN. Попробуйте онлайн!
Explaination:
Входные данные читаются и отражаются в первой строке. Для ввода
abcd
это оставляетdcbaabcd
в стеке. Каждая половина затем отражается, чтобы датьabcddcba
(строка 2). Затем каждый элемент дублируется и по очереди остается в своем стеке (строки 3 и 4). После этого процесса стек стеков выглядит примерно так:Для каждого стека по очереди значение строки (нижняя часть стека) сравнивается со значением столбца (верхняя часть стека). Соответствующий символ выбирается из
- |
и записывается в STDOUT. Затем значения столбцов поворачиваются так, чтобы следующий столбец находился на вершине стека (строка 6).После того, как все столбцы рассмотрены, значение строки отбрасывается, печатается новая строка, а значения столбцов помещаются в предыдущий стек (строка 7), чтобы процесс вывода начался заново.
Команда
]
, помимо извлечения из стека, очищает текущий стек, если он остался единственным. Конечное условие программы - если стек пуст, так как все строки обработаны (строка 5).источник
C #,
169150 байтспасибо FryAmTheEggman
ungolfed:
больше советов по гольфу приветствуется
источник
t+=c==k?" ":c>k?"|":"-";
должно сработать. Я не много играл в C #, но вполне возможно, что использование обычныхfor
лупов будет короче.Reverse()
и поэтому ониToArray()
являются частьюSystem.Linq
оператора using.C #
166143 байта,Объяснение:
Контрольная работа:
источник
IEnumerable<char>
вы можете сохранить несколько байтов, используя.Reverse()
непосредственно строку, пропуская.ToCharArray()
var a = new[] { '-', ' ', '|' };
на,var a = "- |";
потому что вы можете использовать индексацию для строкCJam, 20 байтов
Проверьте это здесь.
Использует очевидный подход вычисления внешнего продукта и использования разности и sgn для вычисления символа в каждой ячейке.
источник
Clojure, 171 байт
ungolfed:
источник
J,
75байт5 байтов сохранено благодаря Денису.
Я буду работать над преобразованием его в молчаливый глагол позже.
источник
Октава, 39 байт
Создает анонимную функцию, которую можно запустить с помощью
ans('string')
.демонстрация
объяснение
Это решение объединяет входную строку (
x
) и ее обратное (flip(x)
) с помощью[x, flip(x)]
. Обратное назначаетсяy
для сокращения ответа[x, y = flip(x)]
. Затем мы создаем вектор - столбец одно и то же, комбинируяx
иy
и принимая транспонирование:[x,y]'
. Затем мы берем разницу, которая будет автоматически транслироваться для создания двумерного массива различий между любыми ASCII-представлениями букв в строках. Мы используем ,sign
чтобы сделать это либо-1
,0
или ,1
а затем добавить ,2
чтобы получить значение индекса действителен 1 на основе. Затем мы используем их для индексации в исходной строке'| -'
.источник
Юлия, 70 байт
Это моя первая попытка кода в гольф, и я раньше не пользовался Джулией, поэтому расскажите, что вы думаете:
Попробуйте онлайн!
Ungolfed:
Я думаю, что это может быть сделано короче. Этот код хранит символы слова в матрице:
К сожалению, мне не удалось получить желаемый результат с использованием матрицы.
источник
Джольф, 42 байта
Вряд ли в гольф. Я, наверное, забыл о матрице, встроенной в Jolf.
Попробуй это здесь! Этот код использует функцию стрелки (
Ψ
) для матричной карты.источник
JavaScript, 303 байта
Ungolfed
Никакой экмы 2015 здесь
источник
var x = 1
, просто сделайтеx = 1
. В коде гольф никто не заботится о соблюдении лучших практик. :)Python 2, 126 байт
По сути это порт моего На самом деле решения .
Попробуйте онлайн
Объяснение:
источник
Python 3,5
250223175 байтов:Попробуйте онлайн! (Ideone) (Последние два тестовых случая не будут отображаться в выходных данных, поскольку они являются просто пустыми строками. Моя программа обрабатывает их, хотя это подтверждается тем фактом, что вводятся 10 случаев, но появляются только 8 выходов.)
Развернутый с последующим объяснением:
p=[[' ―'[O(i)<O(g)],'|'][O(i)>O(g)]for i in o for g in o]
Создайте список,
p
в|
который добавляется a, если значение точки Unicode для буквы столбца меньше, чем значение буквы строки, a–
добавляется, если значение точки Unicode для буквы столбца превышает значение буквы строки, или a,если оба значения равны.
u='\n'.join([''.join(p[i:G+i]+p[i:G+i][::-1])for i in range(0,len(p),G)])
Создайте объединенную строку новой строки,
u
из спискаp
, разделив ее на сегменты объединенной строки, каждый из которых состоит из числа символов длины ввода как вперед, так и назад, в результате чего каждый из них имеет длину, в 2 раза превышающую количество символов на входе. Это верхняя половина вашего вордентикона. Итак, в случае вашего вводаfood
, это вернет:print(u+'\n'+u[::-1])
Наконец, вывод
u
сопровождается новой строкой, а затемu
переворачивается, чтобы вертикально отразить первую половину для второй половины. Это ваш законченный Wordenticon, который для контрольного примераfood
, наконец, будет:источник
R 101 байт
101 байт, так как я использую
―
(что я думаю, выглядит лучше, чем-
).Попробуйте онлайн!
Я был удивлен, что раньше не было ответа R, поскольку мы можем использовать симметрию и матрицы R, чтобы получить вполне конкурентный ответ, несмотря на то, что
string
проблема.Ungolfed Объяснение:
источник
C (gcc) , 202 байта
Попробуйте онлайн!
Работает, просматривая каждый символ, затем обновляя результирующий символ (и его отражения).
источник
05AB1E (наследие) ,
202221 байт+2 байта в качестве исправления ошибки для однозначных входных данных.
-1 байт, используя обычные тире
-
вместо―
, так как мы можем использовать… |-
вместо"… |―"
(так… |―
как неправильно будет действовать как строка словаря)Использует унаследованную версию 05AB1E, так как она неявно присоединяется к символам новой строки при зеркалировании, что требует дополнительного явного
»
в новой версии.Попробуйте онлайн или проверьте все контрольные примеры .
Объяснение:
источник