Produk dengan rentang eksklusif dan inklusif


18

Terinspirasi oleh pertanyaan ini oleh @ CᴏɴᴏʀO'Bʀɪᴇɴ .

Diambil dari pertanyaan:

Tugas Anda sederhana: diberi dua bilangan bulat a dan b, output ∏ [a, b]; yaitu, produk dari kisaran antara a dan b. Anda dapat mengambil a dan b dalam format apa pun yang masuk akal, apakah itu argumen untuk fungsi, input daftar, STDIN, dan lain-lain. Anda dapat menampilkan dalam format apa pun yang masuk akal, seperti nilai balik (untuk fungsi) atau STDOUT. a akan selalu kurang dari b.

Perhatikan bahwa akhirnya mungkin eksklusif atau inklusif dari b. Saya tidak pilih-pilih. ^ _ ^

Perbedaan untuk tantangan ini adalah kita akan pilih-pilih tentang jenis jangkauan. Input adalah string dari bentuk [a,b], (a,b], [a,b), atau (a,b)di mana []merupakan batas inklusif dan ()merupakan batas eksklusif. Mengingat batas-batas eksplisit, berikan produk kisaran. Kisaran input juga akan selalu menyertakan setidaknya 1 angka, rentang arti seperti (3,4)tidak valid dan tidak perlu diuji.

Uji kasus

[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

Ini adalah , sehingga program terpendek dalam byte menang.


Papan peringkat

Cuplikan Stack di bagian bawah posting ini menghasilkan katalog dari jawaban a) sebagai daftar solusi terpendek per bahasa dan b) sebagai leaderboard keseluruhan.

Untuk memastikan bahwa jawaban Anda muncul, silakan mulai jawaban Anda dengan tajuk utama, menggunakan templat Penurunan harga berikut:

## Language Name, N bytes

di mana Nukuran kiriman Anda. Jika Anda meningkatkan skor Anda, Anda dapat menyimpan skor lama di headline, dengan mencoretnya. Contohnya:

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

Jika Anda ingin memasukkan beberapa angka dalam tajuk Anda (mis. Karena skor Anda adalah jumlah dari dua file atau Anda ingin membuat daftar hukuman penterjemah secara terpisah), pastikan bahwa skor sebenarnya adalah angka terakhir di tajuk:

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

Anda juga dapat membuat nama bahasa menjadi tautan yang kemudian akan muncul di cuplikan:

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

Jawaban:


7

LabVIEW, 38 LabVIEW Primitif

"sedikit" dimodifikasi, sekarang atur rentang dengan memindai untuk () dan [] dan menambahkan indeks ke angka.

pertama


5
Dengan memiliki bahasa yang membutuhkan gif mewah, Anda telah segera memperoleh ∞ rep. GG. +1
Addison Crump

3

Python 2, 72 byte

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

Untuk mengekstraksi angka yang kita evaluasi s[1:-1], string input dengan ujungnya dihilangkan, yang memberikan tuple. Idenya adalah untuk mendapatkan manfaat rangedari tuple ini dan mengambil produknya.

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

Pemalsuan terjadi untuk menyesuaikan titik akhir. Titik akhir atas mudah, cukup potong elemen pertama jika input dimulai dengan (, dilakukan sebagai [s<'[':].

Titik akhir lainnya lebih rumit. Python tidak memiliki cara bersih untuk menghapus elemen terakhir dari suatu daftar karena l[:0]menghapus semuanya. Jadi, kami melakukan sesuatu yang aneh. Kami memodifikasi string tuple sebelum dievaluasi untuk memakukan string "+True"atau "+False"tergantung pada apakah s berakhir pada ]atau ). Hasilnya adalah sesuatu seperti 3,7menjadi 3,7+Falseyang mana 3,7, 3,7+Trueyang mana 3,8.

Alternatif, lebih cantik 72:

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

3

Minecraft 15w35a +, ukuran program total 638 (lihat di bawah)

