Generar un favicon de intercambio de pila


25

¿Reconoces el logo de PPCG? se ve así, cuando haces un arte ascii de ello.

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

Ahora, en este Código Golf, creará un código que crea logotipos para otros sitios, similar al logotipo de PPCG.

Lo que debe hacer

La cadena "acortada" será la cadena, con todas las letras mayúsculas y números en la cadena de entrada (que sería PPCGcuando la cadena de entrada es Programming Puzzles & Code Golf)

La caja" (

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

) debe encajar perfectamente en la cadena acortada. (No más grande ni más pequeño)

Además, la vparte debe estar exactamente 1 abajo y 1 izquierda hacia abajo derecha +.

Luego, envíe el cuadro que contiene la cadena acortada.

Ejemplo

Stack Overflow:

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

Area 51:

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

Reglas

Puede suponer que la entrada contiene al menos un dígito o letra mayúscula.

Se aplican reglas estándar de .



@MartinEnder Sí, muy relacionado, pero no duplicado.

1
@MatthewRoh El propósito de los enlaces es que los desafíos aparezcan en la barra lateral, no es un voto de engaño. Dicho esto, personalmente creo que eliminar los caracteres no deseados y también imprimirlos ^no agrega mucho en comparación con el segundo desafío que relacioné, pero no lanzaré un martillo de engaño sobre eso, pero dejaré que el Communitz decida si lo consideran un engaño o no.
Martin Ender

44
Si lo fuera 99 Bottles Of Beer, lo sería 99BOB.

1
@MatthewRoh todavía tiene errores, déjame ver si puedo obtener una respuesta bf después de todo
Rohan Jhunjhunwala

Respuestas:


23

Vim, 42 golpes

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

Reemplazar <DOWN>con , <LEFT>con , <ESC>con escy <C-V>con CTRL+ V.

Aquí hay una animación de este script en ejecución (versión anterior que usa un en Vlugar de a v):

Animación

Explicación del guión:

: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.

V minúscula, no V mayúscula

Un personaje más, pero evita los caracteres especiales de escape: r | y uP ​​$ pYPVr-r + $. YjppVr $ hrV
Bryce Wagner

Puede reemplazar i+↓←|␛␖ky$pcon A+↓|␛␖ky0Ppara guardar un byte.
Lynn

Alternativamente, reemplace los primeros ocho golpes en el enfoque de Bryce conI|<END>|␛
Lynn

Me pregunto si esto tiene más votos a favor debido a la imagen genial.
Joe

10

V 34 bytes

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

Tenga en cuenta que esto funcionó en una versión anterior, pero no funciona en la versión actual al probarlo en línea. Cambié Äa lo YPque es funcionalmente equivalente.

Pruébalo en línea!

Explicación:

Ó[^A-Z0-9]

Elimine todo excepto los dígitos y las mayúsculas.

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

Ahora, el búfer se ve así:

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

Y nuestro cursor está en la primera columna de la última línea.

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

Versión no competitiva: (31 bytes)


Acabo de notar que la entrada Programming Puzzles & Code Golfproduce la cadena incorrecta PP&CGen la salida. El &debería ser eliminado
Luis Mendo

@LuisMendo Aww, maldita sea! Gracias por señalarlo, lo arreglaré en algún momento hoy.
DJMcMayhem

@DrGreenEggsandIronMan Entonces, lo arreglaste, ¿verdad? [¿cuando? ¿será? ¿tú? ¿finalmente? ¿fijar? it?]
Erik the Outgolfer

¿No obtengo ningún resultado en TIO?
Downgoat

@Downgoat V recientemente tuvo una gran actualización, y desafortunadamente borró algunas cosas que estoy investigando, pero no estoy seguro de cuánto tiempo llevará arreglarlo.
DJMcMayhem

7

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

En hexadecimal:

565789F731C9FCAC84C074143C5A77F73C4173083C3977EF3C3072EBAA41EBE75F5EE81500B07CAA51F3A4AB59E80A00B020F3AAB076AA91AAC351B02BAAB02DF3AAB82B10AB59C3

Parámetros: SI= cadena de entrada, DI- búfer de salida.

Emite una cadena terminada en NULL con líneas delimitadas por nueva línea. Utiliza la cadena de entrada como un búfer temporal.

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 ... no he hecho código de ensamblaje por un tiempo.

3
Yo también. Comencé de nuevo hace aproximadamente una semana solo para jugar golf
meden

3c 41 cmp al,a' no debería ser 3c 41 cmp al,'a' ?
rav_kr

@rav_kr, claro, gracias por notarlo. Se perdió una cita al reemplazar códigos hexadecimales con caracteres para facilitar la lectura.
meden

4

Retina , 43 bytes

[^A-Z\d]

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

Pruébalo en línea!

