生成堆栈交换图标


25

您认识PPCG徽标吗?当您对其进行ascii艺术处理时,它看起来像这样。

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

现在,在此Code Golf中,您将创建一个代码,该代码为其他站点制作徽标,类似于PPCG徽标。

你应该做什么

字符串“ Shortened”将是字符串,输入字符串中包含所有大写字母和数字。(PPCG当输入字符串为时Programming Puzzles & Code Golf

“盒子”(

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

)应该完全适合缩短的字符串。

同样,该v部分应该正好是1向下,左1是右下+

然后输出其中包含缩短的字符串的框。

Stack Overflow

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

Area 51

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

规则

您可以假定输入至少包含一个数字或大写字母。

适用标准规则。



@MartinEnder是的,密切相关,但不是重复的。

1
@MatthewRoh链接的目的是使挑战显示在侧边栏中,而不是重复投票。就是说,^与我所链接的第二个挑战相比,我个人认为删除不需要的字符并打印这些字符并没有多大好处,但是我不会对此施加假象锤子,但要让社群决定他们是否将其视为假象或假象。不。
Martin Ender

4
如果是这样99 Bottles Of Beer,那将会是99BOB

1
@MatthewRoh它仍然是越野车,让我看看我是否还能得到bf的答案
Rohan Jhunjhunwala 16'Jul

Answers:


23

Vim,42招

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

更换<DOWN><LEFT><ESC>esc<C-V>CTRL+ V

这是此脚本运行的动画(旧版本使用V而不是v):

Animation

脚本说明:

: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,不是大写的V

多一个字符,但避免使用特殊的转义字符:r | y uP $ pYPVr-r + $。YjppVr $ hrV
Bryce Wagner

您可以替换i+↓←|␛␖ky$p使用A+↓|␛␖ky0P,以节省一个字节。
林恩

或者,用I|<END>|␛
Lynn

我不知道这是因为图片好看是否最受好评。

10

V 34字节

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

请注意,这在较旧的版本中有效,但在在线尝试的当前版本中无效。我改ÄYP其在功能上等同。

在线尝试!

说明:

Ó[^A-Z0-9]

删除除数字和大写字母以外的所有内容。

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

现在,缓冲区看起来像这样:

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

我们的光标位于最后一行的第一列。

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

非竞争版本:(31个字节)


我只是注意到输入在输出中Programming Puzzles & Code Golf产生了不正确的字符串PP&CG。本&应该被删除
路易斯Mendo

@LuisMendo Aww,该死!感谢您指出这一点,我将在今天的某个时间修复它。
DJMcMayhem

@DrGreenEg​​gsandIronMan所以,您已修复它,对吧?[什么时候?将?您?最后?固定?它吗?]
暴民埃里克(Erik the Outgolfer)'16

我没有在TIO上获得任何输出吗?
Downgoat

@Downgoat V最近刚刚进行了一次巨大的更新,不幸的是,它使我正在研究的某些内容感到厌烦,但是我不确定修复需要多长时间。
DJMcMayhem

7

16位x86机器代码,72字节

十六进制:

565789F731C9FCAC84C074143C5A77F73C4173083C3977EF3C3072EBAA41EBE75F5EE81500B07CAA51F3A4AB59E80A00B020F3AAB076AA91AAC351B02BAAB02DF3AAB82B10AB59C3

参数:SI=输入字符串,DI-输出缓冲区。

输出以NULL终止的字符串,其行由换行符分隔。使用输入字符串作为临时缓冲区。

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

嗯..我已经有一段时间没有汇编代码了。

3
我也是。大约一周前才再次开始高尔夫活动
默登

3c 41 cmp al,a' 不是3c 41 cmp al,'a' 吗?
rav_kr 2016年

@rav_kr,当然,谢谢。为方便阅读而用字符替换十六进制代码时,缺少引号。
默登

4

视网膜,43字节

[^A-Z\d]

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

在线尝试!

这是展示马丁·恩德(Retina)(马丁·恩德)的高尔夫语言的完美挑战。

该解决方案分为两个步骤(我们称为阶段),两个阶段都是替换阶段。

第一阶段:

[^ AZ \ d]

这将匹配匹配的子字符串[^A-Z\d],这些子字符串不是大写字母也不是数字,然后用任何字符替换,表示删除它们。

第二阶段:

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

.+整个结果一致,然后用第二线替代它。

在第二行:

  • $& 指整个比赛
  • $.& 指整个比赛的时间
  • $*表示取前一个整数,重复下一个字符多次。此处$.&$*-表示要重复多-长时间的匹配。
  • 指的是换行符。

不错,我较早尝试过,但最终得到了54个字节。T`dLp`dL_不幸的是,第一阶段的替代方法是,但长度相同。
Martin Ender

@MartinEnder您的54个字节是多少?
Leaky Nun


4

C#,183177165字节

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

在C#中,将字符相乘是可怕的。建议表示赞赏

非常感谢aloisdg -18个字节


您可以替换| ||
aloisdg说,莫妮卡(Monica)恢复

您可以使用字符串插值return$"+{x}+\n|{s}|\n+{x}+\n{new string(' ',m+1)}v";}
aloisdg说莫妮卡(Monica)恢复

