Gere um Favicon de Troca de Pilha

25

Você reconhece o logotipo PPCG? fica assim, quando você faz uma arte ascii.

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

Agora, neste Code Golf, você criará um código que cria logotipos para outros sites, semelhantes ao logotipo PPCG.

O que você deveria fazer

A string "Encurtada" será a string, com todas as letras maiúsculas e números na string de entrada (que seria PPCGquando a string de entrada for Programming Puzzles & Code Golf)

A Caixa" (

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

) deve caber perfeitamente na corda encurtada. (Não é maior ou menor)

Além disso, a vpeça deve ser exatamente 1 para baixo e 1 para a esquerda, para a direita +.

Em seguida, imprima a caixa que possui a string encurtada.

Exemplo

Stack Overflow:

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

Area 51:

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

Regras

Você pode supor que a entrada contenha pelo menos um dígito ou letra maiúscula.

Aplicam-se as regras de padrão .

Insano
fonte
@MartinEnder Sim, muito relacionado, mas não duplicado.
1
@MatthewRoh O objetivo dos links é para que os desafios apareçam na barra lateral, não seja um voto falso. Dito isso, eu pessoalmente acho que remover os caracteres indesejados e também imprimir o ^texto não adiciona muito em comparação com o segundo desafio que vinculei, mas não vou lançar um golpe nisso, mas deixo que a comunidade decida se eles o consideram um idiota ou não.
Martin Ender
4
Se fosse 99 Bottles Of Beer, seria 99BOB.
1
@MatthewRoh ainda é seu buggy, deixe-me ver se eu posso obter uma resposta bf depois de tudo #
Rohan Jhunjhunwala

Respostas:

23

Vim, 42 golpes

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

Substitua <DOWN>por , <LEFT>com , <ESC>com esce <C-V>com CTRL+ V.

Aqui está uma animação desse script em execução (versão antiga que usa um em Vvez de a v):

Animação

Explicação do script:

: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.
Loovjo
fonte
V minúsculo, não V maiúsculo
Um caráter mais, mas evita o especial caracteres de escape:. R | y até US $ pYPVr-r + $ YjppVr $ VFC
Bryce Wagner
Você pode substituir i+↓←|␛␖ky$ppor A+↓|␛␖ky0Ppara salvar um byte.
Lynn
Como alternativa, substitua os oito primeiros traços na abordagem de Bryce porI|<END>|␛
Lynn
Gostaria de saber se isso tem mais votos por causa da imagem legal.
3126 Joe
10

V 34 bytes

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

Observe que isso funcionou em uma versão mais antiga, mas não funciona na versão atual, tente online. Eu mudei Äpara YPqual é funcionalmente equivalente.

Experimente online!

Explicação:

Ó[^A-Z0-9]

Remova tudo, exceto dígitos e caracteres maiúsculos.

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

Agora, o buffer fica assim:

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

E nosso cursor está na primeira coluna da última linha.

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

Versão não concorrente: (31 bytes)

DJMcMayhem
fonte
Acabei de notar que a entrada Programming Puzzles & Code Golfproduz a string incorreta PP&CGna saída. O &deve ser removido
Luis Mendo
@LuisMendo Aww, danado! Obrigado por apontar isso, vou corrigi-lo ainda hoje.
DJMcMayhem
@DrGreenEggsandIronMan Então, você corrigiu, certo? [quando? vai? vocês? finalmente? consertar? isso?]
Erik the Outgolfer
Eu não estou recebendo nenhuma saída no TIO?
Downgoat 26/07/16
O @Downgoat V recentemente teve uma grande atualização e, infelizmente, trouxe algumas coisas que estou procurando, mas não sei quanto tempo levará para corrigir.
DJMcMayhem
7

Código de máquina x86 de 16 bits, 72 bytes

Em hexadecimal:

565789F731C9FCAC84C074143C5A77F73C4173083C3977EF3C3072EBAA41EBE75F5EE81500B07CAA51F3A4AB59E80A00B020F3AAB076AA91AAC351B02BAAB02DF3AAB82B10AB59C3

Parâmetros: SI= string de entrada, DI- buffer de saída.

