Générer un favicon d'échange de pile

25

Reconnaissez-vous le logo PPCG? cela ressemble à ceci, quand vous en faites un art ascii.

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

Maintenant, dans ce code Golf, vous allez créer un code qui crée des logos pour d'autres sites, similaire au logo PPCG.

Ce que tu devrais faire

La chaîne "raccourcie" sera la chaîne, avec toutes les lettres majuscules et les chiffres dans la chaîne d'entrée (ce qui serait le cas PPCGlorsque la chaîne d'entrée est Programming Puzzles & Code Golf).

La boîte" (

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

) devrait parfaitement s'adapter à la chaîne raccourcie (ni plus grande ni plus petite)

De plus, la vpièce doit être exactement 1 en bas et 1 à gauche en bas à droite +.

Ensuite, affichez la boîte contenant la chaîne raccourcie.

Exemple

Stack Overflow:

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

Area 51:

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

Règles

Vous pouvez supposer que l'entrée contient au moins un chiffre ou une lettre majuscule.

Les règles de standard s'appliquent.

Insensé
la source
@MartinEnder Oui, très proche, mais pas en double.
1
@MatthewRoh Le but des liens est de faire en sorte que les défis apparaissent dans la barre latérale, ce n'est pas un vote dupe. Cela dit, je pense personnellement que la suppression des caractères indésirables et l'impression du ^n'ajoutent pas grand-chose par rapport au deuxième défi que j'ai lié, mais je ne lancerai pas de dupe à ce sujet, mais je laisserai le communitz décider s'il le considère comme dupe ou ne pas.
Martin Ender
4
Si c'était le cas 99 Bottles Of Beer, ce serait 99BOB.
1
@MatthewRoh son buggy toujours, laissez-moi voir si je peux obtenir une réponse bf après tout
Rohan Jhunjhunwala

Réponses:

23

Vim, 42 coups

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

Remplacez <DOWN>par , <LEFT>par , <ESC>par escet <C-V>par CTRL+ V.

Voici une animation de ce script en cours d'exécution (ancienne version qui utilise un Vau lieu d'un v):

Animation

Explication du 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
la source
V en minuscule, pas en V majuscule
Un caractère de plus, mais évite les caractères d'échappement spéciaux: r | y uP ​​$ pYPVr-r + $. YjppVr $ hrV
Bryce Wagner
Vous pouvez remplacer i+↓←|␛␖ky$ppar A+↓|␛␖ky0Ppour enregistrer un octet.
Lynn
Alternativement, remplacez les huit premiers coups dans l'approche de Bryce parI|<END>|␛
Lynn
Je me demande si cela a le plus de votes positifs en raison de l'image sympa.
Joe
10

V 34 octets

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

Notez que cela fonctionnait dans une ancienne version, mais ne fonctionne pas dans la version actuelle sur l'essayer en ligne. J'ai changé Äpour YPlequel est fonctionnellement équivalent.

Essayez-le en ligne!

Explication:

Ó[^A-Z0-9]

Supprimez tout sauf les chiffres et les majuscules.

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

Maintenant, le tampon ressemble à ceci:

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

Et notre curseur se trouve dans la première colonne de la dernière ligne.

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

Version non concurrente: (31 octets)

DJMcMayhem
la source
Je viens de remarquer que l'entrée Programming Puzzles & Code Golfproduit la chaîne incorrecte PP&CGdans la sortie. Le &devrait être supprimé
Luis Mendo
@LuisMendo Aww, sacrément! Merci de l'avoir signalé, je vais le réparer aujourd'hui.
DJMcMayhem
@DrGreenEggsandIronMan Donc, vous l'avez corrigé, non? [quand? volonté? toi? enfin? réparer? ça?]
Erik the Outgolfer
Je ne reçois aucune sortie sur TIO?
Downgoat
@Downgoat V a récemment eu une énorme mise à jour, et malheureusement, il a falsifié certaines choses que j'examine , mais je ne sais pas combien de temps il faudra pour corriger.
DJMcMayhem
7

Code machine x86 16 bits, 72 octets

En hex:

