Генеруйте Wordenticons


54

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

Виклик

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

Словослойник 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――― 
    

Щоб завершити wordenticon, видаліть зайвий рядок і стовпець, що містить слова

 ――|
|  |
|  |
――― 

потім віддзеркалюйте всю річ горизонтально

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

і, нарешті, знову його по вертикалі

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

в результаті виходить 2*length(S)текстова сітка довжини сторони, яка є завершальним словом.

Приклади

Ось кілька додаткових прикладів wordenticon. Зауважте, що різні слова можуть мати ідентичні wordenticons, а деякі wordenticons можуть бути повністю зроблені з пробілів (на жаль, розмітка не хоче їх виводити).

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

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

Оцінка балів

Це , найкоротший код у байтах виграє. Тібрейкер переходить до більш ранньої відповіді.

Примітки

  • Будь-який примірник горизонтальної смуги ( ) у вашому коді може зараховуватися як 1 байт замість 3 байт UTF-8, який він фактично займає. (До десяти екземплярів.)
  • За бажанням ви можете використовувати звичайні тире ( -) замість горизонтальних брусків ( ).
  • Видалення або додавання пробілів у рядках wordenticon не дозволяється (навіть якщо форма залишається незмінною). Це має бути точний 2*length(S)квадрат довжини сторони тексту.
  • Вихідний wordenticon може необов'язково мати один зворотний новий рядок.

Чи можемо ми взяти вхід як масив символів?
Пуховик

@Downgoat Ні, це повинен бути звичайний рядок, якщо немає абсолютно іншого способу для вашої мови.
Хобі Кальвіна

2
У вас є приклади programming, andі , codegolfале ви забули puzzles...
Neil

Чи можете ви додати таблицю лідерів?
Лина монашка

Тож ми зрештою з’ясували, чому ви розмовляли про
portmanteaus

Відповіді:


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
: О ти перевершив Денніса!
Пуховик

@Downgoat Це один з тих рідкісних випадків, коли MATL коротший, ніж Jelly!
Suever

Гарна ідея використовувати знакову функцію!
Луїс Мендо

18

Java, 329 305 264 259 192 байт

Завдяки:

  • @ Bálint запропонував використовувати потрійні оператори.
  • @ user902383 за те, що я пропонував сам змінити рядок
  • @Frozn та @ user902383 запропонували замінити StringBuilderна String.

Гольф:

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;}

Безголівки:

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
Ласкаво просимо до головоломки програмування та коду для гольфу! Це дуже приємна перша відповідь. :)
Олексій А.

1
Зауважте, що вам не потрібно користуватися \u2015. Використання горизонтальної смуги (або просто тире) в неочищеному коді добре.
Захоплення Кальвіна

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

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

Я думаю, ви могли б значно заощадити, якщо змінити цикл for для кожного циклу. Індекси вам не потрібні ні для чого іншого, ніж отримання знака.
Фрозн

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 через кілька біфуркатів. Досить базовий алгоритм до цих пір, підрахунок трактує горизонтальну смугу як 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 20 байт

6 байт завдяки @Zgarb .

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

Попередня відповідь в 26 байт

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

Використовується той же алгоритм, що і відповідь Денніса.

Використання:

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

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

( >>означає вхід (STDIN), <<значення виводу (STDOUT))


1
З деякою реструктуризацією ви можете дістатись до 20 байт:' |-'{~3*@-/~@u:[,|.
Згарб

Це приємне використання вилок ...
Leaky Nun,

3

Математика, 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
зазвичай ви можете замінити => {...} на => (...) і замінити всі крапки з комою протягом цих коми
Пуховик

Ця відповідь майже ідентична відповіді Даунгаута, клянусь, я не подивився на його.
Балінт

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. Спробуйте в Інтернеті!

Пояснення:

Вхід, який він читав і відображав у першому рядку. Для введення 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);}

неозорений:

    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так використанням заяви не потрібно.
Phaeze

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

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

Я не був впевнений, чи прийнятний лише метод, якщо не дайте мені знати, і я відповідно
скорегую

@Downgoat дякую за редагування, я не був впевнений у правильному способі уникнути #.
Phaeze

Який, мабуть,
заплутався

оскільки рядкові інструменти IEnumerable<char>ви можете зберегти кілька байт, скориставшись .Reverse()безпосередньо на рядку, пропускаючи.ToCharArray()
grabthefish

Ви також можете змінити , var a = new[] { '-', ' ', '|' };щоб , var a = "- |"; тому що ви можете використовувати індексацію на рядках
grabthefish

2

CJam, 20 байт

l_W%+_ff{-g" |―"=}N*

Тестуйте це тут.

Використовує очевидний підхід до обчислення зовнішнього продукту та використання різниці та нью для обчислення символів у кожній комірці.


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)))))

неозорений:

(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 70 байт

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]'. Тоді ми беремо різницю, яка автоматично транслюватиметься, щоб створити 2D масив відмінностей між будь-якими представленнями ASCII літер у рядках. Ми використовуємо signдля виготовлення цих або -1, 0або, 1а потім додаємо, 2щоб отримати дійсні значення на основі індексу. Потім ми використовуємо їх для індексації у початковий рядок '| -'.


2

Джулія, 70 байт

Це моя перша спроба кодового гольфу, і я раніше не використовував Джулію, тож скажи мені, що ти думаєш:

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

Спробуйте в Інтернеті!

Безголівки:

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

Я думаю, це, можливо, може бути скорочене. Цей код зберігає символи wordicon у матриці:

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

На жаль, мені не вдалося отримати бажаний вихід за допомогою матриці.


Привіт, ласкаво просимо до PPCG! Дякуємо, що приєдналися до нас!
NoOneIsHere

1

Джолф, 42 байти

Навряд чи гольф. Я, мабуть, забуваю про матрицю, вбудовану Джолфом.

ΆΖR~mGiEd+γR~mGiEΨ."| -"hmA-~@ά~@HE_γSSZiζ

Спробуйте тут! Цей код використовує функцію стрілки ( Ψ) для матричної карти.


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])}

Безумовно

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(''));
    }
}

Тут немає фантазії ecma 2015


Ви можете перевірити, якщо лист надходить в алфавіті, просто зробивши "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 виходів.)

Ungolfed з подальшим поясненням:

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де а |додається, якщо значення точки Unicode у стовпчикові букви менше значення рядкової літери, а додається, якщо значення точки 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проблема.

Пояснення без вогню:

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.