Gera uma sequência terminada em NULL com linhas delimitadas por nova linha. Usa a string de entrada como um buffer temporário.

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
meden
fonte
Uhh .. Eu não fiz o código de montagem por enquanto.
3
Eu também. Começou novamente cerca de uma semana atrás apenas para golfe
meden
3c 41 cmp al,a' não deveria ser 3c 41 cmp al,'a' ?
rav_kr
@rav_kr, claro, obrigado por perceber. Faltou uma cotação ao substituir códigos hexadecimais por caracteres para facilitar a leitura.
meden 12/07/16
4

Retina , 43 bytes

[^A-Z\d]

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

Experimente online!

Este é o desafio perfeito para demonstrar a Retina, a linguagem de golfe de Martin Ender.

Essa solução é dividida em duas etapas (o que chamamos de etapas), sendo ambas as etapas uma substituição.

O primeiro estágio:

[^ AZ \ d]

Isso corresponde às substrings correspondentes [^A-Z\d], que são os caracteres que não estão em maiúsculas e nem dígitos e, em seguida, os substituem por nada, o que significa excluí-los.

A segunda etapa:

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

Ele .+corresponde ao resultado inteiro e o substitui pela segunda linha.

Na segunda linha:

  • $& refere-se a toda a partida
  • $.& refere-se à duração de toda a partida
  • $*significa pegar o número inteiro anterior, repita o próximo caractere várias vezes. Aqui $.&$*-significa repetir a -duração da partida.
  • refere-se a uma nova linha.
Freira Furada
fonte
Bom, eu tentei isso anteriormente, mas acabei com 54 bytes. Uma alternativa para a primeira etapa é, T`dLp`dL_mas infelizmente tem o mesmo comprimento.
Martin Ender
@MartinEnder Quais foram os seus 54 bytes?
Leaky Nun
4

C #, 183177165 bytes

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";}

multiplicar caracteres é terrível em C #. sugestões apreciadas

muito obrigado a aloisdg por -18 bytes

downrep_nation
fonte
Você pode substituir | |por|
aloisdg diz Reinstate Monica
Você pode usar a interpolação de stringsreturn$"+{x}+\n|{s}|\n+{x}+\n{new string(' ',m+1)}v";}
aloisdg diz Reinstate Monica
1
isso é um método doce!
downrep_nation
Você pode substituir string.Join("", porstring.Concat(
aloisdg diz Reinstate Monica
1
Você pode remover o espaço após oreturn
aloisdg diz Reintegrar Monica
4

VBA do Excel, 375 359 358 bytes:

Funciona, desisto de tentar diminuir ...

Editar: Alternada para instrução de caso de instruções if, -16 bytes

Edit2: Se livrou de u e substituído por Len (b), -1 byte

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
tjb1
fonte
3
É bom, considerando que o VBA às vezes é um lixo.
Eu apenas faço isso para o desafio, sei que não posso competir com o VBA. Geralmente acabam super confusos no final depois de alterar todas as variáveis ​​de nomes para letras únicas.
Julio
Sim iEUR Tão verdadeiro
Você pode remover o espaço em branco ao redor dos operadores?
Morgan Thrapp
3
Riu de "Se livrou de você"
CocoaBean
4

Lua, 145 99 bytes

Não há muito a dizer, manipular strings é sempre prolixo na lua :). Obtém um argumento da linha de comando e gera saída via STDOUT

Obrigado a @LeakyNun por me salvar 45 bytes!

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

100 bytes propostos por @LeakyNun

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

OLD 145 Bytes

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
Katenkyo
fonte
1
Uhh, você quer dizer saída via STDOUT? Mas eu não me importo porque SEU DIA OPOSTO !!!
1
@MatthewRoh, eu quis dizer enviar para o STDIN do seu terminal! (corrigido ... vergonha ...) #
7898
n=(...):gsub("[^A-Z%d]","")s="+"..("-"):rep(#n).."+\n"return s.."|"..n.."|\n"..s..(" "):rep(#n).."V"é de 100 bytes
Freira Furada
@LeakyNun usando o padrão %u, ganhamos mais alguns bytes. De qualquer forma, graças :) (atualizará o mais tarde ungolfed)
Katenkyo
3

2sable , 36 34 33 32 31 bytes

Apresentando 2sable :). Embora tenha muito em comum com 05AB1E, este realmente se junta automaticamente à pilha em vez de gerar a parte superior da pilha. Código:

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