Este es el desafío perfecto para demostrar Retina, el lenguaje de golf de Martin Ender.

Esta solución se divide en dos pasos (lo que llamamos etapas), siendo ambas etapas una etapa de reemplazo.

El primer escenario:

[^ AZ \ d]

Esto coincide con las subcadenas que coinciden [^A-Z\d], que son los caracteres que no son mayúsculas ni dígitos, y luego los sustituye por nada, lo que significa eliminarlos.

La segunda etapa:

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

El .+coincide con el resultado completo y luego lo sustituye con la segunda línea.

En la segunda linea:

  • $& se refiere a todo el partido
  • $.& se refiere a la duración de todo el partido
  • $*significa tomar el número entero anterior, repetir el siguiente carácter tantas veces. Aquí $.&$*-significa repetir -por mucho tiempo que sea el partido.
  • se refiere a una nueva línea.

Bien, intenté esto antes, pero terminé con 54 bytes. Una alternativa para la primera etapa es, T`dLp`dL_pero desafortunadamente, tiene la misma longitud.
Martin Ender

@MartinEnder ¿Cuáles fueron sus 54 bytes?
Leaky Nun


4

C #, 183 177 165 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 es terrible en C #. sugerencias apreciadas

muchas gracias a aloisdg por -18 bytes


Puede reemplazar | |con|
aloisdg dice Reinstate Monica

Puede usar la interpolación de cadenasreturn$"+{x}+\n|{s}|\n+{x}+\n{new string(' ',m+1)}v";}
aloisdg dice Reinstate Monica el

1
ese es un método dulce!
downrep_nation

Puede reemplazar string.Join("", constring.Concat(
aloisdg dice Reinstate Monica

1
Puede eliminar el espacio después de lareturn
aloisdg dice Reinstate Monica

4

Excel VBA, 375 359 358 bytes:

Funciona, renuncio a tratar de hacerlo más corto ...

Editar: Cambió a declaración de caso de declaraciones if, -16 bytes

Edit2: Deshágase de usted y reemplazado con 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

3
Sin embargo, es bueno, teniendo en cuenta que VBA a veces es basura.

Solo hago esto para el desafío, sé que no puedo competir con VBA. Por lo general, terminan súper confundidos al final después de cambiar todas las variables de nombres a letras individuales.
tjb1

Yeah ikr So true

¿Se puede eliminar el espacio en blanco alrededor de los operadores?
Morgan Thrapp

3
Se
rió de

4

Lua, 145 99 Bytes

No hay mucho que decir, manipular cadenas siempre es prolijo en lua :). Toma un argumento de línea de comandos y se envía a través de STDOUT

¡Gracias a @LeakyNun por salvarme 45 Bytes!

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

100 bytes propuestos por @LeakyNun

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

145 bytes anteriores

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

Sin golf

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
Uhh, ¿te refieres a la salida a través de STDOUT? ¡Pero no me importa porque ES SU DÍA OPUESTO!

1
@MatthewRoh ¡Me refería a la salida al STDIN de su terminal! (arreglado ... vergüenza ...)
Katenkyo

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

@LeakyNun usando el patrón %uganamos algunos bytes más. De todos modos, gracias :) (actualizará los no golfados más tarde)
Katenkyo

3

2sable , 36 34 33 32 31 bytes

Presentando 2sable :). Aunque tiene mucho en común con 05AB1E, este realmente se une automáticamente a la pila en lugar de generar la parte superior de la pila. Código:

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

Utiliza la codificación CP-1252 .


2
ಠ_ಠ ¡No más golf o cambios de idioma! ¡Déjalo donde está ahora! : P
DJMcMayhem

@DrGreenEggsandIronMan Jajaja, todavía está a 3 bytes dolorosos de tu respuesta: P.
Adnan

