Bir Yığın Değişim Favicon Oluştur


25

PPCG logosunu tanıyor musunuz? Bir sanatını yaparken, öyle gözüküyor.

+---+
|PCG|
+---+
   v

Şimdi, bu Code Golf'ta, PPCG logosuna benzeyen diğer siteler için logolar yapan bir kod yapacaksınız.

Ne yapmalısın

"Kısaltılmış" dize, tüm büyük harfler ve sayılarla girdi dizesindeki dize olacaktır. ( PPCGGirdi dizgisi ne olur Programming Puzzles & Code Golf)

Kutu" (

+---+
|   |
+---+
   v

) kısaltılmış dizeye mükemmel şekilde uymalıdır. (Daha büyük veya daha küçük değil)

Ayrıca vparça tam olarak 1 aşağı ve 1 aşağı sağa doğru bırakılmalıdır +.

Sonra kısaltılmış dizginin bulunduğu kutuyu çıkar.

Örnek

Stack Overflow:

+--+
|SO|
+--+
  v

Area 51:

+---+
|A51|
+---+
   v

kurallar

Girişin en az bir rakam veya büyük harf içerdiğini varsayabilirsiniz.

Standart kuralları geçerlidir.



@MartinEnder Evet, Çok yakından ilişkili, ancak kopya değil.

1
@MatthewRoh Bağlantıların amacı, kenar çubuğundaki zorlukların ortaya çıkması için, oy bir oy değil. Bununla birlikte, şahsen istenmeyen karakterleri kaldırmayı ve baskıyı ^eklemeyi ikinci bağlantımla kıyaslandığında çok fazla bir şey eklemez diye düşünüyorum, ancak bunun üzerine bir dupe çekiç kullanmayacağım, değil.
Martin Ender

4
Eğer öyle olsaydı 99 Bottles Of Beer, olurdu 99BOB.

1
@MatthewRoh hala arabası, sonuçta bf cevabını alıp alamayacağımı göreyim
Rohan Jhunjhunwala

Yanıtlar:


23

Vim, 42 vuruş

:s/[^A-Z0-9]//g
YPVr-i+<DOWN><LEFT>|<ESC><C-V>ky$pYjppVr $xrv

Değiştir <DOWN>ile , <LEFT>birlikte , <ESC>ile escve <C-V>ile CTRL+ V.

İşte çalışan bu betiğin bir animasyonu ( Vyerine a kullanan eski sürüm v):

Animasyon

Senaryonun açıklaması:

:s/[^A-Z0-9]//g                               # Remove all the characters that are not uppercase or numbers using a Regex.
YPVr-                                         # Duplicate the current, and replace all the characters of the upper one with dashes.
     i+<DOWN><LEFT>|<ESC>                     # Insert a + on the upper line, and a | on the second line.
                         <C-V>ky$p            # Copy the + and | to the end of both lines.
                                  Yjpp        # Copy the upper line to the bottom two times.
                                      Vr $    # Replace the bottom most line with spaces and put the cursor on the last character.
                                          xrv # Remove the last character and replace the second last character with a v.

küçük harf V, büyük harf V

Bir karakter fazla, ama önler özel karakterleri kaçan:. R | y uP $ pYPVr-r + $ YjppVr $ HRV
Bryce Wagner

Bir bayt kaydetmek için i+↓←|␛␖ky$pile değiştirebilirsiniz A+↓|␛␖ky0P.
Lynn,

Alternatif olarak, Bryce'ın yaklaşımındaki ilk sekiz darbeyi değiştirinI|<END>|␛
Lynn

Acaba bu harika resim yüzünden en çok oy alan olup olmadığını merak ediyorum.
Joe,

10

V 34 bayt

Ó[^A-Z0-9]
ys$|ÄVr-r+$.YLppVr x$rv

Bunun eski bir sürümde çalıştığını ancak çevrimiçi sürümde geçerli sürümde çalışmadığını unutmayın. Değiştirdiğim Äiçin YPfonksiyonel olarak eşdeğerdir.

Çevrimiçi deneyin!

Açıklama:

Ó[^A-Z0-9]

Rakam ve büyük harf karakterleri hariç her şeyi kaldırın.