Usa a codificação CP-1252 .

Adnan
fonte
2
ಠ_ಠ Não há mais troca de golfe ou idioma! Deixe onde está agora! : P
DJMcMayhem
@DrGreenEggsandIronMan Hahaha, ainda faltam 3 bytes dolorosos para a sua resposta: P.
Adnan
1
Haha, eu estava comemorando quando vi que 7 bytes mais tempo, e depois, lentamente, assistiu a lacuna desaparecer, um por um ...
DJMcMayhem
3

JavaScript (ES6), 99 bytes

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

Haskell, 107 bytes

Esta resposta é fortemente baseada na resposta de Zylviij e nos comentários de nimi . Eu teria acrescentado mais comentários a essa resposta, mas, infelizmente, não tenho representante suficiente.

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

Truques adicionais usados:

  • Substituído intersectpor sua implementação para que a importação possa ser descartada. (Nota: a implementação é quase a mesma da biblioteca, não consegui encontrar uma versão mais curta.)
  • As funções auxiliares foram movidas para a wherecláusula para que as funções possam usar o nparâmetro internamente.
  • Depois disso, (#)foi curto o suficiente para ser incorporado.
  • Coloque tudo em uma linha para limitar o espaço em branco extra.
MarLinn
fonte
2

Python 3.5, 114 93 112 bytes:

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

Um programa completo. Basicamente, usa uma expressão regular para corresponder a todas as ocorrências de letras maiúsculas e números, depois cria a caixa do tamanho exato com base no comprimento da lista de correspondências e, finalmente, coloca a lista de correspondências "dentro" dela.

Experimente Online! (Ideona)

R. Kap
fonte
5
Está faltando o 'v' inferior.
Carles Empresa
@CarlesCompany É fixo, ao custo de 19 bytes a mais.
R. Kap
2

Python 3, 121 124 bytes

Corrigido erro estúpido

s=''
for i in input():_=ord(i);s+=("",i)[91>_>64or 47<_<58]
x=len(s)
c='+'+"-"*x+'+'
print(c+"\n|"+s+"|\n"+c+"\n"+" "*x+"v")

não importa bibliotecas como outra resposta python.

Limão destrutível
fonte
Não funciona corretamente. -1 Notifique se você corrigir.
Erik the Outgolfer
@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ Fixed. Obrigado
Destructible Lemon
Na verdade, o link continha algum código, e é por isso que eu o coloquei lá.
Erik the Outgolfer
2

Java 8, 149 bytes

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";}

Experimente online.

Explicação:

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"
Kevin Cruijssen
fonte
1

Pyke, 39 bytes

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

Experimente aqui!

12 bytes de criação de mini-string, 20 bytes de formatação. Alegria!

Azul
fonte
1

Pitão, 38 37 bytes


Jj*\-lK@jrG1UTz"++"jK"||"JtXJ"-+"" v

Experimente online.

Observe a nova linha no início.

PurkkaKoodari
fonte
1

Python 2, 113 bytes

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'
atlasologist
fonte
Você pode usar ascii em Python? Se sim, você pode usar 47<x<58|64<x<91:)
aloisdg diz Reinstate Monica
@aloisdg Ao contrário do C / C ++, o Python não usa um chartipo integral - todos os caracteres nas seqüências de caracteres Python são eles mesmos e não podem ser comparados diretamente com números inteiros. Seria necessário 47<ord(x)<58or 64<ord(x)<91.
Mego
[x for x in n if x.isupper()^x.isdigit()]é um byte menor que #filter(lambda x:x.isupper()^x.isdigit(),n)
Leaky Nun
@LeakyNun: filter retornará uma string, mas a compreensão da lista retornará uma lista, que não será utilizável na expressão de valor de retorno.
Nikita Borisov
Por que XOR? Você não pode usar OU? O XOR é mais complexo e, portanto, mais lento, o AFAIK. x.isupper()^x.isdigit()->x.isupper()|x.isdigit()
Erik the Outgolfer
1

