Вырасти Treemote!


12

Это мой друг Томас. Он наполовину дерево, наполовину смайлик.

|    |
| :D |
|    |

Он одинок. Давайте сделаем его друзьями!


Учитывая , текстовый смайлик в качестве входных данных (например ಠ_ಠ, :P, >_>, а не 😀, 🤓или 🐦), выход соответствующего treemote.

Длина древовидного мотива - это количество символов, которое оно составляет (в основном большинство встроенных функций длины для строк). Так ಠ_ಠимеет длину 3.

Синтаксис для древовидной длины nявляется следующим:

|< 2+n spaces>| * ceil(n/2)
| <emote> | (note the spaces)
|< 2+n spaces>| * ceil(n/2)

Таким образом, любое дерево длиной 3 будет выглядеть так:

|     |
|     |
| ಠ_ಠ |
|     |
|     |

У него есть ceil(n/2)новые разделенные сегменты туловища с обеих сторон, каждый с 2 + nпробелами внутри.

Задача: учитывая текстовый смайлик, выведите соответствующее древовидное примечание.


Другие правила:

  • Это , что означает, что я хочу, чтобы вы написали короткий код.
  • Стандартные лазейки запрещены.
  • Вы должны поддерживать не-ascii символы, если ваш язык не может их обработать.

Тестовые случаи:

^_^

|     |
|     |
| ^_^ |
|     |
|     |

\o/

|     |
|     |
| \o/ |
|     |
|     |


(✿◠‿◠)

|        |
|        |
|        |
| (✿◠‿◠) |
|        |
|        |
|        |


D:

|    |
| D: |
|    |


( ͡° ͜ʖ ͡°)


|             |
|             |
|             |
|             |
|             |
|             |
| ( ͡° ͜ʖ ͡°) |
|             |
|             |
|             |
|             |
|             |
|             |

Разрешены ли конечные переводы строки?
Р. Кап

Мы предполагаем, что 1-символьных смайликов не существует?
Адам

Под "текстовым смайликом" вы подразумеваете смайлик ascii?
Downgoat

@ Даунгоат нет. Смотрите ಠ_ಠтестовый пример.
Rɪᴋᴇʀ

6
Может быть, добавить тестовый случай с длиной, отличной от 3 ...
SuperJedi224

Ответы:


4

05AB1E , 27 25 байтов

Код:

g©Ìð×"|ÿ|
"®;îש„| ¹s¶®J

Объяснение:

g                  # Push the length of the input string.
 ©                 # Copy that to the register.
  Ì                # Increment by 2.
   ð×              # Multiply by spaces.
     "|ÿ|\n"       # ÿ is used for interpolation and push the string "|spaces|\n".
                   #
 ®                 # Retrieve the value from the register.
  ;î               # Divide by 2 and round up.
    ×              # Multiply that by "|spaces|".
     ©             # Copy this into the register.
      „|           # Push the string "| ".
         Â         # Bifurcate, pushing the string and the string reversed.
          ¹s       # Push input and swap.
            ¶      # Push a newline character.
             ®J    # Retrieve the value from the register and join everything in the stack.
                   # Implicitly output this.

Использует кодировку CP-1252 . Попробуйте онлайн! ,


Ввод ( ͡° ͜ʖ ͡°)возвращает забавные результаты.
Шон Уайлд,

@ShaunWild Да, это странный тестовый пример, потому что ( ͡° ͜ʖ ͡°)сам по себе имеет длину 11 символов, но выглядит 8 символов.
Аднан

4

Python 3.5, 76 75 73 байта:

( Спасибо Blue за подсказку, которая сэкономила 2 байта! )