ys$|              "Surround this line with '|' characters.
    Ä             "Duplicate this line
     Vr-          "Replace this whole duplicated line with '-' characters
        r+        "replace the first character with '+'
          $       "Move to the end of the line, and
           .      "Repeat our last command. This is the same as 'r+'
            Y     "Yank the current line
              pp  "and paste it twice
             L    "At the end of our text

Şimdi, tampon bu gibi görünüyor:

+---+
|A51|
+---+
+---+

Ve imlecimiz son satırın ilk sütununda.

Vr                 "Change the whole last line to spaces
   x               "Delete a character
    $rv            "And change the last character to a 'v'

Rekabet etmeyen sürüm: (31 bayt)


Girdilerin çıktıda Programming Puzzles & Code Golfyanlış dizge ürettiğini fark ettim PP&CG. &Kaldırılması gerekir
Luis Mendo

@LuisMendo Aww, kahretsin! Bunu gösterdiğin için teşekkürler, bugün bir gün halledeceğim.
DJMcMayhem

@DrGreenEggsandIronMan Yani düzelttiniz, değil mi? [ne zaman? irade? sen? en sonunda? düzeltmek? o?]
Outgolfer Erik,

TIO'dan çıktı alamıyorum?
Downgoat

@Downgoat V çok yeni bir güncelleme geçirdi ve maalesef araştırdığım bazı şeyleri rahatsız etti, ancak düzeltmenin ne kadar zaman alacağından emin değilim.
DJMcMayhem

7

16 bit x86 makine kodu, 72 bayt

Onaltılı olarak:

565789F731C9FCAC84C074143C5A77F73C4173083C3977EF3C3072EBAA41EBE75F5EE81500B07CAA51F3A4AB59E80A00B020F3AAB076AA91AAC351B02BAAB02DF3AAB82B10AB59C3

Parametreler: SI= giriş dizesi, DI- çıktı tamponu.

Newline ile sınırlanmış çizgilerle NULL-sonlandırılmış bir dizge çıktılar. Giriş dizesini geçici arabellek olarak kullanır.

56           push   si
57           push   di
89 f7        mov    di,si    ;Using source string as a buffer
31 c9        xor    cx,cx    ;Counter
fc           cld
_loop:
ac           lodsb
84 c0        test   al,al    ;Test for NULL
74 14        jz     _draw    ;Break
3c 5a        cmp    al,'z'   ;\
77 f7        ja     _loop    ; |
3c 41        cmp    al,'a'    ; \
73 08        jae    _stor    ;  >[A-Z0-9]?
3c 39        cmp    al,'9'   ; /
77 ef        ja     _loop    ; |
3c 30        cmp    al,'0'   ;/
72 eb        jb     _loop
_stor:
aa           stosb           ;Store char in the source buffer
41           inc    cx
eb e7        jmp    _loop
_draw:
5f           pop    di
5e           pop    si
e8 15 00     call   _line    ;Output the first line
b0 7c        mov    al,'|'   ;This proc upon return leaves '\n' in AH
aa           stosb           ;First char of the second line
51           push   cx
f3 a4        rep    movsb    ;Copy CX logo characters from the source buffer
ab           stosw           ;Outputs "|\n", which is still in AX
59           pop    cx
e8 0a 00     call   _line    ;Output the third line
b0 20        mov    al,0x20  ;Space
f3 aa        rep    stosb    ;Output it CX times
b0 76        mov    al,'v'
aa           stosb           ;Output the final 'v'
91           xchg   cx,ax    ;CX == 0
aa           stosb           ;NULL-terminate the string
c3           retn            ;Return to caller
_line:
51           push   cx
b0 2b        mov    al,'+'
aa           stosb
b0 2d        mov    al,'-'
f3 aa        rep    stosb     ;'-'*CX
b8 2b 10     mov    ax,0x102b ;"+\n"
ab           stosw
59           pop    cx
c3           retn

Uhh .. Bir süredir montaj kodunu yapmadım.

3
Ben de. Sadece golf için bir hafta kadar önce yeniden başladı
meden