Jolf, 35 bytes

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

Preciso de uma maneira mais curta de remover todos, exceto letras maiúsculas e números ...

Conor O'Brien
fonte
1

C, 171 163

A função f()modifica sua entrada e imprime o resultado.

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);}

Programa de teste

Requer um parâmetro, a string a ser usada no favicon:

#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;
}
owacoder
fonte
Por que você copia o elemento argv?
Mare98 10/07/16
Porque a função modifica sua entrada. Não tenho certeza se modificar os parâmetros no local é um comportamento definido.
27416 owacoder
nunca pensei sobre isso ... de acordo com esta resposta por isso deve ser muito bem: stackoverflow.com/a/963504/3700391
mame98
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"

Uso

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

o"Area 51"
+---+
|A51|
+---+
   V
Zylviij
fonte
1
Você está usando replicate, lengthe fexclusivamente nesta combinação, para mesclá-los em uma função: r=replicate.length.fe chamá-lo como r n '-'. Você pode salvar ainda mais bytes usando um operador infix: (#)=replicate.length.fe n#'-'/ n#' '. Além disso, replicate.lengthé >>(com uma string singleton em vez de um caractere), então é:(#)=(>>).f e n#"-"/ n#" ", ambos sem ( )o uso.
nimi
1
... também: não há necessidade de a ( )volta t ne f n. "|"++é '|':. Todos em todos: o n=t n++'|':f n++"|\n"++t n++n#" "++"V".
nimi
1

Bash, 99 74 bytes

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

Uso: Execute o comando acima, digite o nome do site, pressione enter e, em seguida, Ctrl+ D(envie 'fim do arquivo').

someonewithpc
fonte
1

R, 108 bytes

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

Explicação

Indo de dentro para fora (porque quem não gosta de atribuir variáveis ​​globais de dentro de uma regex), assumindo que sé a nossa string de entrada:

y<-gsub("[^A-Z0-9]","",s) mantém maiúsculas e números, atribui o valor resultante a y.

gsub(".","-",y<-...) substitui todos os caracteres por hífens acima.

x<-gsub("(.*)","+\\1+\n",gsub(...)) lança um + em cada extremidade da linha de hífens e uma nova linha, e os armazenamos como x.

O resto é bem direto, com saída na ordem apropriada e use o fato de que o número de espaços antes do vserá o mesmo que o comprimento de y.

Barbarossa
fonte
1

Brachylog , 61 bytes

Vinculado ao repositório em 7 de julho para garantir compatibilidade com versões anteriores.

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

Não concorrente, 53 bytes

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

Experimente online!

Freira Furada
fonte
1

APL, 52 49 bytes

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

(até 49 graças ao comentário).

lstefano
fonte
{x⍪2⌽'v'↑⍨≢⍉x←⍉z⍪⍨(z←'+|+')⍪'-','-',⍨⍪⍵/⍨⍵∊⎕D,⎕A}(Você nunca entre parênteses um dos arguents em uma função argumento revertida quando golfe Ele sempre pode estar em ordem normal para salvar um byte..)
Zachary
1

Perl, 57 bytes

Código de 56 bytes + 1 para -p.

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

Originalmente, tentei fazer isso usando regexes, mas era muito maior do que eu esperava, então usei algumas repetições de string.

Experimente online!

Dom Hastings
fonte
1

MATL , 34 bytes

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

Experimente online!

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'
Luis Mendo
fonte
1

JavaScript (ES6), 119 bytes

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");
Logern
fonte
1

J , 52 bytes

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

Experimente online!

   [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
FrownyFrog
fonte
0

Ruby, 81 bytes (78 + -psinalizador)

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

Lisp comum (Lispworks), 159 bytes bytes

(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))))

Uso:

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

CL-USER 3 > (f "pcg")
+---+
|pcg|
+---+
   v
NIL
sadfaf
fonte