도전
프로그램은 숫자 그룹 (쉼표와 하이픈으로 구분 된 시퀀스)에 포함 된 모든 숫자를 반환해야합니다.
규칙
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