숫자 그룹에서 각 숫자를 반환 반환해야합니다. 규칙 s 시퀀스 문자열입니다. 포함 된 모든

도전

프로그램은 숫자 그룹 (쉼표와 하이픈으로 구분 된 시퀀스)에 포함 된 모든 숫자를 반환해야합니다.

규칙

  • 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

행운을 빕니다. =)



답변

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

실제로 4 개의 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


답변

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


답변

골프 스크립트, 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 : 마지막 {} % ~를 {} /으로 변경했는데 내 설명이 잘못되었을 수 있습니다.


답변

R , 44 바이트

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

온라인으로 사용해보십시오!

다시 정의 -하여 seq(즉 :) 입력을 둘러싸고 c()해당 표현식을 평가하십시오.


답변

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"


답변

젤리 , 9 바이트

⁾-ryṣ”,VF

온라인으로 사용해보십시오!

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

범위 dyad r는 양쪽에 두 개의 인수를 사용하여 그 사이에 포함 범위를 생성합니다.


답변

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