สร้าง Favicon ของ Exchange Exchange


25

คุณรู้จักโลโก้ PPCG หรือไม่? มันจะเป็นแบบนี้เมื่อคุณทำ ascii art ของมัน

+---+
|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

คำตอบ:


23

เป็นกลุ่ม 42 จังหวะ

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

แทนที่<DOWN>ด้วย, <LEFT>กับ, <ESC>ด้วยescและ<C-V>ด้วย+CTRLV

ต่อไปนี้เป็นภาพเคลื่อนไหวของสคริปต์นี้ที่ทำงานอยู่ (เวอร์ชันเก่าซึ่งใช้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เพื่อบันทึกไบต์
ลินน์

อีกทางเลือกหนึ่งแทนที่แปดครั้งแรกในแนวทางของ Bryce ด้วยI|<END>|␛
Lynn

ฉันสงสัยว่าสิ่งนี้มี upvotes มากที่สุดเพราะภาพเจ๋ง ๆ
Joe

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

@DrGreenEggsandIronMan ดังนั้นคุณแก้ไขใช่มั้ย [เมื่อ? จะ? คุณ? ในที่สุด? แก้ไขปัญหา? มัน?]
Erik the Outgolfer

ฉันไม่ได้รับผลลัพธ์ใด ๆ จาก TIO?
Downgoat

@Downgoat V เพิ่งมีการอัปเดตครั้งใหญ่และโชคไม่ดีที่มันทำให้บางสิ่งที่ฉันกำลังดูอยู่ แต่ฉันไม่แน่ใจว่าจะต้องใช้เวลานานแค่ไหนในการแก้ไข
DJMcMayhem

7

รหัสเครื่อง 16 บิต x86, 72 ไบต์

ในรูปหกเหลี่ยม:

565789F731C9FCAC84C074143C5A77F73C4173083C3977EF3C3072EBAA41EBE75F5EE81500B07CAA51F3A4AB59E80A00B020F3AAB076AA91AAC351B02BAAB02DF3AAB82B10AB59C3

พารามิเตอร์: SI= สตริงป้อนเข้าDI- บัฟเฟอร์เอาต์พุต

ส่งออกสตริงที่สิ้นสุดด้วยค่า NULL ที่มีบรรทัดคั่นด้วย newline ใช้สตริงอินพุตเป็นบัฟเฟอร์ชั่วคราว

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
ฉันด้วย. เริ่มอีกครั้งเมื่อประมาณหนึ่งสัปดาห์ที่ผ่านมาสำหรับการเล่นกอล์ฟเท่านั้น
meden

3c 41 cmp al,a' มันไม่ควรจะเป็น3c 41 cmp al,'a' ?
rav_kr

@rav_kr แน่นอนขอบคุณสำหรับการสังเกต พลาดเครื่องหมายคำพูดในขณะที่แทนที่รหัสฐานสิบหกด้วยตัวอักษรเพื่อให้อ่านง่าย
meden

4

เรติน่า 43 ไบต์

[^A-Z\d]

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

ลองออนไลน์!

นี่เป็นความท้าทายที่สมบูรณ์แบบในการแสดงภาษา Retina ของภาษากอล์ฟของ Martin Ender

วิธีการแก้ปัญหานี้แบ่งออกเป็นสองขั้นตอน (สิ่งที่เราเรียกขั้นตอน) ทั้งสองขั้นตอนเป็นขั้นตอนการเปลี่ยน

ขั้นตอนแรก:

[^ AZ \ d]

สิ่งนี้จะตรงกับสตริงย่อยที่ตรงกัน[^A-Z\d]ซึ่งเป็นอักขระที่ไม่ใช่ตัวพิมพ์ใหญ่และไม่ใช่ตัวเลขจากนั้นจึงแทนที่มันโดยไม่มีอะไรเลยซึ่งหมายถึงการลบออก

ขั้นตอนที่สอง:

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

การ.+จับคู่ผลลัพธ์ทั้งหมดแล้วแทนที่ด้วยบรรทัดที่สอง

ในบรรทัดที่สอง:

  • $& หมายถึงการแข่งขันทั้งหมด
  • $.& หมายถึงความยาวของการแข่งขันทั้งหมด
  • $*หมายถึงใช้จำนวนเต็มก่อนหน้าทำซ้ำตัวอักษรต่อไปที่หลายต่อหลายครั้ง ที่นี่$.&$*-หมายถึงการทำซ้ำ-การแข่งขันนาน
  • อ้างถึงบรรทัดใหม่

ดีฉันลองใช้ก่อนหน้านี้ แต่จบลงด้วย 54 ไบต์ ทางเลือกสำหรับระยะแรกคือT`dLp`dL_แต่มันมีความยาวเท่ากันโชคไม่ดี
Martin Ender

@MartinEnder 54 ไบต์ของคุณคืออะไร?
Leun Nun


4

C #, 183 177 165 ไบต์

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 พูดว่า Reinstate Monica

คุณสามารถใช้การแก้ไขสตริงreturn$"+{x}+\n|{s}|\n+{x}+\n{new string(' ',m+1)}v";}
aloisdg พูดว่า Reinstate Monica