1
多数民众赞成在一个甜蜜的方法!
downrep_nation

您可以替换string.Join("", string.Concat(
aloisdg说莫妮卡(Monica)恢复

1
您可以在return
aloisdg说“恢复莫妮卡”后于

4

Excel VBA中,375个 359 358字节:

它有效,我放弃尝试使其更短...

编辑:从if语句切换到case语句,-16个字节

Edit2:删除u并替换为Len(b),-1字节

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
考虑到VBA有时是垃圾,这很好。

我只是为应对挑战而做,我知道我无法与VBA竞争。通常,在将所有变量从名称更改为单个字母后,最终最终会造成超级困惑。
tjb1

是的ikr如此真实

您可以删除运算符周围的空白吗?
Morgan Thrapp '16

3
嘲笑

4

Lua,145 99字节

不多说,在lua :)中操纵字符串总是罗word的。接受命令行参数并通过STDOUT输出

感谢@LeakyNun为我节省了45个字节!

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

@LeakyNun提议的100个字节

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

旧145字节

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

不打高尔夫球

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
嗯,您是说通过STDOUT输出吗?但是我不介意,因为它的反对日!!!

1
@MatthewRoh我的意思是输出到您终端的STDIN!(已修复...感到羞耻。。)
Katenkyo '16

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

@LeakyNun使用该模式,%u我们获得了更多的字节。无论如何,谢谢:)(稍后将更新未修改的内容)
Katenkyo

3

2sable36 34 33 32 31字节

介绍2sable :)。尽管它与05AB1E有很多共同点,但实际上它会自动加入堆栈,而不是输出堆栈的顶部。码:

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

使用CP-1252编码。


2
ಠ_ಠ不再打高尔夫球或切换语言!离开它现在!:P
DJMcMayhem

@DrGreenEg​​gsandIronMan哈哈哈,距离您的答案:P 仍有3个痛苦的字节。
阿德南

1
哈哈,我正在庆祝,当我看到它再长7个字节时,然后慢慢地看着间隙逐渐消失了……
DJMcMayhem

3

JavaScript(ES6),99个字节

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

3

Haskell,107字节

这个答案在很大程度上基于答案Zylviij和评论NIMI。我会在该答案中添加更多评论,但是,我没有足够的代表。

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

使用的其他技巧:

  • intersect由其实现代替,因此可以删除导入。(附带说明:该实现几乎完全是库中的一种,我找不到较短的版本。)
  • 将帮助程序函数移到where子句中,以便函数可以在n内部使用参数。
  • 之后,(#)足够短以内联。
  • 将所有内容放在一行上以限制多余的空格。

2

蟒3.5,114个 93 112字节:

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

完整的程序。基本上使用正则表达式来匹配所有出现的大写字母和数字,然后根据匹配项列表的长度创建大小正确的框,最后将连接的匹配项“放入”其中。

在线尝试!(爱迪生)


5
它缺少底部的“ v”。
Carles Company

@CarlesCompany它是固定的,但要多花19个字节。
R. Kap

2

Python 3,121 124字节

修复了愚蠢的错误

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

不像其他python答案一样导入库。


无法正常工作。-1通知您是否修复。
暴民埃里克

@EʀɪᴋᴛʜᴇGᴏʟғᴇʀ固定。谢谢
破坏的柠檬

实际上,该链接包含一些代码,这就是为什么我将其放在此处。
暴民埃里克

2

Java 8,149字节

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

在线尝试。

说明:

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个字节

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

在这里尝试!

迷你字符串创建12个字节,格式设置20个字节。喜悦!



1

Python 2,113字节

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中使用ascii吗?如果是的话,您可以使用47<x<58|64<x<91:)
aloisdg说莫妮卡(Monica)恢复

