返回一组数字中的每个数字


11

挑战

程序必须返回包含在一组数字(用逗号和连字符分隔的序列)中的所有数字。

规则

  • s 是序列字符串;
  • 其中的所有数字s均为 ;
  • 数量总是会增加 ;
  • 数字永远不会重复
  • 当您回答时,显示输出 s="1,3-5,9,16,18-23"

例子

input(s)    outputs
-----------------
1           1
1,2         1,2
1-4         1,2,3,4
1-4,6       1,2,3,4,6
1-4,8-11    1,2,3,4,8,9,10,11

祝好运。=)


1
我们是否会遇到输入序列不会不断增加的情况,例如:4-9,1-21-3,9-6
马特

1
还是重叠?输出是否必须排序并且不包含重复项?
彼得·泰勒

@Gareth是的,这是一个代码高尔夫,然后请投票给我最短的答案。马特和彼得,我编辑了问题,请检查。谢谢!
BernaMariano

它必须是一个完整的程序,并且输出格式是否受到限制?
布拉德·吉尔伯特b2gills,2015年

Answers:


6

GolfScript(24个字符)

','/{~.,!{~)),>~}*}%','*

例如

$ golfscript.rb expand.gs <<<"1,3-5,9,16,18-23"
1,3,4,5,9,16,18,19,20,21,22,23

我实际上有四个24字符的解决方案,但是我选择了这个解决方案,因为它没有任何字母数字字符。

这个怎么运作

# On the stack: a string such as "1,3-5,9,16,18-23"
','/
# Split on commas to get ["1" "3-5" "9" "16" "18-23"]
{
    # This is executed for each of those strings in a map
    # So stack holds e.g. "1" or "3-5"

    # Evaluate the string.
    # If it's a single number, this puts the number on the stack.
    # Otherwise it's parsed as a positive number followed by a negative number.
    ~
    # Stack holds e.g. 1 or 3 -5
    # Duplicate the last element on the stack and make a list of that length.
    # If it's negative or zero, the list will be empty
    .,
    # Negate. An empty list => 1; a non-empty list => 0
    !
    # If the string was a single number "n", the stack now holds n 0
    # If the string was a range "m-n", the stack now holds m -n 1
    # The following block will be executed 0 times for "n" and once for "m-n"
    {
        # Here we rely on twos-complement numbers satisfying ~n = -n -1
        # Stack: m -n
        ~))
        # Stack: m -(-n)-1+2  =  m n+1
        ,
        # Stack: m [0 1 2 ... n]
        >
        # Stack: [m m+1 ... n]
        ~
        # Stack: m m+1 ... n
    }*
}%
# On the stack: e.g. [1 3 4 5 9 16 18 19 20 21 22 23]
','*
# Joined by , to give the desired output

如何在不使用单个字符的情况下将3-5扩展为3,4,5 -
BernaMariano 2012年

@BernaMariano,对不起,我以某种方式错过了您的问题。我将详细解释扩展答案。
彼得·泰勒

7

Perl 25 26 25

$_ 是序列字符串

s/-/../g;$_=join",",eval

会话示例:

[~/] $ perl -M5.010 -pe 's/-/../g;$_=join",",eval' <<< "1,3-5,9,16,18-23"
1,3,4,5,9,16,18,19,20,21,22,23

为选项的字符计数增加了1个字符(感谢Gareth,.. kinda)。-n-p


我可能已经完成了错误的字符计数(使用命令行选项)。请随时纠正我的计算问题
ardnew

按照meta该问题的答案,您只需为该n选项添加1个字符。
Gareth 2012年

删除-M5.010和交流-e-E
吉尔伯特b2gills

4

golfscript,46 45

我的第一个高尔夫脚本程序需要几个小时才能完成。

{','/{'-'/{~}%.,1-{))+{,}/\-~}{~}if}%","*}:r; 

# call:
"1,3-5,9,16,18-23"r

# return:
1,3,4,5,9,16,18,19,20,21,22,23

