Treemote büyütün!


12

Bu arkadaşım Thomas. O yarım ağaç, yarım ifade.

|    |
| :D |
|    |

O yalnız. Hadi onu arkadaş edelim!


Giriş olarak bir metin tabanlı ifadeyi göz önüne alındığında (örneğin ಠ_ಠ, :P, >_>, olup 😀, 🤓ya da 🐦), çıkış, ilgili treemote.

Bir treemote'un uzunluğu kaç karakter uzunluğunda olduğudur (temelde dizeler için en yerleşik uzunluk işlevleri). Yani ಠ_ಠuzunluğu 3.

Bir treemote uzunluk sözdizimi naşağıdaki gibidir:

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

Yani uzunluk 3'teki herhangi bir treemote şöyle görünecektir:

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

Her ceil(n/2)iki tarafında yeni satırlar ayrılmış gövde bölümleri vardır ve her birinde 2 + nboşluk vardır.

Zorluk: Metin tabanlı ifade verildiğinde, karşılık gelen treemote'u çıktılayın.


Diğer kurallar:

  • Bu , yani kısa kod yazmanızı istiyorum.
  • Standart boşluklara izin verilmedi.
  • Diliniz bunları işleyemediği sürece ascii olmayan karakterleri desteklemelisiniz.

Test Durumları:

^_^

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

\o/

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


(✿◠‿◠)

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


D:

|    |
| D: |
|    |


( ͡° ͜ʖ ͡°)


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

Sondaki satırsonlarına izin veriliyor mu?
R. Kap

1 karakterlik ifadelerin var olmadığını varsayıyoruz?
Adám

"Metin tabanlı ifade" ile ASCII ifade mi demek istediniz?
Downgoat

@Downgoat no. ಠ_ಠTest senaryosuna bakın .
Rɪᴋᴇʀ

6
Belki 3'ten farklı bir uzunluğa sahip bir test çantası ekleyin ...
SuperJedi224

Yanıtlar:


4

05AB1E , 27 25 bayt

Kod:

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

Açıklama:

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 kodlamasını kullanır . Çevrimiçi deneyin! .


Girmek ( ͡° ͜ʖ ͡°)komik sonuçlar verir.
Shaun Wild

@ShaunWild Evet, çünkü, garip bir test durumu var ( ͡° ͜ʖ ͡°)kendisi 11 karakter uzunluğunda, ama görünüyor 8 karakter uzunluğunda.
Adnan

4

Python 3,5, 76 75 73 bayt:

( 2 bayt tasarruf sağlayan bir ipucu için Mavi sayesinde ! )

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

Çevrimiçi Deneyin! (Ideone)

Ayrıca, 87 baytta daha uzun olduğu için rakipsiz bir Python 2.7.5 sürümü .

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

Bunun nedeni, Python 2'nin varsayılan kodlamasının asciive bu nedenle, 128 unicode nokta aralığının dışındaki karakterler 1 bayttan ( list('ಠ')verim ['\xe0', '\xb2', '\xa0']) fazla sayılmasıdır . Bunun için düşünebildiğim tek geçici çözüm, önce girdiyi kullanarak kodu çözmek utf-8ve sonra bu utf-8kodu çözülmüş dizeyle devam etmekti .

Bu Python 2 Sürümünü Çevrimiçi Deneyin! (Ideone)


