Tom vai implementar uma nova linguagem de programação de sua invenção. Mas antes de realmente começar a trabalhar nele, ele quer saber se seu idioma deve diferenciar maiúsculas de minúsculas ou não.
Por um lado, a diferenciação entre maiúsculas e minúsculas parece mais fácil de implementar para ele, mas ele se preocupa que isso possa causar uma falta nas possibilidades de combinações de caracteres que formam uma variável, o que significa que nomes de variáveis mais longos devem ser usados para evitar conflitos de nomeação (por por exemplo, você pode usar Hello
, HEllo
, heLLo
e um monte de outras possibilidades se o idioma é sensível a maiúsculas, mas apenas HELLO
se não).
Mas Tom é uma pessoa meticulosa, então apenas uma preocupação não é suficiente para ele. Ele quer saber os números.
O desafio
Escreva uma função (ou um programa completo se o seu idioma não os suportar) que, dado um número inteiro n
como entrada, produza (ou retorne) a diferença no número de permutações possíveis para uma sequência de comprimento n
com e sem distinção entre maiúsculas e minúsculas.
No idioma de Tom, os nomes de variáveis podem incluir todas as letras do alfabeto, sublinhados e, a partir do segundo caractere, dígitos.
Casos de teste
Input (length of the variable) -> Output (difference between the possibilities with case sensitivity and the possibilities with case insensitivity)
0 -> 0
1 -> 26
2 -> 2340
5 -> 784304586
8 -> 206202813193260
9 -> 13057419408922746
Implementação de referência C ++ não concorrente
void diff(int n) {
long long total[2] = {0, 0}; //array holding the result for case insensivity ([0]) and case sensitivity ([1])
for (int c = 1; c <= 2; c ++) //1 = insensitivity, 2 = sensitivity
for (int l = 1; l <= n; l ++) //each character of the name
if (l == 1)
total[c - 1] = 26 * c + 1; //first character can't be a number
else
total[c - 1] *= 26 * c + 1 + 10; //starting from the second character, characters can include numbers
std::cout << total[1] - total[0] << std::endl;
}
Pontuação
Tom gosta de golfe, então o programa mais curto em bytes vence.
Nota
Tudo bem se talvez os dois últimos casos de teste não estejam corretos por causa da precisão numérica. Afinal, nem tenho certeza se meu código manipulou o número 9 corretamente.
fonte
Respostas:
Geléia ,
1615 bytesExperimente online! ou verifique todos os casos de teste .
Como funciona
fonte
JavaScript (ES7), 43 bytes
reduce
Hoje não é dia - 55 bytes.fonte
TSQL, 41 bytes
Violino
fonte
Java,
7776 bytesSolução O (1), sem loop envolvidofonte
n-1
pow
função não é tempo constante #long
.JavaScript (ES6) 47
Nota: os valores estão corretos até os 53 bits de precisão dos números javascript.
Teste
fonte
MATL ,
1716 bytesExperimente online!
O último caso de teste (entrada 9) não é exato devido à precisão numérica.
Explicação
fonte
Python 3, 36 bytes
Uma função anônima que recebe entrada via argumento e retorna a saída.
Viva a precedência do operador!
Como funciona
Experimente no Ideone
fonte
Pitão, 16 bytes
Experimente aqui!
Funciona da mesma forma que a minha resposta Pyke
fonte
Fator , 54 bytes
Saída de teste (com preguiça de criar um conjunto de testes no momento)
Para 100 porque eu posso:
fonte
dc, 19 bytes
Esta é apenas a diferença de dois exponenciais
53 × 63^(n-1) - 27 × 37^(n-1)
,. O caso especial de zero cai naturalmente, comodc
começa com uma precisão de0
, significando que x ^ -1 ==0
para todos os x positivos .Normalmente
dc
, a entrada é retirada do topo da pilha e a saída é empurrada para o topo da pilha. Para um programa completo, inclua entre?
ep
faça um filtro de pipeline.Saída de teste
O desempenho é razoável para n pequeno , mas começa a diminuir quando atinge algumas centenas de milhares ou mais:
Esse último exemplo produz um resultado de 1941435 dígitos, então talvez não seja tão ruim assim.
fonte
dc
já havia sido usado ... mas isso não pode ser derrotado!Pyke,
1715 bytesExperimente aqui!
fonte