Produkt z ekskluzywnych i obejmujących asortyment produktów

18

Zainspirowany tym pytaniem przez @ CᴏɴᴏʀO'Bʀɪᴇɴ .

Zaczerpnięte z pytania:

Twoje zadanie jest proste: biorąc pod uwagę dwie liczby całkowite aib, wyprowadzanie ∏ [a, b]; to jest iloczyn zakresu od a do b. Możesz wziąć aib w dowolnym rozsądnym formacie, niezależnie od tego, czy są to argumenty funkcji, dane wejściowe listy, STDIN i tak dalej. Możesz wyprowadzać dane w dowolnym rozsądnym formacie, takim jak wartość zwracana (dla funkcji) lub STDOUT. a zawsze będzie mniejsze niż b.

Pamiętaj, że koniec może być wyłączny lub obejmować b. Nie jestem wybredna. ^ _ ^

Różnica w tym wyzwaniu polega na tym, że będziemy wybredni co do rodzaju zasięgu. Wejście jest ciągiem postaci [a,b], (a,b], [a,b), lub (a,b), gdzie []jest granica włącznie i ()jest wyłącznym granica. Biorąc pod uwagę wyraźne granice, podaj iloczyn zakresu. Również zakres wejściowy zawsze będzie zawierać co najmniej 1 liczbę, co oznacza, że ​​zakresy takie (3,4)są nieprawidłowe i nie muszą być testowane.

Przypadki testowe

[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

To jest , więc wygrywa najkrótszy program w bajtach.


Tabela liderów

Fragment kodu na dole tego postu generuje katalog na podstawie odpowiedzi a) jako listy najkrótszych rozwiązań według języka oraz b) jako ogólnej tabeli wyników.

Aby upewnić się, że twoja odpowiedź się pojawi, zacznij od nagłówka, korzystając z następującego szablonu Markdown:

## Language Name, N bytes

gdzie Njest rozmiar twojego zgłoszenia. Jeśli poprawić swój wynik, to może zachować stare porachunki w nagłówku, uderzając je przez. Na przykład:

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

Jeśli chcesz umieścić w nagłówku wiele liczb (np. Ponieważ twój wynik jest sumą dwóch plików lub chcesz osobno wymienić kary za flagi tłumacza), upewnij się, że rzeczywisty wynik jest ostatnią liczbą w nagłówku:

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

Możesz także ustawić nazwę języka jako link, który pojawi się we fragmencie:

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

Alexis Andersen
źródło

Odpowiedzi:

7

LabVIEW, 38 Prymitywy LabVIEW

„nieznacznie” zmodyfikowany, teraz ustawia zakresy, skanując w poszukiwaniu () i [] i dodając indeks do liczb.

pierwszy

Eumel
źródło
5
Posługując się językiem wymagającym fantazyjnego gifa, natychmiast zyskałeś ∞ rep. GG +1
Addison Crump,
3

Python 2, 72 bajty

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

Aby wyodrębnić liczby, które oceniamy s[1:-1], ciąg wejściowy z usuniętymi końcami, co daje krotkę. Chodzi o to, aby zdobyć rangetę krotkę i wziąć produkt.

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

Krówki zdarzają się w celu dostosowania punktów końcowych. Górny punkt końcowy jest łatwy, wystarczy odciąć pierwszy element, jeśli dane wejściowe zaczynają się od (, zrobione jak [s<'[':].

Drugi punkt końcowy jest trudniejszy. Python nie ma czystego sposobu warunkowego usunięcia ostatniego elementu listy, ponieważ l[:0]usuwa całą rzecz. Robimy więc coś dziwnego. Zmodyfikujemy ciąg krotki przed oszacowaniem, aby przylgnął do ciągu "+True"lub w "+False"zależności od tego, czy s kończy się na ]lub ). Rezultat jest taki, że coś w rodzaju 3,7staje się tym, 3,7+Falseco jest 3,7lub 3,7+Trueco jest 3,8.

Alternatywnie, ładniej 72:

lambda s:eval("reduce(int.__mul__,range((s<'[')+%s+(']'in s)))"%s[1:-1])
xnor
źródło
3

Minecraft 15w35a +, łączny rozmiar programu 638 (patrz poniżej)

Taka sama jak moja odpowiedź tutaj , ale zmodyfikowana. Ponieważ Minecraft nie ma ciągów wejściowych, mogłem zachować dane wejściowe z tablicy wyników. Jeśli jest to problem, rozważ tę odpowiedź niekonkurencyjną.

wprowadź opis zdjęcia tutaj

Oblicza się to PI a,bz włączeniem / wyłączeniem określonym przez dwie dźwignie. wprowadź opis zdjęcia tutajDane wejściowe są podawane za pomocą tych dwóch poleceń: /scoreboard players set A A {num}i /scoreboard players set B A {num}. Pamiętaj, aby użyć /scoreboard objectives add A dummyprzed wejściem.

