สตริงของอักขระตัวอักษรผสมตัวเลขในรายการที่เรียงลำดับของช่วงที่คั่นด้วยเครื่องหมายจุลภาค


12

กำหนดสตริงของตัวอักษรและตัวเลขที่ไม่เรียงลำดับเช่น

ABC321STPpJqZZr0

เอาท์พุทรายการ "," - คั่นช่วงของอักขระ, เรียงลำดับตามค่า ASCII, ละเว้นตัวพิมพ์ใหญ่และลบรายการที่ซ้ำกัน ( เช่นเอาท์พุทเฉพาะตัวพิมพ์ใหญ่และตัวอักษรตัวเลข) เช่น

0-3, A-C, J, P-T, Z

กฎระเบียบ

  • ความยาวของโปรแกรมคือคะแนนฐานของคุณตามปกติ
  • คุณต้องเริ่มต้น (hardcode) ตัวอย่างข้างต้นภายในโปรแกรมของคุณ แต่คุณอาจลดความยาวของตัวอย่างนั้นจากความยาวโปรแกรมของคุณเช่นสำหรับchar* s="ABC321STPpJqZZr0";คุณอาจลด 16 ตัวอักษรอีก 11 ตัวอักษรนับเป็นความยาวโปรแกรมของคุณ

โบนัส (+50 เงินรางวัล)

  • เนื่องจากนี่เป็นปัญหาจริงที่เพื่อนร่วมงานของฉันพบในวันนี้จำเป็นต้องเขียนในTcl 8.0.5 (เวอร์ชั่นโบราณขาด Tcl บิวด์อินล่าสุด) ฉันจะให้คะแนน 50 คะแนนกับคนที่เขียน Tcl 8.0 ที่สั้นที่สุด .5 โซลูชันถ้ามีการส่งที่ถูกต้องอย่างน้อย 2 รายการใน Tcl 8.0.5

@FezVrasta - ฉันตั้งใจเขียน", "เพื่อรวมช่องว่าง แต่เราสามารถออกจากการแก้ไขของคุณและให้ความคิดเห็นนี้เป็นตัวบ่งชี้ว่า
Andrew Cheong

เหตุใดจึงต้องรวม GolfScript ด้วย ทำไมไม่อนุญาตให้ใช้ภาษาอื่นเช่น Befunge
Justin

เราสามารถพูดได้ทั้งหมดเป็นเกมที่ยุติธรรม ฉันไม่สามารถตรวจสอบพวกเขาส่วนใหญ่ได้อย่างง่ายดาย
Andrew Cheong

นั่นคือแท็ก Code-Golf ใช่ไหม
VisioN

1
@Chron - จับได้ดี AB ในกรณีของฉัน แต่เนื่องจากมีการส่งจำนวนมากแล้วให้ทั้งสองวิธี
Andrew Cheong

คำตอบ:


5

ทับทิม, 87-16 = 71

