Tumbuhkan Treemote!

12

Ini temanku Thomas. Dia setengah pohon, setengah emoticon.

|    |
| :D |
|    |

Dia kesepian. Mari kita buat dia menjadi teman!


Mengingat emoticon berbasis teks sebagai input (misalnya ಠ_ಠ, :P, >_>, tidak 😀, 🤓atau 🐦), output yang sesuai treemote.

Panjang treemote adalah berapa banyak karakternya lon (pada dasarnya fungsi built-in untuk string). Jadi ಠ_ಠmemiliki panjang 3.

Sintaks untuk treemote panjang nadalah sebagai berikut:

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

Jadi setiap treemote dengan panjang 3 akan terlihat seperti:

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

Dia memiliki ceil(n/2)segmen trunk yang dipisahkan baris baru di kedua sisi, masing-masing dengan 2 + nspasi di dalam.

Tantangan: Dengan adanya emotikon berbasis teks, tampilkan treemote yang sesuai.


Aturan lainnya:

  • Ini adalah , yang berarti saya ingin Anda menulis kode pendek.
  • Celah standar tidak diijinkan.
  • Anda harus mendukung karakter non-ascii kecuali bahasa Anda tidak bisa menanganinya.

Kasus uji:

^_^

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

\o/

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


(✿◠‿◠)

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


D:

|    |
| D: |
|    |


( ͡° ͜ʖ ͡°)


|             |
|             |
|             |
|             |
|             |
|             |
| ( ͡° ͜ʖ ͡°) |
|             |
|             |
|             |
|             |
|             |
|             |
Rɪᴋᴇʀ
sumber
Apakah membuntuti baris baru diizinkan?
R. Kap
Kami menganggap emotikon 1-char tidak ada?
Adám
Dengan "emotikon berbasis teks" maksud Anda emotikon ascii?
Downgoat
@Downgoat no. Lihat ಠ_ಠtest case.
R
6
Mungkin menambahkan test case dengan panjang selain 3 ...
SuperJedi224

Jawaban:

4

05AB1E , 27 25 byte

Kode:

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

Penjelasan:

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.

Menggunakan pengodean CP-1252 . Cobalah online! .

Adnan
sumber
Memasukkan ( ͡° ͜ʖ ͡°)menghasilkan hasil yang lucu.
Shaun Wild
@ShaunWild Ya, ini kasus aneh tes, karena ( ͡° ͜ʖ ͡°)itu sendiri adalah 11 karakter, tapi terlihat 8 karakter.
Adnan
4

Python 3.5, 76 75 73 byte:

( Terima kasih kepada Blue untuk tip yang menghemat 2 byte! )

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

Cobalah secara Online! (Ideone)

Juga, ini adalah versi 2.7.5 Python yang tidak bersaing karena jauh lebih lama pada 87 byte .

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

Ini karena pengkodean default Python 2 adalah ascii, dan karena itu, karakter seperti di luar 128 unicode point range dihitung lebih dari 1 byte ( list('ಠ')menghasilkan ['\xe0', '\xb2', '\xa0']). Satu-satunya solusi yang dapat saya pikirkan untuk ini adalah pertama-tama mendekode penggunaan input utf-8, dan kemudian melanjutkan dengan utf-8string yang diterjemahkan ini .

Coba Versi Python 2 Ini Daring! (Ideone)