565789F731C9FCAC84C074143C5A77F73C4173083C3977EF3C3072EBAA41EBE75F5EE81500B07CAA51F3A4AB59E80A00B020F3AAB076AA91AAC351B02BAAB02DF3AAB82B10AB59C3

Paramètres: SI= chaîne d'entrée, DI- tampon de sortie.

Génère une chaîne terminée par NULL avec des lignes délimitées par une nouvelle ligne. Utilise la chaîne d'entrée comme tampon temporaire.

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
la source
Euh .. Je n'ai pas fait de code d'assemblage depuis un moment.
3
Moi aussi.
Recommencé
3c 41 cmp al,a' ne devrait-il pas en être ainsi 3c 41 cmp al,'a' ?
rav_kr
@rav_kr, bien sûr, merci de le remarquer. Vous avez manqué un devis en remplaçant les codes hexadécimaux par des caractères pour plus de lisibilité.
meden
4

Rétine , 43 octets

[^A-Z\d]

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

Essayez-le en ligne!

C'est le défi parfait pour démontrer Retina, le langage du golf de Martin Ender.

Cette solution est divisée en deux étapes (ce que nous appelons des étapes), les deux étapes étant une étape de remplacement.

Le premier stade:

[^ AZ \ d]

Cela correspond aux sous-chaînes qui correspondent [^A-Z\d], c'est-à-dire les caractères qui ne sont pas en majuscules et non aux chiffres, puis les remplacent par rien, ce qui signifie les supprimer.

La deuxième étape:

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

Le .+correspond à l'ensemble du résultat, puis le remplace par la deuxième ligne.

Sur la deuxième ligne:

  • $& fait référence à l'ensemble du match
  • $.& se réfère à la longueur de l'ensemble du match
  • $*signifie prendre le nombre entier précédent, répéter le caractère suivant autant de fois. Ici, il $.&$*-faut répéter la -durée du match.
  • fait référence à une nouvelle ligne.
Leaky Nun
la source
Bien, j'ai essayé plus tôt, mais j'ai fini avec 54 octets. Une alternative pour la première étape est T`dLp`dL_mais c'est la même longueur, malheureusement.
Martin Ender
@MartinEnder Quels étaient vos 54 octets?
Leaky Nun
4

C #, 183 177 165 octets

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

multiplier les caractères est terrible en C #. suggestions appréciées

merci beaucoup à aloisdg pour -18 octets

downrep_nation
la source
Vous pouvez remplacer | |par|
aloisdg dit Reinstate Monica
Vous pouvez utiliser l'interpolation de chaînesreturn$"+{x}+\n|{s}|\n+{x}+\n{new string(' ',m+1)}v";}
aloisdg dit Reinstate Monica
1
c'est une méthode douce!
downrep_nation
Vous pouvez remplacer string.Join("", parstring.Concat(
aloisdg dit Reinstate Monica
1
Vous pouvez supprimer l'espace après lereturn
aloisdg dit Reinstate Monica
4

Excel VBA, 375 359 358 octets:

Ça marche, j'abandonne d'essayer de le raccourcir ...

Modifier: basculé vers l'instruction case à partir des instructions if, -16 octets

Edit2: Débarrassé de u et remplacé par Len (b), -1 octet

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
la source
3
C'est bon cependant, étant donné que VBA est parfois une poubelle.
Je fais juste ça pour le défi, je sais que je ne peux pas rivaliser avec VBA. Finissent généralement super confus à la fin après avoir changé toutes les variables des noms en lettres simples.
tjb1
Ouais ikr So true
Pouvez-vous supprimer les espaces autour des opérateurs?
Morgan Thrapp
3
Rire de
4

Lua, 145 99 octets

Pas grand chose à dire, manipuler des cordes est toujours verbeux en lua :). Prend un argument de ligne de commande et une sortie via STDOUT

Merci à @LeakyNun de m'avoir sauvé 45 octets!

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

100 octets proposés par @LeakyNun

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

VIEUX 145 octets

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

Non 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
Katenkyo
la source
1
Euh, voulez-vous dire la sortie via STDOUT? Mais ça ne me dérange pas car SON JOUR OPPOSÉ !!!
1
@MatthewRoh Je voulais dire sortir sur le STDIN de votre terminal! (corrigé ... dommage ...)
Katenkyo
n=(...):gsub("[^A-Z%d]","")s="+"..("-"):rep(#n).."+\n"return s.."|"..n.."|\n"..s..(" "):rep(#n).."V" est de 100 octets
Leaky Nun
@LeakyNun en utilisant le modèle, %unous gagnons encore plus d'octets. Quoi qu'il en soit, merci :) (mettra à jour le non-golfé plus tard)
Katenkyo
3

2sable , 36 34 33 32 31 octets

Présentation de 2sable :). Bien qu'il ait beaucoup en commun avec 05AB1E, celui-ci rejoint en fait automatiquement la pile plutôt que de sortir le haut de la pile. Code:

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

