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


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.