3.9 KiB
id | title | challengeType | forumTopicId | dashedName |
---|---|---|---|---|
5a23c84252665b21eecc8043 | Somma a 100 | 5 | 302335 | sum-to-100 |
--description--
Trova le soluzioni per il puzzle Somma a cento.
Aggiungi (inserisci) gli operatori matematici + o ─ (più o meno) prima di una qualsiasi delle cifre della stringa numerica decimale 123456789 in modo che l'espressione matematica risultante sommi a una particolare somma (in questo caso iconico, 100).
Esempio:
123 + 4 - 5 + 67 - 89 = 100
--instructions--
Scrivi una funzione che prende un numero come parametro. La funzione dovrebbe restituire un array contenente tutte le soluzioni per il numero dato. Le soluzioni dovrebbero essere stringhe che rappresentino le espressioni. Per esempio: "1+23-456+78-9". Ordina l'array prima di restituirlo.
--hints--
sumTo100
dovrebbe essere una funzione.
assert(typeof sumTo100 == 'function');
sumTo100(199)
dovrebbe restituire un array.
assert(Array.isArray(sumTo100(199)));
sumTo100(199)
dovrebbe restituire ["-1+2-3+45+67+89", "123-4+5+6+78-9", "123-4+56+7+8+9"]
.
assert.deepEqual(sumTo100(199), [
'-1+2-3+45+67+89',
'123-4+5+6+78-9',
'123-4+56+7+8+9'
]);
sumTo100(209)
dovrebbe restituire ["1+234+56+7-89"]
.
assert.deepEqual(sumTo100(209), ['1+234+56+7-89']);
sumTo100(243)
dovrebbe restituire ["-1-234+567-89", "-12+345+6-7-89", "123+45+6+78-9"]
.
assert.deepEqual(sumTo100(243), [
'-1-234+567-89',
'-12+345+6-7-89',
'123+45+6+78-9'
]);
sumTo100(197)
dovrebbe restituire ["1-2-3+45+67+89", "12+34-5+67+89", "123+4-5+6+78-9"]
.
assert.deepEqual(sumTo100(197), [
'1-2-3+45+67+89',
'12+34-5+67+89',
'123+4-5+6+78-9'
]);
--seed--
--seed-contents--
function sumTo100(n) {
}
--solutions--
function sumTo100(n) {
var permutationsWithRepetition = function(n, as) {
return as.length > 0
? foldl1(curry(cartesianProduct)(as), replicate(n, as))
: [];
};
var cartesianProduct = function(xs, ys) {
return [].concat.apply(
[],
xs.map(function(x) {
return [].concat.apply(
[],
ys.map(function(y) {
return [[x].concat(y)];
})
);
})
);
};
var curry = function(f) {
return function(a) {
return function(b) {
return f(a, b);
};
};
};
var flip = function(f) {
return function(a, b) {
return f.apply(null, [b, a]);
};
};
var foldl1 = function(f, xs) {
return xs.length > 0 ? xs.slice(1).reduce(f, xs[0]) : [];
};
var replicate = function(n, a) {
var v = [a],
o = [];
if (n < 1) return o;
while (n > 1) {
if (n & 1) o = o.concat(v);
n >>= 1;
v = v.concat(v);
}
return o.concat(v);
};
var asSum = function(xs) {
var dct = xs.reduceRight(
function(a, sign, i) {
var d = i + 1; // zero-based index to [1-9] positions
if (sign !== 0) {
// Sum increased, digits cleared
return {
digits: [],
n: a.n + sign * parseInt([d].concat(a.digits).join(''), 10)
};
} else
return {
// Digits extended, sum unchanged
digits: [d].concat(a.digits),
n: a.n
};
},
{
digits: [],
n: 0
}
);
return (
dct.n + (dct.digits.length > 0 ? parseInt(dct.digits.join(''), 10) : 0)
);
};
var asString = function(xs) {
var ns = xs.reduce(function(a, sign, i) {
var d = (i + 1).toString();
return sign === 0 ? a + d : a + (sign > 0 ? '+' : '-') + d;
}, '');
return ns[0] === '+' ? tail(ns) : ns;
};
var universe = permutationsWithRepetition(9, [0, 1, -1])
.filter(function(x) {
return x[0] !== 1 && asSum(x) === n;
})
.map(asString);
return universe.sort();
}