您可以在http://golfscript.apphb.com/上尝试

我最好的解释是这种暴行:

{...}:r;     # makes a function block ... and names it r

','/         # slices the top element of stack from each ','
             # so we get ["1" "3-5" "9" "16" "18-23"]

{...}%       # makes a function block ... and calls it for 
             # each element in the list

'-'/{~}%     # slices the list by '-' and evals each element 
             # from string to int. ["1"] becomes [1], 
             # ["3-5"] becomes [3 5]

.,1-         # adds the length of the list -1 on top of the stack
             # so for [1] the stack becomes [1] 0, for [3 5]
             # it becomes [3 5] 1

# next we add two function blocks, they, like the 0/1 just before
# are used by an if clause a tiny bit later. First block is for 
# lists that have a 1 on top of them, the latter for ones with 0.

# First block, we have something like [3 5]

))+          # pops the top element of the array, increments 
             # it and puts back. [3 6]

## It seems {...}%~ is same as {...}/
## this is why these two are not in the code any more

{,}%         # , makes a list from 0 to n-1, where n is the parameter
             # so we get [[0 1 2] [0 1 2 3 4 5]]

~            # Dumps the outer array, [0 1 2] [0 1 2 3 4 5]

\            # swaps the two arrays

-            # set complement [3 4 5]

~            # dumps the array, so the elements are left in the stack

# Second block, we have something like [16]

~            # just dumps the array, 16

# Blocks end

if           # takes the top three elements of the stack, evaluates the 
             # first (0 or 1), runs second if true (anything but 
             # [], "", 0 or {} ), otherwise the third.

","*         # joins an array with ","

编辑1:将最后一个{}%〜更改为{} /,我的描述也可能是错误的。


2
+1,因为任何在GolfScript中进行程序的人都可以得到。
Gareth 2012年

@加雷斯谢谢。我首先以为我会以perl的方式进行操作:将-更改为..并对其进行评估。然后我找不到建立任何数组的任何明智方法,所以我做到了。我确信有人会用golfscript带来大约20个字符的解决方案。
shiona 2012年

我目前有24个人,所以我将以20个人为挑战;)不过,您可以轻松保存一些。该问题需要一个程序而不是一个函数,因此您可能会丢失首字母{和最后一个}:r;,也可以通过替换1-为来保存一个(。(顺便说一句,IIRC是我在第一个GolfScript程序中也错过的一个技巧)
Peter Taylor

PS {...}%~和之间有细微的差别{...}/。如果您要使用堆栈访问更远的内容,integer $则第一个比较简单,因为您不必每次都调整整数以补偿剩余的内容。
彼得·泰勒

4

R,44个字节

`-`=seq;eval(parse(t=c("c(",scan(,""),")")))

在线尝试!

重新定义-为均值seq(即:),将输入括起来c()并评估相应的表达式。


3

K,47

","/:,/${x+!1+y-x}.'2#'a,'a:"I"$'"-"\:'","\:0:0

测试用例

k)","/:,/${x+!1+y-x}.'2#'a,'a:"I"$'"-"\:'","\:0:0
1,3-5,9,16,18-23
"1,3,4,5,9,16,18,19,20,21,22,23"

","/:$,/{{x+!1+y-x}. 2#"J"$"-"\:x}'","\:0:0对于43个字节
streetster '19

3

果冻,9字节

⁾-ryṣ”,VF

在线尝试!

   y         Replace
⁾-r          hyphens with the letter r,
    ṣ”,      split on commas,
       V     evaluate every element,
        F    and flatten.

范围dyad r在其任一侧接受两个参数,并在它们之间产生一个包含范围。


2

J,53 43 41 39 38个字符

;(}.[:i.1+])/&.>".'- ,;'charsub 1!:1[1

从键盘获取输入:

   ;(}.[:i.1+])/&.>".'- ,;'charsub 1!:1[1
1-4,8-11
1 2 3 4 8 9 10 11

请求的测试用例的输出:

   ;(}.[:i.1+])/&.>".'- ,;'charsub 1!:1[1
