Wachsen Sie eine Treemote!


12

Das ist mein Freund Thomas. Er ist halb Baum, halb Emoticon.

|    |
| :D |
|    |

Er ist einsam. Machen wir ihm ein paar Freunde!


Bei einer textbasierten emoticon als Eingabe ( zum Beispiel ಠ_ಠ, :P, >_>, nicht 😀, 🤓oder 🐦), die entsprechenden Ausgang treemote.

Die Länge einer Treemote gibt an, wie viele Zeichen sie enthält (im Grunde genommen sind die meisten Längenfunktionen für Zeichenfolgen integriert). Also ಠ_ಠhat Länge 3.

Die Syntax für einen Baum mit der Länge nlautet wie folgt:

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

Jeder Baum mit der Länge 3 würde also so aussehen:

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

Er hat ceil(n/2)auf beiden Seiten durch Zeilenumbrüche getrennte Kofferraumsegmente, die jeweils 2 + nLeerzeichen enthalten.

Herausforderung: Geben Sie mit dem textbasierten Emoticon die entsprechende Treemote aus.


Andere Regeln:

  • Dies ist , was bedeutet, dass Sie kurzen Code schreiben sollen.
  • Standardlücken sind nicht erlaubt.
  • Sie müssen Nicht-ASCII-Zeichen unterstützen, es sei denn, Ihre Sprache kann sie nicht verarbeiten.

Testfälle:

^_^

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

\o/

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


(✿◠‿◠)

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


D:

|    |
| D: |
|    |


( ͡° ͜ʖ ͡°)


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

Sind nachgestellte Zeilenumbrüche erlaubt?
R. Kap

Gehen wir davon aus, dass keine 1-Zeichen-Emoticons vorhanden sind?
Adám,

Mit "textbasiertem Emoticon" meinen Sie ASCII-Emoticon?
Downgoat

@ Downgoat Nr. Siehe den ಠ_ಠTestfall.
17.

6
Vielleicht fügen Sie einen Testfall mit einer anderen Länge als 3 ...
SuperJedi224

Antworten:


4

05AB1E , 27 25 Bytes

Code:

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

Erläuterung:

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.

Verwendet die CP-1252- Codierung. Probieren Sie es online! .


Die Eingabe ( ͡° ͜ʖ ͡°)liefert lustige Ergebnisse.
Shaun Wild

@ShaunWild Ja, es ist ein seltsamer Testfall, da er ( ͡° ͜ʖ ͡°)selbst 11 Zeichen lang ist, aber 8 Zeichen lang aussieht .
Adnan

4

Python 3.5, 76 75 73 Bytes:

( Danke an Blue für einen Tipp, der 2 Bytes gespart hat! )

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

Probieren Sie es online! (Ideone)

Hier ist auch eine nicht konkurrierende Python 2.7.5- Version, da sie mit 87 Bytes viel länger ist .

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

Dies liegt daran, dass die Standardcodierung von Python 2 aus asciiZeichen besteht, die beispielsweise außerhalb des 128-Unicode- Punktbereichs liegen , und daher mehr als 1 Byte list('ಠ')ergeben ['\xe0', '\xb2', '\xa0']. Die einzige Umgehung, die ich mir vorstellen konnte, war, die Eingabe zuerst mit zu dekodieren utf-8und dann mit dieser utf-8dekodierten Zeichenfolge fortzufahren.

Probieren Sie diese Python 2-Version online aus! (Ideone)


