Produkt über exklusive und inklusive Bereiche

18

Inspiriert von dieser Frage von @ CᴏɴᴏʀO'Bʀɪᴇɴ .

Aus der Frage entnommen:

Ihre Aufgabe ist einfach: Geben Sie bei zwei Ganzzahlen a und b ∏ [a, b] aus; das Produkt des Bereichs zwischen a und b. Sie können a und b in jedem vernünftigen Format verwenden, egal ob es sich um Argumente für eine Funktion, eine Listeneingabe, STDIN usw. handelt. Sie können in jedem vernünftigen Format ausgeben, z. B. als Rückgabewert (für Funktionen) oder als STDOUT. a wird immer kleiner als b sein.

Beachten Sie, dass das Ende exklusiv oder inklusive von b sein kann. Ich bin nicht wählerisch. ^ _ ^

Der Unterschied für diese Herausforderung besteht darin, dass wir in Bezug auf den Bereichstyp wählerisch sein werden. Eingabe ist ein String der Form [a,b], (a,b], [a,b), oder , (a,b)wo eine []ist eine integrative Grenze und ()ist eine exklusive Grenze. Geben Sie anhand der expliziten Grenzen das Produkt des Bereichs an. Außerdem enthält der Eingabebereich immer mindestens 1 Zahl, was bedeutet, dass Bereiche wie (3,4)ungültig sind und nicht getestet werden müssen.

Testfälle

[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

Dies ist ein , also gewinnt das kürzeste Programm in Bytes.


Bestenliste

Das Stapel-Snippet am Ende dieses Beitrags generiert den Katalog aus den Antworten a) als Liste der kürzesten Lösungen pro Sprache und b) als Gesamt-Bestenliste.

Um sicherzustellen, dass Ihre Antwort angezeigt wird, beginnen Sie Ihre Antwort mit einer Überschrift. Verwenden Sie dazu die folgende Markdown-Vorlage:

## Language Name, N bytes

Wo Nist die Größe Ihres Beitrags? Wenn Sie Ihren Score zu verbessern, Sie können alte Rechnungen in der Überschrift halten, indem man sich durch das Anschlagen. Zum Beispiel:

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

Wenn Sie mehrere Zahlen in Ihre Kopfzeile aufnehmen möchten (z. B. weil Ihre Punktzahl die Summe von zwei Dateien ist oder wenn Sie die Strafen für Interpreter-Flags separat auflisten möchten), stellen Sie sicher, dass die tatsächliche Punktzahl die letzte Zahl in der Kopfzeile ist:

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

Sie können den Namen der Sprache auch als Link festlegen, der dann im Snippet angezeigt wird:

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

Alexis Andersen
quelle

Antworten:

7

LabVIEW, 38 LabVIEW-Grundelemente

"leicht" modifiziert, setzt jetzt die Bereiche durch Scannen nach () und [] und Hinzufügen des Index zu den Zahlen.

zuerst

Eumel
quelle
5
Wenn Sie eine Sprache haben, die ein ausgefallenes GIF erfordert, haben Sie sofort ∞ rep gewonnen. GG. +1
Addison Crump
3

Python 2, 72 Bytes

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

Um die Zahlen zu extrahieren, die wir auswerten s[1:-1], wird die Eingabezeichenfolge mit entfernten Enden als Tupel ausgegeben. Die Idee ist, das rangevon diesem Tupel zu bekommen und das Produkt zu nehmen.

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

Das Fudgen geschieht, um die Endpunkte anzupassen. Der obere Endpunkt ist einfach, schneiden Sie einfach das erste Element ab, wenn die Eingabe mit " (, done as" beginnt [s<'[':].

Der andere Endpunkt ist schwieriger. Python bietet keine saubere Möglichkeit, das letzte Element einer Liste bedingt zu l[:0]entfernen, da das Ganze entfernt wird. Also machen wir etwas Seltsames. Wir modifizieren die Tupelzeichenfolge, bevor sie ausgewertet wird, um sie an der Zeichenfolge anzuheften, "+True"oder "+False"je nachdem, ob s mit ]oder endet ). Das Ergebnis ist, dass so etwas 3,7entweder 3,7+Falsewas ist 3,7oder 3,7+Truewas ist 3,8.

Alternative, hübscher 72:

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

Minecraft 15w35a +, Programmgröße 638 insgesamt (siehe unten)

Wie meine Antwort hier , aber modifiziert. Da Minecraft keine Zeichenfolgeeingabe hat, habe ich mir erlaubt, die Anzeigetafeleingabe beizubehalten. Wenn dies ein Problem ist, betrachten Sie diese Antwort als nicht wettbewerbsfähig.

