Виростіть Тремоте!


12

Це мій друг Томас. Він наполовину дерево, наполовину смайлик.

|    |
| :D |
|    |

Він самотній. Давайте зробимо з ним кілька друзів!


З огляду на , текстовий смайлик в якості вхідних даних (наприклад ಠ_ಠ, :P, >_>, а НЕ 😀, 🤓або 🐦), вихід відповідного treemote.

Довжина 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-карткових смайликів не існує?
Адама

Під текстовим смайликом ви маєте на увазі смайлик емоцій?
Пуховик

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


Введення ( ͡° ͜ʖ ͡°)повертає смішні результати.
Shaun Wild

@ShaunWild Так, це дивний тестовий випадок, тому що ( ͡° ͜ʖ ͡°)сам по собі 11 символів, але він виглядає в 8 символів.
Аднан

4

Python 3.5, 76 75 73 байт:

( Дякую Блакитному за підказку, яка зберегла 2 байти! )

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

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

Крім того, тут є неконкурентна версія 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, отже, такі символи, як поза межами діапазону 128 унікодних точок, вважаються більш ніж 1 байт ( list('ಠ')урожайність ['\xe0', '\xb2', '\xa0']). Єдине вирішення, про яке я міг придумати це, - це спочатку розшифрувати вхід, використовуючи utf-8, а потім перейти до цього utf-8декодованого рядка.

Спробуйте цю версію Python 2 в Інтернеті! (Ідеон)


Ви можете позбутися паронів навколо (- (- q // 2)) на 2 байти. Я думаю, що ви можете зберегти ще 2 байти, перейшовши на Python 2.7. Для цього не потрібен другий / в //, а лише пробіл у операторі друку.
Блакитний

@Blue Так, ти маєш рацію, я можу видалити ці дві круглі дужки. Тим НЕ менше, я дійсно потрібен другий /в //робити CEIL поділ.
Р. Кап

як я вже говорив, в Python 2.7 ціле ділення відбувається з 1 /
Синій

@Blue О, я припускав, що ви говорите, що мені це не потрібно в Python 3. Ну, у такому випадку я перейду на Python 2. Дякую за поради! :)
Р. Кап

@Blue Якщо це так, то як ви робите поплавковий поділ у Python 2?
Р. Кап

3

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

Оскільки тут міститься купа неприємних друкованих матеріалів, ось такий оборотний шестигранник:

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 введення з символами unicode не працюватиме. Вам доведеться використовувати локальну версію замість них. Дякую, @Dennis!



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підраховує байти до першого нульового байту, і в результаті смайлики, що не мають права, вважаються набагато ширшими, ніж вони є.
араґер

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.