Генерация вордентиконов


54

Идентификаторы представляют собой визуальные изображения значений хеш-функции, часто сделанные из симметричных компоновок геометрических фигур. Ваш аватар Stack Exchange по умолчанию является идентичным. Эта задача заключается в создании "wordenticons" , простых текстовых версий идентификаторов, которые применяются к строкам строчных букв, то есть словам.

Вызов

Напишите программу или функцию, которая принимает строку S и выводит ее wordenticon. S гарантированно не является пустым и содержит только строчные буквы английского алфавита az. При желании вы можете предположить, что S имеет завершающий символ новой строки.

Wordenticon S будет квадратной сеткой текста с длинами сторон, 2*length(S)состоящими из пробелов ( ), вертикальных полос ( |) и горизонтальных полос ( ―).

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

Например, если S foodнаша начальная сетка выглядит

 food
f....
o....
o....
d....

где .просто заполнитель.

Для каждой пустой точки (каждой .) в сетке:

  1. Если буква столбца предшествует строке буквы в алфавитном порядке, заменить .с |.
  2. Если буква столбца приходит после строки буквы в алфавитном порядке, заменить .с ―.
  3. Если столбцов и строк буквы одинаковы, заменить .с (пространства).

Вот foodпример после каждого из этих шагов:

  1. Добавление |:

     food
    f...|
    o|..|
    o|..|
    d....
    
  2. Добавление ―:

     food
    f.――|
    o|..|
    o|..|
    d―――.
    
  3. Добавление :

     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 может опционально содержать один завершающий перевод строки.

Можем ли мы принять входные данные как массив символов?
— Downgoat

@ Downgoat Нет, это должна быть обычная строка, если нет абсолютно никакого другого пути для вашего языка.
— Увлечения Кэлвина

2
У вас есть примеры programming, andи , codegolfно вы забыли puzzles...
— Neil

Не могли бы вы добавить таблицу лидеров?
— Утренняя монахиня

Таким образом, мы в конце концов выяснили, почему вы спрашивали о portmanteaus в чате :)
— gcampbell

Ответы:


21

MATL, 20 15 байт

'-| 'jtPht!-ZS)

Попробуйте это на MATL Online

объяснение

'-| '       % String literal defining the replacement characters
j           % Explicitly grab the input as a string
tP          % Duplicate and reverse the input string (row vector of chars)
h           % Horizontally concatenate the input and it's inverse
t!          % Duplicate and turn into a column vector
-           % Subtract the two vectors (converts to ASCII codes) and we automatically
            % broadcast to create a (2N x 2N) matrix where if the column is
            % later in the alphabet (higher ASCII) we get a positive number, if the 
            % column was earlier (lower ASCII) we get a negative number, and if they are
            % the same letter (same ASCII) we get a 0.
ZS          % sign function which yields -1 for negative, 1 for positive, and 0 for 0;
)           % Use this to index (modulus) into the string literal '-| '. MATL uses 1-based
            % indexing so 0 yields ' ', -1 replaced by '|', and 1 replaced by '-'
            % Implicitly display the result

9
: O ты переиграл Дениса!
— Downgoat

@Downgoat Это один из тех редких случаев, когда MATL короче, чем Jelly!
— августа

Хорошая идея использовать функцию знака!
— Луис Мендо

18

Java, 329 305 264 259 192 байта

Благодаря:

  • @ Bálint за предложение использовать троичные операторы.
  • @ user902383 за предложение перевернуть строку самостоятельно
  • @Frozn и @ user902383 за предложение заменить StringBuilderна String.

Golfed:

String g(String w){char[]a=w.toCharArray();String s="";for(int i=a.length-1;i>=0;s=s+a[i--]);w+=s;a=w.toCharArray();s="";for(char x:a){for(char y:a)s+=(x>y?'|':x<y?'-':' ');s+='\n';}return s;}

Ungolfed:

String g(String w) {
    char[] a = w.toCharArray();
    String s = "";
    for (int i = a.length - 1; i >= 0; s = s + a[i--]);
    w += s;
    a = w.toCharArray();
    s = "";// To keep the output pure (ie. without the input string as well)
    for (char x : a) {
        for (char y : a)
            s += (x > y ? '|' : x < y ? '-' : ' ');
        s += '\n';
    }
    return s;
}

Определенно веселый. Первая попытка была функцией, которая была O(n)заменена на эту более простую форму после того, как я слишком расстроился.

И, чтобы проверить:

supercalifragilisticexpialidocious
 -|||||||||||||| -|||-||||||||||-  -||||||||||-|||- ||||||||||||||- 
