숫자 그룹에서 각 숫자를 반환


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-2거나 1-3,9-6?
Matt

1
아니면 겹치는가? 출력을 정렬해야하고 중복을 포함하지 않아야합니까?
피터 테일러

@Gareth 네, 이것은 코드 골프입니다. 그러면 가장 짧은 답변에 투표하십시오. 매트와 피터, 질문을 편집했습니다. 확인하십시오. 감사!
BernaMariano

전체 프로그램이어야하고 출력 형식에 제한이 있습니까?
브래드 길버트 b2gills

답변:


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

실제로 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

단일 문자를 사용하지 않고 어떻게 3-5를 3,4,5로 확장 할 수 -있습니까?
BernaMariano

@ BernaMariano, 죄송합니다. 어떻게 든 질문을 놓쳤습니다. 자세한 설명으로 답변을 확장하겠습니다.
피터 테일러

7

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

제거 -M5.010및 교환 -e을위한-E
브래드 길버트는 b2gills

4

골프 스크립트, 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

@Gareth 감사합니다. 나는 처음에 내가 그것을 perl 방식으로 할 것이라고 생각했다 : change-to .. 그리고 그것을 평가. 그런 다음 배열을 만들 수있는 깔끔한 방법을 찾을 수 없으므로이 작업을 수행했습니다. 골프 스크립트가있는 ~ 20 문자 솔루션을 누군가가 올 것이라고 확신합니다.
shiona

나는 지금 24를 가지고 있으므로 20을 도전으로 삼을 것이다;) 당신은 그래도 몇 가지를 쉽게 구할 수있다. 문제는 함수가 아닌 프로그램을 요구하므로 초기 {와 최종을 잃을 }:r;수 있으며로 대체 1-하여 저장할 수도 있습니다 (. (실수로, IIRC는 필자가 첫 번째 GolfScript 프로그램에서 놓친 하나의 트릭입니다)
Peter Taylor

추신 : {...}%~와 사이에 미묘한 차이가 {...}/있습니다. 스택을 사용하여 더 많은 것을 액세스 integer $하는 경우 스택에서 떠나는 모든 것을 보상하기 위해 매번 정수를 조정할 필요가 없기 때문에 첫 번째 것이 더 간단합니다.
피터 테일러


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:0for 43 bytes
streetster


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

파이썬 2.7, 147138 바이트

z, f = 입력 (). 분할 ( ','), []
z의 경우 :
 x = i. 분할 ( '-')
 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 2

@ 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

Veskah 덕분에 -8 바이트



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

클로저, 110 바이트

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

문자열 다루는 것은 그리 재미 있지 않습니다 :(




0

Japt , 12 바이트

q, c@OvXr-'ò

시도 해봐


당신은 대체 할 수 c@와 함께 £?
Oliver

@Oliver는 I / O 형식을 지정하지 않는 오래된 도전 과제이므로 쉼표로 구분 된 문자열로 입력하고 평평한 배열로 출력하는 데주의를 기울였습니다. 일반적으로 예, 입력을 문자열 배열로 지정하고 다차원 배열로 출력 £하고 처음 5 바이트 대신 사용 했습니다 .
얽히고 설킨

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.