1
นั่นเป็นวิธีที่หวาน!
downrep_nation

คุณสามารถแทนที่string.Join("", ด้วยstring.Concat(
aloisdg พูดว่า Reinstate Monica

1
คุณสามารถลบช่องว่างหลังจากreturn
aloisdg พูดว่า Reinstate Monica

4

Excel VBA, 375 359 358 ไบต์:

มันใช้งานได้ฉันยอมแพ้ในการพยายามทำให้มันสั้นลง ...

แก้ไข: เปลี่ยนเป็นคำสั่งกรณีจากถ้าข้อความสั่ง, -16 ไบต์

Edit2: กำจัด u และแทนที่ด้วย 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
มันดีแม้ว่าเมื่อพิจารณาว่า VBA บางครั้งก็เป็นขยะ

ฉันทำสิ่งเหล่านี้เพื่อความท้าทายฉันรู้ว่าฉันไม่สามารถแข่งขันกับ VBA ได้ มักจะจบลงด้วยความสับสนสุดในตอนท้ายหลังจากเปลี่ยนตัวแปรทั้งหมดจากชื่อเป็นตัวอักษรเดียว
tjb1

ใช่แล้ว

คุณสามารถลบช่องว่างรอบ ๆ ตัวดำเนินการได้หรือไม่
Morgan Thrapp

3
หัวเราะที่ "กำจัดเจ้า"
CocoaBean

4

ลัวะ145 99 Bytes

ไม่มากที่จะพูดการจัดการสตริงมักจะพูดมากใน lua :) รับอาร์กิวเมนต์บรรทัดคำสั่งและเอาต์พุตผ่าน STDOUT

ขอบคุณ @LeakyNun ที่ช่วยฉันประหยัด 45 ไบต์!

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

100 ไบต์ที่เสนอโดย @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

1
เอ่อคุณหมายถึงเอาต์พุตผ่าน STDOUT หรือไม่ แต่ฉันไม่รังเกียจเพราะวัน OPPOSITE !!!

1
@ MatthewRoh ฉันหมายถึงการส่งออกไปยัง STDIN ของสถานีของคุณ! (แก้ไข ... อับอาย .... )
Katenkyo

n=(...):gsub("[^A-Z%d]","")s="+"..("-"):rep(#n).."+\n"return s.."|"..n.."|\n"..s..(" "):rep(#n).."V"คือ 100 ไบต์
Leun Nun

@LeakyNun โดยใช้รูปแบบที่%uเราได้รับไบต์เพิ่มเติม อย่างไรก็ตามขอบคุณ :) (จะมีการปรับปรุงในภายหลัง ungolfed)
Katenkyo

3

2sable , 36 34 33 32 31 ไบต์

นำเสนอ2sable :) แม้ว่าจะมีจำนวนมากที่เหมือนกันกับ 05AB1E อันนี้จริงอัตโนมัติเข้าร่วมสแต็คมากกว่าการส่งออกด้านบนของสแต็ค รหัส:

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

ใช้การเข้ารหัสCP-1252


2
ಠ_ಠไม่มีการตีกอล์ฟหรือภาษา! ทิ้งมันไว้ตอนนี้! : P
DJMcMayhem

@DrGreenEggsandIronMan ฮ่าฮ่าฮ่ามันยังมี 3 ไบต์ที่เจ็บปวดจากคำตอบของคุณ: P
Adnan

1
ฮ่าฮ่าฉันกำลังฉลองเมื่อฉันเห็นมันอีก 7 ไบต์แล้วค่อย ๆ ดูช่องว่างที่หายไปทีละคน ...
DJMcMayhem


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

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

โปรแกรมเต็มรูปแบบ โดยทั่วไปใช้นิพจน์ทั่วไปเพื่อจับคู่ตัวอักษรและตัวเลขที่เกิดขึ้นทั้งหมดจากนั้นสร้างกล่องที่มีขนาดที่แน่นอนตามความยาวของรายการที่ตรงกัน

ลองออนไลน์! (Ideone)


5
มันหายไป 'v' ด้านล่าง
บริษัท Carles

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