| |||||||||||||||||||-|||||||||| || ||||||||||-||||||||||||||||||| |
-- |-|||||-|||||--|||- |||||||||----||||||||| -|||--|||||-|||||-| --
--- -||----|-------| ---|--|-|--------|-|--|--- |-------|----||- ---
--|| ||||| |||||--|||-||||||||||----||||||||||-|||--||||| ||||| ||--
----- |----|------- ----|---- -------- ----|---- -------|----| -----
------ ---- ------------ ------------------ ------------ ---- ------
---|-|| ||-||| |--|||--|| ||-||------||-|| ||--|||--| |||-|| ||-|---
---|-||- |-|| - -- ||-- |- |-| ------ |-| -| --|| -- - ||-| -||-|---
---|-||-- -|-------||---|--|-|--------|-|--|---||-------|- --||-|---
--|| ||||| |||||--|||-||||||||||----||||||||||-|||--||||| ||||| ||--
------ ---- ------------ ------------------ ------------ ---- ------
---|-||--|-| ------||---|--|-|--------|-|--|---||------ |-|--||-|---
---|-||- |-|| - -- ||-- |- |-| ------ |-| -| --|| -- - ||-| -||-|---
---|-|| ||-||| |--|||--|| ||-||------||-|| ||--|||--| |||-|| ||-|---
---|-||- |-|| - -- ||-- |- |-| ------ |-| -| --|| -- - ||-| -||-|---
 -|||||||||||||| -|||-||||||||||-  -||||||||||-|||- ||||||||||||||- 
|-||||||||||||||| |||-||||||||||-||-||||||||||-||| |||||||||||||||-|
---|-||- |-|| - -- ||-- |- |-| ------ |-| -| --|| -- - ||-| -||-|---
----- |----|------- ----|---- -------- ----|---- -------|----| -----
--- -||----|-------| ---|--|-|--------|-|--|--- |-------|----||- ---
||||||||||||||||||||| |||||||||||||||||||||||| |||||||||||||||||||||
-- |-|||||-|||||--|||- |||||||||----||||||||| -|||--|||||-|||||-| --
---|-||- |-|| - -- ||-- |- |-| ------ |-| -| --|| -- - ||-| -||-|---
------ ---- ------------ ------------------ ------------ ---- ------
---|-|| ||-||| |--|||--|| ||-||------||-|| ||--|||--| |||-|| ||-|---
---|-||- |-|| - -- ||-- |- |-| ------ |-| -| --|| -- - ||-| -||-|---
-----||----|-------|----|-- -|--------|- --|----|-------|----||-----
---|-|||||-|||||--|||--||||| || ---- || |||||--|||--|||||-|||||-|---
----- |----|------- ----|---- -------- ----|---- -------|----| -----
---|-||- |-|| - -- ||-- |- |-| ------ |-| -| --|| -- - ||-| -||-|---
---|-|||||-|||||--|||--||||| || ---- || |||||--|||--|||||-|||||-|---
| |||||||||||||||||||-|||||||||| || ||||||||||-||||||||||||||||||| |
 -|||||||||||||| -|||-||||||||||-  -||||||||||-|||- ||||||||||||||- 
 -|||||||||||||| -|||-||||||||||-  -||||||||||-|||- ||||||||||||||- 
| |||||||||||||||||||-|||||||||| || ||||||||||-||||||||||||||||||| |
---|-|||||-|||||--|||--||||| || ---- || |||||--|||--|||||-|||||-|---
---|-||- |-|| - -- ||-- |- |-| ------ |-| -| --|| -- - ||-| -||-|---
----- |----|------- ----|---- -------- ----|---- -------|----| -----
---|-|||||-|||||--|||--||||| || ---- || |||||--|||--|||||-|||||-|---
-----||----|-------|----|-- -|--------|- --|----|-------|----||-----
---|-||- |-|| - -- ||-- |- |-| ------ |-| -| --|| -- - ||-| -||-|---
---|-|| ||-||| |--|||--|| ||-||------||-|| ||--|||--| |||-|| ||-|---
------ ---- ------------ ------------------ ------------ ---- ------
---|-||- |-|| - -- ||-- |- |-| ------ |-| -| --|| -- - ||-| -||-|---
-- |-|||||-|||||--|||- |||||||||----||||||||| -|||--|||||-|||||-| --
||||||||||||||||||||| |||||||||||||||||||||||| |||||||||||||||||||||
--- -||----|-------| ---|--|-|--------|-|--|--- |-------|----||- ---
----- |----|------- ----|---- -------- ----|---- -------|----| -----
---|-||- |-|| - -- ||-- |- |-| ------ |-| -| --|| -- - ||-| -||-|---
|-||||||||||||||| |||-||||||||||-||-||||||||||-||| |||||||||||||||-|
 -|||||||||||||| -|||-||||||||||-  -||||||||||-|||- ||||||||||||||- 
