독점 및 포괄적 범위의 제품


18

영감을받은 이 질문 에 의해 @ CᴏɴᴏʀO'Bʀɪᴇɴ .

질문에서 가져온 것 :

당신의 작업은 간단합니다 : 두 개의 정수 a와 b가 주어지면, 출력 ∏ [a, b]; 즉, a와 b 사이의 범위의 곱입니다. a, b는 함수,리스트 입력, STDIN 등의 인수인지에 관계없이 합리적인 형식으로 취할 수 있습니다. 리턴 값 (함수의 경우) 또는 STDOUT과 같은 적절한 형식으로 출력 할 수 있습니다. a는 항상 b보다 작습니다.

끝은 b를 포함하거나 포함 할 수 있습니다. 나는 까다 롭지 않다. ^ _ ^

이 문제의 차이점은 범위 유형에 대해 까다로울 것입니다. 입력 양식의 문자열입니다 [a,b], (a,b], [a,b), 또는 (a,b)a는 어디 []포괄적 경계와 ()독점 경계입니다. 명확한 경계가 주어지면 범위의 곱을 제공하십시오. 또한 입력 범위에는 항상 최소 1 개의 숫자가 포함되며, 이는 (3,4)유효하지 않으며 테스트 할 필요가없는 범위를 의미합니다 .

테스트 사례

[a,b) => result
[2,5) => 24
[5,10) => 15120
[-4,3) => 0
[0,3) => 0
[-4,0) => 24

[a,b] => result
[2,5] => 120
[5,10] => 151200
[-4,3] => 0
[0,3] => 0
[-4,-1] => 24

(a,b] => result
(2,5] => 60
(5,10] => 30240
(-4,3] => 0
(0,3] => 6
(-4,-1] => -6

(a,b) => result
(2,5) => 12
(5,10) => 3024
(-4,3) => 0
(0,3) => 2
(-4,0) => -6

이것은 이므로 바이트 단위의 가장 짧은 프로그램이 승리합니다.


리더 보드

이 게시물의 맨 아래에있는 스택 스 니펫은 답변 a) 언어 당 가장 짧은 솔루션 목록으로, b) 전체 리더 보드로 카탈로그를 생성합니다.

답변이 표시되도록하려면 다음 마크 다운 템플릿을 사용하여 헤드 라인으로 답변을 시작하십시오.

## Language Name, N bytes

N제출물의 크기는 어디에 있습니까 ? 당신이 당신의 점수를 향상시킬 경우에, 당신은 할 수 있습니다 를 통해 눈에 띄는에 의해, 헤드 라인에 오래된 점수를 유지한다. 예를 들어 :

## Ruby, <s>104</s> <s>101</s> 96 bytes

헤더에 여러 숫자를 포함하려는 경우 (예 : 점수가 두 파일의 합계이거나 인터프리터 플래그 페널티를 별도로 나열하려는 경우) 실제 점수가 헤더 의 마지막 숫자 인지 확인하십시오 .

## Perl, 43 + 2 (-p flag) = 45 bytes

언어 이름을 링크로 만들면 스 니펫에 표시됩니다.

## [><>](http://esolangs.org/wiki/Fish), 121 bytes

답변:


7

LabVIEW, 38 LabVIEW 프리미티브

"약간"수정되었습니다. 이제 () 및 []를 스캔하고 숫자에 색인을 추가하여 범위를 설정합니다.

먼저


5
멋진 gif가 필요한 언어를 사용하면 즉시 ∞ 담당자가되었습니다. GG. +1
Addison Crump

3

파이썬 2, 72 바이트

lambda s:reduce(int.__mul__,range(*eval(s[1:-1]+'+'+`']'in s`))[s<'[':])

평가 한 숫자를 추출하기 위해 s[1:-1]끝이 제거 된 입력 문자열은 튜플을 제공합니다. 아이디어는 range이 튜플을 가져 와서 제품을 가져 오는 것입니다.

