Language agnostic 代码:数字范围 挑战

Language agnostic 代码:数字范围 挑战,language-agnostic,code-golf,Language Agnostic,Code Golf,通过用范围替换连续运行来压缩一长串数字 例子 输入 1,2,3,4,7,8,10,12,13,14,15 输入保证按升序排列,并且不包含重复项 输出 1-4,7,8,10,12-15 请注意,两个数字的范围应保持不变。(7,8;不是7-8) 规则 您可以从命令行或中的标准接受整数(或等效数据类型)的排序列表作为方法参数。(选择代码较短的选项) 您可以通过打印字符串或返回单个字符串或字符串集来输出字符串列表 参考实现 (C#) IEnumerable示例(IList输入){ 对于(int i=0;

通过用范围替换连续运行来压缩一长串数字

例子 输入
1,2,3,4,7,8,10,12,13,14,15

输入保证按升序排列,并且不包含重复项

输出
1-4,7,8,10,12-15

请注意,两个数字的范围应保持不变。(
7,8
;不是
7-8

规则 您可以从命令行或中的标准接受整数(或等效数据类型)的排序列表作为方法参数。(选择代码较短的选项)
您可以通过打印字符串或返回单个字符串或字符串集来输出字符串列表

参考实现 (C#)

IEnumerable示例(IList输入){
对于(int i=0;i2)
收益率返回起点+“-”+(起点+大小-1);
}
}
Ruby,165个字符
a=[]
def o(a)打印“{@s}{a[0]}{a.sizePython,98个字符
Python-86字符
这个结尾不包括一个额外的“,”

f=lambda a:''.join(`x`+",-"[(x+1in a)&x+2in a]for x in a if(x-1in a)&(x+1in a)^1)[:-1]
C++,166个字符 F#,188查尔 更具可读性:

let range (x::xs) =
  let f = printf
  let print x = function
    | 1 -> f "%A " x
    | 2 -> f "%A %A " x (x+1)
    | n -> f "%A-%A " x (x+n-1)
  let rec loop x n = function
    | y::ys when y=x+n ->
        loop x (n+1) ys
    | y::ys ->
        print x n
        loop y 1 ys
    | [] ->
        print x n
  loop x 1 xs
通用Lisp,442/206字符 “d”函数将输入列表重写为规范形式。为了好玩,我完全是递归地这样做的。“p”函数将输出格式化为与参考实现等效的格式。

Python,83个字符 红宝石:123个字符 PHP95字符 (实际上,这是继python之后的第二种语言)

给定
$a=数组(数字);

算法:

for($i=0;$i<count($a);$i++){$c=$i;while($a[$i+2]==$a[$i]+2)$i++;echo $a[$c],$i-$c>1?'-':',';}
($i=0;$i1?'-':',;)的


CW的问题是。我还认为程序员应该是code golf应该去的地方(至少根据FAQ和Jeffs的帖子).@Oded、@SLaks,从现在起,这里是代码高尔夫的合适位置。CW请求应该通过旗帜来完成,而不是通过问题中的提示。我已经为您完成了。像这些代码高尔夫和其他谜题一样?提交。重复的问题,并且已经在中发布了一个扰流板。请不要在此处发布解决方案,这样解决方案就不会被忽略如果x-1不在a或x+1不在a:print x,“,-”[x+1在a和x+2在a],
是短的,我不太懂python,但这不是额外打印一条吗?”最后呢?复制并粘贴你的第一个片段实际上已经超过83个了chars@yes:你把换行符计算为两个字符。很好,但是为什么会在x附近回跳呢?@TomaszGandor:老实说,我不确定(这已经很老了!)。似乎没有反勾号就可以正常工作,是的…实际上这会引发关于未定义偏移量的通知…但是,嘿,规则没有说stderr必须是干净的…但是输出格式不太正确。编辑:它也没有说明输入的来源,因此95个字符无效imho@luxifer当前位置我不太记得这个问题了,我不会的请重新编辑我的脚本,我将进行更新
#define o std::cout
void f(std::vector<int> v){for(int i=0,b=0,z=v.size();i<z;)i==z-1||v[i+1]>v[i]+1?b?o<<", ":o,(i-b?o<<v[b]<<(i-b>1?" - ":", "):o)<<v[i],b=++i:++i;}
#define o std::cout
void f(std::vector<int> v){
    for(int i=0,b=0,z=v.size();i<z;)
        i==z-1||v[i+1]>v[i]+1 ?
            b?o<<", ":o,
            (i-b?o<<v[b]<<(i-b>1?" - ":", "):o)<<v[i],
            b=++i
        :++i;
}
let r(x::s)=
 let f=printf
 let p x=function|1->f"%A "x|2->f"%A %A "x (x+1)|n->f"%A-%A "x (x+n-1)
 let rec l x n=function|y::s when y=x+n->l x (n+1)s|y::s->p x n;l y 1 s|[]->p x n
 l x 1 s
let range (x::xs) =
  let f = printf
  let print x = function
    | 1 -> f "%A " x
    | 2 -> f "%A %A " x (x+1)
    | n -> f "%A-%A " x (x+n-1)
  let rec loop x n = function
    | y::ys when y=x+n ->
        loop x (n+1) ys
    | y::ys ->
        print x n
        loop y 1 ys
    | [] ->
        print x n
  loop x 1 xs
(defun d (l)
  (if l
      (let ((f (car l))
        (r (d (cdr l))))
      (if r
          (if (= (+ f 1) (caar r))
          (push `(,f ,(cadar r)) (cdr r))
          (push `(,f ,f) r))
          `((,f ,f))
          ))
      nil))

(defun p (l)
  (mapc #'(lambda (x)
          (if (= (car x) (cadr x))
          (format t "~a " (car x))
          (if (= (+ 1 (car x)) (cadr x))
              (format t "~a ~a " (car x) (cadr x))
              (format t "~a-~a " (car x) (cadr x)))))
      (d l)))
def f(l,a=2):
 for x in l:
  b,a=a,(x+1in l)*(x-1in l)
  if a<1:print',- '[b],`x`,
>>> l=[1, 2, 3, 4, 7, 8, 10, 12, 13, 14, 15]
>>> f(l)
  1 - 4 , 7 , 8 , 10 , 12 - 15
def y(n) t=[];r=[];n.each_with_index do |x,i| t<<x;if(x.succ!=n[i+1]);r=((t.size>2)?r<<t[0]<<-t[-1]:r+t);t=[];end;end;r;end
def y(n) 
t=[];r=[];
n.each_with_index do |x,i|
 t << x
 if (x.succ != n[i+1])
    r = ((t.size > 2) ? r << t[0] << -t[-1] : r+t)  
    t=[]
 end
 end
 r
end
 > n=[1, 2, 3, 4, 7, 8, 10, 12, 13, 14, 15]
 > y n
 => [1, -4, 7, 8, 10, 12, -15]
for($i=0;$i<count($a);$i++){$c=$i;while($a[$i+2]==$a[$i]+2)$i++;echo $a[$c],$i-$c>1?'-':',';}