Utilise l' encodage CP-1252 .

Adnan
la source
2
ಠ_ಠ Plus de golf ni de changement de langue! Laissez-le où il est maintenant! : P
DJMcMayhem
@DrGreenEggsandIronMan Hahaha, il reste encore 3 octets douloureux loin de votre réponse: P.
Adnan
1
Haha, je fêtais quand je l'ai vu 7 octets de plus, puis j'ai lentement regardé l'écart disparaître, un par un ...
DJMcMayhem
3

JavaScript (ES6), 99 octets

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

Haskell, 107 octets

Cette réponse est largement basée sur la réponse de Zylviij et les commentaires de nimi . J'aurais ajouté plus de commentaires à cette réponse, mais hélas, je n'ai pas assez de représentants.

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

Astuces supplémentaires utilisées:

  • Remplacé intersect par son implémentation afin que l'importation puisse être supprimée. (Note latérale: l'implémentation est presque textuellement celle de la bibliothèque, je n'ai pas pu trouver de version plus courte.)
  • Déplacement des fonctions d'assistance dans la whereclause afin que les fonctions puissent utiliser len paramètre en interne.
  • Après ça, (#) était assez court pour être aligné.
  • Mettez tout sur une seule ligne pour limiter les espaces supplémentaires.
MarLinn
la source
2

Python 3.5, 114 93 112 octets:

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

Un programme complet. Fondamentalement, utilise une expression régulière pour faire correspondre toutes les occurrences de lettres et de chiffres en majuscules, puis crée la boîte de la taille exacte en fonction de la longueur de la liste des correspondances et place enfin la liste des correspondances "à l'intérieur".

Essayez-le en ligne! (Ideone)

R. Kap
la source
5
Il manque le «v» inférieur.
Carles Company
@CarlesCompany C'est fixe, au prix de 19 octets supplémentaires.
R. Kap
2

Python 3, 121 124 octets

Correction d'une erreur stupide

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'importe pas de bibliothèques comme les autres réponses python.

Citron destructible
la source
Ne fonctionne pas correctement. -1 Avertissez si vous corrigez.
Erik the Outgolfer
@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ Fixed. Merci
Destructible Lemon
En fait, le lien faisait jouer un code, et c'est pourquoi je l'ai mis là.
Erik the Outgolfer
2

Java 8, 149 octets

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

Essayez-le en ligne.

Explication:

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
la source
1

Pyke, 39 octets

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

Essayez-le ici!

12 octets de création de mini-chaîne, 20 octets de formatage. Joie!

Bleu
la source
1

Python 2, 113 octets

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'
atlasologue
la source
Pouvez-vous utiliser ascii en Python? Si oui, vous pouvez utiliser 47<x<58|64<x<91:)
aloisdg dit Reinstate Monica
@aloisdg Contrairement à C / C ++, Python n'utilise pas de chartype intégral - tous les caractères des chaînes Python sont eux-mêmes des chaînes et ne peuvent pas être directement comparés aux entiers. Il faudrait que ce soit 47<ord(x)<58or 64<ord(x)<91.
Mego
[x for x in n if x.isupper()^x.isdigit()]est un octet plus court quefilter(lambda x:x.isupper()^x.isdigit(),n)
Leaky Nun
@LeakyNun: le filtre renverra une chaîne, mais la compréhension de la liste renverra une liste, qui ne sera pas utilisable dans l'expression de valeur de retour.
Nikita Borisov
Pourquoi XOR? Ne pouvez-vous pas utiliser OU à la place? XOR est plus complexe, et donc AFAIK plus lent. x.isupper()^x.isdigit()->x.isupper()|x.isdigit()
Erik the Outgolfer
1