lambda s:reduce(int.__mul__,range(*eval(s[1:-1]))

퍼징은 엔드 포인트를 조정하기 위해 발생합니다. 로 입력이 시작이되면 상단 엔드 포인트는 쉽고, 단지 첫 번째 요소를 차단 (으로 수행 [s<'[':].

다른 끝점은 더 까다 롭습니다. 파이썬은 l[:0]모든 것을 제거 하기 때문에 목록의 마지막 요소를 조건부로 제거하는 명확한 방법이 없습니다 . 그래서 우리는 이상한 일을합니다. 이 문자열에 압정으로 평가하기 전에 우리는 튜플 문자열을 수정 "+True"또는 "+False"에 여부의 목적에 따라 ]또는 ). 같은 결과는 뭔가 3,7하나가됩니다 3,7+False이다 3,7, 또는 3,7+True어떤이다 3,8.

대안, 예뻐진 72 :

lambda s:eval("reduce(int.__mul__,range((s<'[')+%s+(']'in s)))"%s[1:-1])

3

Minecraft 15w35a +, 프로그램 크기 638 총계 (아래 참조)

내 대답과 동일 여기 만 수정했습니다. Minecraft에는 문자열 입력이 없으므로 점수 판 입력을 유지할 자유가 있습니다. 그것이 문제라면,이 답변을 비 경쟁적이라고 생각하십시오.

여기에 이미지 설명을 입력하십시오

이것은 PI a,b두 개의 레버로 지정된 포괄적 / 독점으로 계산 됩니다. 여기에 이미지 설명을 입력하십시오입력은 다음 두 명령을 사용하여 제공됩니다 : /scoreboard players set A A {num}/scoreboard players set B A {num}. /scoreboard objectives add A dummy입력하기 전에 사용하십시오 .

를 사용하여 득점 : {program size} + ( 2 * {input command} ) + {scoreboard command} = 538 + ( 2 * 33 ) + 34 = 638.

이 코드는 다음 의사 코드에 해당합니다.

R = 1
T = A
loop:
  R *= A
  A += 1
  if A == B:
    if A.exclusive:
      R /= T
    if B.exclusive:
      R /= B
    print R
    end program

여기 에서 세계를 다운로드 하십시오 .


2

Pyth, 20 바이트

*FPW}\)ztW}\(z}FvtPz

온라인으로 사용해보십시오 : 데모 또는 테스트 스위트

설명:

*FPW}\)ztW}\(z}FvtPz   implicit: z = input string
                 tPz   remove the first and last character of z
                v      evaluate, returns a tuple of numbers
              }F       inclusive range
        tW             remove the first number, if
          }\(z            "(" in z
  PW                   remove the last number, if
    }\)z                  ")" in z
*F                     compute the product of the remaining numbers

2

루비, 79 77 바이트

->s{a,b=s.scan /\-?\d+/;(a.to_i+(s[?[]?0:1)..b.to_i-(s[?]]?0:1)).reduce 1,:*}

79 바이트

->s{a,b=s.scan(/\-?\d+/).map &:to_i;((s[?[]?a:a+1)..(s[?]]?b:b-1)).reduce 1,:*}

언 골프 드 :

-> s {
  a,b=s.scan /\-?\d+/    # Extracts integers from the input string, s
  (
    a.to_i+(s[?[]?0:1).. # Increase start of the range by 1 if s contains `(`
    b.to_i-(s[?]]?0:1)   # Decrease end of the range by 1 if s contains `)`
  ).reduce 1,:*
}

용법:

->s{a,b=s.scan /\-?\d+/;(a.to_i+(s[?[]?0:1)..b.to_i-(s[?]]?0:1)).reduce 1,:*}["(2,5]"]
=> 60

2

진심으로, 31 바이트

,#d@p@',@s`εj≈`Mi(@)']=+)'(=+xπ

입력을 문자열로 취합니다 (큰 따옴표로 묶음).

온라인으로 사용해보십시오 (입력은 수동으로 입력해야합니다)

설명:

