Treemote를 키우십시오!


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: |
|    |


( ͡° ͜ʖ ͡°)


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

후행 줄 바꿈이 허용됩니까?
R. Kap

1 문자 이모티콘이 존재하지 않는다고 가정합니다.
Adám

"텍스트 기반 이모티콘"이란 아스키 이모티콘을 의미합니까?
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 바이트 :

( 2 바이트를 절약 한 팁에 대해 Blue 에게 감사드립니다 ! )

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('ಠ')yield ['\xe0', '\xb2', '\xa0'])으로 계산되기 때문 입니다. 내가 생각할 수있는 유일한 해결 방법은 먼저을 사용하여 입력을 디코딩 utf-8한 다음이 utf-8디코딩 된 문자열 로 이동하는 것입니다 .

이 Python 2 버전 온라인을 사용해보십시오! (아이디어)


2 바이트 동안 (-(-q // 2)) 주위의 파렌을 제거 할 수 있습니다. 파이썬 2.7로 전환하여 2 바이트를 더 절약 할 수 있다고 생각합니다. 두 번째 / in //는 필요하지 않으며 print 문에는 공백 만 필요합니다.
Blue

@Blue 네, 맞습니다. 두 번째 괄호 쌍을 제거 할 수 있습니다. 그러나, 나는 두 번째 필요 ///할 일 올림 부문.
R. Kap

내가 말했듯이, 파이썬 2.7에서 정수 나누기는 1 /
Blue로

@Blue 오, 파이썬 3에서는 필요하지 않다고 가정했습니다. 그렇다면이 경우 파이썬 2로 전환하겠습니다. 팁 감사합니다! :)
R. Kap

@Blue 만약 그렇다면, 파이썬 2에서 어떻게 float 나누기를합니까?
R. Kap

3

Dyalog APL , 37 34 33 바이트

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

크롬 사용자 : 각주 참조 *

테스트 사례

      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 + 0338, U + 2262, U + 2375 ≢⍵) 대신 두 문자 (U + 2262, U + 2375)를 (U + 2261, U + 0338, U + 2375)로 ̸≡⍵잘못 표시하므로 여기에 Chrome 용 디스플레이 버전 :{↑'|'{⍺⍵⍺}¨b,(⊂⍵),b←' '/⍨⌈0.5×̸̸≡⍵}


1
코드 내에서 이모티콘을 가지고 +1 {⍺⍵⍺} ¨b
Value Ink

3
아, {⍺⍵⍺}¨b“그녀의 다섯 번째 커피 잔에 엄지 손가락을 올리는 APL 프로그래머”이모티콘입니다.
Lynn

2

V, 60 57 바이트

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

불행하게도, V는 수학 연산의 측면에서 아무것도 없습니다. 나누기 및 ceil 함수 는 바이트 수를 크게 증가 시켰습니다 .

여기에는 인쇄 할 수없는 불쾌한 것들이 포함되어 있으므로 뒤집을 수있는 16 진 덤프가 있습니다.

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의 버그로 인해 유니 코드 문자를 사용한 입력이 작동하지 않습니다. 대신 로컬 버전을 사용해야합니다. 감사합니다, @Dennis!



1

루비, 57 바이트

정수 나누기 트릭을 사용하고 Ruby puts기능 의 단점을 활용 합니다.

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

1

자바 스크립트 ES6, 83 78 바이트

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

당신은 f=2 바이트를 절약 할 필요가 없습니다 . e템플릿 내부와 a외부를 이동하여 다른 2 바이트를 저장하십시오 . 반복에 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>중간 라인의 패턴은 어디에 있고 다른 라인의 동일한 수의 공간으로 구성되어 있다는 관찰을 기반으로합니다 .

nSTDIN에서 입력 (길이 )을 읽은 후 프로그램은 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첫 번째 0 바이트까지 바이트 수를 계산하고 그 결과 ASCII가 아닌 이모티콘은 원래 보다 훨씬 넓게 간주됩니다.
aragaer

1

PowerShell v3 +, 72 바이트

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

입력 문자열을 $a받습니다. 구조물 $b(와 빈 파이프 종단 문자열 (AS $a.length반복 중간 구역)과 후행 개행)은 배 (길이 + 1 둘 ceiling'd 나눈, 즉 오른쪽으로 한 비트 시프트). 그런 다음 $b자체 파이프와 함께 입력 문자열 의 사본을 출력 하고 마지막으로 $b다시 사본을 출력 합니다.

비트 시프트 -shr연산자 에는 v3 +가 필요합니다 .

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.