ไม่นำเข้าห้องสมุดเช่นคำตอบหลามอื่น ๆ


ทำงานไม่ถูกต้อง -1แจ้งให้ทราบหากคุณแก้ไข
Erik the Outgolfer

@ แก้ไขEʀɪᴋᴛʜᴇGᴏʟғᴇʀ ขอบคุณ
มะนาวที่ถูกทำลายได้

ที่จริงแล้วลิงค์กำลังเล่นกอล์ฟรหัสและนั่นคือเหตุผลที่ฉันวางไว้ที่นั่น
Erik the Outgolfer

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

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'

คุณสามารถใช้ ascii ใน Python ได้ไหม? ถ้าใช่คุณสามารถใช้47<x<58|64<x<91:)
aloisdg พูดว่า Reinstate 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

ทำไมต้องแฮค คุณไม่สามารถใช้หรือแทนได้หรือ แฮคเกอร์มีความซับซ้อนมากขึ้นและทำให้ AFAIK ช้าลง x.isupper()^x.isdigit()->x.isupper()|x.isdigit()
Erik the Outgolfer

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

โปรแกรมทดสอบ

ต้องการหนึ่งพารามิเตอร์สตริงที่จะใช้ใน 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;
}

ทำไมคุณคัดลอกองค์ประกอบ argv
mame98

เพราะฟังก์ชั่นปรับเปลี่ยนการป้อนข้อมูล ฉันไม่แน่ใจว่าการแก้ไขพารามิเตอร์ในสถานที่นั้นเป็นพฤติกรรมที่กำหนดไว้
owacoder

ไม่เคยคิดเกี่ยวกับเรื่องนี้ ... ตามคำตอบนี้ดังนั้นควรจะดี: 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"

การใช้

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

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

1
คุณกำลังใช้replicate, lengthและfเฉพาะในชุดนี้เพื่อให้คุณสามารถผสานให้เป็นหนึ่งในฟังก์ชั่นและเรียกมันเหมือนr=replicate.length.f r n '-'คุณสามารถบันทึกไบต์มากยิ่งขึ้นโดยใช้ผู้ประกอบการมัด: (#)=replicate.length.fและ/n#'-' n#' 'นอกจากนี้replicate.lengthคือ >>(ด้วยสตริงเดี่ยวแทนที่จะเป็นอักขระ) ดังนั้นจึงเป็น: (#)=(>>).fและn#"-"/ n#" "ซึ่งทั้งคู่ไม่มีโดย( )รอบ
nimi

1
... ยังไม่มีความจำเป็นในการ( )รอบและt n เป็น ทั้งหมดในทั้งหมด: . f 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 (ส่ง 'end of file')



1

R, 108 ไบต์

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

คำอธิบาย

ออกไปจากด้านในสู่ด้านนอก (เพราะคนที่ไม่ชอบกำหนดตัวแปรทั่วโลกจากภายใน regex) สมมติว่าsเป็นสตริงอินพุตของเรา

y<-gsub("[^A-Z0-9]","",s) เก็บเมืองหลวงและตัวเลขกำหนดค่าผลลัพธ์ให้กับ y

gsub(".","-",y<-...) แทนที่อักขระทั้งหมดด้วยเครื่องหมายขีดกลางด้านบน

x<-gsub("(.*)","+\\1+\n",gsub(...)) chucks +บนปลายทั้งสองของยัติภังค์และขึ้นบรรทัดใหม่และเราเก็บมันไว้เป็น x

ส่วนที่เหลือค่อนข้างตรงไปตรงมาให้ส่งออกตามลำดับที่เหมาะสมและใช้ความจริงที่ว่าจำนวนช่องว่างก่อนหน้าvจะเท่ากับความยาวของ y


1

Brachylog 61 ไบต์

เชื่อมโยงกับพื้นที่เก็บข้อมูลที่ 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}(คุณไม่เคยวงเล็บหนึ่งใน arguents ในฟังก์ชั่นการโต้แย้งกลับเมื่อเล่นกอล์ฟมันมักจะอยู่ในลำดับปกติเพื่อบันทึก byte)
Zacharý

1

Perl, 57 ไบต์

56 รหัสไบต์ + 1 -pสำหรับ

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

ฉันพยายามทำสิ่งนี้โดยใช้ regexes แต่มันใหญ่กว่าที่ฉันคาดไว้มากดังนั้นฉันจึงใช้การทำซ้ำสตริงแทน

ลองออนไลน์!


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

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

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

การใช้งาน:

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

CL-USER 3 > (f "pcg")
+---+
|pcg|
+---+
   v
NIL
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.