def i(n):q=len(n);z=('|'+' '*(2+q)+'|\n')*-(-q//2);print(z+'| '+n+' |\n'+z)

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

Кроме того, здесь есть неконкурентная версия Python 2.7.5, поскольку она намного длиннее - 87 байт .

def i(n):q=len(n.decode('utf-8'));z=('|'+' '*(2+q)+'|\n')*-(-q/2);print z+'| '+n+' |\n'+z

Это связано с тем, что кодировка Python 2 по умолчанию - asciiи, следовательно, такие символы, как за пределами диапазона точек Unicode 128, считаются более 1 байта ( list('ಠ')выход ['\xe0', '\xb2', '\xa0']). Единственный обходной путь, который я мог придумать для этого, - это сначала декодировать ввод с помощью utf-8, а затем перейти к этой utf-8декодированной строке.

Попробуйте эту версию Python 2 онлайн! (Ideone)


Вы можете избавиться от паренов вокруг (- (- q // 2)) за 2 байта. Я думаю, что вы можете сохранить еще 2 байта, переключившись на Python 2.7. Ему не нужен второй / in //, а только пробел в операторе print.
Blue

@ Синий Да, вы правы, я могу убрать вторую пару скобок. Тем не менее, я действительно нужен второй /в //делать CEIL разделение.
Р. Кап

как я уже говорил, в Python 2.7 деление целых чисел выполняется с 1 /
Blue

@Blue О, я предполагал, что вы говорите, что мне это не нужно в Python 3. Ну, в таком случае, тогда я переключусь на Python 2. Спасибо за советы! :)
Р. Кап

@Blue Если это так, то как вы делите float в Python 2?
Р. Кап

3

Dyalog APL , 37 34 33 байта

{↑'|'{⍺⍵⍺}¨b,(⊂⍵),b←' '/⍨⌈0.5×≢⍵}

Пользователи Chrome: см. Сноску *

Контрольные примеры

      f←{↑'|'{⍺⍵⍺}¨b,(⊂⍵),b←' '/⍨⌈0.5×≢⍵}

      f,'☺' ⍝ the , is necessary to create a 1 char string instead of a character scalar
|   |
| ☺ |
|   |
      f':D'
|    |
| :D |
|    |
      f'^_^'
|     |
|     |
| ^_^ |
|     |
|     |

* Chrome неправильно отображает два символа ≢⍵(U + 2262, U + 2375) как ≢⍵(U + 2261, U + 0338, U + 2375) вместо как ̸≡⍵(U + 0338, U + 2262, U + 2375), поэтому здесь показать версию для Chrome:{↑'|'{⍺⍵⍺}¨b,(⊂⍵),b←' '/⍨⌈0.5×̸̸≡⍵}


1
+1 за наличие смайликов внутри самого кода {⍺⍵⍺} ¨b
Value Ink

3
Ах, {⍺⍵⍺}¨bэто смайлик "Программист APL на своей пятой чашке кофе поднимает палец вверх".
Линн

2

V 60 57 байт

I| A |ByWo=ceil(len(""")/2.0)
 dF.d0kwviWr Yu@-pH@-P

К сожалению, V не имеет ничего общего с точки зрения математических операций. Функции «Разделяй и отделяй» резко увеличивали количество байтов.

Поскольку это содержит кучу неприятных непечатных файлов, вот обратимый hexdump:

00000000: 497c 201b 4120 7c1b 4279 576f 123d 6365  I| .A |.ByWo.=ce
00000010: 696c 286c 656e 2822 1222 2229 2f32 2e30  il(len("."")/2.0
00000020: 290d 201b 6446 2e64 306b 7776 6957 7220  ). .dF.d0kwviWr 
00000030: 5975 402d 7048 402d 50                   Yu@-pH@-P

Объяснение:

I| A |                                #Add surrounding bars
      B                               #Move back
       yW                             #Yank a word
         o                            #Open a new line
          <C-r>=                      #Evaluate

          <C-r>"                      #Insert the yanked text into our evaluation
ceil(len("      ")/2.0)<cr>           #Evaluate ceil(len(text)/2) and insert it

 dF.                                  #Append a space and delete backward to a (.)
                                      #By default, this will be in register "-
    d0                                #Delete this number into register a
      kw                              #Move up, and forward a word
        viWr                          #Replace the emoticon with spaces
             Yu                       #Yank this line, and undo 
                                      #(so we can get the emoticon back)
               @-p                    #Paste this text "- times.
                  H                   #Move to the beginning
                   @-P                #Paste this text "- times behind the cursor.

Сколько байт было бы, если бы были математические операторы?
Аднан

@ Adnan Трудно сказать, так как я точно не знаю, как они будут выглядеть. Оптимистично я бы сказал, около 30 байтов?
Джеймс

2

Витси, 43 байта

IV2m3mz4m2m
3mV\D4m
V1+2/\[1m]
' || '
}}ZaO

Объяснение:

IV2m3mz4m2m

I            Grab the length of the input string.
 V           Save that value to a global final variable.
  2m         Call the method at line index 2.
    3m       Call the method at line index 3.
      z      Push the entire input to the stack.
       4m    Call the method at line index 4.
         2m  Call the method at line index 2.

3mV\D4m

3m           Call the method at line index 3.
  V          Push the global variable to the stack.
   \D        Duplicate the top item on the stack that many times.
     4m      Call the method at line index 4.

V1+2/\[1m]

V            Push the global variable to the stack.
 1+          Add one to the top value.
             REASONING: We want ceil(V/2), and since repeat commands follow the floor value of repeats, we want ceil(V/2)+.5, so we add one to make this work right.
   2/        Divide by two.
     \[1m]   Call method 1 that top value of the stack times.

' || '

' || '       Push ' || ', the string, to the stack.

}}ZaO

}}           Push the bottom item of the stack to the top twice.
  Z          Output everything in the stack.
   aO        Output a newline.

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

Обратите внимание, что из-за ошибки в TIO ввод с использованием символов Юникода не будет работать. Вместо этого вам придется использовать локальную версию. Спасибо, @ Денис!



1

Рубин, 57 байт

Использует трюки с целочисленным делением и использует все особенности в putsфункции Руби .

->e{s=e.size+1;puts k=[?|+' '*-~s+?|]*(s/2),"| #{e} |",k}

1

JavaScript ES6, 83 78 байт

e=>(a=`| ${" ".repeat(n=e.length)} |
`.repeat(Math.ceil(n/2)))+`| ${e} |
${a}`

Вам не нужно то f=, что экономит 2 байта. Сохраните еще 2 байта, перемещаясь eвнутри шаблона и aснаружи. Сохраните еще 2 байта, вставив пробелы вместо добавления 2 к повторению. Сохраните еще одну группу байтов, используя сдвиг битов, чтобы разделить на 2.
Нил

Я не думаю, что это работает, он просто пытается напечатать исходный код повтора
Bálint

Попробуйте еще раз, я исправил это @ Bálint
Conor O'Brien

1

> <> , 103 байта

i:0(?\
}$&1[\~rl:::2%+*:2,
1-:?!\" "$
]{\  \~
?!\$}1-:
~&\
?!\l$:@-[l2)
~]\
}}\" || "
?!\ol
8.>]l?!;ao2

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

Это решение основано на наблюдении, из которого состоит каждая строка | <x> |, где <x>находится шаблон в средней строке, и такое же количество пробелов в других линиях.

После считывания ввода (длины n) из STDIN программа выталкивает n*(n+(n%2))пробелы. Затем стек складывается вдвое меньше. Затем все nсимволы, кроме символов, перетаскиваются в новый стек, оставляя стеки, состоящие из nпробелов или самого шаблона (только в среднем стеке). На этапе вывода содержимое текущего стека печатается в окружении |и |.


1

C 89 байтов

f;main(int c,char**a){for(c=strlen(*++a)+1;f<(c|1);)printf("|%*s |\n",c,f++==c/2?*a:"");}

Не уверен, что справится с не-смайликами, хотя ....


Можете ли вы проверить это с не-ascii смайликами?
Rɪᴋᴇʀ

Попробовал, и результат не был хорошим - strlenсчитал байты до первого нулевого байта и, как результат, не-смайлики считаются намного шире, чем они есть.
aragaer

1

PowerShell v3 +, 72 байта

param($a)$b=("| "+(" "*($l=$a.length))+" |`n")*($l+1-shr1);"$b| $a |";$b

Принимает входную строку $a. Создает $bкак (пустая строка в конце канала (с $a.lengthпробелами в середине) и завершающий символ новой строки) повторяется (длина + 1 сдвинута вправо на один бит, т.е. разделена на два и потолка) раз. Затем выводит копии $bвходной строки со своими собственными каналами и, наконец, копии $bснова.

Требуется v3 + для -shrоператора сдвига битов .

Примеры

PS C:\Tools\Scripts\golfing> .\grow-a-treemote.ps1 '>:-|'
|      |
|      |
| >:-| |
|      |
|      |


PS C:\Tools\Scripts\golfing> .\grow-a-treemote.ps1 '>:`-('
|       |
|       |
|       |
| >:`-( |
|       |
|       |
|       |


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.