3c 41 cmp al,a' olmamalı mıydı 3c 41 cmp al,'a' ?
rav_kr

@rav_kr, elbette, fark ettiğiniz için teşekkürler. Okunabilirlik için onaltılık kodları karakterlerle değiştirirken bir teklifi kaçırdım.
meden

4

Retina , 43 bayt

[^A-Z\d]

.+
+$.&$*-+¶|$&|¶+$.&$*-+¶$.&$* V

Çevrimiçi deneyin!

Martin Ender'in golf dili Retina'yı göstermek için mükemmel bir meydan okuma.

Bu çözüm iki aşamaya ayrılır (aşama adı dediğimiz), her iki aşama da yeni bir aşamadır.

İlk aşama:

[^ AZ \ d]

Bu [^A-Z\d], büyük olmayan ve rakam olmayan karakterler olan eşleşen alt dizelerle eşleşir ve ardından bunları hiçbir şeyle değiştirmez, bu da onları silmek anlamına gelir.

İkinci aşama:

.+
+$.&$*-+¶|$&|¶+$.&$*-+¶$.&$* V

.+Bütün sonucunu maçlar ve ardından ikinci hat ile ikame etmektedir.

İkinci sırada:

  • $& tüm eşleşmeyi ifade eder
  • $.& tüm maçın uzunluğunu belirtir
  • $*önceki tamsayı almak anlamına gelir, sonraki karakteri birçok kez tekrarlayın. Burada maç uzun $.&$*-olsa da tekrar etmek demektir -.
  • yeni bir çizgiyi ifade eder.

Güzel, bunu daha önce denedim, ancak 54 bayt ile sona erdi. İlk aşama için bir alternatif T`dLp`dL_ancak maalesef aynı uzunlukta.
Martin Ender

@MartinEnder 54 baytınız neydi?
Leaky Nun


4

C #, 183 177 165 bayt

string h(string s){s=string.Concat(s.Where(n=>n>47&n<58|n>64 &n<91));int m=s.Length;var x=new string('-',m);return$"+{x}+\n|{s}|\n+{x}+\n{new string(' ', m + 1)}v";}

karakterleri çarpmak C # 'da korkunç. takdir edilen öneriler

-18 bayt için aloisdg için çok teşekkürler


Yerini alabilir Sen | |ile|
aloisdg eski haline Monica diyor

Dize enterpolasyonu kullanabilirsinizreturn$"+{x}+\n|{s}|\n+{x}+\n{new string(' ',m+1)}v";}
aloisdg Reinstate Monica,

1
Bu tatlı bir yöntem!
downrep_nation