Sie können die Parens um (- (- q // 2)) für 2 Bytes loswerden. Ich denke, Sie können 2 weitere Bytes sparen, indem Sie zu Python 2.7 wechseln. Das zweite / in // und nur ein Leerzeichen in der print-Anweisung werden nicht benötigt.
Blau

@Blau Ja, du hast recht, ich kann das zweite Klammerpaar entfernen. Allerdings habe ich brauche die zweite /in //der tun ceil Division.
R. Kap

Wie ich schon sagte, wird in Python 2.7 die Ganzzahldivision mit 1 /
Blue

@Blue Oh, ich nahm an, Sie sagten, dass ich das in Python 3 nicht brauche. Nun, in diesem Fall werde ich zu Python 2 wechseln. Danke für die Tipps! :)
R. Kap

@Blue Wenn das der Fall ist, wie macht man dann eine Float-Division in Python 2?
R. Kap

3

Dyalog APL , 37 34 33 Bytes

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

Chrome-Nutzer: Siehe Fußnote *

Testfälle

      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 zeigt die beiden Zeichen ≢⍵(U + 2262, U + 2375) ≢⍵falsch als (U + 2261, U + 0338, U + 2375) anstatt als ̸≡⍵(U + 0338, U + 2262, U + 2375) an Anzeigeversion für Chrome:{↑'|'{⍺⍵⍺}¨b,(⊂⍵),b←' '/⍨⌈0.5×̸̸≡⍵}


1
+1 für Emoticons in Ihrem Code selbst {⍺⍵⍺} ¨b
Value Ink

3
Ah, {⍺⍵⍺}¨bist der "APL-Programmierer bei seiner fünften Tasse Kaffee, der einen Daumen hoch gibt" Emoticon.
Lynn

2

V 60 57 Bytes

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

Leider hat V in Bezug auf mathematische Operationen so gut wie nichts. Die Divide- und Ceil-Funktionen haben die Byteanzahl drastisch erhöht .

Da dies eine Menge böser Unprintables enthält, ist hier ein umkehrbarer 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

Erläuterung:

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.

Wie viele Bytes wären es gewesen, wenn es mathematische Operatoren gegeben hätte?
Adnan

@Adnan Es ist schwer zu sagen, da ich nicht genau weiß, wie sie aussehen werden. Optimistisch würde ich sagen, rund 30 Bytes?
James

2

Vitsy, 43 Bytes

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

Erläuterung:

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.

Probieren Sie es online!

Beachten Sie, dass die Eingabe mit Unicode-Zeichen aufgrund eines Fehlers in TIO nicht funktioniert. Sie müssen stattdessen die lokale Version für diese verwenden. Danke, @Dennis!



1

Ruby, 57 Bytes

Verwendet Tricks der Ganzzahldivision und nutzt die Macken in Rubys putsFunktion.

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

1

JavaScript ES6, 83 78 Bytes

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

Das brauchst du nicht f=, das spart dir 2 Bytes. Speichern Sie weitere 2 Byte, indem Sie einnerhalb und aaußerhalb der Vorlage verschieben . Speichern Sie weitere 2 Byte, indem Sie Leerzeichen einfügen, anstatt der Wiederholung 2 hinzuzufügen. Speichern Sie eine weitere Menge von Bytes, indem Sie die Bitverschiebung zum Teilen durch 2 verwenden.
Neil,

Ich denke nicht, dass dies funktioniert, es wird nur versucht, den Quellcode der Wiederholung
Bálint,

Versuchen Sie es erneut, ich habe es @ Bálint
Conor O'Brien

1

> <> 103 Bytes

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

Probieren Sie es online!

Diese Lösung wird auf der Beobachtung basiert , das jede Zeile besteht | <x> |, wobei <x>das Muster in der Mittellinie ist, und die gleiche Anzahl von Leerstellen in den anderen Leitungen.

Nach dem Lesen der Eingabe (Länge n) von STDIN werden n*(n+(n%2))Leerzeichen eingefügt . Der Stapel wird dann halb so oft gerollt. Als nächstes werden alle außer den nZeichen auf einen neuen Stapel gezogen, wobei ein Stapel von Stapeln verbleibt, der entweder aus nLeerzeichen oder dem Muster selbst besteht (nur im mittleren Stapel). Im Ausgabeschritt wird der Inhalt des aktuellen Stapels gedruckt, umgeben von |und |.


1

C 89 Bytes

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

Ich bin mir nicht sicher, ob es mit nicht-ASCII-Emoticons umgehen kann.


Können Sie es mit den Nicht-ASCII-Emoticons testen?
19.

Versucht und das Ergebnis war nicht gut - strlenzählt die Bytes bis zum ersten Null-Byte und als Ergebnis werden Nicht-ASCII-Emoticons als viel breiter angesehen als sie sind.
Aragaer

1

PowerShell v3 +, 72 Byte

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

Übernimmt die Eingabezeichenfolge $a . Konstruiert $bals (die leere Pipe-Ended-Zeichenfolge (mit $a.lengthLeerzeichen in der Mitte) und eine nachfolgende Newline), die sich (Länge + 1 um ein Bit nach rechts verschoben, dh durch zwei und ceiling'd geteilt) mal wiederholt. Anschließend werden die Kopien von $b, die Eingabezeichenfolge mit eigenen Pipes und schließlich die Kopien von $berneut ausgegeben.

Benötigt v3 + für die Bitverschiebung -shr - Operator .

Beispiele

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


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


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.