Produto em um intervalo

39

Sua tarefa é simples: dados dois inteiros ae b, output ∏[a,b]; isto é, o produto do intervalo entre ae b. Você pode usar, ae bem qualquer formato razoável, 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. asempre será menor que b.

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

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

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 em seu cabeçalho (por exemplo, porque sua pontuação é a soma de dois arquivos ou deseja listar as penalidades de sinalizador de intérprete 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

Conor O'Brien
fonte
1
Eu vou responder isso no TI-BASIC amanhã.
SuperJedi224
@ SuperJedi224 Good luck;)
Conor O'Brien
A entrada pode ser tomada como b, a?
FlipTack
@FlipTack sim você pode
Conor O'Brien

Respostas:

36

Geléia, 2 bytes

rP

Leva dois números como argumentos de linha de comando. Experimente online.

Observe que esse é um intervalo inclusivo. Pelo custo de um byte (3 bytes), podemos tornar isso exclusivo:

’rP

Experimente online. Observe que os argumentos devem ser fornecidos na ordem b adesta versão.

Explicação

Inclusive

a rP b
  r   dyadic atom, creates inclusive range between a and b
   P  computes product of the list

Exclusivo

b ’rP a
  ’   decrement b (by default, monadic atoms in dyadic chains operate on the left argument)
   r  range
    P product 
um spaghetto
fonte
10
Eu duvido que este é beatable ...
kirbyfan64sos
14
@ kirbyfan64sos você geléia?
Aaron
30

ArnoldC , 522 511 bytes

Primeiro post no codegolf!

Eu me diverti fazendo isso. Gama exclusiva.

LISTEN TO ME VERY CAREFULLY f
I NEED YOUR CLOTHES YOUR BOOTS AND YOUR MOTORCYCLE a
I NEED YOUR CLOTHES YOUR BOOTS AND YOUR MOTORCYCLE b
GIVE THESE PEOPLE AIR
HEY CHRISTMAS TREE r
YOU SET US UP 1
HEY CHRISTMAS TREE l
YOU SET US UP 1
STICK AROUND l
GET TO THE CHOPPER r
HERE IS MY INVITATION r
YOU'RE FIRED a
ENOUGH TALK
GET TO THE CHOPPER a
HERE IS MY INVITATION a
GET UP 1
ENOUGH TALK
GET TO THE CHOPPER l
HERE IS MY INVITATION b
LET OFF SOME STEAM BENNET a
ENOUGH TALK
CHILL
I'LL BE BACK r
HASTA LA VISTA, BABY

Explicações (Obrigado Bijan):

DeclareMethod f
        MethodArguments a
        MethodArguments b
        NonVoidMethod
        DeclareInt r
        SetInitialValue 1
        DeclareInt l
        SetInitialValue 1
        WHILE l
                AssignVariable r
                        SetValue r
                        MultiplicationOperator a
                EndAssignVariable
                AssignVariable a
                        SetValue a
                        + 1
                EndAssignVariable
                AssignVariable l
                        SetValue b
                        > a
                EndAssignVariable
        EndWhile
        Return r
EndMethodDeclaration
Zycho
fonte
Hahaha ... Eu estou stil rindo
rpax
mas uma explicação seria ótima
rpax
Aqui ele é convertido e recuado usando isso como referência #
1015 Bijan
Qual intérprete você está usando?
lirtosiast
O funcionário um . Você está certo sobre o NO NO PROBLEMO e o 1 (não o 0;))
Zycho 11/12/15
18

Python, 30 bytes

f=lambda a,b:a>b or a*f(a+1,b)

Gama inclusiva. Multiplica repetidamente e incrementa o ponto final esquerdo, até que seja mais alto que o ponto final direito; nesse caso, é o produto vazio de 1 (como True).

xnor
fonte
13

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

insira a descrição da imagem aqui

Isso calcula PI [a,b). A 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 dummy antes da entrada.

Marcado usando: {program size} + ( 2 * {input command} ) + {scoreboard command} = 356 + ( 2 * 33 ) + 34 = 456 .

Este código corresponde ao seguinte psuedocode:

R = 1
loop:
  R *= A
  A += 1
  if A == B:
    print R
    end program

Baixe o mundo aqui .