Etrafındaki parenlerden (- (- q // 2)) 2 bayt için kurtulabilirsiniz. Python 2.7'ye geçerek 2 bayt daha tasarruf edebileceğinizi düşünüyorum. İkincisi / in // ve sadece print deyiminde bir boşluk gerekmez.
Mavi

@Mavi Evet, haklısın, ikinci parantez çiftini kaldırabilirim. Ancak, ben do saniyeye ihtiyacım /içinde //yapılacak ceil bölümü.
R. Kap

Dediğim gibi, Python 2.7'de tamsayı bölme 1 /
Blue

@Mavi Oh, Python 3'te buna ihtiyacım olmadığını söylüyordum. Peki, bu durumda Python 2'ye geçeceğim. İpuçları için teşekkürler! :)
R. Kap

@Mavi Bu durumda, Python 2'de şamandıra bölümü nasıl yapılır?
R. Kap

3

Dyalog APL , 37 34 33 bayt

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

Chrome kullanıcıları: Bkz. Dipnot *

Test senaryoları

      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, iki karakteri ≢⍵(U + 2262, U + 2375) (U + 0338, U + 2262, U + 2375) yerine ≢⍵(U + 2261, U + 0338, U + 2375) olarak ̸≡⍵yanlış görüntüler; Chrome için ekran sürümü:{↑'|'{⍺⍵⍺}¨b,(⊂⍵),b←' '/⍨⌈0.5×̸̸≡⍵}


1
Kodunuzun içinde ifadelere sahip olmak için +1 {⍺⍵⍺} ¨b
Değer Mürekkebi

3
Ah, {⍺⍵⍺}¨b“Beşinci fincan kahvesinde başparmak vazgeçen APL programcısı” ifadesi.
Lynn

2

V, 60 57 bayt

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

Ne yazık ki, V'nin matematiksel işlemler açısından hiçbir şeyin yanında değil. Böl ve tavan fonksiyonları bayt sayısını büyük ölçüde şişirdi.

Bu bir sürü kötü yazdırılamadığı için, burada tersinir bir hexdump var:

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

Açıklama:

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.

Matematiksel operatörler olsaydı kaç bayt olurdu?
Adnan

@Adnan Söylemesi zor, çünkü tam olarak neye benzeyeceklerini bilmiyorum. İyimser olarak 30 bayt söyleyebilir miyim?
James

2

Vitsy, 43 bayt

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

Açıklama:

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.

Çevrimiçi deneyin!

TIO'daki bir hata nedeniyle, unicode karakterlere sahip girişlerin çalışmadığını unutmayın. Bunun için yerel sürümü kullanmanız gerekir. Teşekkürler, @Dennis!



1

Ruby, 57 bayt

Tamsayı bölüm numaralarını kullanır ve Ruby'nin putsişlevindeki tuhaflıklardan yararlanır .

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

1

JavaScript ES6, 83 78 bayt

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

İhtiyacınız yok f=, bu size 2 bayt kazandırır. eŞablonun içinde ve adışında hareket ederek başka bir 2 bayt kaydedin . Tekrara 2 eklemek yerine boşluk ekleyerek 2 bayt daha kaydedin. 2'ye bölmek için bit kaydırma kullanarak başka bir bayt demet kaydedin.
Neil

Bunun işe yaradığını düşünmüyorum, sadece tekrarın kaynak kodunu yazdırmaya çalışıyor
Bálint

Tekrar deneyin, @ Bálint
Conor O'Brien

1

> <> , 103 bayt

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

Çevrimiçi deneyin!

Bu çözüm, her satırın içerdiği gözlemlere dayanmaktadır. | <x> |<x> , orta satırdaki paternin nerede olduğu ve diğer satırlardaki aynı sayıda .

nSTDIN'den giriş (uzunluk ) okuduktan sonra program n*(n+(n%2))boşlukları iter . Daha sonra istif yarıya kadar katlanır. Daha sonra, nkarakterler dışındaki tüm karakterler yeni bir yığına çekilir ve nboşluklardan veya desenin kendisinden oluşan bir yığın yığını kalır (yalnızca orta yığında). Çıkış aşamasında, halihazırda istifin içeriği ile çevrili basılır |ve |.


1

C, 89 bayt

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

Ascii olmayan ifade işleyecek olsa emin değilim ....


Ascii olmayan ifadelerle test edebilir misiniz?
Rɪᴋᴇʀ

Denendi ve sonuç iyi değildi - strlenilk sıfır bayta kadar sonuç olarak baytları sayar ve sonuç olarak ascii olmayan ifadeler olduklarından daha geniş kabul edilir.
aragaer

1

PowerShell v3 +, 72 bayt

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

Giriş dizesini alır $a. Yapılar $b(boş boru uçlu dizisinin (şekilde $a.lengthtekrar ortada bulunan aralıklar) ve bir arka yeni satır) kat (uzunluk + 1 iki ve ceiling'd bölünmesiyle, yani, sağa bir bit, kayar). Daha sonra $b, giriş dizesinin kopyalarını kendi borularıyla ve son olarak da kopyalarını çıktılar $b.

Bit kaydırma -shroperatörü için v3 + gerekir .

Örnekler

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


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


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.