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


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 

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

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).


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 .


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

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.


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.


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


8

Mathematica, 15 bytes

1##&@@Range@##&

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

#2!/(#-1)!&

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.


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


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 ...


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.


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

5

Oitava, 15 bytes

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

Direto. Usa a faixa inclusiva.


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).


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.


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.


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

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

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;}

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

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

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).


4

Braquilog , 3 bytes

⟦₃×

Experimente online!

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


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

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

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.

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.


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..

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.