GamrCorps
fonte
O tamanho do programa é contado por esse método de pontuação .
GamrCorps
Droga, você conseguiu antes de mim. : I
Addison Crump
Você precisa especificar a versão do instantâneo, 15w46aou seja, algo assim.
Addison Crump
Minecraft: D LoL, jogando golfe em Minecraft: D
username.ak
12

TI-BASIC, 9 bytes

Input A
prod(randIntNoRep(A,Ans

Retira um número Ans e outro de um prompt.

Também 9 bytes, tendo como entrada uma lista de Ans:

prod(randIntNoRep(min(Ans),max(Ans
lirtosiast
fonte
1
Demorei um pouco para descobrir por mim mesmo, então vou publicá-lo aqui: Cada função no TI-BASIC é de um byte.
Nic Hartley
3
@QPaysTaxes Muitos deles fazem, mas não todos. %é de dois bytes.
mbomb007
12

Python 2, 44 38 bytes

lambda l:reduce(int.__mul__,range(*l))

Praticamente a resposta óbvia da função anônima.

EDIT: Obrigado ao xnor por salvar 6 bytes com alguns recursos que eu não conhecia.

quintopia
fonte
1
Você pode usar o built-in int.__mul__, que funciona no lugar da sua lambda. Os dois números x,ytambém podem ser escritos como descompactados *l.
Xnor
36
Riscado 44 ainda parece 44.
a spaghetto
10

Pitão, 5 bytes

*FrQE

Pyth não tem produto, por isso reduzimos * ao longo do intervalo.

Utiliza uma gama exclusiva.

lirtosiast
fonte
4
*FrFQé equivalente, mas com entrada diferente, apenas por diversão :)
FryAmTheEggman
9

R, 22 bytes

function(a,b)prod(a:b)
freekvd
fonte
8

Mathematica, 15 bytes

1##&@@Range@##&

Uma solução mais curta que funciona apenas para números inteiros não negativos:

#2!/(#-1)!&
alefalpha
fonte
3
Ainda mais curto para números inteiros não negativos:#2!#/#!&
Anders Kaseorg 25/03
8

JavaScript (ES6), 34 bytes

(a,b)=>eval("for(c=a;a<b;)c*=++a")

Às vezes, a resposta mais simples é a melhor! Apenas um forlaço dentro eval. Gama inclusiva.

user81655
fonte
Uau. Isso é impressionante!
Conor O'Brien
Ah cara, eu pensei nessa solução exata enquanto tentava jogar mina agora ... +1
ETHproductions
1
Este é ainda mais curto, com 25 caracteres: f=(a,b)=>a<b?a*f(a+1,b):1
Matthias Burtscher
7

Sério, 4 bytes

,ixπ

,         Read list [a,b] from stdin
 i        Flatten it to a b
  x       Pop a,b, push range(a,b)
   π      Pop the list and push its product.

Hex Dump:

2c6978e3

Experimente online

quintopia
fonte
7

Japonês , 7 bytes

Desafios fáceis como esse são sempre divertidos. :)

UoV r*1

Experimente online!

Explicação

UoV r*1  // Implicit: U = first input, V = second input
UoV      // Generate range [U,V).
    r*1  // Reduce by multiplication, starting at 1.

Uau, isso parece patético em comparação com as outras respostas até agora. Eu preciso trabalhar mais no Japt ...

ETHproductions
fonte
Explicação? : 3
Conor O'Brien
@ CᴏɴᴏʀO'Bʀɪᴇɴ Done :)
ETHproductions
2
Woot, representante de 5K! : D
ETHproductions
6

Haskell, 19 17 bytes

a#b=product[a..b]

Exemplo de uso: 2#5-> 120.

nimi
fonte
Você pode optar por incluir b.
xnor
@xnor: Ups, deve ter esquecido isso. Obrigado!
nimi
Não tenho certeza, mas acho que o PPCG permite respostas dadas como expressões.
proud haskeller
@proudhaskeller: o padrão é permitir programas e funções completos. Trechos, expressões etc. devem ser explicitamente permitidos na descrição da tarefa.
N /
5

Prolog, 45 bytes

Código:

p(A,B,C):-A=B,C=A;D is A+1,p(D,B,E),C is A*E.

Explicado:

p(A,B,C):-A=B,      % A is unifiable with B
          C=A       % Unify C with A
          ;         % OR
          D is A+1, % D is the next number in the range
          p(D,B,E), % Recurse on the range after the first element
          C is A*E. % The result C is the product of the first element and the result 
                      of the recursion

Exemplo:

p(5,10,X).
X = 151200

p(-4,-1,X).
X = 24
Emigna
fonte
5

Oitava, 15 bytes

@(a,b)prod(a:b)

Direto. Usa a faixa inclusiva.

lirtosiast
fonte
5

CJam, 6 19 18 10 bytes

Agradecemos a Dennis e RetoKoradi pela ajuda no golfe!

q~1$-,f+:*

Experimente online

Toma entrada como a b. CalculaPI [a,b).

Nota: este programa tem 6 bytes de comprimento e só funciona se ae bfor positivo.

q~,>:*

Experimente online

Toma entrada como a b. Calcula PI [a,b).

GamrCorps
fonte
q~{_)_W$<}g;]:*salva três bytes.
Dennis
4
q~1$-,f+:*por 10 bytes.
Reto Koradi
5

Utilitários Bash + GNU, 13

seq -s* $@|bc

Assume que não há arquivos no diretório atual cujos nomes começam com -s . Início e fim (inclusive) são passados ​​como parâmetros de linha de comando.

Isso simplesmente produz a sequência do início ao fim, separada por * e depois canalizada bcpara avaliação aritmética.

Trauma Digital
fonte
2
Mas inicio todos os meus arquivos com -s! : P
Conor O'Brien
5

MATL (não concorrente), 4 bytes

Faixa Inclusiva

2$:p

Experimente online!

Explicação

2$: % Implicitly grab two input arguments and create the array input1:input2
p   % Take the product of all array elements

Agradeço a @Don Muesli por me ajudar a entender esse assunto do MATL.

Suever
fonte
Boa resposta! Desde que a língua é posterior o desafio, você pode enviar a resposta, mas talvez você deve indicar que é não-elegíveis para ganhar
Luis Mendo
&:pUm byte não é mais curto?
DJMcMayhem
Sim @DrGreenEggsandIronMan então eu acho que é não-concorrentes de qualquer maneira para que eu pudesse encurtá-lo, mas no momento eu postei a minha resposta não tínhamos&
Suever
4

Jolf , 4 bytes

Experimente aqui!

OrjJ
  jJ two inputs
 r   range between them [j,J)
O    product
Conor O'Brien
fonte
No Jolf moderno, isso pode ser Orj(que é automaticamente transpilado para Orjx)
Conor O'Brien
4

Ruby, 22 bytes

->i,n{(i..n).reduce:*}

Ungolfed:

-> i,n {
  (i..n).reduce:* # Product of a range
}

Uso:

->i,n{(i..n).reduce:*}[5,10]
=> 151200
Vasu Adari
fonte
1
Eu estava pensando nessa mesma solução ontem à noite, mas não tive tempo para escrevê-la.
Alexis Andersen
4

C, 32 bytes

Para [a,b):

f(a,b){return a-b?a*f(a+1,b):1;}

Para [a,b](nas sugestões de Katenkyo, 32 bytes novamente):

f(a,b){return a<b?a*f(a+1,b):b;}
Sahil Arora
fonte
1
Encontrei uma outra solução em C, se você estiver interessado, também tem 32 bytes f(a,b){return a<b?a*f(a+1,b):b;}. :)
Katenkyo
-5 bytes em gcc com em a=...vez dereturn...
4

