Wyhoduj treemote!

12

To jest mój przyjaciel Thomas. Jest w połowie drzewem, w połowie emotikonem.

|    |
| :D |
|    |

On jest samotny. Zróbmy mu przyjaciół!


Biorąc pod uwagę emotikon tekstowej jako wejście (na przykład ಠ_ಠ, :P, >_>, a nie 😀, 🤓lub 🐦) na wyjściu odpowiadający treemote.

Długość treemote to liczba znaków, jaką ma on (zasadniczo większość wbudowanych funkcji długości dla łańcuchów). Więc ಠ_ಠma długość 3.

Składnia treemote długości njest następująca:

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

Tak więc każdy treemote o długości 3 wyglądałby tak:

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

Ma ceil(n/2)oddzielne segmenty tułowia po obu stronach, każdy ze 2 + nspacjami w środku.

Wyzwanie: Biorąc pod uwagę emotikon tekstowy, wypisz odpowiedni treemot.


Inne zasady:

  • To jest , co oznacza, że ​​chcę, żebyś napisał krótki kod.
  • Standardowe luki zabronione.
  • Musisz obsługiwać znaki inne niż ascii, chyba że Twój język ich nie obsługuje.

Przypadki testowe:

^_^

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

\o/

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


(✿◠‿◠)

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


D:

|    |
| D: |
|    |


( ͡° ͜ʖ ͡°)


|             |
|             |
|             |
|             |
|             |
|             |
| ( ͡° ͜ʖ ͡°) |
|             |
|             |
|             |
|             |
|             |
|             |
Rɪᴋᴇʀ
źródło
Czy dozwolone są końcowe znaki nowej linii?
R. Kap
Zakładamy, że emotikony 1-char nie istnieją?
Adám
Przez „emotikon tekstowy” masz na myśli emotikon ascii?
Downgoat
@Downgoat no. Zobacz ಠ_ಠprzypadek testowy.
Rɪᴋᴇʀ
6
Może dodaj skrzynkę testową o długości innej niż 3 ...
SuperJedi224

Odpowiedzi:

4

05AB1E , 27 25 bajtów

Kod:

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

Wyjaśnienie:

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.

Wykorzystuje kodowanie CP-1252 . Wypróbuj online! .

Adnan
źródło
Wprowadzanie ( ͡° ͜ʖ ͡°)zwraca śmieszne wyniki.
Shaun Wild,
@ShaunWild Tak, to dziwny przypadek testowy, ponieważ ( ͡° ͜ʖ ͡°)sam ma 11 znaków, ale wygląda na 8 znaków.
Adnan
4

Python 3.5, 76 75 73 bajtów:

( Dzięki Blue za wskazówkę, która zaoszczędziła 2 bajty! )

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

Wypróbuj online! (Ideone)

Tutaj jest także niekonkurencyjna wersja Python 2.7.5, ponieważ ma ona znacznie dłuższą pojemność 87 bajtów .

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

Wynika to z faktu, że domyślnym kodowaniem w Pythonie 2 są asciiznaki, takie jak poza zakresem 128 punktów Unicode, liczone jako więcej niż 1 bajt ( list('ಠ')wydajność ['\xe0', '\xb2', '\xa0']). Jedynym obejściem, jakie mogłem wymyślić, było najpierw zdekodowanie danych wejściowych za pomocą utf-8, a następnie przejście z tym utf-8zdekodowanym łańcuchem.

Wypróbuj tę wersję Python 2 online! (Ideone)

