Entrada: você recebe 2 números inteiros n
e k
. n
é um número inteiro positivo (> = 1) e k
um número inteiro, que é o número de vezes que você tem permissão para usar n
.
Saída: saída de todos os inteiros não negativos que podem ser formados usando, no máximo k
n
's usando essas operações matemáticas: +
, -
, *
, /
, e parênteses.
Editar: se o seu idioma suportar a remoção de elementos de uma matriz / conjunto / etc., É necessário o requisito de números inteiros não negativos. Caso contrário, não é necessário.
O único valor numérico que pode existir na expressão é n (porém várias vezes). Se o valor da expressão exceder o valor máximo de qualquer armazenamento de dados que você tenha (como int
ou long
etc.), será necessário compensá-lo (não há valor máximo que possa ser fornecido n
).
A velocidade não é importante, mas o código mais curto vence!
Bônus:
-50: inclui exponenciação na lista de operações matemáticas. Exponenciação é definida como sendo que a base é uma expressão de n, e não = 2,71828 ...
-50: inclua as funções de piso (ou teto) se uma determinada operação possível não for um número inteiro.
Exemplos
> 2 2
0 1 4
> 4 3
3 4 5 12 20 64 ...
(Entradas / saídas de amostra não incluem necessariamente bônus)
2
para que 2 seja incluído na saída. 2. por exponenciação, você quer dizer aumentar para uma potência, e nãoe^x?
3. se você deseja código-golfe (código mais curto), a tag de desafio de código é redundante.2^x
(ou2**x
) de exponenciação, enquanto queexp(x)
é exponencial. Como por 3, que fazia parte de uma edição que eu estava fazendo, então é removido agoraRespostas:
Javascript (E6) 215 (bônus de 315 - 2 * 50)
252Editar simplificado. Erro correto de 0 ausente
Definido como uma função, contando mais 10 bytes para saída usando
alert()
Importante Realmente este não é válido de acordo com as regras, porque o javascript não pode lidar com grandes números. Por exemplo, com os parâmetros 2,5, não é possível encontrar 2 ^ 2 ^ 2 ^ 2 ^ 2 (ou seja, 2 ^ 65536). Um número desse tamanho é 'Infinito' em javascript.
Golfe
Para ser jogado golfe.Tenho uma ideia que quero compartilhar: use uma notação postfix. No postfix, qualquer tipo de expressão é feita apenas de valores e operadores - sem parênteses. A notação postfix pode ser traduzida para a notação de infixo algébrico usual - mas isso está fora de escopo neste desafio.Uso
Resultado
1,2,3,4,5,8,12,16,20,32,64,252,256,260,1024,4096,65536,4294967296,1.3407807929942597e+154
Ungolfed
Primeira versão, isso é mais complicado, mas talvez mais fácil de seguir
Exibe a expressão postfix para cada número
Uso
Resultado
fonte
Python 2, 249 caracteres - 50 bônus = 199
Amostras de execuções:
Isso reivindica o bônus de exponenciação de -50 pontos. Permitir a exponenciação pode fornecer resultados surpreendentemente grandes para pequenas entradas (remova
pow
da lista de operadores para tentar sem exponenciação).fonte
Mathematica, 105 bytes - 100 bônus = 5
Nota: No momento, isso não suporta parênteses. A correção assim que o OP esclarece o desafio.
Se números inteiros negativos também estiverem bons, isso marca 1 em seu lugar.
Um pouco não-destruído:
Estou reivindicando os dois bônus por incluir exponenciação e obter resultados não inteiros.
Exemplos:
fonte
Python 2.x: 32 (
132-(50+50)
)Vou reivindicar os dois bônus:
x/y
comporta - se como você esperariafloor(x/y)
, e suporta poderes.Demo:
fonte
abs
é inteligente, eu acho que estou roubando isso como recompensa por apontar o erro;)4,3
caso?4^4^4
começa com13407...
.2**2**2**2**2
, porque eu tive uma repetição demais.f(5,2)
ainda deve dar essa resposta.J: -23 (77-50 * 2)
Isso ainda não funciona
n<=2
, não sei por quê. Vou procurar consertar isso, mas se alguém souber uma resposta, diga-o nos comentários.fonte
Haskell, 35
Não tenho certeza se uma função é suficiente ou se é necessário um programa real, por isso estou publicando duas versões, ambas com bônus de 100.
Como programa, pontuação 80:
ou em função, pontuação de 35:
saída de amostra, para
(4%3)
ouecho 4 3|codegolf.exe
, classificada para sua convenção, desde que:A única coisa que é um pouco estranha sobre isso é que o número de ponto flutuante é
Infinity
convertido em um número inteiro enorme, mas espero que isso não importe muito.fonte
J, -43 (53-2 * 50)
Isso nem sempre funciona, porque J tenta impedir cálculos com números muito grandes. Se tivermos permissão para usar flutuadores (de máquina), que simplesmente são configurados para o infinito em um estouro, obtemos o seguinte, um pouco mais curto, para uma pontuação de 52-100 = -48:
Esta é uma versão que não está de forma alguma ou inspirada na minha resposta J anterior, por isso estou publicando-a como uma resposta separada. Curiosidades: esta pode ser a primeira vez que eu tenho que usar uma função explícita em uma resposta em J.
Uso (Sim, as caixinhas são estruturas de dados reais em J e são realmente exibidas assim.):
fonte
Python 2 - 212 bytes (262-50)
Segundo código de golfe!
EDIT: Ok com colchetes é um pouco maior:
Com colchetes - 354 bytes (404-50)
fonte
Haskell - 235 bytes - 100 bônus = 135
Testado com
Este resultado é alcançado usando
replicateM
. Se usarmos a entrada4 3
,replicateM
forneceremos as seguintes matrizes de funções:[[(+),(+)],[(+),(-)],[(+),(*)],[(+),(/)],[(+),(**)],[(-),(+)],[(-),(-)],[(-),(*)],[(-),(/)],[(-),(**)],[(*),(+)],[(*),(-)],[(*),(*)],[(*),(/)],[(*),(**)],[(/),(+)],[(/),(-)],[(/),(*)],[(/),(/)],[(/),(**)],[(**),(+)],[(**),(-)],[(**),(*)],[(**),(/)],[(**),(**)]]
ou, mais simplesmente[[a->a->a]]
,. Cada matriz é então dobrada a partir da direita, utilizandon
como entrada:[(+),(+)] = 4+(4+4) = 12
. Note que não há nenhuma precedência do operador aqui:[(*),(+)] = 4*(4+4) != (4*4)+4
.Os números fornecidos são então colocados no chão, agrupados, classificados e filtrados para números menores que 0.
fonte
2
está faltando? (like(4+4)/4
)C, dc & bash utils - 259 (fonte) + 21 (em execução) - 100 bônus = 180
Salvar como
calc.c
:Compilar:
Isso produzirá permutações de
dc
entrada compatível.dc
é uma calculadora de precisão ilimitada, por isso pode gerar grandes números, também possui exponenciação.dc
no modo padrão, usa aritmética inteira, de modo que éfloor
incorporado, e os comandos comunsd*v
próximos ao final efetivamente recebem o valor absoluto para aumentar o número de possíveis saídas válidas.Correr sozinho gera muita produção, por exemplo
Portanto, para obter os resultados, amarre isso
dc | sort -n | uniq | xargs
para obter a saída desejada, por exemploO k mais alto que ele pode suportar é 13, mas você esperará muito tempo pelos resultados!
No momento, ele segue um
# # op # op # op ...
padrão estrito , mas você pode obter mais números alternando o padrão, por exemplo:A maneira como isso pode ser feito é tratar os números e operadores como símbolos e permutá-los da mesma forma. Você obteria muitas seqüências não legais
dc
, mas vamosdc
descobrir isso. Resultados pendentes ...fonte
HASKELL 98 (bônus de 198-100)
editar: eu comentaria, mas não posso, sugeriria tratar um intervalo ilimitado como um bônus
Parece-me que uma resposta poucos perca um ponto:
using at most k n
. Isso significa que f (4,3) pode gerar (4/4) = 1 ou (4 * 4) = 16.Enfim, essa é a minha resposta. Presumo que int / int se comporte como piso. Exponenciação está incluída.
HASKELL 111 (bônus 211-100)fonte
<!-- language: lang-haskell -->
duas linhas antes do código para destacar a sintaxe.<!-- language-all: lang-haskell -->
algum lugar antes do primeiro bloco de código, um truque que aprendi alguns dias atrás.Rubi 181 - 50 - 50 = 81
fonte