05AB1E , 2 bytes (não concorrente)

Código:

ŸP

Explicação:

Ÿ   # Inclusive range [input, ..., input]
 P  # Total product of the list
    # Implicit printing top of the stack
Adnan
fonte
4

J, 8 bytes

[:%/!@<:

Uso

>> f =: [:%/!@<:
>> f 10 5
<< 15120

Onde >> está STDIN e<< STDOUT.

Explicação

Ele calcula ∏[a,b]como (b-1)!/(a-1)!.

minus_one =: <:
factorial =: !
of        =: @
monadic   =: [:
division  =: %/
f =: monadic division factorial of minus_one

Versão anterior de 13 bytes

Escrito quando eu não tinha idéia do que Jé: p

*/(}.[:>:i.)/

Uso:

   */(}.[:>:i.)/ 5 10
30240

Explicação:

*/            NB. multiply over
  (
   }.         NB. remove [the first x items] from
     [:>:     NB. increment all of
         i.   NB. the numbers from 0 to [y-1]
           )
            / NB. insert the above code into the following numbers

Explicação detalhada:

i.10 would produce 0 1 2 3 4 5 6 7 8 9

>:i.10 would make it 1 2 3 4 5 6 6 7 8 9 10

the [: is used to make the ">:" take only one argument (a monad)
because if it takes two arguments, it is a different function.
so [:>:i.10 becomes 1 2 3 4 5 6 7 8 9 10

}. means take away the first [x] items from the following list,
so 5}.1 2 3 4 5 6 7 8 9 10 becomes 6 7 8 9 10

the two slashes "/" in the code are actually the same
for example, */6 7 8 9 10 becomes 6*7*8*9*10
Freira Furada
fonte
1
Ótima explicação!
Wizzwizz4
2
Você pode usar [:*/]+i.@-para 10 bytes se você tomar a faixa [a, b)como b ([:*/]+i.@-) atal que 10 ([:*/]+i.@-) 5saídas 15120.
milhas
@miles Essa resposta foi escrito quando eu não sabia Jnada: p
Leaky Nun
Sua solução de 8 bytes não funcionará se nenhum dos argumentos for positivo.
Dennis
4

JavaScript (ES6), 22 bytes

Não acredito que nenhum de nós, jogadores de JS, pensou em usar recursão ...

a=>F=b=>a-b?b*F(b-1):a

Atribua a uma variável com var q = a=>F=b=>a-b?b*F(b-1):a, por exemplo , e chame como q(2)(5).

ETHproductions
fonte
4

Braquilog , 3 bytes

⟦₃×

Experimente online!

A entrada é passada como [A,B]. O intervalo é exclusivo de B, mas pode ser inclusivo substituindo o com .

String não relacionada
fonte
3
Bem-vindo ao PPCG! Atualmente, não importa quando os idiomas são criados, portanto, essa resposta é perfeitamente competitiva. Esperamos que você aproveite a sua estadia!
Conor O'Brien
Ah, bom saber! Eu acho que tenho visto muitos desafios antigos com respostas classificadas por votos.
String não relacionada
@UnrelatedString A propósito, se você vir essas mensagens não concorrentes, é perfeitamente bom editá-las.
Esolanging Fruit
3

Minkolang 0.14 , 7 bytes

nnL$*N.

Experimente aqui.

Explicação

nn         Takes two numbers from input
  L        Pops b,a and pushes a..b
   $*      Product the whole stack
     N.    Output as number and stop.
El'endia Starman
fonte
3

Python, 52 bytes

Código muito simples; um pouco demais.

def p(a,b):
 t=1
 for i in range(a,b):t*=i
 return t
Sherlock9
fonte
3

JavaScript (ES6), 45 41 bytes

Guardado 4 bytes graças a @ Cᴏɴᴏʀ O'Bʀɪᴇɴ

(a,b)=>[...Array(b-a)].reduce(x=>x*a++,1)

Parece um pouco longo ...

(a,b)=>           // Define an anonymous function that takes parameters a and b, and returns:
[...Array(b-a)]   // An array of b-a items,
.reduce(          // Reduced by
x=>x*a++          //  multiplying each item with the previous,
,1)               //  starting at 1.
ETHproductions
fonte
Isso funciona? parabéns! Eu não acho que você precise do ymapeamento de redução, então pare emx=>x*a++
Conor O'Brien
@ CᴏɴᴏʀO'Bʀɪᴇɴ Obrigado, esse truque funciona muito bem!
ETHproductions
2
você deve adicionar um ponto e vírgula no final. para a pontuação.
Seadrus
3

Julia, 16 bytes

f(a,b)=prod(a:b)

Nota: se o objeto de intervalo a:b(que é literalmente armazenada como um valor de partida e um valor de paragem, e inclui internamente um "incremento por um em cada passo" valor) é permitida a entrada, então são necessárias apenas 4 bytes: prod.

Glen O
fonte
3

Perl 6 , 14 bytes

{[*] $^a..$^b}

uso:

my &code = {[*] $^a..$^b}
say code |$_ for (2,5),(5,10),(-4,3),(0,3),(-4,-1);
# 120
# 151200
# 0
# 0
# 24

say chars code 1,10000;
# 35660

Se você deseja excluir o último elemento, use em ..^vez de..

Brad Gilbert b2gills
fonte