Trồng Treemote!


12

Đây là Thomas bạn tôi. Ông là một nửa cây, một nửa biểu tượng cảm xúc.

|    |
| :D |
|    |

Anh ta cô đơn. Hãy làm cho anh ấy một vài người bạn!


Cho một biểu tượng cảm xúc dựa trên văn bản như là đầu vào (ví dụ ಠ_ಠ, :P, >_>, không 😀, 🤓hoặc 🐦), sản lượng treemote tương ứng.

Độ dài của treemote là bao nhiêu ký tự (đơn giản là hầu hết các hàm có độ dài dựng sẵn cho chuỗi). Vậy ಠ_ಠcó chiều dài 3.

Cú pháp cho một treemote có độ dài nnhư sau:

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

Vì vậy, bất kỳ treemote có chiều dài 3 sẽ trông như:

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

Anh ta có ceil(n/2)các phân đoạn thân cây mới tách ra ở hai bên, mỗi bên có 2 + nkhông gian bên trong.

Thách thức: Đưa ra biểu tượng cảm xúc dựa trên văn bản, xuất ra treemote tương ứng.


Các quy tắc khác:

  • Đây là , có nghĩa là tôi muốn bạn viết mã ngắn.
  • Sơ hở tiêu chuẩn không được phép.
  • Bạn phải hỗ trợ các ký tự không phải ascii trừ khi ngôn ngữ của bạn không thể xử lý chúng.

Các trường hợp thử nghiệm:

^_^

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

\o/

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


(✿◠‿◠)

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


D:

|    |
| D: |
|    |


( ͡° ͜ʖ ͡°)


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

Được kéo dài dòng mới được phép?
R. Kap

Chúng tôi giả sử biểu tượng cảm xúc 1-char không tồn tại?
Adám

"Biểu tượng cảm xúc dựa trên văn bản" có nghĩa là biểu tượng cảm xúc ascii?
Hạ cấp

@Downgoat không. Xem ಠ_ಠtrường hợp thử nghiệm.
Rɪᴋᴇʀ

6
Có thể thêm một trường hợp thử nghiệm có độ dài khác hơn 3 ...
SuperJedi224

Câu trả lời:


4

05AB1E , 27 25 byte

Mã số:

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

Giải trình:

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.

Sử dụng mã hóa CP-1252 . Hãy thử trực tuyến! .


Nhập ( ͡° ͜ʖ ͡°)kết quả hài hước.
Shaun Wild

@ShaunWild Vâng, đó là một trường hợp thử nghiệm kỳ lạ, vì ( ͡° ͜ʖ ͡°)bản thân nó dài 11 ký tự, nhưng trông dài 8 ký tự.
Ad Nam

4

Python 3.5, 76 75 73 byte:

( Cảm ơn Blue vì một mẹo đã lưu 2 byte! )

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

Dùng thử trực tuyến! (Ý)

Ngoài ra, đây là phiên bản Python 2.7.5 không cấu hình vì nó dài hơn ở mức 87 byte .

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

Điều này là do mã hóa mặc định của Python 2 ascii, và do đó, các ký tự như bên ngoài phạm vi điểm unicode 128 được tính là hơn 1 byte ( list('ಠ')sản lượng ['\xe0', '\xb2', '\xa0']). Cách giải quyết duy nhất tôi có thể nghĩ đến cho việc này là trước tiên giải mã đầu vào bằng cách sử dụng utf-8, sau đó tiếp tục với utf-8chuỗi được giải mã này .

Hãy dùng thử phiên bản Python 2 trực tuyến này! (Ý)