R. Kap
źródło
Możesz pozbyć się parenów wokół (- (- q // 2)) na 2 bajty. Myślę, że możesz zaoszczędzić 2 bajty, przechodząc na Python 2.7. Nie potrzebuje drugiego / w //, a jedynie spację w instrukcji print.
Niebieski,
@Blue Tak, masz rację, mogę usunąć drugą parę nawiasów. Jednak ja nie potrzebuję drugiego /w //zrobić odgórnie podział.
R. Kap
tak jak mówiłem, w Pythonie 2.7 dzielenie liczb całkowitych odbywa się za pomocą 1 /
Blue
@Blue Och, założyłem, że mówisz, że nie potrzebuję tego w Pythonie 3. Cóż, w takim razie przełączę się na Python 2. Dzięki za wskazówki! :)
R. Kap
@Blue Jeśli tak jest, to w jaki sposób przeprowadzasz dzielenie zmiennoprzecinkowe w Pythonie 2?
R. Kap
3

Dyalog APL , 37 34 33 bajtów

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

Użytkownicy Chrome: patrz przypis *

Przypadki testowe

      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 źle wyświetla dwa znaki ≢⍵(U + 2262, U + 2375) jako ≢⍵(U + 2261, U + 0338, U + 2375) zamiast jako ̸≡⍵(U + 0338, U + 2262, U + 2375), więc tutaj wersja wyświetlana dla Chrome:{↑'|'{⍺⍵⍺}¨b,(⊂⍵),b←' '/⍨⌈0.5×̸̸≡⍵}

Adám
źródło
1
+1 za posiadanie emotikonów w samym kodzie {⍺⍵⍺} ¨b
Wartość tuszu
3
Ach, {⍺⍵⍺}¨bjest „programistą APL na swojej piątej filiżance kawy z kciukiem do góry”.
Lynn
2

V, 60 57 bajtów

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

Niestety, V ma prawie nic pod względem operacji matematycznych. Funkcje dzielenia i pułapu drastycznie zawyżają liczbę bajtów.

Ponieważ zawiera on wiele nieprzyjemnych druków, oto odwracalny zrzut heksowy:

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

Wyjaśnienie:

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
źródło
Ile by to było bajtów, gdyby istniały operatory matematyczne?
Adnan
@Adnan Trudno powiedzieć, ponieważ nie wiem dokładnie, jak będą wyglądać. Optymistycznie powiedziałbym, że około 30 bajtów?
James
2

Vitsy, 43 bajty

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

Wyjaśnienie:

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.

Wypróbuj online!

Zauważ, że z powodu błędu w TIO, wprowadzanie znaków Unicode nie będzie działać. Zamiast tego będziesz musiał użyć wersji lokalnej. Dzięki, @Dennis!

Addison Crump
źródło
1

Pyke, 31 bajtów

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

Wypróbuj tutaj!

Dzięki @ R.Kap za uratowanie bajtu dzięki sztuczce podziału podłogi

niebieski
źródło
1

Rubinowy, 57 bajtów

Wykorzystuje sztuczki dzielenia liczb całkowitych i wykorzystuje dziwactwa w putsfunkcji Ruby .

->e{s=e.size+1;puts k=[?|+' '*-~s+?|]*(s/2),"| #{e} |",k}
Wartość tuszu
źródło
1

JavaScript ES6, 83 78 bajtów

e=>(a=`| ${" ".repeat(n=e.length)} |
`.repeat(Math.ceil(n/2)))+`| ${e} |
${a}`
Conor O'Brien
źródło
Nie potrzebujesz f=, co oszczędza 2 bajty. Zaoszczędź kolejne 2 bajty, poruszając się ewewnątrz szablonu i na azewnątrz. Zapisz kolejne 2 bajty, wstawiając spacje zamiast dodając 2 do powtórzenia. Zaoszczędź kolejną wiązkę bajtów, używając funkcji przesuwania bitów, aby podzielić przez 2.
Neil
Nie sądzę, że to działa, po prostu próbuje wydrukować kod źródłowy powtórzenia
Bálint
Spróbuj ponownie, naprawiłem to @ Bálint
Conor O'Brien
1

> <> , 103 bajty

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

Wypróbuj online!

To rozwiązanie opiera się na obserwacji, z | <x> |której składa się każda linia , gdzie <x>jest wzór w środkowej linii i ta sama liczba spacji w innych liniach.

Po odczytaniu wartości wejściowej (długości n) ze STDIN, program wypycha n*(n+(n%2))spacje. Stos jest następnie rzucany o połowę tyle razy. Następnie wszystkie npostacie oprócz tych są przyciągane do nowego stosu, pozostawiając stosy składające się ze nspacji lub samego wzoru (tylko na środkowym stosie). W kroku wyjściowym zawartość bieżącego stosu jest drukowana, otoczona przez |i |.

Sok
źródło
1

C, 89 bajtów

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

Nie jestem jednak pewien, czy poradzi sobie z emotikonami nie-ascii ....

aragaer
źródło
Czy możesz to przetestować za pomocą emotikonów innych niż ascii?
Rɪᴋᴇʀ
Próbowałem, a wynik nie był dobry - strlenzlicza bajty do pierwszego bajtu zero, w wyniku czego emotikony nie-ascii są uważane za znacznie szersze niż są.
aragaer
1

PowerShell v3 +, 72 bajty

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

Pobiera ciąg wejściowy $a. Konstruuje $bjako (pusty ciąg zakończony rurą (ze $a.lengthspacjami na środku) i znak nowej linii) powtarzany (długość + 1 przesunięty w prawo o jeden bit, tj. Podzielony przez dwa i sufit) razy. Następnie wyprowadza kopie $bciągu wejściowego z własnymi potokami i wreszcie kopie $bponownie.

Wymaga v3 + dla -shroperatora zmiany bitów .

Przykłady

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


PS C:\Tools\Scripts\golfing> .\grow-a-treemote.ps1 '>:`-('
|       |
|       |
|       |
| >:`-( |
|       |
|       |
|       |
AdmBorkBork
źródło
1

Pyth, 30 bajtów

Dziwię się, że tak łatwe zadanie nie zostało zaimplementowane w Pyth.

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

Wypróbuj online!

Leaky Nun
źródło
1

TSQL, 96 88 bajtów

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

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

Wypróbuj online!

t-clausen.dk
źródło