Sản phẩm trên phạm vi độc quyền và bao gồm


18

Lấy cảm hứng từ câu hỏi này của @ CᴏɴᴏʀO'Bʀɪᴇɴ .

Lấy từ câu hỏi:

Nhiệm vụ của bạn rất đơn giản: đưa ra hai số nguyên a và b, đầu ra ∏ [a, b]; đó là tích của phạm vi giữa a và b. Bạn có thể lấy a và b ở bất kỳ định dạng hợp lý nào, cho dù đó là đối số cho hàm, đầu vào danh sách, STDIN, et cetera. Bạn có thể xuất ra ở bất kỳ định dạng hợp lý nào, chẳng hạn như giá trị trả về (cho các hàm) hoặc STDOUT. a sẽ luôn luôn nhỏ hơn b.

Lưu ý rằng kết thúc có thể là độc quyền hoặc bao gồm b. Tôi không kén chọn. ^ _ ^

Sự khác biệt cho thử thách này là chúng tôi sẽ rất kén chọn loại phạm vi. Đầu vào là một chuỗi các hình thức [a,b], (a,b], [a,b), hoặc (a,b)nơi một []là một ranh giới bao gồm và ()là một ranh giới độc quyền. Đưa ra các ranh giới rõ ràng, cung cấp sản phẩm của phạm vi. Ngoài ra, phạm vi đầu vào sẽ luôn bao gồm ít nhất 1 số, nghĩa là các phạm vi như (3,4)không hợp lệ và không cần phải kiểm tra.

Các trường hợp thử nghiệm

[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

Đây là một , vì vậy chương trình ngắn nhất tính bằng byte sẽ thắng.


Bảng xếp hạng

Đoạn trích Stack ở cuối bài đăng này tạo ra danh mục từ các câu trả lời a) dưới dạng danh sách các giải pháp ngắn nhất cho mỗi ngôn ngữ và b) dưới dạng bảng xếp hạng tổng thể.

Để đảm bảo rằng câu trả lời của bạn hiển thị, vui lòng bắt đầu câu trả lời của bạn bằng một tiêu đề, sử dụng mẫu Markdown sau:

## Language Name, N bytes

nơi Nlà kích thước của trình của bạn. Nếu bạn cải thiện điểm số của mình, bạn có thể giữ điểm số cũ trong tiêu đề, bằng cách đánh bại chúng thông qua. Ví dụ:

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

Nếu bạn muốn bao gồm nhiều số trong tiêu đề của mình (ví dụ: vì điểm của bạn là tổng của hai tệp hoặc bạn muốn liệt kê riêng các hình phạt cờ của thông dịch viên), hãy đảm bảo rằng điểm thực tế là số cuối cùng trong tiêu đề:

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

Bạn cũng có thể đặt tên ngôn ngữ thành liên kết sau đó sẽ hiển thị trong đoạn trích:

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

Câu trả lời:


7

LabVIEW, 38 LabVIEW Nguyên thủy

Đã sửa đổi "một chút", bây giờ đặt phạm vi bằng cách quét tìm () và [] và thêm chỉ mục vào các số.

Đầu tiên


5
Bằng cách có một ngôn ngữ đòi hỏi một gif ưa thích, bạn đã ngay lập tức đạt được. GG. +1
Addison Crump

3

Python 2, 72 byte

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

Để trích xuất các số chúng tôi đánh giá s[1:-1], chuỗi đầu vào có đầu bị loại bỏ, cung cấp một bộ dữ liệu. Ý tưởng là để có được bộ dữ rangeliệu này và lấy sản phẩm.

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

Sự xì hơi xảy ra để điều chỉnh các điểm cuối. Điểm cuối trên rất dễ dàng, chỉ cần cắt bỏ phần tử đầu tiên nếu đầu vào bắt đầu bằng (, được thực hiện như [s<'[':].

Các điểm cuối khác là khó khăn hơn. Python không có cách rõ ràng để loại bỏ một cách có điều kiện phần tử cuối cùng của danh sách vì l[:0]loại bỏ toàn bộ. Vì vậy, chúng tôi làm một cái gì đó kỳ lạ. Chúng tôi sửa đổi chuỗi tuple trước khi nó được ước tính để xử lý chuỗi "+True"hoặc "+False"tùy thuộc vào việc s kết thúc bằng ]hay ). Kết quả là một cái gì đó giống như 3,7trở thành một trong hai 3,7+Falseđó là 3,7, hoặc 3,7+True3,8.

Thay thế, đẹp hơn 72:

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

3

Minecraft 15w35a +, kích thước chương trình tổng cộng 638 (xem bên dưới)

