Chuỗi các ký tự chữ và số vào danh sách các phạm vi được phân tách bằng dấu phẩy


12

Cho một chuỗi các ký tự chữ và số chưa được sắp xếp, vd

ABC321STPpJqZZr0

xuất ra một danh sách các phạm vi ký tự "," được sắp xếp theo thứ tự, được sắp xếp theo giá trị ASCII, bỏ qua trường hợp và loại bỏ trùng lặp ( nghĩa là chỉ xuất ra chữ hoa và ký tự số), vd

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

Quy tắc

  • Độ dài của chương trình là điểm cơ bản của bạn, như thường lệ.
  • Bạn phải khởi tạo (hardcode) ví dụ trên trong chương trình của bạn, nhưng bạn có thể giảm giá theo chiều dài của ví dụ mà từ chiều dài chương trình của bạn, ví dụ như cho char* s="ABC321STPpJqZZr0";bạn có thể giảm giá 16 chars, 11 chars khác bị tính vào chiều dài chương trình của bạn.

Tiền thưởng (+50 tiền thưởng)

  • Vì đây là một vấn đề thực sự mà đồng nghiệp của tôi gặp phải ngày hôm nay, cần phải được viết trong Tcl 8.0.5 (phiên bản cổ, thiếu nhiều bản dựng Tcl mới nhất), tôi sẽ trao 50 điểm cho bất kỳ ai viết Tcl 8.0 ngắn nhất .5 giải pháp, nếu có ít nhất 2 lần gửi hợp lệ trong Tcl 8.0.5.

@FezVrasta - Tôi cố tình viết ", "để bao gồm khoảng trắng , nhưng chúng tôi có thể để lại chỉnh sửa của bạn và để nhận xét này phục vụ như chỉ dẫn đó.
Andrew Cheong

Tại sao cố ý bao gồm GolfScript? Tại sao không cho phép các ngôn ngữ khác, chẳng hạn như Befunge?
Justin

Có thể nói tất cả là trò chơi công bằng. Tôi sẽ không thể kiểm tra hầu hết chúng một cách dễ dàng.
Andrew Cheong

Vậy đó có phải là thẻ Code-Golf không?
VisioN

1
@Chron - Bắt tốt. AB trong trường hợp của tôi nhưng vì đã có nhiều bài nộp, hãy cho phép cả hai cách.
Andrew Cheong

Câu trả lời:


5

Hồng ngọc, 87-16 = 71

EDIT: Phải thêm một số ký tự để phạm vi hai ký tự được hiển thị chính xác. Cũng sử dụng ?[thay vì ?Zđể sửa một lỗi có phạm vi kết thúc bằng Z.

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

Bạn có thể thấy Ideone chạy ở đây .


+1 Đối với một lớp lót. Sử dụng rất thông minh các phương pháp khác nhau; Điều này thực sự tuyệt vời.
daniero

1
Lưu ý rằng gsub(/[]/i)ngắn hơn tr(''.upcase)2 ký tự. Hơn nữa, scan(/.+/)-> splittiết kiệm 5, và $><<thay vì putsmột cái khác.
Howard

@Howard Gợi ý tuyệt vời, cảm ơn!
Paul Prestidge

2

Julia, 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"

Không được hỗ trợ bởi Ideone.com, và có lẽ sẽ bị nghiền nát.


1
Dẫu sao cũng xin cảm ơn! Ràng buộc của Ideone.com chỉ để tôi có thể kiểm tra nhưng tôi cho rằng tôi có thể tin tưởng vào sự chính trực của người chơi golf và loại bỏ quy tắc đó. +1, dù sao đi nữa.
Andrew Cheong

2

C #, 221 byte

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

Bạn có thể thêm một lời giải thích nhỏ?
Justin

Lặp lại chuỗi, tích lũy số lượng phiên bản của mỗi ký tự chữ và số. Sau đó, lặp lại tất cả các ký tự chữ và số theo thứ tự bảng chữ cái, viết ra bắt đầu của mỗi phạm vi nhỏ gọn và, nếu phù hợp, một dấu gạch ngang theo sau là kết thúc của phạm vi. Nếu đây không phải là phạm vi đầu tiên được viết, hãy thêm dấu phân cách dấu phẩy. Mã phải được nhúng trong hàm main () với các tiêu đề thích hợp (stdio, chuỗi, ctypes), vì vậy tôi đã bị lừa ở đó.
warrenm

2

GolfScript 57 54 52

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

Hãy thử nó ở đây .

Mã đầu tiên viết hoa mọi thứ:

{.95>32*-}%

Sau đó nhận được các ký tự duy nhất và lưu nó trong một biến:

.|:x

Sau đó, chúng tôi nhận được các ký tự có tiền thân trực tiếp không nằm trong chuỗi (để chúng là phần đầu của một phạm vi):

..{)}%&-x

Chúng tôi tương tự nhận được kết thúc của phạm vi với x..{)}%&-.

Bây giờ thực sự hình thành các phạm vi bằng cách ghép các danh sách, sắp xếp và chia thành các nhóm 2:

+$2/

Phần còn lại chỉ là định dạng, sử dụng *như chuỗi tham gia.


1
Trong đầu ra, các phạm vi cần được phân tách bằng ',' và không chỉ ','
Paul Prestidge

1
Ngoài ra .95>{32-}{}if-> .95>32*-lưu 5 ký tự.
Howard

@Howard Tuyệt vời! Tôi biết rằng một phần là tối ưu.
Ben Reich

1
@Chron Đã sửa lỗi không gian!
Ben Reich

2

Q, 94

{","sv(,/){{"-"sv(?) -1 1#\:x}'[cut[;a]0,1_(&)1<(-':)"i"$'a:asc upper[x]inter y]}[x]'[.Q`n`A]}

1

Trăn 2.x, 304 - 16 = 288

Điều này chắc chắn có thể được chơi golf hơn nữa, tất cả các ý kiến ​​hoan nghênh!

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

Nổi loạn (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

Phiên bản không rút gọn:

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 ký tự]

{.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}

Sử dụng

{.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"
Đầu ra
"0-3,A-C,J,P-T,Z"

Có một phạm vi lưu ký tự, tôi sẽ thử một số phương pháp khác và đăng nó.


0

Tcl 8.0.5, 344 (360 byte)

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

Nháy mắt với renamelệnh mang lại một số thủ thuật thú vị! Tôi đã ghi lại chúng trong một chủ đề khác .

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 byte) [Không ổn định phụ thuộc vào $ 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

Tín dụng cho @JohannesKuhn cho thủ thuật tương tác .


1
Đôi khi bạn có thể lưu byte thay thế whilebằng các timecấu trúc. codegolf.stackexchange.com/a/126236/29325
sergiol
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.