---|-||- |-|| - -- ||-- |- |-| ------ |-| -| --|| -- - ||-| -||-|---
---|-|| ||-||| |--|||--|| ||-||------||-|| ||--|||--| |||-|| ||-|---
---|-||- |-|| - -- ||-- |- |-| ------ |-| -| --|| -- - ||-| -||-|---
---|-||--|-| ------||---|--|-|--------|-|--|---||------ |-|--||-|---
------ ---- ------------ ------------------ ------------ ---- ------
--|| ||||| |||||--|||-||||||||||----||||||||||-|||--||||| ||||| ||--
---|-||-- -|-------||---|--|-|--------|-|--|---||-------|- --||-|---
---|-||- |-|| - -- ||-- |- |-| ------ |-| -| --|| -- - ||-| -||-|---
---|-|| ||-||| |--|||--|| ||-||------||-|| ||--|||--| |||-|| ||-|---
------ ---- ------------ ------------------ ------------ ---- ------
----- |----|------- ----|---- -------- ----|---- -------|----| -----
--|| ||||| |||||--|||-||||||||||----||||||||||-|||--||||| ||||| ||--
--- -||----|-------| ---|--|-|--------|-|--|--- |-------|----||- ---
-- |-|||||-|||||--|||- |||||||||----||||||||| -|||--|||||-|||||-| --
| |||||||||||||||||||-|||||||||| || ||||||||||-||||||||||||||||||| |
 -|||||||||||||| -|||-||||||||||-  -||||||||||-|||- ||||||||||||||-  

2
Добро пожаловать в Программирование Пазлов и Code Golf! Это очень хороший первый ответ. :)
— Алекс А.

1
Обратите внимание, что вам не нужно использовать \u2015. Использование горизонтальной черты (или просто тире) в необработанном коде - это нормально.
— Увлечения Кэлвина

Я почти уверен, что если бы вы использовали обычный Stringвместо StringBuilderответа, он мог бы быть намного короче ... (хотя это может занять гораздо больше памяти)
— Leaky Nun

Вы можете выиграть несколько байтов, объявив все ints в одной строке:int i,j,l=m.length();for(i=0;i<l;i++){...
— Аарон

Я думаю, вы могли бы сэкономить много, если вы измените циклы for для каждого цикла. Вам не нужны индексы для чего-то еще, кроме получения символа.
— Frozn

11

Haskell, 93 байта

r=reverse
h x=unlines$(++)<*>r$zipWith(++)<*>map r$(<$>x).((("- |"!!).fromEnum).).compare<$>x

Пример использования:

*Main> putStr $ h "food"
 --||-- 
|  ||  |
|  ||  |
---  ---
---  ---
|  ||  |
|  ||  |
 --||-- 

Как это работает (примечание: (f <*> g) xопределяется как f x (g x)):

((("- |"!!).fromEnum).).compare       -- a function that finds the replacement char
                                      -- for two given chars
   (<$>x).(    )<$>x                  -- map this function for every char in the
                                      -- input over each char. Now we have the
                                      -- first quadrant as a list of strings
zipWith(++) <*> map r                 -- append to each line a reversed copy of itself
(++) <*> r                            -- append a reversed copy of the whole list
unlines                               -- turn into a single string

Альтернативная версия: функция «найти замену» ((("- |"!!).fromEnum).).compareтакже может быть записана как a#b|a<b='-'|a>b='|'|1<2=' 'и вызываться через (#)для того же количества байтов.


8

Желе , 16 байт

Om©0_'®Ṡị“-| ”j⁷

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

Как это устроено

Om©0_'®Ṡị“-| ”j⁷  Main link. Argument: s (string)

O                 Ordinal; replace the characters of s with their code points.
 m 0              Concatenate the result with a reversed copy.
  ©               Copy the result to the register.
      ®           Yield the list in the register.
    _'            Perform spawned difference of the character codes.
       Ṡ          Apply the sign function.
        ị“-| ”    Index into that string (indices 1, -1, 0).
              j⁷  Join, separating by linefeeds.

8

JavaScript (ES6), 94 байта

s=>[...s,s].reverse().join``.replace(/./g,(c,_,t)=>t.replace(/./g,d=>d<c?`|`:d>c?`-`:` `)+`
`)

Использование тире, потому что я обычно запускаю оболочку SpiderMonkey JS в Windows, и Unicode не работает, если я это делаю.


Блестящая идея с [...s,s].reverse()+1
— Downgoat

5

Pyth, 31 30

js_BsM_BMclQsm@" |―"._-FCMd*QQ

Тестирование

К сожалению не могу бросить Qs из-за нескольких раздвоений. До сих пор довольно простой алгоритм, count рассматривает горизонтальную полосу как 1 байт.



1
@Maltysen Я устал от FGITWed;) В любом случае, я уверен, что это может быть короче ...
— FryAmTheEggman


4

JavaScript ES6, 138 126 123 байта

s=>(a=(p=[...s]).map(l=>(b=p.map(i=>i<l?"|":i>l?"-":" ").join``)+[...b].reverse().join``)).concat([...a].reverse()).join`
`

большая часть кода является отражением


4

J 26 26 байт

6 байтов благодаря @Zgarb .