Giống như câu trả lời của tôi ở đây , nhưng sửa đổi. Vì Minecraft không có đầu vào chuỗi, tôi có quyền tự do giữ đầu vào bảng điểm. Nếu đó là một vấn đề, hãy xem xét câu trả lời này không cạnh tranh.

nhập mô tả hình ảnh ở đây

Điều này tính toán PI a,bvới bao gồm / độc quyền được chỉ định bởi hai đòn bẩy. nhập mô tả hình ảnh ở đâyĐầu vào được đưa ra bằng cách sử dụng hai lệnh này: /scoreboard players set A A {num}/scoreboard players set B A {num}. Nhớ sử dụng /scoreboard objectives add A dummytrước khi nhập.

Ghi bằng : {program size} + ( 2 * {input command} ) + {scoreboard command} = 538 + ( 2 * 33 ) + 34 = 638.

Mã này tương ứng với mã psuedocode sau:

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

Tải về thế giới ở đây .


2

Bình thường, 20 byte

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

Dùng thử trực tuyến: Trình diễn hoặc Test Suite

Giải trình:

*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 byte

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

79 byte

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

Ung dung:

-> 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ử dụng:

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

2

Nghiêm túc, 31 byte

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

Đưa đầu vào dưới dạng một chuỗi (được gói trong dấu ngoặc kép)

Dùng thử trực tuyến (đầu vào phải được nhập thủ công)

Giải trình:

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

Trăn 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)

Lấy đầu vào từ stdin.


chúng tôi thực sự đã đăng câu trả lời của mình trong cùng một giây Oo
Eumel

@Eumel Đó phải là một huy hiệu.
Morgan Thrapp

Tôi thực sự đăng nó trên Meta ngay bây giờ ^^
Eumel

@Eumel: Thật ra bạn đã đăng bài của bạn 1 giây trước Morgan Thrapp's
ev3commander

ồ vậy sao nó cho thấy đã trả lời n giây trước trên cả hai câu trả lời
Eumel

1

MATLAB, 86 70 byte

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

Điều này cũng hoạt động với Octave . Bạn có thể thử trực tuyến tại đây . Tôi đã thêm các mã như một kịch bản để không gian làm việc đó, vì vậy bạn chỉ có thể nhập productRangetại dấu nhắc, sau đó nhập đầu vào của bạn, ví dụ '(2,5]'.


Vì vậy, mã đầu tiên quét đầu vào để trích xuất dấu ngoặc và các số cùng nhau:

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

Điều này trả về một mảng được làm bằng [bracket, number, number, bracket].

Các mảng được so sánh với 42, thực sự bất kỳ số nào trong khoảng từ 42 đến 90 sẽ bao gồm. Điều này xác định loại khung đó là gì, đưa ra 1 nếu là khung độc quyền và 0 nếu khung bao gồm.

a=s<42;

Cuối cùng, chúng tôi hiển thị sản phẩm của phạm vi yêu cầu:

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

Sản phẩm là các số nhìn chằm chằm với số thứ nhất s(2)cộng với loại khung đầu tiên a(1)(là 1 nếu là một khung độc quyền), bao gồm và bao gồm số thứ hai s(3)trừ loại khung thứ hai a(4). Điều này cung cấp phạm vi bao gồm / độc quyền chính xác.


1

Julia, 75 byte

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

Đây là một hàm ẩn danh chấp nhận một chuỗi và trả về một số nguyên. Để gọi nó, đặt tên cho nó, vd f=s->....

Ung dung:

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

Toán học, 128 byte

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

Điều này quá dài ... Hiện đang nghĩ về một giải pháp StringReplace+ RegularExpression.


0

PowerShell, 146 104 byte

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

Giảm bớt 42 byte bằng cách thay đổi cách trích xuất các số từ đầu vào. Woo!

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 byte

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

Có một chút khớp sai bởi vì cách bạn viết (2,5]ví dụ trong Perl 6 sẽ là 2^..5( [2^..5]cũng hoạt động).
Vì vậy, tôi phải trao đổi (2với [2^, và ,với.. , sau đó tôi phải EVALnó thành một dãy.


sử dụng:

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

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

Dùng thử trực tuyến

Giải trình:

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 byte

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

Giải trình

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

Kiểm tra


0

R, 102 104 byte

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

Ung dung

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])
}

chỉnh sửa để cho phép số âm [với chi phí thêm 2 ký tự


Ngôn ngữ?
ThisSuitIsBlackNot

@ ThisSuitIsBlackNot - R(và đã sửa trong câu trả lời)
mnel

0

JavaScript (ES6), 79

Như một phương thức ẩn danh

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

Kiểm tra đoạn

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>

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.