Javascript (E6) 215 (315 - 2 * 50 de bonificación) 252
Editar simplificado. Fallo correcto de 0 faltantes
Definido como una función, luego contar 10 bytes más para la salida usando alert()
Importante Realmente este no es válido según las reglas, porque JavaScript no puede manejar grandes números. Por ejemplo, con los parámetros 2,5 no puede encontrar 2 ^ 2 ^ 2 ^ 2 ^ 2 (es decir, 2 ^ 65536). Un número tan grande es 'Infinity' en javascript.
Golfed
F=(n,k,g={})=>{k+=k-1;for (l=i=1;x=i.toString(6),l+=!!x[l],l<k;i++)if(x.split(0).length*2==l+1){for(s=[n,n],p=l;o=x[--p];)
if(-o)b=s.pop(),a=s.pop(),s.push(o<2?a+b:o<3?a-b:o<4?a*b:o<5?a/b:Math.pow(a,b));else s.push(x[p]=n);
r=Math.floor(s.pop());r>=0&isFinite(r)&!isNaN(r)&!g[r]&&(g[r]=x)}return Object.keys(g)};
Para jugar al golf. Tengo una idea que quiero compartir: use una notación postfix. En postfix, cualquier tipo de expresión está hecha solo de valores y operadores, no se necesitan paréntesis. La notación postfix se puede traducir a la notación infija algebraica habitual, pero eso está fuera de alcance en este desafío.
Uso
alert(F(4,3))
Salida 1,2,3,4,5,8,12,16,20,32,64,252,256,260,1024,4096,65536,4294967296,1.3407807929942597e+154
Sin golf
F=(n, k, g={})=>{
k += k - 1;
// Count in base 6 - '0' means Value, '1'..'5' means operators
// A valid expression starts with Value twice, then n operators intermixed with n-1 Values
// x: Coded expression, l: Expression length, k Expression limit length from param
for (l = i = 1; x = i.toString(6), l += !!x[l], l<k; i++)
if (x.split(0).length*2 == l+1) // check balancing values/operators
{
for (s = [n,n], p = l; o = x[--p];) // Calc stack starts with N,N
if (-o) // If not '0'
b=s.pop(),a=s.pop(), // Do calc
s.push(o<2 ? a+b : o<3 ? a-b : o<4 ? a*b : o<5 ? a/b : Math.pow(a,b))
else // Push value
s.push(n) //
r = Math.floor(s.pop()); // Last result in stack
r >= 0 & isFinite(r) & !isNaN(r) & !g[r] && (g[r]=x) // Put in hashtable avoiding duplicates
}
// Uncomment this to see the postfix expression list
// for (i in g) console.log(i, [n,n,...[...g[i]].reverse().map(v=>v>0?'x+-*/^'[v]:n)])
return Object.keys(g) // Retust list of hashtable keys
}
Primera versión, esto es más complicado pero quizás más fácil de seguir
Mostrar la expresión de postfix para cada número
F=(n,k)=> {
var i,l,s;
var cmd;
var op='n+-*/^'
var bag = {}
function Calc(val,pos,stack)
{
while (c = cmd[pos])
{
if (c == 0)
{
stack.push(n);
cmd[pos] = n
pos++
}
else
{
var b=stack.pop(), a=stack.pop();
stack.push(c < 2 ? a+b : c < 3 ? a-b : c < 4 ? a*b : c < 5 ? a/b
: Math.pow(a,b))
cmd[pos]=op[c]
pos++
}
}
var res = Math.floor(stack.pop())
if (res > 0 && isFinite(res) && !isNaN(res) && !bag[res])
{
bag[res] = cmd
}
}
k=k+k-3;
for (i=1;s=i.toString(6), !s[k]; i++)
{
l=s.split(0).length;
if (l+l-1==s.length)
{
var cmd = (s+'00').split('').reverse()
Calc(n, 0, [], cmd.map(c=>op[c]).join(' '))
}
}
for (i in bag)
{
console.log(bag[i],'=', i)
}
}
Uso
F(4,3)
Salida
[4, 4, "/"] = 1
[4, 4, "+", 4, "/"] = 2
[4, 4, 4, "/", "-"] = 3
[4, 4, "-", 4, "+"] = 4
[4, 4, "/", 4, "+"] = 5
[4, 4, "+"] = 8
[4, 4, "+", 4, "+"] = 12
[4, 4, "*"] = 16
[4, 4, "*", 4, "+"] = 20
[4, 4, "+", 4, "*"] = 32
[4, 4, "*", 4, "*"] = 64
[4, 4, "^", 4, "-"] = 252
[4, 4, "^"] = 256
[4, 4, "^", 4, "+"] = 260
[4, 4, "^", 4, "*"] = 1024
[4, 4, "+", 4, "^"] = 4096
[4, 4, "*", 4, "^"] = 65536
[4, 4, "^", 4, "^"] = 4294967296
[4, 4, 4, "^", "^"] = 1.3407807929942597e+154
2
por lo que 2 deben incluirse en la salida. 2. por exponenciación quieres decir elevar a una potencia, noe^x?
3. si quieres código golf (código más corto), entonces la etiqueta de desafío de código es redundante.