1,3-5,9,16,18-23
1 3 4 5 9 16 18 19 20 21 22 23

2

Hassium,173字节

这很长,可能没有竞争,因为最后是结尾。

 func main(){p="1,2,3,5-8".split(",")for(c=0;c<p.length;c++){e=p[c]if(e.contains("-")){p=e.split("-")for(x=p[0].toInt();x<=p[1].toInt()print(x++ +",")){}}else print(e+",")}}

在线运行并在此处查看展开



1

Python 2.7版,147个 138字节

z,f = input()。split(','),[]
对于z中的i:
 x = i.split('-')
 如果len(x)> 1:f + = range(int(x [0]),int(x [1])+ 1)
 else:f + = [int(x [0])]
打印str(f)[1:-1]

用法:

>>> python nums.py
“ 1,3-5,9,16,18-23”
1、3、4、5、9、16、18、19、20、21、22、23

不是最好的程序...


1
欢迎来到PPCG。我认为您可以通过使用1个缩进空格来缩短答案。
intrepidcoder

感谢@intrepidcoder,我不知道您可以使用单个空格缩进。
Alex

1

MATLAB,47个字节

disp(eval(['[',strrep(input(''),'-',':'),']']))

此代码段从命令窗口中读取字符串输入,用':'替换'-',在字符串中添加方括号,然后对其求值,以便将输入扩展为完整的数字数组。

输入示例:

'1,3-5,9,16,18-23'

输出示例:

1     3     4     5     9    16    18    19    20    21    22    23

我认为此输出是允许的,因为挑战仅表明应该显示组中的所有数字。


逗号分隔的输出会更好,尽管我可以使用5个空格分隔的模式,这对我来说很酷:)
BernaMariano


1

PowerShell,79 71字节

('('+($args[0]-replace'-','..'-replace',','),(')+')'|iex|%{$_})-join','

在线尝试!

内部将“ 1,5-9,12”更改为PowerShell可以理解的“(1),(5..9),(12)”格式,然后使用iex执行该操作,这将创建一个数组数组。然后遍历每个内部数组,最后将所有外部数组元素连接在一起

从“帮助我管理时间” 答案中借用代码

用法

PS C:\Tools\Scripts\golfing> .\return-each-number-from-a-group-of-numbers.ps1 '1,3-5,9,16,18-23'
1,3,4,5,9,16,18,19,20,21,22,23

-8字节归功于Veskah



1

K(oK)40 31字节

,/{{x+!1+y-x}. 2#.:'"-"\x}'","\

在线尝试!

说明:

在增加解释的同时管理了更多高尔夫球运动...

,/{{x+!1+y-x}. 2#.:'"-"\x}'","\ / the solution
                           ","\ / split input on ","
  {                      }'     / apply lambda to each
                    "-"\x       / split x on "-"
                 .:'            / value (.:) each (')
               2#               / 2 take (dupe if only 1 element)
   {        }.                  / diadic lambda, 2 args x and y
         y-x                    / y subtract x
       1+                       / add 1
      !                         / range 0..n
    x+                          / add x
,/                              / flatten

0

Clojure,110字节

#(clojure.string/join","(for[s(.split %",")[a b][(map read-string(.split s"-"))]r(if b(range a(inc b))[a])]r))

处理字符串不是很有趣:(


0

Python 2,112字节

非常简单明了的答案。

L=[]
for s in input().split(','):
 if'-'in s:a,b=map(int,s.split('-'));L+=range(a,b+1)
 else:L+=[int(s)]
print L

在线尝试!



0

Japt,12个字节

q, c@OvXr-'ò

尝试一下


您可以替换c@£
奥利弗·

@Oliver是一个古老的挑战,它没有指定其I / O格式,因此我谨慎地犯错,将输入作为逗号分隔的字符串并将输出作为展平的数组。但是,通常情况下,是的,我将输入指定为字符串数组,将输出指定为多维数组,并且仅用于£代替前5个字节。
毛茸茸的

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.