产品超出独家和包容范围


18

受到@C @O'Bʀɪthis 这个问题启发

取自问题:

您的任务很简单:给定两个整数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

这是一个,因此以字节为单位的最短程序获胜。


排行榜

这篇文章底部的Stack Snippet会根据答案a)生成目录,a)作为每种语言最短解决方案的列表,b)作为整体排行榜。

为确保您的答案显示出来,请使用以下Markdown模板以标题开头。

## 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

Answers:


7

LabVIEW,38个LabVIEW原语

进行了“轻微”修改,现在通过扫描()和[]并将索引添加到数字来设置范围。

第一


5
通过使用需要精美gif的语言,您立即获得了∞rep。GG。+1
Addison Crump 2015年

3

Python 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<'[':]

另一个端点比较棘手。Python没有一种干净的方法有条件地删除列表的最后一个元素,因为l[:0]会删除整个内容。因此,我们做了一些奇怪的事情。我们先对元组字符串进行修改,然后再对其进行评估以使其固定在字符串上,"+True"或者"+False"取决于s是否以]或结尾)。其结果是,像3,7变得要么3,7+False3,7,或者3,7+True3,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

Ruby,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

Python 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,2015年

@Eumel应该是徽章。
Morgan Thrapp 2015年

病实际上将其立即发布到Meta上^^
Eumel 2015年

@Eumel:实际上,您是在Morgan Thrapp的
ev3commander 2015年

真的吗?它在n秒钟前的两个答案中都得到了回答
Eumel 2015年

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

Mathematica,128个字节

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

这太长了...目前正在考虑StringReplace+ RegularExpression解决方案。


0

PowerShell,146104字节

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

Perl 6,60个字节

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

有点不匹配,因为(2,5]在Perl 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

JavaScript(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

@ThisSuitIsBlackNot - R(固定在回答)
MNEL

0

JavaScript(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>

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.