Zdobył za pomocą: {program size} + ( 2 * {input command} ) + {scoreboard command} = 538 + ( 2 * 33 ) + 34 = 638.

Ten kod odpowiada następującemu kodowi psuedocode:

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

Pobierz świat tutaj .

GamrCorps
źródło
2

Pyth, 20 bajtów

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

Wypróbuj online: pakiet demonstracyjny lub testowy

Wyjaśnienie:

*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
Jakube
źródło
2

Rubinowy, 79 77 bajtów

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

79 bajtów

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

Nie golfowany:

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

Stosowanie:

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

Poważnie, 31 bajtów

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

Pobiera dane wejściowe jako ciąg znaków (zawinięty w podwójne cudzysłowy)

Wypróbuj online (dane należy wprowadzić ręcznie)

Wyjaśnienie:

,#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
Mego
źródło
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)

Pobiera dane wejściowe ze standardowego wejścia.

Morgan Thrapp
źródło
faktycznie opublikowaliśmy nasze odpowiedzi w tym samym drugim Oo
Eumel
@Eumel To powinna być odznaka.
Morgan Thrapp,
tak naprawdę nie opublikuj tego teraz w Meta ^^
Eumel
@Eumel: Właściwie opublikowałeś swój 1 sekundę przed Morganem Thrappem
ev3commander
naprawdę? pokazał odpowiedź n sekund temu na obie odpowiedzi
Eumel,
1

MATLAB, 86 70 bajtów

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

Działa to również z Octave . Możesz spróbować online tutaj . Dodałem kod jako skrypt do tego obszaru roboczego, dzięki czemu możesz po prostu wprowadzić productRangemonit, a następnie wprowadzić dane wejściowe, np '(2,5]'.


Tak więc kod najpierw skanuje dane wejściowe, aby wyodrębnić nawiasy i liczby razem:

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

Zwraca tablicę, która jest wykonana [bracket, number, number, bracket].

Tablica jest porównywana z 42, w rzeczywistości wystarczy dowolna liczba od 42 do 90 włącznie. Określa, jaki to był nawias, dając 1, jeśli jest to nawias wyłączny, i 0, jeśli to nawias włącznie.

a=s<42;

Na koniec wyświetlamy produkt o wymaganym zakresie:

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

Produkt składa się z liczb oznaczających pierwszą cyfrę s(2)a(1) zaczynających się od plus pierwszego rodzaju nawiasu (który jest 1, jeśli nawias wyłączny), w zakresie od drugiej liczby włącznie z drugim s(3)rodzajem nawiasu a(4). Daje to prawidłowy zakres włączenia / wyłączenia.

Tom Carpenter
źródło
1

Julia, 75 bajtów

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

Jest to anonimowa funkcja, która przyjmuje ciąg znaków i zwraca liczbę całkowitą. Aby to nazwać, nadaj mu nazwę, np f=s->....

Nie golfowany:

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
Alex A.
źródło
1

Mathematica, 128 bajtów

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

To za długo ... Obecnie myślę o rozwiązaniu StringReplace+ RegularExpression.

LegionMammal978
źródło
0

PowerShell, 146 104 bajtów

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

Grał w golfa o 42 bajty, zmieniając sposób, w jaki liczby są wyodrębniane z wejścia. Zabiegać!

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)
AdmBorkBork
źródło
0

Japt, 43 41 bajtów

[VW]=Uf"\\d+";ÂV+Â('A>Ug¹oÂW+Â('A<UtJ¹r*1

Wypróbuj online!

ETHprodukcje
źródło
0

Perl 6 , 60 bajtów

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

Jest trochę niedopasowania, ponieważ sposób, w jaki napisałbyś (2,5]przykład w Perlu 6, byłby 2^..5( [2^..5]również działa).
Więc mam do zamiany (2z [2^, i ,ze .., to muszę EVALgo w Range.


stosowanie:

# 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
Brad Gilbert b2gills
źródło
0

CJam, 34 bajty

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

Wypróbuj online

Wyjaśnienie:

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.
Reto Koradi
źródło
0

JavaScript (ES6), 90 bajtów

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

Wyjaśnienie

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

Test

użytkownik 81655
źródło
0

R, 102 104 bajty

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

Bez golfa

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

edytuj, aby umożliwić liczby ujemne [kosztem kolejnych 2 znaków

mnel
źródło
Język?
ThisSuitIsBlackNot
@ThisSuitIsBlackNot - R(i poprawiony w odpowiedzi)
mnel
0

JavaScript (ES6), 79

Jako anonimowa metoda

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

Testowy fragment kodu

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>

edc65
źródło