Quem não ama absolutamente permutações, certo? Eu sei, eles são incríveis - muito divertidos!
Bem, por que não aproveitar essa diversão e torná-la mais divertida ?
Aqui está o desafio:
Dada uma entrada na forma exata:, nPr
onde n
é o conjunto retirado e r
o número de seleções desse conjunto ( n
e r
são inteiros), gera / retorna o número exato de permutações. Para aqueles que estão um pouco enferrujados com a terminologia: Permutação, def. 2a .
No entanto, é aqui que o desafio entra em jogo (o que não é muito fácil):
Você não pode usar nenhuma biblioteca, estrutura ou método interno para sua função de permutação. Você não pode usar um método fatorial, um método de permutação ou qualquer coisa do tipo; você deve escrever tudo sozinho.
Se mais esclarecimentos forem necessários, não hesite em me informar nos comentários e eu agirei prontamente.
Aqui está um exemplo de E / S:
A função de amostra é permute(String) -> int
Entrada:
permute("3P2")
Resultado:
6
Isso é código-golfe, então o código mais curto vence!
fonte
split
para dividir a entrada noP
? Que tal uma função que converte uma string em um número?0 <= r <= n
?Respostas:
CJam,
1514 bytesExperimente online no intérprete CJam .
Como funciona
fonte
Perl, 27 bytes
Contando o shebang como 4, a entrada é obtida de stdin.
Uso da amostra
fonte
l61
?$\
para1
(char 49, octal 61).Haskell,
7166 bytesCoisas bem simples: divida no 'P' e depois leve o produto entre (n-k + 1) e n.
Graças a nimi por sua idéia de usar protetores de padrões em vez de uma
where
cláusula, ele cortou 5 bytes.fonte
Minkolang 0.11 ,
132519 bytesObrigado ao Sp3000 por sugerir isso!
Experimente aqui.
Explicação
Isso usa o mesmo algoritmo que o de Alex:
n P k
=n(n-1)(n-2)...(n-k+1)
.fonte
Julia,
635848 bytesIsso cria uma função sem nome que aceita uma sequência e retorna um número inteiro. Para chamá-lo, dê um nome, por exemplo
f=s->...
.Ungolfed:
Isso usa o fato de que o número de permutações é n ( n -1) ( n -2) ... ( n - k +1).
Economizou 10 bytes graças a Glen O!
fonte
Int
, então você pode apenas usarmap(parse,...)
.Int
era necessário nessa situação. Muito obrigado!Utilitários Bash + Linux, 33
jot
produz a sequência der
números inteiros começando emn-r+1
e os separa com*
. Essa expressão é canalizadabc
para avaliação aritmética.fonte
MATLAB, 54 bytes
Tentou diminuí-lo, mas uma das coisas nas quais o MATLAB é realmente ruim é obter entradas. São necessários 32 caracteres apenas para obter os dois números da string de entrada!
Código bastante auto-explicativo. Obtenha a entrada no formato em
%dP%d
que% d é um número inteiro. Divida isso emn
er
. Em seguida, exiba o produto de cada número inteiro no intervalon-r+1
atén
. Curiosamente, isso funciona mesmo paraxP0
fornecer a resposta correta de 1. Isso ocorre porque no MATLAB aprod()
função retorna 1 se você tentar fazer o produto de uma matriz vazia. Sempre quer
for zero, o intervalo será um array vazio; portanto, o bingo recebe 1.Isso também funciona perfeitamente com o Octave também. Você pode experimentá-lo online aqui .
fonte
Javascript,
5957 bytesfonte
Java (594 - bytes)
fonte
J, 23 bytes
Uma função anônima. Exemplo:
Explicação:
A função stope que usei pode ser contada como um built-in ... Ela fica em algum lugar entre a generalidade do operador de multiplicação e a especificidade do operador fatorial.
fonte
APL, 23
Pega a string como argumento. Explicação:
fonte
⎕ML←3
no Dyalog.Python 2, 66
Bem direto. Processa a entrada do número como
a,b
. Mantém um produto em execução comoP
, multiplicado pelos primeirosb
termos dea, a-1, a-2, ...
.fonte
input()
não resultou em erro."3P2"
, o que eu acho que geralmente é permitido, mas aqui o desafio diz "uma entrada na forma exata", então eu a altero para uma função que usa uma string.TI-BASIC, 52 bytes
O TI-BASIC possui uma função "produto de uma lista", portanto, contornar a restrição de componentes internos não é muito difícil. No entanto, o TI-BASIC não suporta listas vazias - portanto, precisamos
Para extrair os dois números, extraio o primeiro número como uma substring. Isso é caro ; ocupa toda a segunda linha. Para não precisar fazer isso novamente para o segundo número, defino a variável P para esse número e avalio a cadeia inteira usando
expr(
, depois divido por P².Finalmente, tomo uma permutação aleatória da lista entre os dois números (tomando o cuidado de adicionar um ao segundo número) e pego o produto.
fonte
Ouroboros ,
4745 bytesParte disso é muito feia - eu imagino que poderia ser ainda mais jogado.
Cada linha de código em Ouroboros representa uma cobra comendo seu rabo.
Cobra 1
S
muda para a pilha compartilhada.r.r
lê um número, duplica e lê outro. (Caracteres não numéricos comoP
são ignorados.)-
Subtrai os dois. Se a entrada foi7P2
, agora temos7
,5
na pilha compartilhada. Finalmente,1(
come o caráter final da cobra. Como esse é o personagem em que o ponteiro de instrução está, a cobra morre.Cobra 2
)s
não faz nada na primeira vez..!+
duplica a parte superior da pilha do snake 2, verifica se é zero e, se sim, adiciona 1. Na primeira iteração, a pilha está vazia e tratada como se contivesse zeros infinitos1
; nas iterações posteriores, a pilha contém um valor diferente de zero e isso não tem efeito.Em seguida,
S
alterna para a pilha compartilhada, onde temos o númeron
e um contador para calcular o produto.1+
incrementa o contador..@@.@\<!
duplica os números e empurra 1 sen
ainda for maior ou igual ao contador, 0 caso contrário.@@*Y
depois multiplica o contador por essa quantidade e puxa uma cópia para a pilha da cobra 2.s.!+
volta para a pilha do snake 2 e usa o mesmo código anterior para converter o número superior em 1 se fosse 0 e mantê-lo da mesma forma. Em seguida,*
multiplica o resultado pelo produto parcial que estava na pilha.Agora voltamos à pilha compartilhada (
S
), duplicamos o contador-ou-zero (.
) e o negamos duas vezes (!!
) para transformar um contador diferente de zero em um 1.4*.(
multiplica isso por 4, duplica e consome muitos caracteres do fim da cobra.(
são comidos e os loops de controle ficam no início do código. Aqui)
regurgita quatro caracteres,s
volta para a pilha de snake 2 e a execução continua.n
, temos um 0 na pilha e nada é comido.sn
muda para a pilha da cobra 2 e gera o valor superior como um número; então1(
come o último caractere e morre.O resultado é que o produto
(r+1)*(r+2)*...*n
é calculado e produzido.Experimente
Mostrar snippet de código
fonte