Münhasır ve kapsayıcı aralıklardaki ürün


18

Esinlenerek bu soruya tarafından @ CᴏɴᴏʀO'Bʀɪᴇɴ .

Sorudan alınmıştır:

Göreviniz basit: iki a ve b tamsayısı verildiğinde, çıktı ∏ [a, b]; yani, a ve b arasındaki aralığın ürünü. A ve b'yi bir işleve, bir liste girdisine (STDIN, et cetera) ait bağımsız değişkenler olsun, makul bir biçimde alabilirsiniz. Bir dönüş değeri (işlevler için) veya STDOUT gibi makul bir biçimde çıktı alabilirsiniz. a her zaman b'den küçük olacaktır.

Sonun münhasır veya b'yi içerebileceğini unutmayın. Seçici değilim. ^ _ ^

Bu meydan okuma için fark, menzil türü hakkında seçici olacağımızdır. Girdi formunun bir dizidir [a,b], (a,b], [a,b)veya (a,b)bir yerde []kapsayıcı sınırıdır ve ()özel bir sınırıdır. Açık sınırlar göz önüne alındığında, aralığın ürününü sağlayın. Ayrıca, giriş aralığı her zaman en az 1 sayı içerir, yani (3,4)geçersiz aralıklar geçersizdir ve test edilmeleri gerekmez.

Test senaryoları

[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

Bu bir , bu yüzden bayttaki en kısa program kazanıyor.


Liderler Sıralaması

Bu yazının altındaki Yığın Parçacığı, a) her dil için en kısa çözüm listesi ve b) genel bir lider panosu olarak cevaplardan katalog oluşturur.

Yanıtınızın göründüğünden emin olmak için lütfen aşağıdaki Markdown şablonunu kullanarak yanıtınızı bir başlıkla başlatın:

## Language Name, N bytes

Ngönderiminizin büyüklüğü nerede . Puanınızı artırmak varsa, olabilir onları içinden vurarak, başlığa eski hesapları tutmak. Örneğin:

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

Başlığınıza birden fazla sayı eklemek istiyorsanız (örneğin, puanınız iki dosyanın toplamı olduğu veya yorumlayıcı bayrak cezalarını ayrı olarak listelemek istediğiniz için), gerçek puanın başlıktaki son sayı olduğundan emin olun :

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

Dil adını snippet'te görünecek bir bağlantı da yapabilirsiniz:

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

Yanıtlar:


7

LabVIEW, 38 LabVIEW Temel Öğeleri

"biraz" değiştirildi, şimdi () ve [] için tarama yaparak ve sayılara indeks ekleyerek aralıkları ayarlıyor.

ilk


5
Süslü bir gif gerektiren bir dile sahipseniz, hemen ∞ temsilcisi oldunuz. İYİ OYUN. +1
Addison Crump

3

Python 2,72 bayt

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

Değerlendirdiğimiz sayıları çıkarmak için s[1:-1]uçları çıkarılmış giriş dizesi bir demet verir. Fikir rangebu tuple almak ve ürünü almaktır.

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

Geçiş noktaları, uç noktaları ayarlamak için yapılır. Üst uç nokta kolaydır, giriş ile başlarsa ilk öğeyi kesin (, olarak yapılır [s<'[':].

Diğer uç nokta daha karmaşıktır. Python, bir listenin son öğesini koşullu olarak kaldırmanın temiz bir yoluna sahip değildir, çünkü l[:0]her şeyi kaldırır. Yani, tuhaf bir şey yapıyoruz. O ipte tack için değerlendirilir önce tuple dizesini değiştirmek "+True"veya "+False"olsun lar uçlarına bağlı ]veya ). Sonuç şudur: Gibi bir şey 3,7ya 3,7+Falseolan ya 3,7da 3,7+Trueolan 3,8.

Alternatif, güzel 72:

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

3

Minecraft 15w35a +, toplam program boyutu 638 (aşağıya bakın)