Yerini alabilir Sen string.Join("", ilestring.Concat(
aloisdg eski haline Monica diyor

1
Sonra boşlukları kaldırabilirsinizreturn
aloisdg diyor Reinstate Monica

4

Excel VBA, 375 359 358 bayt:

Çalışıyor, kısaltmaya çalışmaktan vazgeçiyorum ...

Düzenleme: if ifadelerinden vaka ifadesine geçildi, -16 bayt

Düzen2: u kurtulmak ve yerine len (b), -1 bayt

Function b(x)
For i = 1 To Len(x)
a = Mid(x, i, 1)
e = Asc(a)
If e > 64 And e < 91 Or e > 47 And e < 58 Then b = b & a
Next i
For Z = 1 To 4
y = ""
Select Case Z
Case 2
y = "|" & b & "|"
Case 4
For i = 1 To Len(b)
y = y & " "
Next i
y = y & "v"
Case Else
y = "+"
For i = 1 To Len(b)
y = y & "-"
Next i
y = y & "+"
End Select
Debug.Print y
Next Z
End Function

3
Olsa da, VBA bazen çöp olduğunu düşünüyor.

Bunları sadece meydan okuma için yapıyorum, biliyorum VBA ile rekabet edemem. Genellikle tüm değişkenleri isimlerden tekil harflere çevirdikten sonra sonunda kafanın karışmasına neden olabilirsiniz.
tjb1,

Evet ikr Çok doğru

Operatörlerin etrafındaki boşlukları kaldırabilir misin?
Morgan Thrapp

3
"U kurtulmak" de güldü
CocoaBean

4

Lua, 145 99 Bayt

Söylenecek çok fazla şey yok, dizeleri değiştirmek her zaman Luua'da endişe vericidir :). STDOUT üzerinden bir komut satırı argümanı ve çıkışı alır

Beni 45 Bytes tasarruf için @LeakyNun teşekkürler!

n=(...):gsub("[^%u%d]","")s="+"..("-"):rep(#n).."+\n"return s.."|"..n.."|\n"..s..(" "):rep(#n).."V"

@LeakyNun tarafından önerilen 100 Bayt

n=(...):gsub("[^A-Z%d]","")s="+"..("-"):rep(#n).."+\n"return s.."|"..n.."|\n"..s..(" "):rep(#n).."V"

ESKİ 145 Bayt

g="|"..(...):gsub("%a+",function(w)return w:sub(1,1)end):gsub("%s",'').."|"S="+"..g.rep("-",#g-2).."+"p=print
p(S)p(g)p(S)p(g.rep(" ",#g-2).."v")

Ungolfed

g="|"                            -- g is the second, and starts with a |
  ..(...):gsub("%a+",            -- append the string resulting of the iteration on each word
    function(w)                  -- in the input, applying an anonymous function
      return w:sub(1,1)          -- that return the first character of the word
    end):gsub("%s",'')           -- then remove all spaces
  .."|"                          -- and append a |
S="+"..g.rep("-",#g-2).."+"      -- construct the top and bot of the box
p=print                          -- alias for print
p(S)p(g)p(S)                     -- output the box
p(g.rep(" ",#g-2).."v")          -- output #g-2 spaces (size of the shortened name), then v

1
Ah, STDOUT üzerinden çıktı mı demek istiyorsun? Ama umursamıyorum çünkü OPPOSİTE GÜNÜ !!!

1
@MatthewRoh Terminalinizin STDIN’ine çıkış yapmak istemiştim! (sabit ... utanç ....)
Katenkyo

n=(...):gsub("[^A-Z%d]","")s="+"..("-"):rep(#n).."+\n"return s.."|"..n.."|\n"..s..(" "):rep(#n).."V"100 bayttır
Leaky Nun

@LeakyNun modelini kullanarak %ubiraz daha bayt kazanıyoruz. Neyse, teşekkürler :) (daha sonra ungolfed'i güncelleyecektir)
Katenkyo

3

2sable , 36 34 33 32 31 bayt

2sable sunmak :). 05AB1E ile ortak olan bir yeri olmasına rağmen, bu aslında yığının tepesini çıkarmak yerine otomatik olarak yığına bağlanır. Kod:

žKA-ég'-×'+DŠJDU„
|®sX¶®gð×'v

CP-1252 kodlamasını kullanır .


2
ಠ_ಠ Artık golf ya da dil anahtarı yok! Şimdi olduğu yerde bırak! : P
DJMcMayhem

@DrGreenEggsandIronMan Hahaha, hala cevabınızdan 3 acı bayt var: P.
Adnan,

1
Haha, 7 bayt daha uzun gördüğümde kutluyordum ve sonra aradaki boşluğun yavaş yavaş kaybolmasını izledim ...
DJMcMayhem

3

JavaScript (ES6), 99 bayt

(s,t=s.replace(/[^0-9A-Z]/g,``),g=c=>t.replace(/./g,c))=>`${s=`+${g(`-`)}+
`}|${t}|
${s}${g(` `))v`

3

Haskell, 107 Bayt

Bu cevap, Zylviij'in cevabına ve nimi'nin yorumlarına dayanmaktadır . Bu cevaba daha fazla yorum ekleyecektim, ama ne yazık ki yeterli temsilcim yok.

o n=t++'|':f++"|\n"++t++(f>>" ")++"v"where f=[c|c<-n,any(==c)$['0'..'9']++['A'..'Z']];t='+':(f>>"-")++"+\n"

Kullanılan ilave numaralar:

  • Değiştirilen intersectithalat düştü böylece bunun uygulanması ile. (Not: uygulama neredeyse kitaplıktan biriyle aynıdır, daha kısa bir sürüm bulamadım.)
  • Yardımcı işlevlerini wherefıkra içine kaydırdı, böylece işlevler nparametreyi dahili olarak kullanabilir .
  • Bundan sonra, (#)satır içi olması için yeterince kısaydı.
  • Ekstra boşluk alanını sınırlamak için her şeyi bir satıra koyun.

2

Python 3.5, 114 93 112 bayt:

import re;Y=re.findall('[A-Z0-9]',input());I='+'+'-'*len(Y)+'+\n|';print(I+''.join(Y)+I[::-1]+'\n'+' '*len(Y)+'v')

Tam bir program. Temel olarak, büyük harflerin ve sayıların tüm örnekleriyle eşleşmesi için normal bir ifade kullanır, ardından eşleşme listesinin uzunluğuna dayalı olarak tam boyutta bir kutu oluşturur ve en sonunda birleştirilmiş eşleşme listesini "içine" koyar.

Çevrimiçi Deneyin! (Ideone)


5
'V' alt kısmı eksik.
Carles Şirketi

@CarlesCompany 19 tane daha bayt pahasına, sabit.
R. Kap,


2

Java 8, 149 bayt

s->{s=s.replaceAll("[^A-Z0-9]","");String t="+",r;int l=s.length(),i=l;for(;i-->0;t+="-");for(r=(t+="+\n")+"|"+s+"|\n"+t;++i<l;r+=" ");return r+"v";}

Çevrimiçi deneyin.

Açıklama:

s->{                     // Method with String as both parameter and return-type
  s=s.replaceAll("[^A-Z0-9]","");
                         //  Leave only the uppercase letters and digits
  String t="+",          //  Temp-String, starting at "+"
         r;              //  Result-String
  int l=s.length(),      //  Amount of uppercase letters and digits `l`
  i=l;for(;i-->0;t+="-");//  Loop and append `l` amount of "-" to the temp-String
  for(r=(t+="+\n")       //  Append "+" and a new-line to the temp-String
        +"|"+s+"|\n"+t;  //  Set the result to `t`, "|", modified input, "|", new-line, `t`
                         //  all appended to each other
      ++i<l;r+=" ");     //  Loop and append `l` amount of spaces to the result
  return r+"v";}         //  Return the result-String with appended "v"

1

Pyke, 39 bayt

cFDh~u{!Ih(sil\-*\+R\+sj\|i\|++jild*\v+

Burada dene!

12 baytlık mini string oluşturma, 20 bayt formatlama. Sevinç!



1

Python 2, 113 bayt

def f(n):c=filter(lambda x:x.isupper()^x.isdigit(),n);L=len(c);h='+'+L*'-'+'+\n';return h+'|'+c+'|\n'+h+' '*L+'v'

Python'da ascii kullanabilir misiniz? Evet ise kullanabilirsiniz 47<x<58|64<x<91:)
aloisdg Reinstate Monica diyor

@ aloisdg C / C ++ 'dan farklı olarak, Python integral chartip kullanmaz - Python karakter dizisindeki tüm karakterlerin kendisi karakter dizisidir ve tamsayılarla doğrudan karşılaştırılamaz. Olması gerekiyordu 47<ord(x)<58or 64<ord(x)<91.
Mego,

[x for x in n if x.isupper()^x.isdigit()]bir bayt daha kısadırfilter(lambda x:x.isupper()^x.isdigit(),n)
Leaky Nun

@ LeakyNun: filtre bir dize döndürür, ancak liste anlama işlevi, dönüş değeri ifadesinde kullanılamayacak bir liste döndürür.
Nikita Borisov

Neden XOR? Bunun yerine VEYA kullanamaz mısın? XOR, daha karmaşık ve bu nedenle AFAIK'ten daha yavaş. x.isupper()^x.isdigit()->x.isupper()|x.isdigit()
Outgolfer Erik,

1

Jolf, 35 bayt

Ά+,Alγ/x"[^A-Z0-9]"1'+'-'|γS*lγ" 'v

Tüm büyük harf ve rakamları kaldırmak için daha kısa bir yola ihtiyacım var ...


1

C 171 163

İşlev f()girişini değiştirir ve sonucu yazdırır.

l;f(char*n){char*p=n,*s=n,c[99];for(;*n;++n)isupper(*n)+isdigit(*n)?*p++=*n:0;*p=0;memset(c,45,l=strlen(s));c[l]=0;printf("+%s+\n|%s|\n+%s+\n%*.cv\n",c,s,c,l,32);}

Test programı

Favicon'da kullanılacak dize olan bir parametre gerektirir:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int main(int argc, const char **argv)
{
    char *input=malloc(strlen(argv[1])+1);
    strcpy(input,argv[1]);
    f(input);
    free(input);
    return 0;
}

Argv öğesini neden kopyalıyorsunuz?
mame98

Çünkü fonksiyon girişini değiştirir. Parametreleri yerinde değiştirmekten emin değilim, davranış tanımlanmış
owacoder

Bu konuda hiç düşünmedim ... Bu SO cevabına göre iyi olmalı: stackoverflow.com/a/963504/3700391
mame98 20

1

Haskell, 161

import Data.List
r=replicate
l=length
f n=intersect n$['0'..'9']++['A'..'Z']
t n='+':(r(l$f n)'-')++"+\n"
o n=(t n)++"|"++(f n)++"|\n"++(t n)++(r(l$f n)' ')++"V"

kullanım

o"Stack Overflow"
+--+
|SO|
+--+
  V

o"Area 51"
+---+
|A51|
+---+
   V

1
Sen kullanıyorsanız replicate, lengthve f: Bir fonksiyonun onları birleştirmek, böylece bu arada münhasıran r=replicate.length.fve benzeri diyoruz r n '-'. Bir infix operatörü kullanarak daha fazla bayttan tasarruf edebilirsiniz: (#)=replicate.length.fve n#'-'/ n#' '. Ek replicate.lengtholarak >>(bir karakter yerine bir singleton dizesiyle), yani: (#)=(>>).fve n#"-"/ n#" ", her ikisi de ( )etrafında değil.
nimi

1
... ayrıca: ( )çevreye t nve gerek yok f n. "|"++olduğunu '|':. Sonuçta: o n=t n++'|':f n++"|\n"++t n++n#" "++"V".
nimi

1

Bash, 99 74 bayt

s=$(sed s/[^A-Z0-9]//g);a=${s//?/-};echo -e "+$a+\n|$s|\n+$a+\n${s//?/ }v"

Kullanım: Yukarıdaki komutu çalıştırın, site adını yazın, enter tuşuna ve ardından Ctrl+ D('dosyanın sonunu gönder') tuşuna basın .



1

R, 108 bayt

cat(x<-gsub("(.*)","+\\1+\n",gsub(".","-",y<-gsub("[^A-Z0-9]","",s))),"|",y,"|\n",x,gsub("."," ",y),"v",sep="")

açıklama

İçeriden dışarıya doğru gitmek (çünkü bir regex içinden global değişkenleri atamaktan hoşlanmadığı için), sgiriş dizgimiz olduğunu varsayalım:

y<-gsub("[^A-Z0-9]","",s) büyük harfleri ve sayıları tutar, elde edilen değeri y'ye atar.

gsub(".","-",y<-...) Yukarıdaki tüm karakterleri tire ile değiştirir.

x<-gsub("(.*)","+\\1+\n",gsub(...)) mandren bir + her iki ucunda birer satır ve bir satırsonu, ve bunu x olarak saklıyoruz.

Gerisi oldukça basittir, uygun sırayla çıktı verir ve önceki boşluk sayısının vy'nin uzunluğu ile aynı olacağı gerçeğini kullanın .


1

Brachylog , 61 bayt

Geriye dönük uyumluluk sağlamak için 7 Temmuz'daki depoya bağlandı.

lybL:{,."-"}ac:"+"c:"+"rcAw@NNw"|"Bw?wBwNwAwNwL:{," "w}a,"v"w

Rekabet etmeyen, 53 bayt

lL:"-"rjb:"+"c:"+"rcAw@NNw"|"Bw?wBwNwAwNw" ":Ljbw"v"w

Çevrimiçi deneyin!


1

APL, 52 49 bayt

{x⍪2⌽'v'↑⍨≢⍉x←⍉z⍪⍨(z←'+|+')⍪'-','-',⍨⍪⍵/⍨⍵∊⎕D,⎕A}

(Yorum sayesinde 49'a kadar).


{x⍪2⌽'v'↑⍨≢⍉x←⍉z⍪⍨(z←'+|+')⍪'-','-',⍨⍪⍵/⍨⍵∊⎕D,⎕A}(Golf oynarken ters bir argüman fonksiyonundaki tartışmacılardan birini asla parantez içine almazsınız. Bir baytı kurtarmak için her zaman normal sırada olabilir.)
Zacharý

1

Perl, 57 bayt

İçin 56 bayt kodu + 1 -p.

y/a-z //d;$d="-"x y///c;$_="+$d+
|$_|
+$d+
".$"x y///c.v

Başlangıçta bunu yalnızca regex'ler kullanarak yapmaya çalıştım, ancak umduğumdan çok daha büyüktü, bu yüzden bazı dize tekrarları kullandım.

Çevrimiçi deneyin!


1

MATL , 34 bayt

t1Y24Y2hm)T45&Ya'+|+'!wy&h10M~'v'h

Çevrimiçi deneyin!

t        % Implicit input. Duplicate
1Y2      % Uppercase letters
4Y2      % Digit characters
h        % Concatenate horizontally: string with uppercase letters and digits
m        % True for input chars that are uppercase letters or digits
)        % Keep only those
T45&Ya   % Pad up and down with character 45, which is '-'. Gives three-row char array
'+|+'!   % Push this string and transpose into a column vector
wy       % Swap, duplicate the second array from the top. This places one copy of the
         % column vector below and one above the three-row char array
&h       % Contatenate all stack arrays horizontally. This gives the box with the text
10M      % Retrieve the string with selected letters
~        % Logical negate. Gives zeros, which will be displayes as spaces
'v'      % Push this character
h        % Concatenate horizontally with the zeros.
         % Implicitly display the box with the text followed by the string containing
         % the zero character repeated and the 'v'

1

JavaScript (ES6), 119 bayt

h=a=>"+"+"-".repeat(a.length)+"+\n";j=a=>(a=a.replace(/[^A-Z0-9]/g,""),h(a)+"|"+a+"|\n"+h(a)+" ".repeat(a.length)+"v");

1

J , 52 bayt

'v'(<3 _2)}4{.1":]<@#~2|'/9@Z'&I.[9!:7@'+++++++++|-'

Çevrimiçi deneyin!

   [9!:7@'+++++++++|-'            Set the box drawing characters.
        '/9@Z'&I.                 Interval index, 1 for numbers, 3 for 
                                  uppercase letters.
          ]  #~2|                 Mod 2, and filter
                                  the characters that correspond to 1s.
           <@                     Put them in a box.
           1":                    Convert to a character matrix, so we can do stuff to it.
           4{.                    Add a 4th line filled with spaces   
       'v'(<3 _2)}                Insert a “v” at 3,−2

0

Ruby, 81 bayt (78 + -pbayrak)

gsub(/[^A-Z\d]/,'')
gsub(/.+/){"+#{k=?-*s=$&.size}+
|#{$&}|
+#{k}+
#{' '*s}v"}

0

Ortak Lisp (Lispworks), 159 bayt

(defun f(s)(labels((p(c l)(dotimes(i l)(format t"~A"c))))(let((l(length s)))#1=(p"+"1)#2=(p"-"l)#3=(format t"+~%")(format t"|~A|~%"s)#1##2##3#(p" "l)(p"v"1))))

ungolfed:

(defun f (s)
  (labels ((p (c l)
             (dotimes (i l)
               (format t "~A" c))))
    (let ((l (length s)))
      #1=(p "+" 1)
      #2=(p "-" l)
      #3=(format t "+~%")
      (format t "|~A|~%" s)
      #1#
      #2#
      #3#
      (p " " l)
      (p "v" 1))))

Kullanımı:

CL-USER 2 > (f "so")
+--+
|so|
+--+
  v
NIL

CL-USER 3 > (f "pcg")
+---+
|pcg|
+---+
   v
NIL
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.