Jolf, 35 octets

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

J'ai besoin d'un moyen plus court pour supprimer tout sauf les majuscules et les chiffres ...

Conor O'Brien
la source
1

C, 171 163

La fonction f()modifie son entrée et imprime le résultat.

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

Programme de test

Nécessite un paramètre, la chaîne à utiliser dans le 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
la source
Pourquoi copiez-vous l'élément argv?
mame98
Parce que la fonction modifie son entrée. Je ne suis pas sûr que la modification des paramètres en place soit un comportement défini.
owacoder
jamais pensé à ça ... selon cette réponse SO ça devrait aller: 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"

Usage

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

o"Area 51"
+---+
|A51|
+---+
   V
Zylviij
la source
1
Vous utilisez replicate, lengthet fexclusivement dans cette combinaison, vous pouvez donc les fusionner en une seule fonction: r=replicate.length.fet l'appeler comme r n '-'. Vous pouvez économiser encore plus d'octets en utilisant un opérateur d'infixe: (#)=replicate.length.fet n#'-'/ n#' '. replicate.lengthEst en outre >>(avec une chaîne singleton au lieu d'un char), donc c'est: (#)=(>>).fet n#"-"/ n#" ", les deux sans ( )autour.
nimi
1
... aussi: pas besoin de faire le ( )tour t net f n. "|"++est '|':. Dans l' ensemble: o n=t n++'|':f n++"|\n"++t n++n#" "++"V".
nimi
1

Bash, 99 74 octets

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

Utilisation: Exécutez la commande ci-dessus, saisissez le nom du site, appuyez sur Entrée, puis sur Ctrl+ D(envoyer «fin de fichier»).

quelqu'un avec pc
la source
1

R, 108 octets

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

Explication

Aller de l'intérieur (car qui n'aime pas assigner des variables globales de l'intérieur d'une expression régulière), en supposant s notre chaîne d'entrée:

y<-gsub("[^A-Z0-9]","",s) conserve les majuscules et les nombres, attribue la valeur résultante à y.

gsub(".","-",y<-...) remplace tous les caractères par des tirets dans ce qui précède.

x<-gsub("(.*)","+\\1+\n",gsub(...))jette un +à chaque extrémité de la rangée de traits d'union, et une nouvelle ligne, et nous stockons cela en tant que x.

Le reste est assez simple, produit dans l'ordre approprié et utilise le fait que le nombre d'espaces avant le vsera le même que la longueur de y.

Barbarossa
la source
1

Brachylog , 61 octets

Lié au référentiel le 7 juillet pour assurer la compatibilité descendante.

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

Non concurrent, 53 octets

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

Essayez-le en ligne!

Leaky Nun
la source
1

APL, 52 49 octets

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

(jusqu'à 49 grâce au commentaire).

lstefano
la source
{x⍪2⌽'v'↑⍨≢⍉x←⍉z⍪⍨(z←'+|+')⍪'-','-',⍨⍪⍵/⍨⍵∊⎕D,⎕A}(Vous ne mettez jamais entre parenthèses l'un des arguments dans une fonction d'argument inversé lorsque vous jouez au golf. Il peut toujours être dans l'ordre normal pour enregistrer un octet.)
Zacharý
1

Perl, 57 octets

Code de 56 octets + 1 pour -p.

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

À l'origine, j'ai essayé de faire cela uniquement en utilisant des expressions rationnelles, mais c'était beaucoup plus grand que je l'espérais, j'ai donc utilisé une répétition de chaîne à la place.

Essayez-le en ligne!

Dom Hastings
la source
1

MATL , 34 octets

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

Essayez-le en ligne!

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
la source
1

JavaScript (ES6), 119 octets

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
la source
1

J , 52 octets

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

Essayez-le en ligne!

   [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
la source
0

Ruby, 81 octets (78 + -pdrapeau)

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

Lisp commun (Lispworks), 159 octets octets

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

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

Usage:

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

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