' |-'{~3*@-/~@u:[,|.

Предыдущий 26-байтовый ответ

({&' |-')@*@-/~@(3&u:)@,|.

Использует тот же алгоритм, что и ответ Денниса.

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

>> f =: ' |-'{~3*@-/~@u:[,|.
>> f 'food'
<<  --||-- 
   |  ||  |
   |  ||  |
   ---  ---
   ---  ---
   |  ||  |
   |  ||  |
    --||-- 

>> f 'supercalifragilisticexpialidocious'
<<  -|||||||||||||| -|||-||||||||||-  -||||||||||-|||- ||||||||||||||- 
   | |||||||||||||||||||-|||||||||| || ||||||||||-||||||||||||||||||| |
   -- |-|||||-|||||--|||- |||||||||----||||||||| -|||--|||||-|||||-| --
   --- -||----|-------| ---|--|-|--------|-|--|--- |-------|----||- ---
   --|| ||||| |||||--|||-||||||||||----||||||||||-|||--||||| ||||| ||--
   ----- |----|------- ----|---- -------- ----|---- -------|----| -----
   ------ ---- ------------ ------------------ ------------ ---- ------
   ---|-|| ||-||| |--|||--|| ||-||------||-|| ||--|||--| |||-|| ||-|---
   ---|-||- |-|| - -- ||-- |- |-| ------ |-| -| --|| -- - ||-| -||-|---
   ---|-||-- -|-------||---|--|-|--------|-|--|---||-------|- --||-|---
   --|| ||||| |||||--|||-||||||||||----||||||||||-|||--||||| ||||| ||--
   ------ ---- ------------ ------------------ ------------ ---- ------
   ---|-||--|-| ------||---|--|-|--------|-|--|---||------ |-|--||-|---
   ---|-||- |-|| - -- ||-- |- |-| ------ |-| -| --|| -- - ||-| -||-|---
   ---|-|| ||-||| |--|||--|| ||-||------||-|| ||--|||--| |||-|| ||-|---
   ---|-||- |-|| - -- ||-- |- |-| ------ |-| -| --|| -- - ||-| -||-|---
    -|||||||||||||| -|||-||||||||||-  -||||||||||-|||- ||||||||||||||- 
   |-||||||||||||||| |||-||||||||||-||-||||||||||-||| |||||||||||||||-|
   ---|-||- |-|| - -- ||-- |- |-| ------ |-| -| --|| -- - ||-| -||-|---
   ----- |----|------- ----|---- -------- ----|---- -------|----| -----
   --- -||----|-------| ---|--|-|--------|-|--|--- |-------|----||- ---
   ||||||||||||||||||||| |||||||||||||||||||||||| |||||||||||||||||||||
   -- |-|||||-|||||--|||- |||||||||----||||||||| -|||--|||||-|||||-| --
   ---|-||- |-|| - -- ||-- |- |-| ------ |-| -| --|| -- - ||-| -||-|---
   ------ ---- ------------ ------------------ ------------ ---- ------
   ---|-|| ||-||| |--|||--|| ||-||------||-|| ||--|||--| |||-|| ||-|---
   ---|-||- |-|| - -- ||-- |- |-| ------ |-| -| --|| -- - ||-| -||-|---
   -----||----|-------|----|-- -|--------|- --|----|-------|----||-----
   ---|-|||||-|||||--|||--||||| || ---- || |||||--|||--|||||-|||||-|---
   ----- |----|------- ----|---- -------- ----|---- -------|----| -----
   ---|-||- |-|| - -- ||-- |- |-| ------ |-| -| --|| -- - ||-| -||-|---
   ---|-|||||-|||||--|||--||||| || ---- || |||||--|||--|||||-|||||-|---
   | |||||||||||||||||||-|||||||||| || ||||||||||-||||||||||||||||||| |
    -|||||||||||||| -|||-||||||||||-  -||||||||||-|||- ||||||||||||||- 
    -|||||||||||||| -|||-||||||||||-  -||||||||||-|||- ||||||||||||||- 
   | |||||||||||||||||||-|||||||||| || ||||||||||-||||||||||||||||||| |
   ---|-|||||-|||||--|||--||||| || ---- || |||||--|||--|||||-|||||-|---
   ---|-||- |-|| - -- ||-- |- |-| ------ |-| -| --|| -- - ||-| -||-|---
   ----- |----|------- ----|---- -------- ----|---- -------|----| -----
   ---|-|||||-|||||--|||--||||| || ---- || |||||--|||--|||||-|||||-|---
   -----||----|-------|----|-- -|--------|- --|----|-------|----||-----
   ---|-||- |-|| - -- ||-- |- |-| ------ |-| -| --|| -- - ||-| -||-|---
   ---|-|| ||-||| |--|||--|| ||-||------||-|| ||--|||--| |||-|| ||-|---
   ------ ---- ------------ ------------------ ------------ ---- ------
   ---|-||- |-|| - -- ||-- |- |-| ------ |-| -| --|| -- - ||-| -||-|---
   -- |-|||||-|||||--|||- |||||||||----||||||||| -|||--|||||-|||||-| --
   ||||||||||||||||||||| |||||||||||||||||||||||| |||||||||||||||||||||
   --- -||----|-------| ---|--|-|--------|-|--|--- |-------|----||- ---
   ----- |----|------- ----|---- -------- ----|---- -------|----| -----
   ---|-||- |-|| - -- ||-- |- |-| ------ |-| -| --|| -- - ||-| -||-|---
   |-||||||||||||||| |||-||||||||||-||-||||||||||-||| |||||||||||||||-|
    -|||||||||||||| -|||-||||||||||-  -||||||||||-|||- ||||||||||||||- 
   ---|-||- |-|| - -- ||-- |- |-| ------ |-| -| --|| -- - ||-| -||-|---
   ---|-|| ||-||| |--|||--|| ||-||------||-|| ||--|||--| |||-|| ||-|---
   ---|-||- |-|| - -- ||-- |- |-| ------ |-| -| --|| -- - ||-| -||-|---
   ---|-||--|-| ------||---|--|-|--------|-|--|---||------ |-|--||-|---
   ------ ---- ------------ ------------------ ------------ ---- ------
   --|| ||||| |||||--|||-||||||||||----||||||||||-|||--||||| ||||| ||--
   ---|-||-- -|-------||---|--|-|--------|-|--|---||-------|- --||-|---
   ---|-||- |-|| - -- ||-- |- |-| ------ |-| -| --|| -- - ||-| -||-|---
   ---|-|| ||-||| |--|||--|| ||-||------||-|| ||--|||--| |||-|| ||-|---
   ------ ---- ------------ ------------------ ------------ ---- ------
   ----- |----|------- ----|---- -------- ----|---- -------|----| -----
   --|| ||||| |||||--|||-||||||||||----||||||||||-|||--||||| ||||| ||--
   --- -||----|-------| ---|--|-|--------|-|--|--- |-------|----||- ---
   -- |-|||||-|||||--|||- |||||||||----||||||||| -|||--|||||-|||||-| --
   | |||||||||||||||||||-|||||||||| || ||||||||||-||||||||||||||||||| |
    -|||||||||||||| -|||-||||||||||-  -||||||||||-|||- ||||||||||||||- 

( >>означает ввод (STDIN), <<означает вывод (STDOUT))


1
С некоторой реструктуризацией вы можете получить до 20 байт:' |-'{~3*@-/~@u:[,|.
— Zgarb

Это хорошее использование вилок ...
— Leaky Nun

3

Mathematica, 124 110 104 102 байта

a=Join[#,Reverse@#]&;#<>"
"&/@a@a@Table[{"|"," ","-"}[[c~Order~d+2]],{c,b=Characters@#},{d,b}]<>""&

Анонимная функция. Символ Unicode - это U + F3C7 для \[Transpose].


3

Javascript 146 142 132 130 124 байтов

n=>(e=(a=[...n]).map(b=>(d=a.map(c=>c<b?"|":c>b?"-":" ")).concat([...d].reverse()).join``)).concat([...e].reverse()).join`
`

Тестирование:

f=n=>{a=n.split``;e=a.map(b=>a.map(c=>c<b?"|":c>b?"-":" ")).map(d=>d.concat([...d].reverse()).join``);alert(e.concat([...e].reverse()).join`
`)}

f(prompt("Enter string!"));

Спасибо за @HelkaHomba, за помощь в удалении как минимум 50 байтов, и @Downgoat за 3 байта!


1
обычно вы можете заменить => {...} на => (...) и заменить все точки с запятой в запятых этого времени
— Downgoat

Этот ответ почти идентичен ответу Даунгоата, клянусь, я не смотрел его.
— Балинт

3

На самом деле, 53 байта

;l╗;∙`♂O♂ii-s3@%" |-"E`MW╜`d@`nkd@Σ'.o@WX'.@s;R+;♂R¥i

Еще раз, на самом деле слабые способности к обработке строк - это криптонит. Это все еще короче, чем Java, так что у меня есть, что хорошо, что хорошо.

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

Объяснение:

Код можно разделить на 3 отдельные части: код перевода, код обработки и код зеркального отображения. Для удобства чтения я собираюсь объяснить каждый раздел отдельно.

Код перевода (начинается со строки ввода s, в стеке):

;l╗;∙`♂O♂ii-s3@%" |-"E`M
;l╗                       push len(s) to reg0 (needed for processing step; we'll call this n)
   ;∙                     cartesian product of s with itself
     `♂O♂ii-s3@%" |-"E`M  map:
      ♂O♂ii                 get a pair of ordinals for the characters
           -s               subtract, signum
             3@%            mod by 3 because element access with negative indices isn't working
                " |-"E      get corresponding string

Обработка кода (начинается со списка n**2символов, соответствующего правому нижнему углу):

W╜`d@`nkd@Σ'.o@WX
W╜`d@`nkd@Σ'.o@W   while loop (while top of stack is truthy):
 ╜`d@`n              remove n characters from the list
       kd@Σ'.o       concatenate those n characters, and append a period
                X  discard the empty list

Зеркальное отображение кода (начинается со n**2+nстроки длиной, с точками, действующими как символы новой строки)

'.@s;R+;♂R¥i
'.@s          split on periods
    ;R+       add the reverse list (vertical mirror)
       ;♂R    make a copy of the list with each string reversed (horizontal mirror)
          ¥   concatenate each pair of strings in the two lists (zip-concat)
           i  flatten list
              (implicitly print each stack item, separated by newlines)

3

> <> , 109 байт

i:0(?\:}
,[r]l\~l2,[r]rl2
1-:?!\$:}l1-[}
~]\  \
&r\l:?!;1-
?!\$:@@:@$:@@:@)}(}"- |"{?$@{?$o~~$}&1-:&
4.>~ao]2

Ввод осуществляется через STDIN. Попробуйте онлайн!

Explaination:

Входные данные читаются и отражаются в первой строке. Для ввода abcdэто оставляет dcbaabcdв стеке. Каждая половина затем отражается, чтобы дать abcddcba(строка 2). Затем каждый элемент дублируется и по очереди остается в своем стеке (строки 3 и 4). После этого процесса стек стеков выглядит примерно так:

aabcddcba  <-- top of the stack of stacks
b
c
d
d
c
b
a          <-- bottom of the stack of stacks

Для каждого стека по очереди значение строки (нижняя часть стека) сравнивается со значением столбца (верхняя часть стека). Соответствующий символ выбирается из - |и записывается в STDOUT. Затем значения столбцов поворачиваются так, чтобы следующий столбец находился на вершине стека (строка 6).

После того, как все столбцы рассмотрены, значение строки отбрасывается, печатается новая строка, а значения столбцов помещаются в предыдущий стек (строка 7), чтобы процесс вывода начался заново.

Команда ], помимо извлечения из стека, очищает текущий стек, если он остался единственным. Конечное условие программы - если стек пуст, так как все строки обработаны (строка 5).


3

C #, 169 150 байт

спасибо FryAmTheEggman

void f(string s){s+=new string(s.Reverse().ToArray());foreach(char c in s){var t="";foreach(char k in s)t+=c==k?" ":c>k?"|":"-";Console.WriteLine(t);}

ungolfed:

    public static void f(string s)
    {
        s += new string(s.Reverse().ToArray());
        foreach (char c in s)
        {
            var t="";
            foreach (char k in s)
            t+=c==k?" ":c>k?"|":"-";

            Console.WriteLine(t);
        }

    }

больше советов по гольфу приветствуется


t+=c==k?" ":c>k?"|":"-";должно сработать. Я не много играл в C #, но вполне возможно, что использование обычных forлупов будет короче.
— FryAmTheEggman

Этот ответ имеет ту же проблему, что и мой исходный ответ на C #, и то, и другое, Reverse()и поэтому они ToArray()являются частью System.Linqоператора using.
— JustinM - Восстановить Монику

3

C # 166 143 байта,

using System.Linq;s=>string.Join("\n",(s+=string.Concat(s.Reverse())).Select(x=>s.Aggregate("",(c, y)=>c+"- |"[Math.Sign(x.CompareTo(y))+1])));

Объяснение:

using System.Linq;

s=>                                     // Expression bodied member allows for implicit return
  string.Join("\n",                     // Join the generate lines into the final output
    (s+=string.Concat(s.Reverse()))     // Combine s and its reverse inline so aggregate has the whole line
        .Select(x=>                     // For each character in the line run the aggregate to generate its row
            s.Aggregate("",             // Empty string is required to cooerce the output type from char
                (c, y)=>                // c is the generated string so far, y is the next character
                        c+
                                        // Compare the two letters here (row to column)
                                        // Then take the sign of the result to collapse to -1, 0, or 1
                                        // Finally add 1 to line it up with the indexes of the constant string;                                             
                        "- |"[Math.Sign(x.CompareTo(y))+1]
)));

Контрольная работа:

Wordenticons

 |||||||||||||||||||||| 
- -|||-|| |--| ||-|||- -
-| |||-||||--||||-||| |-
--- ----|------|---- ---
---| ---|------|--- |---
---|| -||- -- -||- ||---
-||||| |||||||||| |||||-
---||-- |------| --||---
-------- ------ --------
- -|||-|| |--| ||-|||- -
---|| -||- -- -||- ||---
-|||||-||||  ||||-|||||-
-|||||-||||  ||||-|||||-
---|| -||- -- -||- ||---
- -|||-|| |--| ||-|||- -
-------- ------ --------
---||-- |------| --||---
-||||| |||||||||| |||||-
---|| -||- -- -||- ||---
---| ---|------|--- |---
--- ----|------|---- ---
-| |||-||||--||||-||| |-
- -|||-|| |--| ||-|||- -
 |||||||||||||||||||||| 

Я не был уверен, был ли приемлем только метод, если нет, дайте мне знать, и я соответствующим образом скорректирую свой ответ
— JustinM - Восстановить Монику

@ Downgoat спасибо за редактирование, я не был уверен в правильном способе избежать #.
— ДжастинМ - Восстановить Монику

Который очевидно только испортил в предварительном просмотре, хорошо знать
— JustinM - Восстановите Монику

Так как string реализует, IEnumerable<char>вы можете сохранить несколько байтов, используя .Reverse()непосредственно строку, пропуская.ToCharArray()
— grabthefish

Вы также можете перейти var a = new[] { '-', ' ', '|' };на, var a = "- |"; потому что вы можете использовать индексацию для строк
— grabthefish


2

Clojure, 171 байт

(fn[w](let[f concat r reverse p(map #(f %(r %))(partition(count w)(for[x w y w :let[c(compare x y)]](if(neg? c)\-(if(pos? c)\|\ )))))](run! #(apply println %)(f p(r p)))))

ungolfed:

(fn [w]
  (let [n (count w)
        a (for [x w y w
                :let [c (compare x y)]]
            (if (neg? c)
              \-
              (if (pos? c)
                \|
                \ )))
        p (map #(concat % (reverse %))(partition n a))
        p (concat p (reverse p))]
    (run! #(apply println %) p))))

2

J, 75 байт

5 байтов сохранено благодаря Денису.

3 :'(],.|:@|.@|:)(],|.)''- |''{~]([:-.@*(,~@#$])-(,~@#$(##])@]))3 u:y'

Я буду работать над преобразованием его в молчаливый глагол позже.


2

Октава, 39 байт

@(x)'| -'(sign([x,y=flip(x)]-[x y]')+2)

Создает анонимную функцию, которую можно запустить с помощью ans('string').

демонстрация

объяснение

Это решение объединяет входную строку ( x) и ее обратное ( flip(x)) с помощью [x, flip(x)]. Обратное назначается yдля сокращения ответа [x, y = flip(x)]. Затем мы создаем вектор - столбец одно и то же, комбинируя xи yи принимая транспонирование: [x,y]'. Затем мы берем разницу, которая будет автоматически транслироваться для создания двумерного массива различий между любыми ASCII-представлениями букв в строках. Мы используем , signчтобы сделать это либо -1, 0или , 1а затем добавить , 2чтобы получить значение индекса действителен 1 на основе. Затем мы используем их для индексации в исходной строке '| -'.


2

Юлия, 70 байт

Это моя первая попытка кода в гольф, и я раньше не пользовался Джулией, поэтому расскажите, что вы думаете:

f(s)=join([join([r>c?'|':r<c?'―':' 'for c=s])for r=s*=reverse(s)],"
")

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

Ungolfed:

function wordenticon(word::AbstractString)
    word*=reverse(word)
    join([
        join([
            if r>c
                '|'
            elseif r<c
                '―'
            else
                ' '
            end
            for c in word
        ])
        for r in word]
        ,"\n"
    )
end

Я думаю, что это может быть сделано короче. Этот код хранит символы слова в матрице:

f(s)=[r>c?'|':r<c?'―':' 'for r=s*=reverse(s),c=s]

К сожалению, мне не удалось получить желаемый результат с использованием матрицы.


Здравствуйте и добро пожаловать в PPCG! Спасибо, что присоединились к нам!
— NoOneIsHere


1

JavaScript, 303 байта

function w(o){function r(o){var r=Array.prototype.slice.call(o).reverse();console.log(o.join("")+r.join(""))}var e,n,c,h=[],s=o.length;for(e=0;s>e;e++){for(h.push([]),n=0;s>n;n++)c=o.charCodeAt(n)-o.charCodeAt(e),0===c?h[e].push(" "):0>c?h[e].push("|"):h[e].push("-");r(h[e])}for(e=s-1;e>=0;e--)r(h[e])}

Ungolfed

function w(s) {
    var arr = [],
        l = s.length, r, c, x;
    for (r = 0; r < l; r++) {
        arr.push([]);
        for (c = 0; c < l; c++) {
            x = s.charCodeAt(c) - s.charCodeAt(r);
            if (0 === x) {
                arr[r].push(' ');
            } else if (x<0) {
                arr[r].push('|');
            } else {
                arr[r].push('-');
            }
        }
        out(arr[r]);
    }
    for (r = l - 1; r>=0; r--) {
        out(arr[r]);
    }
    function out(r){
        var rev = Array.prototype.slice.call(r).reverse();
        console.log(r.join('') + rev.join(''));
    }
}

Никакой экмы 2015 здесь


Вы можете проверить, приходит ли письмо раньше в alphahet, просто выполнив «a» <«b»
— Bálint

Вам не нужно беспокоиться var x = 1, просто сделайте x = 1. В коде гольф никто не заботится о соблюдении лучших практик. :)
— gcampbell

1

Python 2, 126 байт

def f(s):x=[''.join(" -|"[cmp(ord(a),ord(b))]for a in s)for b in s];y=[a+b[::-1]for a,b in zip(x,x)];print'\n'.join(y+y[::-1])

По сути это порт моего На самом деле решения .

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

Объяснение:

x=[''.join(" -|"[cmp(ord(a),ord(b))]for a in s)for b in s] # get the correct character for each pair of characters in the Cartesian product of s with itself, and concatenate the characters in each line
y=[a+b[::-1]for a,b in zip(x,x)] # mirror each line horizontally
print'\n'.join(y+y[::-1]) # mirror vertically and print

1

Python 3,5 250 223 175 байтов:

def H(o):O=ord;G=len(o);p=[[' ―'[O(i)<O(g)],'|'][O(i)>O(g)]for i in o for g in o];u='\n'.join([''.join(p[i:G+i]+p[i:G+i][::-1])for i in range(0,len(p),G)]);print(u+'\n'+u[::-1])

Попробуйте онлайн! (Ideone) (Последние два тестовых случая не будут отображаться в выходных данных, поскольку они являются просто пустыми строками. Моя программа обрабатывает их, хотя это подтверждается тем фактом, что вводятся 10 случаев, но появляются только 8 выходов.)

Развернутый с последующим объяснением:

def H(o):
    O=ord
    G=len(o)
    p=[[' ―'[O(i)<O(g)],'|'][O(i)>O(g)]for i in o for g in o]
    u='\n'.join([''.join(p[i:G+i]+p[i:G+i][::-1])for i in range(0,len(p),G)])
    print(u+'\n'+u[::-1])
  1. p=[[' ―'[O(i)<O(g)],'|'][O(i)>O(g)]for i in o for g in o]

    Создайте список, pв |который добавляется a, если значение точки Unicode для буквы столбца меньше, чем значение буквы строки, a –добавляется, если значение точки Unicode для буквы столбца превышает значение буквы строки, или a, если оба значения равны.

  2. 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, это вернет:

     ――||―― 
    |  ||  |
    |  ||  |
    ―――  ―――
    
  3. print(u+'\n'+u[::-1])

    Наконец, вывод uсопровождается новой строкой, а затем uпереворачивается, чтобы вертикально отразить первую половину для второй половины. Это ваш законченный Wordenticon, который для контрольного примера food, наконец, будет:

     ――||―― 
    |  ||  |
    |  ||  |
    ―――  ―――
    ―――  ―――
    |  ||  |
    |  ||  |
     ――||―― 
    

0

R 101 байт

101 байт, так как я использую ―(что я думаю, выглядит лучше, чем -).

function(s)write(c("|"," ","―")[sign(outer(g<-c(r<-utf8ToInt(s),rev(r)),g,"-"))+2],"",2*nchar(s),,"")

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

Я был удивлен, что раньше не было ответа R, поскольку мы можем использовать симметрию и матрицы R, чтобы получить вполне конкурентный ответ, несмотря на то, что string проблема.

Ungolfed Объяснение:

function(s){
 r <- utf8ToInt(s)               # turn to vector of ints (charcodes)
 g <- c(r, rev(r))               # concatenate r and its reverse
 idx <- sign(outer(g,g,"-")) + 2 # compute all differences and their signs.
                                 # -1=>less than, 0=>equal, +1=>greater than
                                 # add 2 to make them 1-based indices into the vector
 write(c("|"," ","―")[idx],"",2*nchar(s),,"")
     # write the vector of characters to stdout "" with line width 2*nchar(s)
     # and no separator
}

0

C (gcc) , 202 байта

f(c,i,j,s,t,a,v)char*c,*v;{v=malloc((a=strlen(c)*2)*a);for(j=0;t=c[j];j++)for(i=0;s=c[i];i++)v[j*a+i]=v[j*a+a+~i]=v[a*(a+~j)+i]=v[a*(a+~j)+a+~i]="- |"[(s<t)-(s>t)+1];for(;*v;v+=a)write(1,v,a),puts("");}

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

Работает, просматривая каждый символ, затем обновляя результирующий символ (и его отражения).


0

05AB1E (наследие) , 20 22 21 байт

Ǹ˜ãε… |-s`.Sè}sgôJ∞∊

+2 байта в качестве исправления ошибки для однозначных входных данных.
-1 байт, используя обычные тире -вместо ―, так как мы можем использовать … |-вместо "… |―"(так … |―как неправильно будет действовать как строка словаря)

Использует унаследованную версию 05AB1E, так как она неявно присоединяется к символам новой строки при зеркалировании, что требует дополнительного явного »в новой версии.

Попробуйте онлайн или проверьте все контрольные примеры .

Объяснение:

Ç             # Push the unicode values of the characters of the (implicit) input-string
 ¸˜           # Wrap this into a list and flatten (workaround for single-char inputs,
              #  since `Ç` will then result in a single value instead of a list of values..)
   ã          # Create each possible pair
ε             # Map each pair to:
 … |-         #  Push string " |-" (note: `… |―` cannot be used here, since it will
              #   incorrectly act as a dictionary string)
 s            #  Swap to take the current map-pair
  `           #  Push both values seperated to the stack
   .S         #  Compare them with each other (-1 if a<b; 0 if a==b; 1 if a>b)
 è            #  Use it to index into the string " |―" (-1 will wraparound to the tail)
      }s      # After the map: swap to get the (implicit) input-string again
        gô    # Get its length, and split the mapped list into parts of that size
          J   # Join each character in the inner lists together to a string
           ∞∊ # Mirror both horizontally and vertically (which implicitly joins by newlines
              #  in the legacy version of 05AB1E)
              # (and output the result implicitly)
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.