,#d@p@                             get input, take first and last character off and push them individually
      ',@s`εj≈`Mi                  split on commas, map: join on empty, cast to int; explode list
                 (@)']=+)'(=+      increment start and end if braces are ( and ] respectively (since range does [a,b))
                             xπ    make range, push product

1

파이썬 3, 104

y,r=input().split(',')
t=int(y[1:])+(y[0]<')')
for x in range(t+1,int(r[:-1])+(r[-1]>'[')):t*=x
print(t)

stdin에서 입력을받습니다.


우리는 실제로 같은 대답을 두 번째 Oo
Eumel

@Eumel 배지 여야합니다.
Morgan Thrapp 2016

실제로 메타에
실린

@Eumel : 사실 당신은 모건 Thrapp의 전에 당신에게 1 초 게시
ev3commander

아 진짜? 그것은 두 답변 모두에 n 초 전에 답변을 표시했습니다
Eumel

1

MATLAB, 86 70 바이트

s=sscanf(input(''),'%c%d,%d%c');a=s<42;disp(prod(a(1)+s(2):s(3)-a(4)))

이것은 Octave 에서도 작동합니다 . 여기서 온라인으로 시도 할 수 있습니다 . 해당 작업 공간에 스크립트로 코드를 추가 했으므로 productRange프롬프트에 입력 한 다음 입력 내용을 입력하면됩니다.'(2,5]' .


따라서 코드는 먼저 입력을 스캔하여 대괄호와 숫자를 함께 추출합니다.

s=sscanf(input(''),'%c%d,%d%c');

이것은 구성된 배열을 반환합니다 [bracket, number, number, bracket] .

배열은과 비교되며 42실제로 42에서 90 사이의 숫자가 수행됩니다. 이것은 어떤 종류의 대괄호인지를 결정하여, 대괄호 인 경우 1을 포함하고, 대괄호 인 경우 0을 제공합니다.

a=s<42;

마지막으로 필요한 범위의 제품을 표시합니다.

disp(prod(a(1)+s(2):s(3)-a(4)))

제품은 첫 번째 숫자 s(2)와 첫 번째 브래킷 유형 a(1)(독점 브래킷 인 경우 1 임)으로 시작하는 숫자이며, 두 번째 숫자 s(3)에서 두 번째 브래킷 유형을 뺀 숫자까지 a(4)입니다. 이것은 올바른 포함 / 제외 범위를 제공합니다.


1

줄리아, 75 바이트

s->prod((x=map(parse,split(s[2:end-1],",")))[1]+(s[1]<41):x[2]-(s[end]<42))

이것은 문자열을 받아들이고 정수를 반환하는 익명 함수입니다. 호출하려면 이름을 입력하십시오 (예 :f=s->... .

언 골프 드 :

function f(s::AbstractString)
    # Extract the numbers in the input
    x = map(parse, split(s[2:end-1], ","))

    # Construct a range, incrementing or decrementing the endpoints
    # based on the ASCII value of the surrounding bracket
    r = x[1]+(s[1] == 40):x[2]-(s[end] == 41)

    # Return the product over the range
    return prod(r)
end

1

수학, 128 바이트

1##&@@Range[(t=ToExpression)[""<>Rest@#]+Boole[#[[1]]=="("],t[""<>Most@#2]-Boole[Last@#2==")"]]&@@Characters/@#~StringSplit~","&

너무 깁니다 ... 현재 StringReplace+ RegularExpression솔루션 에 대해 생각하고 있습니다.


0

PowerShell, 146 104 바이트

param($i)$a,$b=$i.trim("[]()")-split',';($a,(1+$a))[$i[0]-eq'(']..($b,(+$b-1))[$i[-1]-eq')']-join'*'|iex

입력에서 숫자를 추출하는 방법을 변경하여 42 바이트를 벗어났습니다. 우!

param($i)                          # Takes input string as $i
$a,$b=$i.trim("[]()")-split','     # Trims the []() off $i, splits on comma,
                                   # stores the left in $a and the right in $b

($a,(1+$a))[$i[0]-eq'(']..($b,(+$b-1))[$i[-1]-eq')']-join'*'|iex
# Index into a dynamic array of either $a or $a+1 depending upon if the first
# character of our input string is a ( or not
# .. ranges that together with
# The same thing applied to $b, depending if the last character is ) or not
# Then that's joined with asterisks before
# Being executed (i.e., eval'd)


0

펄 6 , 60 바이트

{s/\((\-?\d+)/[$0^/;s/(\-?\d+)\)/^$0]/;s/\,/../;[*] EVAL $_}

당신이 작성하는 방법과 때문에 잘못 일치의 비트가 (2,5]될 것이다 펄 6 예 2^..5( [2^..5]도 작동).
그래서 (2와 교환해야 [2^하고 ,와 교환 ..해야합니다.EVAL 레인지로.


용법:

# give it a name
my &code = {...}

# the `$ =` is so that it gets a scalar instead of a constant

say code $ = '(2,5)'; # 12
say code $ = '[2,5)'; # 24
say code $ = '(2,5]'; # 60
say code $ = '[2,5]'; # 120

say code $ = '(-4,0)' # -6
say code $ = '[-4,0)' # 24
say code $ = '(-4,0]' # 0
say code $ = '[-4,0]' # 0

say code $ = '(-4,-1)' # 6
say code $ = '[-4,-1)' # -24
say code $ = '(-4,-1]' # -6
say code $ = '[-4,-1]' # 24

# this is perfectly cromulent,
# as it returns the identity of `*`
say code $ = '(3,4)'; # 1

0

CJam, 34 바이트

r)\(@+"[()]"2/\.#\',/:i.+~1$-,f+:*

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

설명:

r       Read input.
)       Split off last character.
\       Swap rest of input to top.
(       Split off first character.
@       Rotate last character to top.
+       Concatenate first and last character, which are the two braces.
"[()]"  Push string with all possible braces.
2/      Split it into start and end braces.
\       Swap braces from input to top.
.#      Apply find operator to vector elements, getting the position of each brace
        from input in corresponding list of possible braces. The lists of braces
        are ordered so that the position of each can be used as an offset for the
        start/end value of the interval.
\       Swap remaining input, which is a string with two numbers separated by
        a comma, to top.
',/     Split it at comma.
:i      Convert the two values from string to integer.
.+      Element-wise addition to add the offsets based on the brace types.
~       Unwrap the final start/end values for the interval.
1$      Copy start value to top.
-       Subtract it from end value.
,       Build 0-based list of values with correct length.
f+      Add the start value to all values.
:*      Reduce with multiplication.

0

자바 스크립트 (ES6), 90 바이트

s=>eval(`for(n=s.match(/-*\\d+/g),i=n[0],c=s[0]<"["||i;++i<+n[1]+(s.slice(-1)>")");)c*=i`)

설명

s=>
  eval(`                    // use eval to allow for loop without return or {}
    for(
      n=s.match(/-*\\d+/g), // n = array of input numbers [ a, b ]
      i=n[0],               // i = current number to multiply the result by
      c=s[0]<"["||i;        // c = result, initialise to a if inclusive else 1
      ++i<+n[1]             // iterate from a to b
        +(s.slice(-1)>")"); // if the end is inclusive, increment 1 more time
    )
      c*=i                  // multiply result
  `)                        // implicit: return c

테스트


0

R, 102 104 바이트

f=function(s){x=scan(t=gsub('\\(|\\[|,|\\)|\\]',' ',s))+c(grepl('^\\(',s),-(grepl('\\)$',s)));prod(x[1]:x[2])}

언 골프

f=function(s){
    # remove delimiting punctuation from input string, parse and return an atomic vector
    x=scan(t=gsub('\\(|\\[|,|\\)|\\]',' ',s)) +
    # add /subtract from the range dependent on the `[)` pre/suf-fixes
    c(grepl('^\\(',s),-(grepl('\\)$',s)))
    # get the product of the appropriate range of numbers
    prod(x[1]:x[2])
}

음수를 허용하도록 편집 [2 자 이상의 비용으로



@ThisSuitIsBlackNot- R(답변으로 고정)
mnel

0

자바 스크립트 (ES6), 79

익명의 방법으로

r=>eval("[a,b,e]=r.match(/-?\\d+|.$/g);c=a-=-(r<'@');for(b-=e<'@';a++<b;)c*=a")

테스트 스 니펫

F=r=>eval("[a,b,e]=r.match(/-?\\d+|.$/g);c=a-=-(r<'@');for(b-=e<'@';a++<b;)c*=a")

// TEST
console.log=x=>O.innerHTML+=x+'\n'

;[
 ['[2,5)',24],['[5,10)',15120],['[-4,3)',0],['[0,3)',0],['[-4,0)',24],
 ['[2,5]',120],['[5,10]',151200],['[-4,3]',0],['[0,3]',0],['[-4,-1]',24],
 ['(2,5]',60],['(5,10]',30240],['(-4,3]',0],['(0,3]',6],['(-4,-1]',-6],
 ['(2,5)',12],['(5,10)',3024],['(-4,3)',0],['(0,3)',2],['(-4,0)',-6]
].forEach(t=>{
  r=F(t[0]),k=t[1],console.log(t[0]+' -> '+r+' (check '+k+ (k==r?' ok)':' fail)'))
})
<pre id=O></pre>

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