字母数字字符的字符串,以逗号分隔范围的排序列表


12

给定一串未排序的字母数字字符,例如

ABC321STPpJqZZr0

输出一个“,”分隔的字符范围列表,按ASCII值排序,忽略大小写并删除重复项(仅输出大写和数字字符),例如

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

规则

  • 程序的长度通常是您的基本分数。
  • 您必须在程序中初始化(硬编码)上面的示例,但是您可以从程序长度中减去该示例的长度,例如char* s="ABC321STPpJqZZr0";您可以折扣16个字符,其他11个字符计入您的程序长度。

红利(+50赏金)

  • 由于这是我的同事今天遇到的一个实际问题,需要用Tcl 8.0.5(一个古老的版本,缺少许多最新的Tcl内置插件)编写,因此我将向写最短Tcl 8.0的任何人奖励50分.5解决方案,如果Tcl 8.0.5中至少有2个有效提交。

@FezVrasta-我故意写出", "要包含空格的内容,但我们可以保留您的编辑,并让此注释作为指示。
Andrew Cheong

为什么要故意包含GolfScript?为什么不允许其他语言,例如Befunge?
贾斯汀2014年

我们可以说一切都是公平的游戏。我只是无法很容易地检查大多数。
Andrew Cheong 2014年

那是Code-Golf标签吗?
2014年

1
@Chron-很好。就我而言,AB,但是由于已经有很多提交,所以让我们允许两种方式。
Andrew Cheong 2014年

Answers:


5

红宝石,87-16 = 71

编辑: 必须添加一些字符,以便正确显示两个字符的范围。还使用?[而不是?Z来修复范围以Z结尾的错误。

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

您可以在此处看到Ideone 。


+1为单线。非常巧妙地使用各种方法;这真是太好了。
daniero 2014年

1
请注意,该字符gsub(/[]/i)tr(''.upcase)2个字符短。此外,scan(/.+/)-> split保存5,而$><<不是puts另一个。
霍华德

@霍华德伟大的建议,谢谢!
Paul Prestidge 2014年

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 2014年

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

高尔夫脚本 57 54 52

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

在这里尝试。

该代码首先将所有内容大写:

{.95>32*-}%

然后获取唯一字符并将其保存在变量中:

.|:x

然后,我们获得其直接前任字符不在字符串中的字符(因此它们是范围的开始部分):

..{)}%&-x

类似地,我们使用来获得范围的终点x..{)}%&-

现在,实际上是通过串联列表,排序并分成2组来形成范围:

+$2/

其余的只是格式化,*用作字符串连接。


1
在输出中,需要用“,”而不是“,”分隔范围
Paul Prestidge 2014年

1
同样.95>{32-}{}if-> .95>32*-保存5个字符。
霍华德

@霍华德太好了!我知道那部分不是最理想的。
本·赖希2014年

1
@Chron修复了空间问题!
本·赖希2014年

2

问94

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

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
有时,您可以保存字节whiletime构造代替。codegolf.stackexchange.com/a/126236/29325
sergiol
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.