Neste desafio, tentamos resolver dois problemas importantes ao mesmo tempo. Eles são:
- Inteiros dadas a e b , dizer se um b -1 é um número primo.
- Dados os números a e b , retorne nCr (a, b).
Especificamente, você deve escrever dois programas, um que executa a primeira tarefa e outro que executa a outra. Como queremos resolver os dois problemas ao mesmo tempo, é recomendável usar o mesmo trecho de código nos dois programas.
Pontuação
A pontuação de uma resposta é a distância de Levenshtein entre os dois programas. Menor pontuação é melhor. Em caso de empate, a resposta com o código combinado mais curto dos dois programas vence. Você pode usar esse script para calcular a pontuação da sua solução.
Regras
- Você deve escrever dois programas no mesmo idioma que resolvam as tarefas descritas acima. Você pode usar qualquer método de E / S que desejar. Para a tarefa 1, você pode retornar um valor de verdade / falsidade ou escolher dois valores para significar verdadeiro e falso e retorná-los de acordo. Por exemplo. você pode escolher que
"prime"
significa verdadeiro e"not prime"
falso. - Os algoritmos que você usa devem funcionar para todas as entradas possíveis, mas tudo bem se o código falhar para números grandes devido a limitações do tipo de número usado. Você pode assumir que a entrada é válida.
Nenhum subconjunto do programa deve resolver o problema, ou seja. o código não deve funcionar se algum caractere for removido. Por exemplo, o código a seguir não é válido, porque é possível remover o outro bloco não utilizado sem interromper o programa:
if (1) { /* change to 0 to get the second program*/ ... } else { ... }
As brechas padrão não são permitidas.
Casos de teste
a b -1 é primo?
a b
1 1 false
2 3 true
5 2 false
2 5 true
4 3 false
2 7 true
nCr
a b nCr(a,b)
1 1 1
5 2 10
4 3 4
10 7 120
12 5 792
Respostas:
MATLAB, distância 10
Primalidade:
nCr:
fonte
PHP, distância 29
a^b-1
imprime 0 para true e qualquer valor inteiro> 0 para falsenCr(a,b)
PHP, distância 36
a^b-1
imprime 1 para verdadeiro nada para falsonCr(a,b)
fonte
Rubi, Distância 1, Comprimento combinado 194
Verificação Prime:
Experimente online!
nCr:
Experimente online!
Como previsto nos comentários, algum idiota sempre tem que ir contra o espírito do problema. Foi divertido encontrar uma maneira de contornar isso! Eis como funciona: Temos duas soluções separadas para os problemas. Executamos os dois, os colocamos em uma matriz e, em seguida, escolhemos o 0º elemento ou o 1º, para uma distância de edição de 1. Isso normalmente seria ilegal, já que você poderia excluir tudo, exceto o cálculo desejado e ainda funcionaria. . No entanto, cada snippet de código é gravado para depender do carregamento da mesma biblioteca padrão
'mathn'
:prime?
mathn
mudar a forma como a divisão funciona - antes de carregá-la,3/4
avalia como0
, enquanto depois avalia a fração(3/4)
. Como o resultado intermediário(a+1-i)/i
nem sempre é um número inteiro, o resultado geral está errado sem a biblioteca.Agora, apenas precisamos tornar o carregamento da biblioteca contingente, pois o restante do código não é modificado. Fazemos isso gerando o nome mathn usando o comprimento do caractere do restante do código principal: o cálculo combinado tem o comprimento 55, que dobrou para 110 e é o valor ASCII de 'n'. Portanto, concatenar isso na string 'math' fornece a biblioteca desejada.
Como um bônus, a introdução das dependências da biblioteca também faz com que o código seja executado em um período de tempo razoável. Em particular, a abordagem ingênua do nCr não geraria resultados intermediários fracionários.
fonte
05AB1E , distância 3
nCr
Experimente online!
isPrime (a ^ b-1)
Experimente online!
fonte
Empilhado , distância 13
Experimente online! O primeiro calcula nCr, a segunda primalidade, usando o teorema de Wilson.
(f g h) fork!
apareceN
args da pilha (chame-osa0 ... aN
) e aplica-sea0 ... aN f a0 ... aN h g
.Para o primeiro programa:
E para o segundo:
fonte
Python 2 , distância 15 , comprimento 172
Tarefa 1
Tarefa 2
Experimente online!
fonte
Mathematica, distância 10
Tarefa 1:
PrimeQ[#2^#-1]&
Tarefa 2:
Binomial[#2,#]&
Ambas as funções recebem as entradas na ordem
b,a
.fonte
Javascript ES7, distância 14
Obrigado @Conor O'Brien por reduzir a distância em 7
Primalidade:
Retorna 1 se prime retorna 0 se não for prime.
Verificação de primos incrivelmente ineficiente, verifica o módulo numérico cada número menor que ele e maior que 1 ...
nCr:
Multiplica 1 por cada número de y + 1 a x e divide por cada número de 1 a xy (x! / Y!) / (Xy)!
fonte
f=x=>y=>{t=x+1;s=1;for(i=1;i<t;i++){if(y<i)s*=i/(i-y)}return s}
dar a distância de edição 14. Experimente online!Oitava, distância
171615nCr
Experimente online!
isprime(a^b-1)
Experimente online!
Eu não sou muito fluente em Oitava, então não sei se existe algum componente para calcular nCr.
fonte
MATL , distância 4, comprimento 6
Diga se
a^b-1
é primo:Experimente online!
Computar
nCr(a,b)
:Experimente online!
Como funciona
Diga se
a^b-1
é primo:Computar
nCr(a,b)
:fonte
Pitão, distância 4, comprimento total 8
Primalidade de
a^b-1
Experimente online!
nCr (a, b)
Experimente online!
Ambos recebem entrada como tuplas / listas de números inteiros (por exemplo
(1,2)
).fonte
PHP, distância 14
Escrever um programa com duas funções e chamar apenas uma delas levaria a uma distância de 1, mas seria muito ruim.
Teste Principal, 100 bytes:
nCr, 98 bytes:
fonte
Gelatina , distância 4, comprimento 5
Tarefa 1
Tarefa 2
Experimente online!
Como funciona
Tarefa 1
Tarefa 2
fonte
JavaScript, Pontuação: 1, Comprimento:
144142126117função (a, b) {s = "a = Math.pow (a, b) -s.length + 79; para (b = 2; a% b ++;); b> a1for (t = s.length-79 ; b;) t = t * a - / b - "; return eval (s.split (1) [1])}Ambas as sub-rotinas usam o comprimento da outra para calcular sua própria constante, para que nenhum caractere possa ser removidofonte