แก้ไข: ต้องเพิ่มตัวละครบางตัวเพื่อให้ช่วงสองอักขระแสดงอย่างถูกต้อง ใช้?[แทน?Zการแก้ไขข้อผิดพลาดด้วยช่วงที่ลงท้ายด้วย Z

$><<[*?0..?[].join.gsub(/[^ABC321STPpJqZZr0]/i,$/).gsub(/\B.+\B/,?-).scan(/.-.|./)*', '

คุณสามารถดูระยะ Ideone ที่นี่


+1 สำหรับหนึ่งซับ ใช้วิธีการต่าง ๆ อย่างชาญฉลาดมาก มันยอดเยี่ยมจริงๆ
daniero

1
โปรดทราบว่าgsub(/[]/i)สั้นกว่าtr(''.upcase)2 ตัวอักษร ยิ่งกว่านั้นscan(/.+/)-> splitบันทึก 5 และ$><<แทนที่จะเป็นputsอีกอันหนึ่ง
Howard

@Howard คำแนะนำที่ดีขอบคุณ!
Paul Prestidge

2

จูเลีย, 131

julia> l=sort(unique(uppercase("ABC321STPpJqZZr0")))
julia> prod([!(c+1 in l)?"$c"*(c==l[end]?"":", "):!(c-1 in l)?"$c":(c+1 in l)&&!(c+2 in l)?"-":"" for c in l])

"0-3, A-C, J, P-T, Z"

ไม่สนับสนุนโดย Ideone.com และอาจถูกบีบอัดอยู่ดี


1
ขอขอบคุณ! ข้อ จำกัด ของ Ideone.com เป็นเพียงเพื่อให้ฉันสามารถทดสอบได้ แต่ฉันคิดว่าฉันสามารถเชื่อถือความสมบูรณ์ของนักกอล์ฟและลบกฎนั้นได้ +1 อย่างไรก็ตาม
Andrew Cheong

2

C #, 221 ไบต์

class P{
    static void Main(){
        var s="ABC321STPpJqZZr0";
        var l=new int[257];
        foreach(int c in s.ToUpper())
            l[c]=1;
        var r="";
        for(int i=0;i<255;){
            if(l[i++]-l[i]<0)
                r+=", "+(char)i;
            else if(l[i+1]-l[i]<0)
                r+="-"+(char)i;
        }
        System.Console.Write(r.Substring(2));
    }
}

2

C, 193

char*s="ABC321STPpJqZZr0";
int c[99];memset(c,0,396);while(*s){++c[toupper(*s++)];}for(int i=0,f=1,r=0;
i<=99;++i){if(!r&&c[i])r=i;if(r&&!c[i]){if(!f)printf(", ");putchar(r);
if(i-r>1)printf("-%c",i-1);r=f=0;}}

คุณสามารถเพิ่มคำอธิบายเล็ก ๆ ได้ไหม?
จัสติน

ทำซ้ำสตริงการสะสมจำนวนอินสแตนซ์ของอักขระตัวอักษรและตัวเลขแต่ละตัว จากนั้นวนซ้ำตัวอักษรและตัวเลขทั้งหมดตามลำดับตัวอักษรเขียนจุดเริ่มต้นของแต่ละช่วงกะทัดรัดและหากเหมาะสมเส้นประจะตามด้วยจุดสิ้นสุดของช่วง หากนี่ไม่ใช่ช่วงแรกที่เขียนขึ้นให้เพิ่มตัวคั่นจุลภาค รหัสจะต้องถูกฝังอยู่ในฟังก์ชั่น main () ที่มีส่วนหัวที่เหมาะสม (stdio, string, ctypes) รวมอยู่ด้วยดังนั้นฉันจึงโกงที่นั่น
warrenm

2

GolfScript 57 54 52

 'ABC321STPpJqZZr0'
 {.95>32*-}%.|:x..{(}%&-x..{)}%&-+$2/{.|'-'*}%', '*

ลองมันนี่

รหัสแรกเป็นตัวพิมพ์ใหญ่ทุกอย่าง:

{.95>32*-}%

จากนั้นรับอักขระที่ไม่ซ้ำกันและบันทึกไว้ในตัวแปร:

.|:x

จากนั้นเราจะได้ตัวละครที่มีรุ่นก่อนตรงไม่ได้อยู่ในสตริง (เพื่อให้พวกเขาเป็นส่วนเริ่มต้นของช่วง):

..{)}%&-x

x..{)}%&-ในทำนองเดียวกันเราได้รับปลายของช่วงที่มี

ตอนนี้สร้างช่วงโดยการเชื่อมต่อรายการเรียงลำดับและแยกเป็นกลุ่ม 2:

+$2/

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


1
ในผลลัพธ์ช่วงจะต้องคั่นด้วย ',' และไม่ใช่แค่ ','
Paul Prestidge

1
นอกจากนี้.95>{32-}{}if-> .95>32*-บันทึก 5 ตัวอักษร
โฮเวิร์ด

@ วิธีการที่ยอดเยี่ยม! ฉันรู้ว่าส่วนนั้นไม่ดี
Ben Reich

1
@Chron แก้ไขปัญหาพื้นที่!
Ben Reich


1

Python 2.x, 304 - 16 = 288

นี่สามารถเล่นกอล์ฟต่อไปได้แน่นอนความคิดเห็นทั้งหมดยินดีต้อนรับ!