R. Kap
sumber
Anda dapat menyingkirkan parens sekitar (- (- q // 2)) selama 2 byte. Saya pikir Anda dapat menyimpan 2 byte lebih banyak dengan beralih ke Python 2.7. Tidak perlu yang kedua / dalam //, dan hanya ruang dalam pernyataan cetak.
Biru
@ Biru Ya, Anda benar, saya bisa menghapus pasangan kurung kedua itu. Namun, saya tidak perlu kedua /di //untuk melakukan ceil divisi.
R. Kap
seperti yang saya katakan, dalam pembagian integer Python 2.7 dilakukan dengan 1 /
Biru
@ Biru Oh, saya berasumsi Anda mengatakan saya tidak membutuhkan itu di Python 3. Nah, dalam hal ini, maka saya akan beralih ke Python 2. Terima kasih atas tipsnya! :)
R. Kap
@Blue Jika itu masalahnya, lalu bagaimana Anda melakukan pembagian float di Python 2?
R. Kap
3

Dyalog APL , 37 34 33 byte

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

Pengguna Chrome: Lihat catatan kaki *

Uji kasus

      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 salah menampilkan dua karakter ≢⍵(U + 2262, U + 2375) sebagai ≢⍵(U + 2261, U + 0338, U + 2375) alih-alih sebagai ̸≡⍵(U + 0338, U + 2262, U + 2375), jadi di sini ada versi tampilan untuk Chrome:{↑'|'{⍺⍵⍺}¨b,(⊂⍵),b←' '/⍨⌈0.5×̸̸≡⍵}

Adm
sumber
1
+1 karena memiliki emotikon dalam kode Anda sendiri {⍺⍵⍺} ¨b
Nilai Tinta
3
Ah, {⍺⍵⍺}¨badalah "APL programmer pada cangkir kopi kelima memberi jempol" emoticon.
Lynn
2

V, 60 57 byte

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

Sayangnya, V tidak memiliki apa-apa dalam hal operasi matematika. Fungsi membagi dan ceil secara drastis meningkatkan jumlah byte.

Karena ini mengandung banyak unsintables jahat, berikut adalah hexdump yang dapat dibalik:

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

Penjelasan:

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.
James
sumber
Berapa byte yang akan terjadi jika ada operator matematika?
Adnan
@ Adnan Sulit untuk mengatakan, karena saya tidak tahu persis seperti apa mereka nantinya. Secara optimis saya akan mengatakan sekitar 30 byte?
James
2

Vitsy, 43 byte

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

Penjelasan:

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.

Cobalah online!

Perhatikan bahwa, karena bug di TIO, input dengan karakter unicode tidak akan berfungsi. Anda harus menggunakan versi lokal sebagai gantinya. Terima kasih, @Dennis!

Addison Crump
sumber
1

Pyke, 31 byte

"||
"1dQlO*:Ql_2f_*iO"|  |"2Q:i

Coba di sini!

Terima kasih @ R.Kap karena telah menyimpan byte dengan trik pembagian lantai

Biru
sumber
1

Ruby, 57 byte

Menggunakan trik bilangan bulat integer dan memanfaatkan keunikan dalam putsfungsi Ruby .

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

JavaScript ES6, 83 78 byte

e=>(a=`| ${" ".repeat(n=e.length)} |
`.repeat(Math.ceil(n/2)))+`| ${e} |
${a}`
Conor O'Brien
sumber
Anda tidak perlu f=, itu menghemat 2 byte. Simpan 2 byte lagi dengan bergerak edi dalam template dan di aluar. Simpan 2 byte lagi dengan menyisipkan spasi alih-alih menambahkan 2 pada pengulangan. Simpan sekelompok byte lain dengan menggunakan bit shifting untuk membagi dengan 2.
Neil
Saya tidak berpikir ini berfungsi, itu hanya mencoba untuk mencetak kode sumber pengulangan
Bálint
Coba lagi, saya memperbaikinya @ Bálint
Conor O'Brien
1

> <> , 103 byte

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

Cobalah online!

Solusi ini didasarkan pada pengamatan bahwa setiap garis terdiri dari | <x> |, di mana <x>pola di garis tengah, dan jumlah ruang yang sama di garis lainnya.

Setelah membaca input (panjang n) dari STDIN, program mendorong n*(n+(n%2))spasi. Tumpukan kemudian digulung setengah kali. Selanjutnya, semua nkarakter kecuali ditarik ke tumpukan baru, meninggalkan tumpukan tumpukan yang terdiri dari nspasi atau pola itu sendiri (hanya di tumpukan tengah). Pada langkah output, isi tumpukan saat ini dicetak, dikelilingi oleh |dan |.

Sok
sumber
1

C, 89 byte

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

Tidak yakin apakah itu akan menangani emotikon non-ascii ....

aragaer
sumber
Bisakah Anda mengujinya dengan emotikon non-ascii?
Rɪᴋᴇʀ
Sudah dicoba dan hasilnya tidak bagus - strlenmenghitung byte hingga nol byte pertama dan sebagai hasilnya emotikon non-ascii dianggap jauh lebih luas daripada yang sebenarnya.
aragaer
1

PowerShell v3 +, 72 byte

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

Mengambil string input $a. Dibangun $bsebagai (string ujung pipa yang kosong (dengan $a.lengthspasi di tengah) dan baris baru yang tertinggal) diulangi (panjang + 1 bergeser ke kanan sedikit, yaitu, dibagi dua dan langit-langit) kali. Kemudian mengeluarkan salinan $b, string input dengan pipa sendiri, dan akhirnya salinan $blagi.

Membutuhkan v3 + untuk -shroperator bit-shift .

Contohnya

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


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

Pyth, 30 byte

Saya terkejut bahwa tugas semudah itu tidak dilaksanakan di Pyth.

Ls[K\|dbdK)j++J*/hlQ2]sym;QyQJ

Cobalah online!

Biarawati Bocor
sumber
1

TSQL, 96 88 byte

DECLARE @ varchar(100)='^_^'

PRINT STUFF(REPLICATE('|'+SPACE(2+LEN(@))+'|
',LEN(@)*2-1),LEN(@)*(LEN(@)+5)-3,LEN(@),@)

Coba online!

t-clausen.dk
sumber