Buradaki cevabımla aynı , ancak değiştirildi. Minecraft'ın dize girişi olmadığı için skorbord girdisini tutma özgürlüğünü aldım. Bu bir sorunsa, bu cevabı rekabetçi değil olarak düşünün.

resim açıklamasını buraya girin

Bu PI a,b, iki kol tarafından belirtilen kapsayıcı / dışlayıcı ile hesaplanır . resim açıklamasını buraya girinGirdi şu iki komut kullanılarak verilir: /scoreboard players set A A {num}ve /scoreboard players set B A {num}. Girişten /scoreboard objectives add A dummyönce kullanmayı unutmayın .

Kullanılarak Attı: {program size} + ( 2 * {input command} ) + {scoreboard command} = 538 + ( 2 * 33 ) + 34 = 638.

Bu kod aşağıdaki psuedo koduna karşılık gelir:

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

Dünyayı buradan indirin .


2

Pyth, 20 bayt

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

Çevrimiçi deneyin: Gösteri veya Test Paketi

Açıklama:

*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

Yakut, 79 77 bayt

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

79 bayt

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

Ungolfed:

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

Kullanımı:

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

2

Ciddi, 31 bayt

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

Girişi dize olarak alır (çift tırnak içine alınır)

Çevrimiçi deneyin (giriş manuel olarak girilmelidir)

Açıklama:

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

MATLAB, 86 70 bayt

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

Bu Octave ile de çalışır . Burada çevrimiçi deneyebilirsiniz . Kodu bu çalışma alanına bir komut dosyası olarak ekledim, böylece sadece productRangebilgi istemine girebilir, ardından girişinizi girebilirsiniz, örn '(2,5]'.


Böylece kod önce parantezleri ve sayıları birlikte çıkarmak için girişi tarar:

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

Bu, oluşan bir dizi döndürür [bracket, number, number, bracket].

Dizi ile karşılaştırıldığında 42, aslında 42 ve 90 dahil herhangi bir sayı yapacak. Bu, ne tür bir braket olduğunu belirler, özel bir braket ise 1 ve kapsayıcı bir braket ise 0 verir.

a=s<42;

Son olarak, gerekli aralıktaki ürünü görüntüleriz:

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

Ürün, ikinci sayı eksi ikinci braket türüne kadar ve ikinci sayı dahil olmak üzere birinci sayı s(2)artı birinci dirsek türüyle a(1)(özel bir dirsek ise 1'dir) bakan sayılardan oluşur . Bu, doğru kapsayıcı / özel aralığı verir.s(3)a(4)


1

Julia, 75 bayt

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

Bu, bir dizeyi kabul eden ve bir tamsayı döndüren anonim bir işlevdir. Aramak için bir ad verin, örn.f=s->... .

Ungolfed:

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 bayt

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

Bu çok uzun ... Şu anda StringReplace+ RegularExpressionçözümünü düşünüyoruz .


0

PowerShell, 146104 Bayt

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

Sayıların girişten çıkarılma şeklini değiştirerek 42 baytın dışına çıktı. 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 bayt

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

Biraz yanlış eşleşme var, çünkü (2,5]Perl 6'da örnek yazma şekliniz olurdu 2^..5( [2^..5]ayrıca çalışır).
Ben takas zorunda Yani (2birlikte [2^ve ,birlikte .., daha sonra bunu yapmak zorunda EVALbir Range içine o.


kullanımı:

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

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

Çevrimiçi deneyin

Açıklama:

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 bayt

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

açıklama

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

Ölçek


0

R, 102 104 bayt

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

Ungolfed

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

negatif sayılara izin vermek için düzenle [2 karakter daha pahasına



@ThisSuitIsBlackNot - R(ve yanıt olarak düzeltildi)
15'te

0

JavaScript (ES6), 79

Anonim bir yöntem olarak

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

Test snippet'i

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>

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.