e=[""]*11;f=[""]*27
for c in"ABC321STPpJqZZr0".lower():e["0123456789".find(c)]=f["abcdefghijklmnopqrstuvwxyz".find(c)]=c
e[-1]=f[-1]=""
def h(j):
 g=[];k=l=i=0
 for e in j:
  if e:
   if not l:k=i;l=1
  elif l:l=g.append((k,i-1))
  i+=1
 print", ".join([j[m],j[m]+"-"+j[n]][n-m>1]for m,n in g)
h(e);h(f)

1

Rebol (218 - 16 = 202)

m: s: sort uppercase unique"ABC321STPpJqZZr0"i: :to-integer f: does[either 1 = length? x: copy/part m s[x][rejoin[x/1"-"last x]]]while[not tail? s: next s][if(1 + i pick back s 1)!=(i s/1)[prin join f", "m: s]]print f

รุ่นที่ไม่ย่อเล็กสุด:

m: s: sort uppercase unique "ABC321STPpJqZZr0"
i: :to-integer

f: does [
    either 1 = length? x: copy/part m s [x] [rejoin [x/1 "-" last x]]
]

while [not tail? s: next s][
    if (1 + i pick back s 1) != (i s/1) [
        prin join f ", "
        m: s
    ]
]

print f

1

q [116 ตัวอักษร]

{.a:();{m:6h$x;.a:.a,$[m[1]=1+m[0];45;m[0],44,m 1];1_x}/[x:asc distinct upper x];p where differ 6h$p:-3_10h$x[0],.a}

การใช้

{.a:();{m:6h$x;.a:.a,$[m[1]=1+m[0];45;m[0],44,m 1];1_x}/[x:asc distinct upper x];p where differ 6h$p:-3_10h$x[0],.a}"ABC321STPpJqZZr0"
เอาท์พุต
"0-3,A-C,J,P-T,Z"

มีขอบเขตของการบันทึกตัวอักษรฉันจะลองวิธีอื่นและโพสต์


0

Tcl 8.0.5, 344 (360 ไบต์)

set a ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
set s string
set x [join [lsort [split [$s toupper ABC321STPpJqZZr0] ""]] ""]
regsub -all (.)\\1+ $x \\1 x
set i 36
while {[incr i -1]} {set j -1
while {$i+[incr j]<36} {set y [$s range $a $j [expr $i+$j]]
regsub $y $x [$s index $y 0]-[$s index $y end],\  x}}
while {[regsub -all {(\w)(\w)} $x {\1, \2} x]} {}
puts $x

Tcl 8.0.5, 340 (356 ไบต์)

การซ่อมด้วยrenameคำสั่งทำให้ได้เทคนิคที่สนุก! ฉันได้รับการบันทึกพวกเขาในหัวข้ออื่น

rename rename &
& set =
& regsub R
& string S
& while W
= a ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
= x [lsort [split [S toupper ABC321STPpJqZZr0] ""]]
R -all {(.) \1+| } $x \\1 x
= i 36
W {[incr i -1]} {= j -1
W {$i+[incr j]<36} {= y [S range $a $j [expr $i+$j]]
R $y $x [S index $y 0]-[S index $y end],\  x}}
W {[R -all {(\w)(\w)} $x {\1, \2} x]} {}
puts $x

Tcl 8.0.5, 332 (348 ไบต์) [ไม่เสถียร - ขึ้นอยู่กับ $ PATH]

info script ""
set tcl_interactive 1
set a ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
set x [lso [sp [st toupper ABC321STPpJqZZr0] ""]]
regs -all {(.) \1+| } $x \\1 x
set i 36
wh {[inc i -1]} {set j -1
wh {$i+[inc j]<36} {set y [st range $a $j [exp $i+$j]]
regs $y $x [st index $y 0]-[st index $y end],\  x}}
wh {[regs {(\w)(\w)} $x {\1, \2} x]} {}
pu $x

เครดิต@JohannesKuhnสำหรับเคล็ดลับการโต้ตอบ


1
บางครั้งคุณสามารถบันทึกไบต์แทนที่whileด้วยการtimeสร้าง codegolf.stackexchange.com/a/126236/29325
sergiol
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.