Produto em faixas exclusivas e inclusivas


18

Inspirado por esta pergunta de @ CᴏɴᴏʀO'Bʀɪᴇɴ .

Retirado da pergunta:

Sua tarefa é simples: dados dois inteiros aeb, output ∏ [a, b]; isto é, o produto do intervalo entre a e b. Você pode pegar aeb em qualquer formato razoável, sejam argumentos para uma função, uma entrada de lista, STDIN, etc. Você pode imprimir em qualquer formato razoável, como um valor de retorno (para funções) ou STDOUT. a sempre será menor que b.

Observe que o final pode ser exclusivo ou inclusivo de b. Eu não sou exigente. ^ _ ^

A diferença para esse desafio é que seremos exigentes quanto ao tipo de faixa. Entrada é uma cadeia da forma [a,b], (a,b], [a,b), ou (a,b)onde um []é um limite inclusivo e ()é um limite exclusivo. Dados os limites explícitos, forneça o produto do intervalo. Além disso, o intervalo de entrada sempre incluirá pelo menos 1 número, o que significa intervalos (3,4)inválidos e não precisam ser testados.

Casos de teste

[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

Este é um , portanto o programa mais curto em bytes vence.


Entre os melhores

O snippet de pilha na parte inferior desta postagem gera o catálogo a partir das respostas a) como uma lista da solução mais curta por idioma eb) como uma tabela geral de líderes.

Para garantir que sua resposta seja exibida, inicie-a com um título, usando o seguinte modelo de remarcação:

## Language Name, N bytes

onde Nestá o tamanho do seu envio. Se você melhorar sua pontuação, poderá manter as pontuações antigas no título, identificando-as. Por exemplo:

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

Se você quiser incluir vários números no cabeçalho (por exemplo, porque sua pontuação é a soma de dois arquivos ou você deseja listar as penalidades do sinalizador de intérpretes separadamente), verifique se a pontuação real é o último número no cabeçalho:

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

Você também pode transformar o nome do idioma em um link que será exibido no snippet:

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

Respostas:


7

LabVIEW, 38 Primitivas do LabVIEW

"ligeiramente" modificado, agora define os intervalos pesquisando () e [] e adicionando o índice aos números.

primeiro


5
Por ter um idioma que exige um gif chique, você imediatamente ganha rep. GG. +1
Addison Crump

3

Python 2, 72 bytes

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

Para extrair os números que avaliamos s[1:-1], a string de entrada com as extremidades removidas, o que fornece uma tupla. A idéia é obter rangeessa tupla e levar o produto.

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

O fudging acontece para ajustar os pontos finais. O ponto final superior é fácil, basta cortar o primeiro elemento se a entrada começar com (, feito como [s<'[':].

O outro ponto final é mais complicado. O Python não tem uma maneira limpa de remover condicionalmente o último elemento de uma lista porque l[:0]remove a coisa toda. Então, fazemos algo estranho. Modificamos a string da tupla antes que ela seja avaliada para aderência à string "+True"ou "+False"dependendo de s terminar em ]ou ). O resultado é que algo como 3,7se torna o 3,7+Falseque é 3,7ou o 3,7+Trueque é 3,8.

Alternativo, mais bonito 72:

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

3

Minecraft 15w35a +, tamanho do programa 638 total (veja abaixo)

Igual à minha resposta aqui , mas modificada. Como o Minecraft não tem entrada de string, tomei a liberdade de manter a entrada do placar. Se isso for um problema, considere esta resposta não competitiva.

insira a descrição da imagem aqui

Isso calcula PI a,bcom inclusivo / exclusivo especificado pelas duas alavancas. insira a descrição da imagem aquiA entrada é fornecida usando estes dois comandos: /scoreboard players set A A {num}e /scoreboard players set B A {num}. Lembre-se de usar /scoreboard objectives add A dummyantes da entrada.

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

Este código corresponde ao seguinte 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

Baixe o mundo aqui .


2

Pitão, 20 bytes

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

Experimente on-line: Demonstration or Test Suite

Explicação:

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

Uso:

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

2

Sério, 31 bytes

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

Recebe entrada como uma string (entre aspas duplas)

Experimente online (a entrada deve ser inserida manualmente)

Explicação:

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

Recebe entrada de stdin.


na verdade, postamos nossas respostas no mesmo segundo Oo
Eumel 10/12/2015

@Umel Isso deve ser um emblema.
Morgan Thrapp

na verdade, vou postar isso no Meta agora ^^ #
1011 Eumel

@Eumel: Na verdade, você postou o seu 1 segundo antes do Morgan Thrapp's
ev3commander

sério? mostrou respondido n segundos atrás em ambas as respostas
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)))

Isso também funciona com o Octave . Você pode tentar online aqui . Eu adicionei o código como um script a esse espaço de trabalho, para que você possa digitar productRangeno prompt e digitar sua entrada, por exemplo '(2,5]'.


Portanto, o código primeiro verifica a entrada para extrair os colchetes e os números juntos:

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

Isso retorna uma matriz que é composta [bracket, number, number, bracket].

A matriz é comparada com 42, na verdade, qualquer número entre 42 e 90, inclusive. Isso determina que tipo de colchete era, fornecendo 1 se for um colchete exclusivo e 0 se um colchete inclusivo.

a=s<42;

Por fim, exibimos o produto da faixa necessária:

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

O produto é de números que começam com o primeiro número s(2)mais o primeiro tipo de suporte a(1)(que é 1 se for um suporte exclusivo), variando até e incluindo o segundo número s(3)menos o segundo tipo de suporte a(4). Isso fornece a faixa inclusiva / exclusiva correta.


1

Julia, 75 bytes

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

Esta é uma função anônima que aceita uma string e retorna um número inteiro. Para chamá-lo, dê um nome, por exemplo 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 bytes

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

Isso é muito longo ... Atualmente, estou pensando em uma solução 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

Golpeou 42 bytes alterando a maneira como os números são extraídos da entrada. Uau!

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 bytes

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

Há um pouco de incompatibilidade, porque a maneira como você escreveria o (2,5]exemplo no Perl 6 seria 2^..5( [2^..5]também funciona).
Então eu tenho que trocar (2com [2^, e ,com .., então eu tenho que fazer EVALisso em um Range.


uso:

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

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

Experimente online

Explicação:

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 bytes

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

Explicação

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

Teste


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

editar para permitir números negativos [à custa de mais 2 caracteres



@ThisSuitIsBlackNot - R(e corrigido na resposta)
mnel

0

JavaScript (ES6), 79

Como método anônimo

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

Snippet de teste

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>

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.