1
Jaja, estaba celebrando cuando lo vi 7 bytes más, y luego lentamente vi desaparecer la brecha, uno por uno ...
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`

3

Haskell, 107 bytes

Esta respuesta se basa en gran medida en la respuesta de Zylviij y los comentarios de nimi . Hubiera agregado más comentarios a esa respuesta, pero, por desgracia, no tengo suficiente representante.

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

Trucos adicionales utilizados:

  • Reemplazado intersectpor su implementación para que la importación se pueda descartar. (Nota al margen: la implementación es casi literalmente la biblioteca, no pude encontrar una versión más corta).
  • Se movieron las funciones auxiliares a la wherecláusula para que las funciones puedan usar el nparámetro internamente.
  • Después de eso, (#)fue lo suficientemente corto como para estar en línea.
  • Ponga todo en una línea para limitar los espacios en blanco adicionales.

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

Un programa completo Básicamente usa una expresión regular para hacer coincidir todas las apariciones de letras mayúsculas y números, luego crea el cuadro del tamaño exacto basado en la longitud de la lista de coincidencias y finalmente coloca la lista de coincidencias "dentro".

¡Pruébelo en línea! (Ideone)


55
Le falta la 'v' inferior.
Carles Company

@CarlesCompany Es fijo, a costa de 19 bytes más.
R. Kap

2

Python 3, 121 124 bytes

Corregido error 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")

no importa bibliotecas como otra respuesta de Python.



@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ Fijo. Gracias
Destructible Lemon

En realidad, el enlace tenía un código de golf y por eso lo puse allí.
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";}

Pruébalo en línea.

Explicación:

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 bytes

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

Pruébalo aquí!

12 bytes de creación de minicadena, 20 bytes de formato. ¡Alegría!



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'

¿Puedes usar ascii en Python? Si es así, puedes usar 47<x<58|64<x<91:)
aloisdg dice Reinstate Monica

@aloisdg A diferencia de C / C ++, Python no utiliza un chartipo integral : todos los caracteres de las cadenas de Python son cadenas y no se pueden comparar directamente con los enteros. Tendría que serlo 47<ord(x)<58or 64<ord(x)<91.
Mego

[x for x in n if x.isupper()^x.isdigit()]es un byte más corto quefilter(lambda x:x.isupper()^x.isdigit(),n)
Leaky Nun

@LeakyNun: filter devolverá una cadena, pero la comprensión de la lista devolverá una lista, que no se podrá utilizar en la expresión de valor de retorno.
Nikita Borisov

¿Por qué XOR? ¿No puedes usar OR en su lugar? XOR es más complejo y, por lo tanto, AFAIK más lento. x.isupper()^x.isdigit()->x.isupper()|x.isdigit()
Erik the Outgolfer

1

Jolf, 35 bytes

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

Necesito una forma más corta de eliminar todos menos mayúsculas y números ...


1

C, 171 163

La función f()modifica su entrada e imprime el 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 prueba

Requiere un parámetro, la cadena para usar en el 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;
}

¿Por qué copia el elemento argv?
mame98

Porque la función modifica su entrada. No estoy seguro de que modificar los parámetros establecidos sea un comportamiento definido.
owacoder

nunca pensé en esto ... de acuerdo con esta respuesta SO, debería estar bien: 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

1
Está utilizando replicate, lengthy fexclusivamente en esta combinación, por lo que puede combinarlos en una sola función: r=replicate.length.fy llamarlo así r n '-'. Puede guardar aún más bytes utilizando un operador infijo: (#)=replicate.length.fy n#'-'/ n#' '. Además replicate.lengthes >>(con una cadena singleton en lugar de un carácter), por lo que es: (#)=(>>).fy n#"-"/ n#" ", ambos sin ( )alrededor.
nimi

1
... también: no hay necesidad de ( )alrededor t ny f n. "|"++es '|':. En resumen: 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: Ejecute el comando anterior, escriba el nombre del sitio, presione Entrar y luego Ctrl+ D(enviar 'fin de archivo').



1

R, 108 bytes

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

Explicación

Yendo de adentro hacia afuera (porque a quién no le encanta asignar variables globales desde dentro de una expresión regular), suponiendo que ses nuestra cadena de entrada:

y<-gsub("[^A-Z0-9]","",s) mantiene mayúsculas y números, asigna el valor resultante a y.

gsub(".","-",y<-...) reemplaza todos los caracteres con guiones en lo anterior.

x<-gsub("(.*)","+\\1+\n",gsub(...))arroja una +a cada extremo de la fila de guiones, y una nueva línea, y la almacenamos como x.

El resto es bastante sencillo, se emite en el orden apropiado y usa el hecho de que el número de espacios antes del vserá igual a la longitud de y.


1

Brachylog , 61 bytes

Vinculado al repositorio el 7 de julio para garantizar la compatibilidad con versiones anteriores.

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

No competidor, 53 bytes

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

Pruébalo en línea!


1

APL, 52 49 bytes

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

(hasta 49 gracias al comentario).


{x⍪2⌽'v'↑⍨≢⍉x←⍉z⍪⍨(z←'+|+')⍪'-','-',⍨⍪⍵/⍨⍵∊⎕D,⎕A}(Nunca paréntesis uno de los argumentos en una función de argumento invertido al jugar al golf. Siempre puede estar en el orden normal para guardar un byte.)
Zacharý

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 traté de hacer esto solo usando expresiones regulares, pero era mucho más grande de lo que esperaba, así que en su lugar he usado algunas repeticiones de cuerdas.

Pruébalo en línea!


1

MATL , 34 bytes

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

Pruébalo en línea!

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

1

J , 52 bytes

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

Pruébalo en línea!

   [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 bytes (78 + -pbandera)

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

0

Lisp común (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))))

sin golf:

(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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.