Bildbeschreibung hier eingeben

Dies wird PI a,bmit Inklusiv / Exklusiv berechnet, das von den beiden Hebeln angegeben wird. Bildbeschreibung hier eingebenDie Eingabe erfolgt mit diesen beiden Befehlen: /scoreboard players set A A {num}und /scoreboard players set B A {num}. Denken Sie daran, /scoreboard objectives add A dummyvor der Eingabe zu verwenden.

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

Dieser Code entspricht dem folgenden Pseudocode:

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

Laden Sie die Welt hier herunter .

GamrCorps
quelle
2

Pyth, 20 Bytes

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

Probieren Sie es online aus: Demo oder Test Suite

Erläuterung:

*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
quelle
2

Ruby, 79 77 Bytes

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

79 Bytes

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

Verwendung:

->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
quelle
2

Im Ernst, 31 Bytes

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

Nimmt Eingaben als String (in doppelte Anführungszeichen eingeschlossen)

Online ausprobieren (Eingabe muss manuell erfolgen)

Erläuterung:

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

Übernimmt die Eingabe von stdin.

Morgan Thrapp
quelle
Wir haben unsere Antworten tatsächlich im selben zweiten Oo
Eumel
@Eumel Das sollte ein Abzeichen sein.
Morgan Thrapp
Ich werde das jetzt tatsächlich auf Meta posten ^^
Eumel
@Eumel: Eigentlich hast du deine 1 Sekunde vor Morgan Thrapps
ev3commander 11.12.15
Ja wirklich? es zeigte vor n Sekunden auf beide Antworten geantwortet
Eumel
1

MATLAB, 86 70 Bytes

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

Dies funktioniert auch mit Octave . Sie können es hier online versuchen . Ich habe den Code als Skript zu diesem Arbeitsbereich hinzugefügt, sodass Sie ihn einfach productRangean der Eingabeaufforderung eingeben und dann Ihre Eingabe eingeben können, z '(2,5]'.


Der Code durchsucht also zuerst die Eingabe, um die Klammern und die Zahlen zusammen zu extrahieren:

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

Dies gibt ein Array zurück, aus dem besteht [bracket, number, number, bracket].

Das Array wird mit verglichen 42. Tatsächlich reicht jede Zahl zwischen 42 und 90 aus. Dies bestimmt, um welche Art von Klammer es sich handelt, wobei eine 1 gegeben wird, wenn es sich um eine exklusive Klammer handelt, und eine 0, wenn es sich um eine inklusive Klammer handelt.

a=s<42;

Zuletzt zeigen wir das Produkt des gewünschten Sortiments an:

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

Das Produkt besteht aus Zahlen, die mit der ersten Zahl s(2)plus dem ersten Klammertyp a(1)(bei exklusiven Klammern ist dies eine 1) beginnen und bis zur zweiten Zahl s(3)minus dem zweiten Klammertyp reichen a(4). Dies ergibt den richtigen Inklusiv / Exklusiv-Bereich.

Tom Carpenter
quelle
1

Julia, 75 Bytes

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

Dies ist eine anonyme Funktion, die eine Zeichenfolge akzeptiert und eine Ganzzahl zurückgibt. Um es zu nennen, geben Sie ihm einen Namen, z 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
Alex A.
quelle
1

Mathematica, 128 Bytes

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

Das ist zu lang ... Ich denke gerade über eine StringReplace+ RegularExpressionLösung nach.

LegionMammal978
quelle
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

42 Bytes werden durch Ändern der Art und Weise, wie die Zahlen aus der Eingabe extrahiert werden, entfernt. 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)
AdmBorkBork
quelle
0

Japt, 43 41 Bytes

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

Probieren Sie es online!

ETHproductions
quelle
0

Perl 6 , 60 Bytes

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

Es gibt ein bisschen Fehlanpassung, weil die Art und Weise, wie Sie das (2,5]Beispiel in Perl 6 schreiben würden, so wäre 2^..5( [2^..5]funktioniert auch).
Also muss ich (2mit [2^und ,mit tauschen .., dann muss ich EVALes in eine Range umwandeln.


Verwendung:

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

CJam, 34 Bytes

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

Probieren Sie es online aus

Erläuterung:

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

Erläuterung

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

Prüfung

user81655
quelle
0

R 102 104 Bytes

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

Bearbeiten, um negative Zahlen zuzulassen [auf Kosten von 2 weiteren Zeichen

mnel
quelle
Sprache?
ThisSuitIsBlackNot
@ThisSuitIsBlackNot - R(und in der Antwort behoben)
mnel
0

JavaScript (ES6), 79

Als anonyme Methode

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

Testschnipsel

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
quelle