เติบโต Treemote!


12

นี่คือโทมัสเพื่อนของฉัน เขาเป็นครึ่งต้นไม้อิโมติคอนครึ่ง

|    |
| :D |
|    |

เขาเหงา มาทำให้เขามีเพื่อนบ้าง!


ได้รับอีโมติคอนข้อความที่เป็น input (เช่นಠ_ಠ, :P, >_>ไม่😀, 🤓หรือ🐦) เอาท์พุท treemote ที่สอดคล้องกัน

ความยาวของ treemote คือจำนวนอักขระที่ lon (โดยทั่วไปแล้วฟังก์ชัน builtin length สำหรับสตริง) ดังนั้นಠ_ಠมีความยาว 3

ไวยากรณ์สำหรับ treemote ของความยาวnเป็นดังนี้:

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

ดังนั้น treemote ของความยาว 3 จะมีลักษณะ:

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

เขาขึ้นceil(n/2)บรรทัดใหม่แยกส่วนลำตัวทั้งสองข้างแต่ละอันมี2 + nช่องว่างด้านใน

ถาม: ให้อิโมติคอนที่ใช้ข้อความเป็นตัวกำหนดเอาท์พุต treemote


กฎอื่น ๆ :

  • นี่คือซึ่งหมายความว่าฉันต้องการให้คุณเขียนรหัสสั้น ๆ
  • ช่องโหว่มาตรฐานไม่อนุญาต
  • คุณต้องสนับสนุนอักขระที่ไม่ใช่ ASCII ยกเว้นว่าภาษาของคุณไม่สามารถจัดการได้

กรณีทดสอบ:

^_^

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

\o/

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


(✿◠‿◠)

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


D:

|    |
| D: |
|    |


( ͡° ͜ʖ ͡°)


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

บรรทัดใหม่ต่อท้ายได้รับอนุญาตหรือไม่
R. Kap

เราสมมติว่าอีโมติคอนแบบ 1 อักขระไม่มีอยู่จริงหรือไม่?
Adám

โดย "ไอคอนแสดงอารมณ์ข้อความ" คุณหมายถึง ascii emoticon หรือไม่
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 ตัวอักษร
Adnan

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)

นอกจากนี้ที่นี่เป็นnoncompeting 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 เวอร์ชั่นออนไลน์นี้! (Ideone)


คุณสามารถกำจัด parens รอบ ๆ (- (- - - // //)) 2 ไบต์ ฉันคิดว่าคุณสามารถบันทึกได้อีก 2 ไบต์โดยเปลี่ยนเป็น Python 2.7 ไม่ต้องการวินาที / in // และมีเพียงช่องว่างในคำสั่งพิมพ์
บลู

@Blue ใช่คุณพูดถูกฉันสามารถลบวงเล็บคู่ที่สองออกไปได้ แต่ผมไม่ต้องการที่สอง/ใน//การทำceilส่วน
R. Kap

เหมือนที่ฉันพูดใน Python 2.7 จำนวนเต็มหารด้วย 1 /
Blue

@Blue โอ้ฉันคิดว่าคุณพูดว่าฉันไม่ต้องการ Python 3 ในกรณีนี้ฉันจะเปลี่ยนไปใช้ Python 2 ขอบคุณสำหรับเคล็ดลับ! :)
R. Kap

@Blue หากเป็นเช่นนั้นคุณจะแบ่งส่วนทศนิยมใน Python 2 ได้อย่างไร
R. Kap

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
หมึกมูลค่า

3
อ่า{⍺⍵⍺}¨bเป็น "โปรแกรมเมอร์ APL ในถ้วยกาแฟที่ห้าของเขาให้ยกนิ้วให้" อิโมติคอน
ลินน์

2

V, 60 57 ไบต์

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

น่าเสียดายที่ V ไม่มีอะไรในแง่ของการดำเนินการทางคณิตศาสตร์ แบ่งและ ceil ฟังก์ชั่นอย่างเห็นได้ชัดที่สูงขึ้นนับไบต์

เนื่องจากสิ่งนี้มีสิ่งที่ไม่น่าพึงพอใจมากมายนี่คือ 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

@Adnan มันยากที่จะพูดเพราะฉันไม่รู้เหมือนกันว่ามันจะเป็นอย่างไร ในแง่ดีฉันจะพูดประมาณ 30 ไบต์?
James

2

Vitsy, 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

Ruby, 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
Neil

ฉันไม่คิดว่ามันใช้งานได้เพียงพยายามพิมพ์ซอร์สโค้ดของการทำซ้ำ
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 หรือไม่แม้ว่า ....


คุณสามารถทดสอบด้วยอิโมติคอนที่ไม่ใช่ ascii ได้หรือไม่?
Rɪᴋᴇʀ

พยายามและผลลัพธ์ไม่ดีstrlenนับจำนวนไบต์จนกระทั่งไบต์แรกเป็นศูนย์และเนื่องจากอิโมติคอนที่ไม่ใช่ ASCII จะถือว่ากว้างกว่าพวกมันมาก
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 '>:`-('
|       |
|       |
|       |
| >:`-( |
|       |
|       |
|       |


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.