Bạn có thể thoát khỏi các parens xung quanh (- (- q // 2)) cho 2 byte. Tôi nghĩ bạn có thể tiết kiệm thêm 2 byte bằng cách chuyển sang Python 2.7. Nó không cần thứ hai / in // và chỉ có một khoảng trắng trong câu lệnh in.
Màu xanh

@Blue Vâng, bạn nói đúng, tôi có thể xóa cặp ngoặc đơn thứ hai đó. Tuy nhiên, tôi làm cần thứ hai /trong //để làm ceil chia.
R. Kap

như tôi đã nói, trong phân chia số nguyên Python 2.7 được thực hiện với 1 /
Blue

@Blue Ồ, tôi giả sử bạn nói rằng tôi không cần điều đó trong Python 3. Chà, trong trường hợp đó, sau đó tôi sẽ chuyển sang Python 2. Cảm ơn vì những lời khuyên! :)
R. Kap

@Blue Nếu đó là trường hợp, vậy làm thế nào để bạn thực hiện phân chia float trong Python 2?
R. Kap

3

APL Dyalog , 37 34 33 byte

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

Người dùng Chrome: Xem chú thích *

Các trường hợp thử nghiệm

      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 định nghĩa sai hai ký tự ≢⍵(U + 2262, U + 2375) thành ≢⍵(U + 2261, U + 0338, U + 2375) thay vì như ̸≡⍵(U + 0338, U + 2262, U + 2375), vì vậy đây là một phiên bản hiển thị cho Chrome:{↑'|'{⍺⍵⍺}¨b,(⊂⍵),b←' '/⍨⌈0.5×̸̸≡⍵}


1
+1 để có biểu tượng cảm xúc trong chính mã của bạn {} b
Giá trị mực

3
À, {⍺⍵⍺}¨blà lập trình viên APL trên tách cà phê thứ năm của anh ấy, cho ngón tay cái lên biểu tượng cảm xúc.
Lynn

2

V, 60 57 byte

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

Thật không may, V không có gì bên cạnh các hoạt động toán học. Các hàm phân chia và trần làm tăng mạnh số lượng byte.

Vì cái này chứa một loạt các dấu vết khó chịu, đây là một hexdump có thể đảo ngược:

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

Giải trình:

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.

Sẽ có bao nhiêu byte nếu có toán tử toán học?
Ad Nam

@Adnan Thật khó để nói, vì tôi không biết chính xác chúng sẽ trông như thế nào. Lạc quan tôi muốn nói khoảng 30 byte?
James

2

Vitsy, 43 byte

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

Giải trình:

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.

Hãy thử trực tuyến!

Lưu ý rằng, do lỗi trong TIO, đầu vào có các ký tự unicode sẽ không hoạt động. Thay vào đó, bạn sẽ phải sử dụng phiên bản địa phương. Cảm ơn, @Dennis!



1

Ruby, 57 byte

Sử dụng các thủ thuật phân chia số nguyên và tận dụng lợi thế của các quirks trong putschức năng của Ruby .

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

1

JavaScript ES6, 83 78 byte

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

Bạn không cần f=, điều đó giúp bạn tiết kiệm 2 byte. Lưu thêm 2 byte bằng cách di chuyển ebên trong mẫu và abên ngoài. Lưu thêm 2 byte bằng cách chèn khoảng trắng thay vì thêm 2 vào lặp lại. Lưu một bó byte khác bằng cách sử dụng dịch chuyển bit để chia cho 2.
Neil

Tôi không nghĩ rằng nó hoạt động, nó chỉ cố in mã nguồn lặp lại
Bálint

Hãy thử lại, tôi đã sửa nó @ Bálint
Conor O'Brien

1

> <> , 103 byte

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

Hãy thử trực tuyến!

Giải pháp này dựa trên sự quan sát rằng mỗi dòng bao gồm | <x> |, đâu <x>là mẫu ở dòng giữa và cùng một số khoảng trắng trong các dòng khác.

Sau khi đọc đầu vào (độ dài n) từ STDIN, chương trình sẽ đẩy n*(n+(n%2))khoảng trắng. Các ngăn xếp sau đó được cuộn một nửa nhiều lần. Tiếp theo, tất cả trừ các nký tự được kéo đến một ngăn xếp mới, để lại một ngăn xếp bao gồm các nkhoảng trắng hoặc chính mẫu (chỉ trong ngăn xếp giữa). Trong bước đầu ra, nội dung của ngăn xếp hiện tại được in, bao quanh ||.


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:"");}

Không chắc chắn nếu nó sẽ xử lý biểu tượng cảm xúc không ascii mặc dù ....


Bạn có thể kiểm tra nó với các biểu tượng cảm xúc không ascii không?
Rɪᴋᴇʀ

Đã thử và kết quả không tốt - strlenđếm byte cho đến byte 0 đầu tiên và kết quả là các biểu tượng cảm xúc không phải ascii được coi là rộng hơn nhiều so với thực tế.
aragaer

1

PowerShell v3 +, 72 byte

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

Đưa chuỗi đầu vào $a . Xây dựng $bnhư (chuỗi kết thúc đường ống trống (có $a.lengthkhoảng trắng ở giữa) và một dòng mới ở cuối) được lặp lại (chiều dài + 1 thay đổi đúng một bit, tức là chia cho hai và trần) lần. Sau đó xuất ra các bản sao của $b, chuỗi đầu vào với các ống riêng và cuối cùng là các bản sao của $bmột lần nữa.

Yêu cầu v3 + cho -shrtoán tử dịch chuyển bit .

Ví dụ

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


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


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.