Sama seperti jawaban saya di sini , tetapi dimodifikasi. Karena Minecraft tidak memiliki input string, saya mengambil kebebasan menyimpan input papan skor. Jika itu masalah, pertimbangkan jawaban ini tidak kompetitif.

masukkan deskripsi gambar di sini

Ini menghitung PI a,bdengan inklusif / eksklusif yang ditentukan oleh dua tuas. masukkan deskripsi gambar di siniInput diberikan dengan menggunakan dua perintah ini: /scoreboard players set A A {num}dan /scoreboard players set B A {num}. Ingatlah untuk menggunakan /scoreboard objectives add A dummysebelum input.

Mencetak menggunakan: {program size} + ( 2 * {input command} ) + {scoreboard command} = 538 + ( 2 * 33 ) + 34 = 638.

Kode ini sesuai dengan kode psued berikut:

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

Unduh dunia di sini .


2

Pyth, 20 byte

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

Cobalah online: Demonstrasi atau Test Suite

Penjelasan:

*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,:*}

Tidak Disatukan:

-> 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,:*
}

Pemakaian:

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

2

Serius, 31 byte

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

Mengambil input sebagai string (dibungkus dengan tanda kutip ganda)

Coba online (input harus dimasukkan secara manual)

Penjelasan:

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

Mengambil input dari stdin.


kami sebenarnya memposting jawaban kami dalam Oo
Eumel

@Eumel Itu pasti lencana.
Morgan Thrapp

sakit sebenarnya memposting itu di Meta sekarang ^^
Eumel

@Eumel: Sebenarnya Anda memposting milik Anda 1 detik sebelum Morgan Thrapp's
ev3commander

Oh benarkah? itu ditunjukkan dijawab n detik yang lalu pada kedua jawaban
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)))

Ini juga berfungsi dengan Oktaf . Anda dapat mencoba online di sini . Saya telah menambahkan kode sebagai skrip ke ruang kerja itu, jadi Anda bisa langsung masuk productRangesaat diminta, lalu masukkan input Anda, mis '(2,5]'.


Jadi, kode pertama memindai input untuk mengekstrak kurung dan angka bersama:

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

Ini mengembalikan array yang terbuat dari [bracket, number, number, bracket].

Array dibandingkan dengan 42, sebenarnya jumlah antara 42 dan 90 inklusif akan dilakukan. Ini menentukan jenis braket mana itu, memberikan 1 jika braket eksklusif, dan 0 jika braket inklusif.

a=s<42;

Akhirnya, kami menampilkan produk dari rentang yang diperlukan:

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

Produk ini terdiri dari angka yang menatap nomor pertama s(2)plus jenis braket pertama a(1)(yang merupakan 1 jika braket eksklusif), berkisar hingga dan termasuk angka kedua s(3)minus jenis braket kedua a(4). Ini memberikan rentang inklusif / eksklusif yang benar.


1

Julia, 75 byte

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

Ini adalah fungsi anonim yang menerima string dan mengembalikan integer. Untuk menyebutnya, berikan nama, mis f=s->....

Tidak Disatukan:

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 byte

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

Ini terlalu lama ... Saat ini memikirkan solusi StringReplace+ RegularExpression.


0

PowerShell, 146 104 Bytes

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

Golf off 42 byte dengan mengubah cara angka diekstraksi dari input. Merayu!

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 $_}

Ada sedikit ketidaksesuaian karena cara Anda akan menulis (2,5]contoh di Perl 6 akan 2^..5( [2^..5]juga berfungsi).
Jadi saya harus bertukar (2dengan [2^, dan ,dengan .., maka saya harus EVALmengubahnya menjadi Range.


pemakaian:

# 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+:*

Cobalah online

Penjelasan:

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`)

Penjelasan

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

Uji


0

R, 102 104 byte

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

Tidak disatukan

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

sunting untuk memungkinkan angka negatif [dengan mengorbankan 2 karakter lagi



@ThisSuitIsBlackNot - R(dan tetap menjawab)
mnel

0

JavaScript (ES6), 79

Sebagai metode anonim

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

Cuplikan tes

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>

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.