@aloisdg与C / C ++不同,Python不使用整数char类型-Python 字符串中的所有字符本身都是字符串,不能直接与整数进行比较。它需要是47<ord(x)<58or 64<ord(x)<91
Mego

[x for x in n if x.isupper()^x.isdigit()]filter(lambda x:x.isupper()^x.isdigit(),n)
Leaky Nun

@LeakyNun:过滤器将返回一个字符串,但是列表推导将返回一个列表,该列表将无法在返回值表达式中使用。
Nikita Borisov

为什么要异或?您不能改用OR吗?XOR比较复杂,因此AFAIK较慢。x.isupper()^x.isdigit()->x.isupper()|x.isdigit()
暴民埃里克

1

Jolf,35个字节

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

我需要一种更短的方法来删除除大写字母和数字以外的所有内容...


1

C,171 163

函数f()修改其输入并打印出结果。

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

测试程序

需要一个参数,即在收藏夹图标中使用的字符串:

#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元素?
mame98 '16

因为该函数会修改其输入。我不确定在适当位置修改参数是否定义了行为。
owacoder

从来没有想过...根据这个SO答案应该没问题:stackoverflow.com/a/963504/3700391
mame98 '16

1

哈斯克尔(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"

用法

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

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

1
您正在使用replicatelength并且f仅在此组合中使用,因此您可以将它们合并为一个函数:r=replicate.length.f并调用它r n '-'。您可以使用infix运算符保存更多的字节:(#)=replicate.length.fn#'-'/ n#' '。另外replicate.length>>(使用单例字符串而不是char),因此它是:(#)=(>>).fn#"-"/ n#" ",两者都没有( )
妮米

1
……也:不需要( )周围t nf n"|"++'|':。总计:o n=t n++'|':f n++"|\n"++t n++n#" "++"V"
nimi

1

Bash,99 74字节

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

用法:运行以上命令,键入站点名称,按Enter,然后按Ctrl+ D(发送“文件结尾”)。



1

R,108个字节

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

说明

由内而外(因为谁不喜欢从正则表达式内部分配全局变量),假设s是我们的输入字符串:

y<-gsub("[^A-Z0-9]","",s) 保留大写字母和数字,并将结果值分配给y。

gsub(".","-",y<-...) 上面的所有字符都用连字符替换。

x<-gsub("(.*)","+\\1+\n",gsub(...)) 夹一个 +对连字符的行和一个换行符的两端,我们存储为x。

其余的非常简单,以适当的顺序输出,并使用以下事实:之前的空格数v将与y的长度相同。


1

Brachylog,61字节

在7月7日链接到存储库,以确保向后兼容。

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

不竞争,53个字节

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

在线尝试!


1

APL,52 49字节

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

(由于评论而减少到49)。


{x⍪2⌽'v'↑⍨≢⍉x←⍉z⍪⍨(z←'+|+')⍪'-','-',⍨⍪⍵/⍨⍵∊⎕D,⎕A}(打高尔夫球时,您永远不要在反向参数函数中用括号括住一位辩论者。总是可以按正常顺序保存字节。)
Zacharý17年

1

Perl,57个字节

56字节代码+ 1 for -p

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

我最初试图仅使用正则表达式进行此操作,但是它比我希望的要大得多,因此我改用了一些字符串重复。

在线尝试!


1

MATL,34个字节

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

在线尝试!

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个字节

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字节

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

在线尝试!

   [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个字节(78个+ -p标志)

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

0

Common Lisp(Lispworks),159字节字节

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

松散

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

用法:

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

CL-USER 3 > (f "pcg")
+---+
|pcg|
+---+
   v
NIL
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.