chore(i18n,learn): processed translations (#44851)
This commit is contained in:
@ -0,0 +1,73 @@
|
||||
---
|
||||
id: 5900f36e1000cf542c50fe80
|
||||
title: '問題 1: 3 と 5 の倍数'
|
||||
challengeType: 5
|
||||
forumTopicId: 301722
|
||||
dashedName: problem-1-multiples-of-3-and-5
|
||||
---
|
||||
|
||||
# --description--
|
||||
|
||||
3 または 5 の倍数である 10 未満の自然数をすべて並べると、3, 5, 6, 9 になります。 これらの倍数の和は 23 です。
|
||||
|
||||
与えられたパラメータ値 `number` 未満である、3 または 5 の倍数の総和を求めなさい。
|
||||
|
||||
# --hints--
|
||||
|
||||
`multiplesOf3and5(10)` は数値を返す必要があります。
|
||||
|
||||
```js
|
||||
assert(typeof multiplesOf3and5(10) === 'number');
|
||||
```
|
||||
|
||||
`multiplesOf3and5(49)` は 543 を返す必要があります。
|
||||
|
||||
```js
|
||||
assert.strictEqual(multiplesOf3and5(49), 543);
|
||||
```
|
||||
|
||||
`multiplesOf3and5(1000)` は 233168 を返す必要があります。
|
||||
|
||||
```js
|
||||
assert.strictEqual(multiplesOf3and5(1000), 233168);
|
||||
```
|
||||
|
||||
`multiplesOf3and5(8456)` は 16687353 を返す必要があります。
|
||||
|
||||
```js
|
||||
assert.strictEqual(multiplesOf3and5(8456), 16687353);
|
||||
```
|
||||
|
||||
`multiplesOf3and5(19564)` は 89301183 を返す必要があります。
|
||||
|
||||
```js
|
||||
assert.strictEqual(multiplesOf3and5(19564), 89301183);
|
||||
```
|
||||
|
||||
# --seed--
|
||||
|
||||
## --seed-contents--
|
||||
|
||||
```js
|
||||
function multiplesOf3and5(number) {
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
multiplesOf3and5(1000);
|
||||
```
|
||||
|
||||
# --solutions--
|
||||
|
||||
```js
|
||||
const multiplesOf3and5 = (number) => {
|
||||
var total = 0;
|
||||
|
||||
for(var i = 0; i < number; i++) {
|
||||
if(i % 3 == 0 || i % 5 == 0) {
|
||||
total += i;
|
||||
}
|
||||
}
|
||||
return total;
|
||||
};
|
||||
```
|
@ -0,0 +1,81 @@
|
||||
---
|
||||
id: 5900f3761000cf542c50fe89
|
||||
title: '問題 10: 素数の和'
|
||||
challengeType: 5
|
||||
forumTopicId: 301723
|
||||
dashedName: problem-10-summation-of-primes
|
||||
---
|
||||
|
||||
# --description--
|
||||
|
||||
10 より小さい素数の和は、2 + 3 + 5 + 7 = 17 です。
|
||||
|
||||
`n` より小さい素数の総和を求めなさい。
|
||||
|
||||
# --hints--
|
||||
|
||||
`primeSummation(17)` は数値を返す必要があります。
|
||||
|
||||
```js
|
||||
assert(typeof primeSummation(17) === 'number');
|
||||
```
|
||||
|
||||
`primeSummation(17)` は 41 を返す必要があります。
|
||||
|
||||
```js
|
||||
assert.strictEqual(primeSummation(17), 41);
|
||||
```
|
||||
|
||||
`primeSummation(2001)` は 277050 を返す必要があります。
|
||||
|
||||
```js
|
||||
assert.strictEqual(primeSummation(2001), 277050);
|
||||
```
|
||||
|
||||
`primeSummation(140759)` は 873608362 を返す必要があります。
|
||||
|
||||
```js
|
||||
assert.strictEqual(primeSummation(140759), 873608362);
|
||||
```
|
||||
|
||||
`primeSummation(2000000)` は 142913828922 を返す必要があります。
|
||||
|
||||
```js
|
||||
assert.strictEqual(primeSummation(2000000), 142913828922);
|
||||
```
|
||||
|
||||
# --seed--
|
||||
|
||||
## --seed-contents--
|
||||
|
||||
```js
|
||||
function primeSummation(n) {
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
primeSummation(2000000);
|
||||
```
|
||||
|
||||
# --solutions--
|
||||
|
||||
```js
|
||||
function primeSummation(n) {
|
||||
if (n < 3) { return 0 };
|
||||
let nums = [0, 0, 2];
|
||||
for (let i = 3; i < n; i += 2){
|
||||
nums.push(i);
|
||||
nums.push(0);
|
||||
}
|
||||
let sum = 2;
|
||||
for (let i = 3; i < n; i += 2){
|
||||
if (nums[i] !== 0){
|
||||
sum += nums[i];
|
||||
for (let j = i*i; j < n; j += i){
|
||||
nums[j] = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
return sum;
|
||||
}
|
||||
```
|
@ -0,0 +1,87 @@
|
||||
---
|
||||
id: 5900f3d01000cf542c50fee3
|
||||
title: '問題 100: 調整された確率'
|
||||
challengeType: 5
|
||||
forumTopicId: 301724
|
||||
dashedName: problem-100-arranged-probability
|
||||
---
|
||||
|
||||
# --description--
|
||||
|
||||
箱の中に、15 枚の青い円盤と 6 枚の赤い円盤、計 21 枚の色付き円盤が入っています。2 枚の円盤を無作為に取り出したときにそれが青い円盤 2 枚である確率は、次のように求めることができます。
|
||||
|
||||
$${P(BB)} = \frac{15}{21}×\frac{14}{20} = \frac{1}{2}$$
|
||||
|
||||
無作為に取り出した 2 枚が青い円盤である確率がちょうど 50% になるように調整した場合、枚数が次に多いのは、85 枚の青い円盤と 35 枚の赤い円盤が入った箱です。
|
||||
|
||||
合計枚数が `limit` より多くなる最初の調整方法を見つけ、その箱に入っている青い円盤の枚数を求めなさい。
|
||||
|
||||
# --hints--
|
||||
|
||||
`arrangedProbability(20)` は数値を返す必要があります。
|
||||
|
||||
```js
|
||||
assert(typeof arrangedProbability(10) === 'number');
|
||||
```
|
||||
|
||||
`arrangedProbability(20)` は `15` を返す必要があります。
|
||||
|
||||
```js
|
||||
assert.strictEqual(arrangedProbability(20), 15);
|
||||
```
|
||||
|
||||
`arrangedProbability(100)` は `85` を返す必要があります。
|
||||
|
||||
```js
|
||||
assert.strictEqual(arrangedProbability(100), 85);
|
||||
```
|
||||
|
||||
`arrangedProbability(100000)` は `97513` を返す必要があります。
|
||||
|
||||
```js
|
||||
assert.strictEqual(arrangedProbability(100000), 97513);
|
||||
```
|
||||
|
||||
`arrangedProbability(1000000000)` は `3822685023` を返す必要があります。
|
||||
|
||||
```js
|
||||
assert.strictEqual(arrangedProbability(1000000000), 3822685023);
|
||||
```
|
||||
|
||||
`arrangedProbability(1000000000000)` は `756872327473` を返す必要があります。
|
||||
|
||||
```js
|
||||
assert.strictEqual(arrangedProbability(1000000000000), 756872327473);
|
||||
```
|
||||
|
||||
# --seed--
|
||||
|
||||
## --seed-contents--
|
||||
|
||||
```js
|
||||
function arrangedProbability(limit) {
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
arrangedProbability(20);
|
||||
```
|
||||
|
||||
# --solutions--
|
||||
|
||||
```js
|
||||
function arrangedProbability(limit) {
|
||||
// Based on https://www.mathblog.dk/project-euler-100-blue-discs-two-blue/
|
||||
let blue = 15;
|
||||
let discs = 21;
|
||||
|
||||
while (discs < limit) {
|
||||
const nextBlue = 3 * blue + 2 * discs - 2;
|
||||
const nextDiscs = 4 * blue + 3 * discs - 3;
|
||||
|
||||
blue = nextBlue;
|
||||
discs = nextDiscs;
|
||||
}
|
||||
return blue;
|
||||
}
|
||||
```
|
@ -0,0 +1,56 @@
|
||||
---
|
||||
id: 5900f3d21000cf542c50fee4
|
||||
title: '問題 101: 最適な多項式'
|
||||
challengeType: 5
|
||||
forumTopicId: 301725
|
||||
dashedName: problem-101-optimum-polynomial
|
||||
---
|
||||
|
||||
# --description--
|
||||
|
||||
数列の先頭から k 個の項が提示されたときに、次の項の値を確実に知ることは不可能です。その数列をモデル化できる多項式関数が無限にあるからです。
|
||||
|
||||
例として、平方数の数列を考えます。 これは生成関数 $u_n = n^3: 1, 8, 27, 64, 125, 216, \ldots$ によって定義されます。
|
||||
|
||||
この数列の最初の 2 項だけが与えられたとします。 「シンプル・イズ・ベスト」の原則に基づき、線形関係があると想定して次の項が 15 であると予想します (公差 7)。 最初の 3 項が提示されたとしても、上と同じ原則により二次関係があると想定します。
|
||||
|
||||
ここでは、数列の先頭から第 k 項までに対する最適な多項式生成関数の第 $n$ 項を $OP(k, n)$ とします。 $n ≤ k$ のとき、$OP(k, n)$ がその数列の項を正確に生成することは明らかでしょう。そしておそらく、FIT (First Incorrect Term = 最初の不正な項) は $OP(k, k+1)$ でしょう。この場合、これを BOP (Bad OP = 不良 OP) と呼ぶことにします。
|
||||
|
||||
原則として、配列の最初の項のみが与えられた場合、それは定数であると仮定することが最も理にかなうと考えられます。すなわち、$n ≥ 2, OP(1, n) = u_1$ です。
|
||||
|
||||
したがって、立方数の数列について次の OP が得られます。
|
||||
|
||||
$$\begin{array}{ll} OP(1, n) = 1 & 1, {\color{red}1}, 1, 1, \ldots \\\\ OP(2, n) = 7n−6 & 1, 8, {\color{red}{15}}, \ldots \\\\ OP(3, n) = 6n^2−11n+6 & 1, 8, 27, {\color{red}{58}}, \ldots \\\\ OP(4, n) = n^3 & 1, 8, 27, 64, 125, \ldots \end{array}$$
|
||||
|
||||
明らかに、k ≥ 4 に対して BOP は存在しません。 BOP によって生成された FIT の和 (上では $\color{red}{red}$ で示されています) は、1 + 15 + 58 = 74 となります。 次の 10 次多項式生成関数を考えます。
|
||||
|
||||
$$u_n = 1 − n + n^2 − n^3 + n^4 − n^5 + n^6 − n^7 + n^8 − n^9 + n^{10}$$
|
||||
|
||||
BOP の FIT の和を求めなさい。
|
||||
|
||||
# --hints--
|
||||
|
||||
`optimumPolynomial()` は `37076114526` を返す必要があります。
|
||||
|
||||
```js
|
||||
assert.strictEqual(optimumPolynomial(), 37076114526);
|
||||
```
|
||||
|
||||
# --seed--
|
||||
|
||||
## --seed-contents--
|
||||
|
||||
```js
|
||||
function optimumPolynomial() {
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
optimumPolynomial();
|
||||
```
|
||||
|
||||
# --solutions--
|
||||
|
||||
```js
|
||||
// solution required
|
||||
```
|
File diff suppressed because one or more lines are too long
@ -0,0 +1,53 @@
|
||||
---
|
||||
id: 5900f3d61000cf542c50fee7
|
||||
title: '問題 103: 特殊和部分集合: 最適'
|
||||
challengeType: 5
|
||||
forumTopicId: 301727
|
||||
dashedName: problem-103-special-subset-sums-optimum
|
||||
---
|
||||
|
||||
# --description--
|
||||
|
||||
大きさが n である集合 A の要素の和を、$S(A)$ で表します。 空でなく互いに素な 2 つの部分集合 B と C について、次の性質が真の場合、それを「特殊和集合」と呼ぶことにします。
|
||||
|
||||
1. $S(B) ≠ S(C)$ である。すなわち、部分集合の和が等しくてはならない。
|
||||
2. B が C より多くの要素を含む場合、$S(B) > S(C)$ である。
|
||||
|
||||
与えられた n に対して $S(A)$ が最小化されている集合を、「最適な特殊和集合」と呼ぶことにします。 最初の 5 つの最適な特殊和集合は次のとおりです。
|
||||
|
||||
$$\begin{align} & n = 1: \\{1\\} \\\\ & n = 2: \\{1, 2\\} \\\\ & n = 3: \\{2, 3, 4\\} \\\\ & n = 4: \\{3, 5, 6, 7\\} \\\\ & n = 5: \\{6, 9, 11, 12, 13\\} \\\\ \end{align}$$
|
||||
|
||||
与えられた最適な集合 $A = \\{a_1, a_2, \ldots, a_n\\}$ に対して、次に出現する最適な集合は $B = \\{b, a_1 + b, a_2 + b, \ldots, a_n + b\\}$ であり、ここで、b は前行の「途中の」要素です。
|
||||
|
||||
この「ルール」を適用すると、$n = 6$ に対する最適な集合として予想されるのは $A = \\{11, 17, 20, 22, 23, 24\\}$ ($S(A) = 117$) です。 しかし、最適に近い集合を得るためのアルゴリズムを適用しただけなので、これは最適な集合ではありません。 $n = 6$ に対する最適な集合は $A = \\{11, 18, 19, 20, 22, 25\\}$, $S(A) = 115$ であり、これに対応する集合文字列は `111819202225` です。
|
||||
|
||||
A が $n = 7$ に対する最適な特殊和集合であると仮定し、その集合文字列を求めなさい。
|
||||
|
||||
**注:** この問題は、問題 105 および問題 106 と関連しています。
|
||||
|
||||
# --hints--
|
||||
|
||||
`optimumSpecialSumSet()` は文字列 `20313839404245` を返す必要があります。
|
||||
|
||||
```js
|
||||
assert.strictEqual(optimumSpecialSumSet(), '20313839404245');
|
||||
```
|
||||
|
||||
# --seed--
|
||||
|
||||
## --seed-contents--
|
||||
|
||||
```js
|
||||
function optimumSpecialSumSet() {
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
optimumSpecialSumSet();
|
||||
```
|
||||
|
||||
# --solutions--
|
||||
|
||||
```js
|
||||
// solution required
|
||||
```
|
@ -0,0 +1,44 @@
|
||||
---
|
||||
id: 5900f3d51000cf542c50fee6
|
||||
title: '問題 104: 両端がパンデジタルであるフィボナッチ数'
|
||||
challengeType: 5
|
||||
forumTopicId: 301728
|
||||
dashedName: problem-104-pandigital-fibonacci-ends
|
||||
---
|
||||
|
||||
# --description--
|
||||
|
||||
フィボナッチ数列は次の漸化関係によって定義されます。
|
||||
|
||||
$F_n = F_{n − 1} + F_{n − 2}$ ここで、$F_1 = 1$, $F_2 = 1$
|
||||
|
||||
これにより、113 桁の $F_{541}$は、下位 9 桁が 1 から 9 のパンデジタル数 (1 から 9 のすべての数字を含むが、必ずしもその順序ではない) になる初めてのフィボナッチ数であることがわかります。 そして 575 桁の $F_{2749}$ は、上位 9 桁が 1 から 9 のパンデジタル数字である、最初のフィボナッチ数です。
|
||||
|
||||
上位 9 桁と下位 9 桁の両方が 1 から 9 のパンデジタル数であるような初めてのフィボナッチ数を $F_k$ とし、`k` を求めなさい。
|
||||
|
||||
# --hints--
|
||||
|
||||
`pandigitalFibonacciEnds()` は `329468` を返す必要があります。
|
||||
|
||||
```js
|
||||
assert.strictEqual(pandigitalFibonacciEnds(), 329468);
|
||||
```
|
||||
|
||||
# --seed--
|
||||
|
||||
## --seed-contents--
|
||||
|
||||
```js
|
||||
function pandigitalFibonacciEnds() {
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
pandigitalFibonacciEnds();
|
||||
```
|
||||
|
||||
# --solutions--
|
||||
|
||||
```js
|
||||
// solution required
|
||||
```
|
@ -0,0 +1,59 @@
|
||||
---
|
||||
id: 5900f3d61000cf542c50fee8
|
||||
title: '問題 105: 特殊和集合: 検証'
|
||||
challengeType: 5
|
||||
forumTopicId: 301729
|
||||
dashedName: problem-105-special-subset-sums-testing
|
||||
---
|
||||
|
||||
# --description--
|
||||
|
||||
大きさが n である集合 A の要素の和を、$S(A)$ で表します。 空でなく互いに素な 2 つの部分集合 B と C について、次の性質が真の場合、それを「特殊和集合」と呼ぶことにします。
|
||||
|
||||
1. $S(B) ≠ S(C)$ である。すなわち、部分集合の和が等しくてはならない。
|
||||
2. B が C より多くの要素を含む場合、$S(B) > S(C)$ である。
|
||||
|
||||
例えば、{81, 88, 75, 42, 87, 84, 86, 65} は、65 + 87 + 88 = 75 + 81 + 84 なので特殊和集合ではありません。一方、{157, 150, 164, 119, 79, 159, 161, 139, 158} は、考えられるすべての部分集合ペアの組み合わせの両ルールを満たし、$S(A) = 1286$ です。
|
||||
|
||||
7 個から 12 個の要素からなる集合が 100 個含まれている配列 `sets` を使用して (上の 2 例はこの配列に含まれる最初の 2 つの集合)、特殊和集合 $A_1, A_2, \ldots, A_k$ をすべて見つけ、$(A_1) + S(A_2) + \cdots + S(A_k)$ の値を求めなさい。
|
||||
|
||||
**注:** この問題は、問題 103 および問題 106 と関連しています。
|
||||
|
||||
# --hints--
|
||||
|
||||
`testingSpecialSubsetSums(testSets)` は `73702` を返す必要があります。
|
||||
|
||||
```js
|
||||
assert.strictEqual(testingSpecialSubsetSums(_testSets), 73702);
|
||||
```
|
||||
|
||||
# --seed--
|
||||
|
||||
## --after-user-code--
|
||||
|
||||
```js
|
||||
const _testSets = [
|
||||
[81,88,75,42,87,84,86,65],[157,150,164,119,79,159,161,139,158],[673,465,569,603,629,592,584,300,601,599,600],[90,85,83,84,65,87,76,46],[165,168,169,190,162,85,176,167,127],[224,275,278,249,277,279,289,295,139],[354,370,362,384,359,324,360,180,350,270],[599,595,557,298,448,596,577,667,597,588,602],[175,199,137,88,187,173,168,171,174],[93,187,196,144,185,178,186,202,182],[157,155,81,158,119,176,152,167,159],[184,165,159,166,163,167,174,124,83],[1211,1212,1287,605,1208,1189,1060,1216,1243,1200,908,1210],[339,299,153,305,282,304,313,306,302,228],[94,104,63,112,80,84,93,96],[41,88,82,85,61,74,83,81],[90,67,84,83,82,97,86,41],[299,303,151,301,291,302,307,377,333,280],[55,40,48,44,25,42,41],[1038,1188,1255,1184,594,890,1173,1151,1186,1203,1187,1195],[76,132,133,144,135,99,128,154],[77,46,108,81,85,84,93,83],[624,596,391,605,529,610,607,568,604,603,453],[83,167,166,189,163,174,160,165,133],[308,281,389,292,346,303,302,304,300,173],[593,1151,1187,1184,890,1040,1173,1186,1195,1255,1188,1203],[68,46,64,33,60,58,65],[65,43,88,87,86,99,93,90],[83,78,107,48,84,87,96,85],[1188,1173,1256,1038,1187,1151,890,1186,1184,1203,594,1195],[302,324,280,296,294,160,367,298,264,299],[521,760,682,687,646,664,342,698,692,686,672],[56,95,86,97,96,89,108,120],[344,356,262,343,340,382,337,175,361,330],[47,44,42,27,41,40,37],[139,155,161,158,118,166,154,156,78],[118,157,164,158,161,79,139,150,159],[299,292,371,150,300,301,281,303,306,262],[85,77,86,84,44,88,91,67],[88,85,84,44,65,91,76,86],[138,141,127,96,136,154,135,76],[292,308,302,346,300,324,304,305,238,166],[354,342,341,257,348,343,345,321,170,301],[84,178,168,167,131,170,193,166,162],[686,701,706,673,694,687,652,343,683,606,518],[295,293,301,367,296,279,297,263,323,159],[1038,1184,593,890,1188,1173,1187,1186,1195,1150,1203,1255],[343,364,388,402,191,383,382,385,288,374],[1187,1036,1183,591,1184,1175,888,1197,1182,1219,1115,1167],[151,291,307,303,345,238,299,323,301,302],[140,151,143,138,99,69,131,137],[29,44,42,59,41,36,40],[348,329,343,344,338,315,169,359,375,271],[48,39,34,37,50,40,41],[593,445,595,558,662,602,591,297,610,580,594],[686,651,681,342,541,687,691,707,604,675,699],[180,99,189,166,194,188,144,187,199],[321,349,335,343,377,176,265,356,344,332],[1151,1255,1195,1173,1184,1186,1188,1187,1203,593,1038,891],[90,88,100,83,62,113,80,89],[308,303,238,300,151,304,324,293,346,302],[59,38,50,41,42,35,40],[352,366,174,355,344,265,343,310,338,331],[91,89,93,90,117,85,60,106],[146,186,166,175,202,92,184,183,189],[82,67,96,44,80,79,88,76],[54,50,58,66,31,61,64],[343,266,344,172,308,336,364,350,359,333],[88,49,87,82,90,98,86,115],[20,47,49,51,54,48,40],[159,79,177,158,157,152,155,167,118],[1219,1183,1182,1115,1035,1186,591,1197,1167,887,1184,1175],[611,518,693,343,704,667,686,682,677,687,725],[607,599,634,305,677,604,603,580,452,605,591],[682,686,635,675,692,730,687,342,517,658,695],[662,296,573,598,592,584,553,593,595,443,591],[180,185,186,199,187,210,93,177,149],[197,136,179,185,156,182,180,178,99],[271,298,218,279,285,282,280,238,140],[1187,1151,890,593,1194,1188,1184,1173,1038,1186,1255,1203],[169,161,177,192,130,165,84,167,168],[50,42,43,41,66,39,36],[590,669,604,579,448,599,560,299,601,597,598],[174,191,206,179,184,142,177,180,90],[298,299,297,306,164,285,374,269,329,295],[181,172,162,138,170,195,86,169,168],[1184,1197,591,1182,1186,889,1167,1219,1183,1033,1115,1175],[644,695,691,679,667,687,340,681,770,686,517],[606,524,592,576,628,593,591,584,296,444,595],[94,127,154,138,135,74,136,141],[179,168,172,178,177,89,198,186,137],[302,299,291,300,298,149,260,305,280,370],[678,517,670,686,682,768,687,648,342,692,702],[302,290,304,376,333,303,306,298,279,153],[95,102,109,54,96,75,85,97],[150,154,146,78,152,151,162,173,119],[150,143,157,152,184,112,154,151,132],[36,41,54,40,25,44,42],[37,48,34,59,39,41,40],[681,603,638,611,584,303,454,607,606,605,596]
|
||||
];
|
||||
```
|
||||
|
||||
## --seed-contents--
|
||||
|
||||
```js
|
||||
function testingSpecialSubsetSums(sets) {
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
const testSets = [
|
||||
[81,88,75,42,87,84,86,65],[157,150,164,119,79,159,161,139,158],[673,465,569,603,629,592,584,300,601,599,600],[90,85,83,84,65,87,76,46],[165,168,169,190,162,85,176,167,127],[224,275,278,249,277,279,289,295,139],[354,370,362,384,359,324,360,180,350,270],[599,595,557,298,448,596,577,667,597,588,602],[175,199,137,88,187,173,168,171,174],[93,187,196,144,185,178,186,202,182],[157,155,81,158,119,176,152,167,159],[184,165,159,166,163,167,174,124,83],[1211,1212,1287,605,1208,1189,1060,1216,1243,1200,908,1210],[339,299,153,305,282,304,313,306,302,228],[94,104,63,112,80,84,93,96],[41,88,82,85,61,74,83,81],[90,67,84,83,82,97,86,41],[299,303,151,301,291,302,307,377,333,280],[55,40,48,44,25,42,41],[1038,1188,1255,1184,594,890,1173,1151,1186,1203,1187,1195],[76,132,133,144,135,99,128,154],[77,46,108,81,85,84,93,83],[624,596,391,605,529,610,607,568,604,603,453],[83,167,166,189,163,174,160,165,133],[308,281,389,292,346,303,302,304,300,173],[593,1151,1187,1184,890,1040,1173,1186,1195,1255,1188,1203],[68,46,64,33,60,58,65],[65,43,88,87,86,99,93,90],[83,78,107,48,84,87,96,85],[1188,1173,1256,1038,1187,1151,890,1186,1184,1203,594,1195],[302,324,280,296,294,160,367,298,264,299],[521,760,682,687,646,664,342,698,692,686,672],[56,95,86,97,96,89,108,120],[344,356,262,343,340,382,337,175,361,330],[47,44,42,27,41,40,37],[139,155,161,158,118,166,154,156,78],[118,157,164,158,161,79,139,150,159],[299,292,371,150,300,301,281,303,306,262],[85,77,86,84,44,88,91,67],[88,85,84,44,65,91,76,86],[138,141,127,96,136,154,135,76],[292,308,302,346,300,324,304,305,238,166],[354,342,341,257,348,343,345,321,170,301],[84,178,168,167,131,170,193,166,162],[686,701,706,673,694,687,652,343,683,606,518],[295,293,301,367,296,279,297,263,323,159],[1038,1184,593,890,1188,1173,1187,1186,1195,1150,1203,1255],[343,364,388,402,191,383,382,385,288,374],[1187,1036,1183,591,1184,1175,888,1197,1182,1219,1115,1167],[151,291,307,303,345,238,299,323,301,302],[140,151,143,138,99,69,131,137],[29,44,42,59,41,36,40],[348,329,343,344,338,315,169,359,375,271],[48,39,34,37,50,40,41],[593,445,595,558,662,602,591,297,610,580,594],[686,651,681,342,541,687,691,707,604,675,699],[180,99,189,166,194,188,144,187,199],[321,349,335,343,377,176,265,356,344,332],[1151,1255,1195,1173,1184,1186,1188,1187,1203,593,1038,891],[90,88,100,83,62,113,80,89],[308,303,238,300,151,304,324,293,346,302],[59,38,50,41,42,35,40],[352,366,174,355,344,265,343,310,338,331],[91,89,93,90,117,85,60,106],[146,186,166,175,202,92,184,183,189],[82,67,96,44,80,79,88,76],[54,50,58,66,31,61,64],[343,266,344,172,308,336,364,350,359,333],[88,49,87,82,90,98,86,115],[20,47,49,51,54,48,40],[159,79,177,158,157,152,155,167,118],[1219,1183,1182,1115,1035,1186,591,1197,1167,887,1184,1175],[611,518,693,343,704,667,686,682,677,687,725],[607,599,634,305,677,604,603,580,452,605,591],[682,686,635,675,692,730,687,342,517,658,695],[662,296,573,598,592,584,553,593,595,443,591],[180,185,186,199,187,210,93,177,149],[197,136,179,185,156,182,180,178,99],[271,298,218,279,285,282,280,238,140],[1187,1151,890,593,1194,1188,1184,1173,1038,1186,1255,1203],[169,161,177,192,130,165,84,167,168],[50,42,43,41,66,39,36],[590,669,604,579,448,599,560,299,601,597,598],[174,191,206,179,184,142,177,180,90],[298,299,297,306,164,285,374,269,329,295],[181,172,162,138,170,195,86,169,168],[1184,1197,591,1182,1186,889,1167,1219,1183,1033,1115,1175],[644,695,691,679,667,687,340,681,770,686,517],[606,524,592,576,628,593,591,584,296,444,595],[94,127,154,138,135,74,136,141],[179,168,172,178,177,89,198,186,137],[302,299,291,300,298,149,260,305,280,370],[678,517,670,686,682,768,687,648,342,692,702],[302,290,304,376,333,303,306,298,279,153],[95,102,109,54,96,75,85,97],[150,154,146,78,152,151,162,173,119],[150,143,157,152,184,112,154,151,132],[36,41,54,40,25,44,42],[37,48,34,59,39,41,40],[681,603,638,611,584,303,454,607,606,605,596]
|
||||
];
|
||||
|
||||
testingSpecialSubsetSums(testSets);
|
||||
```
|
||||
|
||||
# --solutions--
|
||||
|
||||
```js
|
||||
// solution required
|
||||
```
|
@ -0,0 +1,49 @@
|
||||
---
|
||||
id: 5900f3d71000cf542c50fee9
|
||||
title: '問題 106: 特殊和部分集合: メタ検証'
|
||||
challengeType: 5
|
||||
forumTopicId: 301730
|
||||
dashedName: problem-106-special-subset-sums-meta-testing
|
||||
---
|
||||
|
||||
# --description--
|
||||
|
||||
大きさが n である集合 A の要素の和を、$S(A)$ で表します。 空でなく互いに素な 2 つの部分集合 B と C について、次の性質が真の場合、それを「特殊和集合」と呼ぶことにします。
|
||||
|
||||
1. $S(B) ≠ S(C)$ である。すなわち、部分集合の和が等しくてはならない。
|
||||
2. B が C より多くの要素を含むとき、$S(B) > S(C)$ である。
|
||||
|
||||
この問題では、与えられた集合が n 個の狭義単調増加要素を含み、上の 2 つ目のルールに沿っていると仮定します。
|
||||
|
||||
意外ですが、n = 4 の集合から得られる 25 個の可能な部分集合の対のうち、等価性の検証が必要なものは 1 つだけです (1 つ目のルール)。 同様に、n = 7 のとき、966 個の部分集合の対のうち検証が必要なものは 70 個だけです。
|
||||
|
||||
N = 12 のとき、得られる 261625 個の部分集合の対のうち、等価性の検証が必要なものはいくつありますか。
|
||||
|
||||
**注:** この問題は、問題 103 および問題 105 と関連しています。
|
||||
|
||||
# --hints--
|
||||
|
||||
`subsetSumsMetaTesting()` は `21384` を返す必要があります。
|
||||
|
||||
```js
|
||||
assert.strictEqual(subsetSumsMetaTesting(), 21384);
|
||||
```
|
||||
|
||||
# --seed--
|
||||
|
||||
## --seed-contents--
|
||||
|
||||
```js
|
||||
function subsetSumsMetaTesting() {
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
subsetSumsMetaTesting();
|
||||
```
|
||||
|
||||
# --solutions--
|
||||
|
||||
```js
|
||||
// solution required
|
||||
```
|
File diff suppressed because one or more lines are too long
@ -0,0 +1,46 @@
|
||||
---
|
||||
id: 5900f3d91000cf542c50feeb
|
||||
title: '問題 108: ディオファントス逆数 (1)'
|
||||
challengeType: 5
|
||||
forumTopicId: 301732
|
||||
dashedName: problem-108-diophantine-reciprocals-i
|
||||
---
|
||||
|
||||
# --description--
|
||||
|
||||
次の式の x, y, n は正の整数です。
|
||||
|
||||
$$\frac{1}{x} + \frac{1}{y} = \frac{1}{n}$$
|
||||
|
||||
`n` = 4 のとき、ちょうど 3 つの相異なる解があります。
|
||||
|
||||
$$\begin{align} & \frac{1}{5} + \frac{1}{20} = \frac{1}{4}\\\\ \\\\ & \frac{1}{6} + \frac{1}{12} = \frac{1}{4}\\\\ \\\\ & \frac{1}{8} + \frac{1}{8} = \frac{1}{4} \end{align}$$
|
||||
|
||||
相異なる解の数が 1000 を超える最小の `n` の値を求めなさい。
|
||||
|
||||
# --hints--
|
||||
|
||||
`diophantineOne()` は `180180` を返す必要があります。
|
||||
|
||||
```js
|
||||
assert.strictEqual(diophantineOne(), 180180);
|
||||
```
|
||||
|
||||
# --seed--
|
||||
|
||||
## --seed-contents--
|
||||
|
||||
```js
|
||||
function diophantineOne() {
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
diophantineOne();
|
||||
```
|
||||
|
||||
# --solutions--
|
||||
|
||||
```js
|
||||
// solution required
|
||||
```
|
@ -0,0 +1,52 @@
|
||||
---
|
||||
id: 5900f3db1000cf542c50feec
|
||||
title: '問題 109: ダーツ'
|
||||
challengeType: 5
|
||||
forumTopicId: 301733
|
||||
dashedName: problem-109-darts
|
||||
---
|
||||
|
||||
# --description--
|
||||
|
||||
ダーツゲームのターゲットボードは 20 等分され、それぞれのエリアに 1 から 20 までの番号が割り振られています。プレイヤーはそれに向けてダーツを 3 本投げます。
|
||||
|
||||
<img class="img-responsive center-block" alt="ダーツボード" src="https://cdn.freecodecamp.org/curriculum/project-euler/darts.png" style="background-color: white; padding: 10px;" />
|
||||
|
||||
ダーツのスコアは、ダーツが刺さったエリアの番号によって決まります。 外側にある赤と緑の輪よりも外に刺さったダーツは 0 点です。 この輪の内側にある黒と白の領域は、シングルスコアを表しています。 ただし、赤と緑の輪のうち、外側の輪はダブルスコア、中間の輪はトリプルスコアを表しています。
|
||||
|
||||
ボードの中央には、「ブル」または「ブルズアイ」と呼ばれる同心円が 2 つあります。 外側のブルは 25 点、内側のブルはその倍の 50 点です。
|
||||
|
||||
ルールには数多くのバリエーションがありますが、最も一般的なゲームでは 301 点 または 501 点から始め、現在の得点を最も早く 0 点にまで減らしたプレイヤーが勝ちます。 ただし、通常は「ダブルアウト」方式でプレイをします。この方式では、最後のダーツをダブル (ボード中央にあるダブルブルズアイを含む) に刺さなければ勝利できません。それ以外のダーツで現在の得点を 1 点以下に減らしてしまうと、その 3 本組のダーツのスコアは「バスト (無効)」になります。
|
||||
|
||||
プレイヤーが現在の得点で終了できることは「チェックアウト」と呼ばれます。チェックアウトでの最高スコアは 170: T20 T20 D25 (トリプルの 20 x 2 とダブルのブル) です。 スコア 6 でチェックアウトする方法は次ように 11 通りあります。
|
||||
|
||||
$$\begin{array} \text{D3} & & \\\\ D1 & D2 & \\\\ S2 & D2 & \\\\ D2 & D1 & \\\\ S4 & D1 & \\\\ S1 & S1 & D2 \\\\ S1 & T1 & D1 \\\\ S1 & S3 & D1 \\\\ D1 & D1 & D1 \\\\ D1 & S2 & D1 \\\\ S2 & S2 & D1 \end{array}$$
|
||||
|
||||
注意点として、D1 D2 と D2 D1 は異なるダブルで終了したので互いに異なるとみなされます。 ただし、S1 T1 D1 の組み合わせは T1 S1 D1 と同じとみなされます。 また、組み合わせを考える際にミスは含まれません。例えば D3 は、0 D3 および 0 0 D3 と同じです。 チェックアウトの方法は全部でなんと 42336 通りもあります。 プレイヤーが 100 未満のスコアでチェックアウトする方法は何通りありますか。
|
||||
|
||||
# --hints--
|
||||
|
||||
`darts()` は `38182` を返す必要があります。
|
||||
|
||||
```js
|
||||
assert.strictEqual(darts(), 38182);
|
||||
```
|
||||
|
||||
# --seed--
|
||||
|
||||
## --seed-contents--
|
||||
|
||||
```js
|
||||
function darts() {
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
darts();
|
||||
```
|
||||
|
||||
# --solutions--
|
||||
|
||||
```js
|
||||
// solution required
|
||||
```
|
@ -0,0 +1,182 @@
|
||||
---
|
||||
id: 5900f3781000cf542c50fe8a
|
||||
title: '問題 11: 格子内の最大の積'
|
||||
challengeType: 5
|
||||
forumTopicId: 301734
|
||||
dashedName: problem-11-largest-product-in-a-grid
|
||||
---
|
||||
|
||||
# --description--
|
||||
|
||||
下の 20 × 20 の格子では、対角線上に沿って 4 つの数字が赤で示されています。
|
||||
|
||||
<div style='text-align: center;'>
|
||||
08 02 22 97 38 15 00 40 00 75 04 05 07 78 52 12 50 77 91 08<br>
|
||||
49 49 99 40 17 81 18 57 60 87 17 40 98 43 69 48 04 56 62 00<br>
|
||||
81 49 31 73 55 79 14 29 93 71 40 67 53 88 30 03 49 13 36 65<br>
|
||||
52 70 95 23 04 60 11 42 69 24 68 56 01 32 56 71 37 02 36 91<br>
|
||||
22 31 16 71 51 67 63 89 41 92 36 54 22 40 40 28 66 33 13 80<br>
|
||||
24 47 32 60 99 03 45 02 44 75 33 53 78 36 84 20 35 17 12 50<br>
|
||||
32 98 81 28 64 23 67 10 <span style='color: red'><b>26</b></span> 38 40 67 59 54 70 66 18 38 64 70<br>
|
||||
67 26 20 68 02 62 12 20 95 <span style='color: red'><b>63</b></span> 94 39 63 08 40 91 66 49 94 21<br>
|
||||
24 55 58 05 66 73 99 26 97 17 <span style='color: red'><b>78</b></span> 78 96 83 14 88 34 89 63 72<br>
|
||||
21 36 23 09 75 00 76 44 20 45 35 <span style='color: red'><b>14</b></span> 00 61 33 97 34 31 33 95<br>
|
||||
78 17 53 28 22 75 31 67 15 94 03 80 04 62 16 14 09 53 56 92<br>
|
||||
16 39 05 42 96 35 31 47 55 58 88 24 00 17 54 24 36 29 85 57<br>
|
||||
86 56 00 48 35 71 89 07 05 44 44 37 44 60 21 58 51 54 17 58<br>
|
||||
19 80 81 68 05 94 47 69 28 73 92 13 86 52 17 77 04 89 55 40<br>
|
||||
04 52 08 83 97 35 99 16 07 97 57 32 16 26 26 79 33 27 98 66<br>
|
||||
88 36 68 87 57 62 20 72 03 46 33 67 46 55 12 32 63 93 53 69<br>
|
||||
04 42 16 73 38 25 39 11 24 94 72 18 08 46 29 32 40 62 76 36<br>
|
||||
20 69 36 41 72 30 23 88 34 62 99 69 82 67 59 85 74 04 36 16<br>
|
||||
20 73 35 29 78 31 90 01 74 31 49 71 48 86 81 16 23 57 05 54<br>
|
||||
01 70 54 71 83 51 54 69 16 92 33 48 61 43 52 01 89 19 67 48<br>
|
||||
</div>
|
||||
|
||||
これらの数字の積は 26 × 63 × 78 × 14 = 1788696 です。
|
||||
|
||||
与えられた `arr` 格子の中で、同じ方向 (上下左右または斜め) に連続する 4 つの数字の積のうち最大のものを求めなさい。
|
||||
|
||||
# --hints--
|
||||
|
||||
`largestGridProduct(testGrid)` は数値を返す必要があります。
|
||||
|
||||
```js
|
||||
assert(typeof largestGridProduct(testGrid) === 'number');
|
||||
```
|
||||
|
||||
`largestGridProduct(testGrid)` は 14169081 を返す必要があります。
|
||||
|
||||
```js
|
||||
assert.strictEqual(largestGridProduct(testGrid), 14169081);
|
||||
```
|
||||
|
||||
`largestGridProduct(grid)` は 70600674 を返す必要があります。
|
||||
|
||||
```js
|
||||
assert.strictEqual(largestGridProduct(grid), 70600674);
|
||||
```
|
||||
|
||||
# --seed--
|
||||
|
||||
## --seed-contents--
|
||||
|
||||
```js
|
||||
function largestGridProduct(arr) {
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
// Only change code above this line
|
||||
const grid = [
|
||||
[8, 2, 22, 97, 38, 15, 0, 40, 0, 75, 4, 5, 7, 78, 52, 12, 50, 77, 91, 8],
|
||||
[49, 49, 99, 40, 17, 81, 18, 57, 60, 87, 17, 40, 98, 43, 69, 48, 4, 56, 62, 0],
|
||||
[81, 49, 31, 73, 55, 79, 14, 29, 93, 71, 40, 67, 53, 88, 30, 3, 49, 13, 36, 65],
|
||||
[52, 70, 95, 23, 4, 60, 11, 42, 69, 24, 68, 56, 1, 32, 56, 71, 37, 2, 36, 91],
|
||||
[22, 31, 16, 71, 51, 67, 63, 89, 41, 92, 36, 54, 22, 40, 40, 28, 66, 33, 13, 80],
|
||||
[24, 47, 32, 60, 99, 3, 45, 2, 44, 75, 33, 53, 78, 36, 84, 20, 35, 17, 12, 50],
|
||||
[32, 98, 81, 28, 64, 23, 67, 10, 26, 38, 40, 67, 59, 54, 70, 66, 18, 38, 64, 70],
|
||||
[67, 26, 20, 68, 2, 62, 12, 20, 95, 63, 94, 39, 63, 8, 40, 91, 66, 49, 94, 21],
|
||||
[24, 55, 58, 5, 66, 73, 99, 26, 97, 17, 78, 78, 96, 83, 14, 88, 34, 89, 63, 72],
|
||||
[21, 36, 23, 9, 75, 0, 76, 44, 20, 45, 35, 14, 0, 61, 33, 97, 34, 31, 33, 95],
|
||||
[78, 17, 53, 28, 22, 75, 31, 67, 15, 94, 3, 80, 4, 62, 16, 14, 9, 53, 56, 92],
|
||||
[16, 39, 5, 42, 96, 35, 31, 47, 55, 58, 88, 24, 0, 17, 54, 24, 36, 29, 85, 57],
|
||||
[86, 56, 0, 48, 35, 71, 89, 7, 5, 44, 44, 37, 44, 60, 21, 58, 51, 54, 17, 58],
|
||||
[19, 80, 81, 68, 5, 94, 47, 69, 28, 73, 92, 13, 86, 52, 17, 77, 4, 89, 55, 40],
|
||||
[4, 52, 8, 83, 97, 35, 99, 16, 7, 97, 57, 32, 16, 26, 26, 79, 33, 27, 98, 66],
|
||||
[88, 36, 68, 87, 57, 62, 20, 72, 3, 46, 33, 67, 46, 55, 12, 32, 63, 93, 53, 69],
|
||||
[4, 42, 16, 73, 38, 25, 39, 11, 24, 94, 72, 18, 8, 46, 29, 32, 40, 62, 76, 36],
|
||||
[20, 69, 36, 41, 72, 30, 23, 88, 34, 62, 99, 69, 82, 67, 59, 85, 74, 4, 36, 16],
|
||||
[20, 73, 35, 29, 78, 31, 90, 1, 74, 31, 49, 71, 48, 86, 81, 16, 23, 57, 5, 54],
|
||||
[1, 70, 54, 71, 83, 51, 54, 69, 16, 92, 33, 48, 61, 43, 52, 1, 89, 19, 67, 48]
|
||||
];
|
||||
|
||||
const testGrid = [
|
||||
[40, 17, 81, 18, 57],
|
||||
[74, 4, 36, 16, 29],
|
||||
[36, 42, 69, 73, 45],
|
||||
[51, 54, 69, 16, 92],
|
||||
[7, 97, 57, 32, 16]
|
||||
];
|
||||
|
||||
largestGridProduct(testGrid);
|
||||
```
|
||||
|
||||
# --solutions--
|
||||
|
||||
```js
|
||||
function largestGridProduct(arr) {
|
||||
let maxProduct = 0;
|
||||
let currProduct = 0;
|
||||
|
||||
function maxProductChecker(n) {
|
||||
if (n > maxProduct) {
|
||||
return maxProduct = n;
|
||||
}
|
||||
}
|
||||
|
||||
// loop rows
|
||||
for (let r = 0; r < arr.length; r++) {
|
||||
// loop columns
|
||||
for (let c = 0; c < arr[r].length; c++) {
|
||||
const limit = arr[r].length - 3;
|
||||
|
||||
// check horizontal
|
||||
if (c < limit) {
|
||||
currProduct = arr[r][c] * arr[r][c + 1] * arr[r][c + 2] * arr[r][c + 3];
|
||||
maxProductChecker(currProduct);
|
||||
}
|
||||
|
||||
// check vertical
|
||||
if (r < limit) {
|
||||
currProduct = arr[r][c] * arr[r + 1][c] * arr[r + 2][c] * arr[r + 3][c];
|
||||
maxProductChecker(currProduct);
|
||||
}
|
||||
|
||||
// check diagonal [\]
|
||||
if (c < limit && r < limit) {
|
||||
currProduct = arr[r][c] * arr[r + 1][c + 1] * arr[r + 2][c + 2] * arr[r + 3][c + 3];
|
||||
maxProductChecker(currProduct);
|
||||
}
|
||||
|
||||
// check diagonal [/]
|
||||
if (c > 3 && r < limit) {
|
||||
currProduct = arr[r][c] * arr[r + 1][c - 1] * arr[r + 2][c - 2] * arr[r + 3][c - 3];
|
||||
maxProductChecker(currProduct);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return maxProduct;
|
||||
}
|
||||
|
||||
const grid = [ [8, 2, 22, 97, 38, 15, 0, 40, 0, 75, 4, 5, 7, 78, 52, 12, 50, 77, 91, 8],
|
||||
[49, 49, 99, 40, 17, 81, 18, 57, 60, 87, 17, 40, 98, 43, 69, 48, 4, 56, 62, 0],
|
||||
[81, 49, 31, 73, 55, 79, 14, 29, 93, 71, 40, 67, 53, 88, 30, 3, 49, 13, 36, 65],
|
||||
[52, 70, 95, 23, 4, 60, 11, 42, 69, 24, 68, 56, 1, 32, 56, 71, 37, 2, 36, 91],
|
||||
[22, 31, 16, 71, 51, 67, 63, 89, 41, 92, 36, 54, 22, 40, 40, 28, 66, 33, 13, 80],
|
||||
[24, 47, 32, 60, 99, 3, 45, 2, 44, 75, 33, 53, 78, 36, 84, 20, 35, 17, 12, 50],
|
||||
[32, 98, 81, 28, 64, 23, 67, 10, 26, 38, 40, 67, 59, 54, 70, 66, 18, 38, 64, 70],
|
||||
[67, 26, 20, 68, 2, 62, 12, 20, 95, 63, 94, 39, 63, 8, 40, 91, 66, 49, 94, 21],
|
||||
[24, 55, 58, 5, 66, 73, 99, 26, 97, 17, 78, 78, 96, 83, 14, 88, 34, 89, 63, 72],
|
||||
[21, 36, 23, 9, 75, 0, 76, 44, 20, 45, 35, 14, 0, 61, 33, 97, 34, 31, 33, 95],
|
||||
[78, 17, 53, 28, 22, 75, 31, 67, 15, 94, 3, 80, 4, 62, 16, 14, 9, 53, 56, 92],
|
||||
[16, 39, 5, 42, 96, 35, 31, 47, 55, 58, 88, 24, 0, 17, 54, 24, 36, 29, 85, 57],
|
||||
[86, 56, 0, 48, 35, 71, 89, 7, 5, 44, 44, 37, 44, 60, 21, 58, 51, 54, 17, 58],
|
||||
[19, 80, 81, 68, 5, 94, 47, 69, 28, 73, 92, 13, 86, 52, 17, 77, 4, 89, 55, 40],
|
||||
[4, 52, 8, 83, 97, 35, 99, 16, 7, 97, 57, 32, 16, 26, 26, 79, 33, 27, 98, 66],
|
||||
[88, 36, 68, 87, 57, 62, 20, 72, 3, 46, 33, 67, 46, 55, 12, 32, 63, 93, 53, 69],
|
||||
[4, 42, 16, 73, 38, 25, 39, 11, 24, 94, 72, 18, 8, 46, 29, 32, 40, 62, 76, 36],
|
||||
[20, 69, 36, 41, 72, 30, 23, 88, 34, 62, 99, 69, 82, 67, 59, 85, 74, 4, 36, 16],
|
||||
[20, 73, 35, 29, 78, 31, 90, 1, 74, 31, 49, 71, 48, 86, 81, 16, 23, 57, 5, 54],
|
||||
[1, 70, 54, 71, 83, 51, 54, 69, 16, 92, 33, 48, 61, 43, 52, 1, 89, 19, 67, 48]
|
||||
];
|
||||
|
||||
const testGrid = [
|
||||
[40, 17, 81, 18, 57],
|
||||
[74, 4, 36, 16, 29],
|
||||
[36, 42, 69, 73, 45],
|
||||
[51, 54, 69, 16, 92],
|
||||
[7, 97, 57, 32, 16]
|
||||
];
|
||||
```
|
@ -0,0 +1,46 @@
|
||||
---
|
||||
id: 5900f3db1000cf542c50feed
|
||||
title: '問題 110: ディオファントス逆数 (2)'
|
||||
challengeType: 5
|
||||
forumTopicId: 301735
|
||||
dashedName: problem-110-diophantine-reciprocals-ii
|
||||
---
|
||||
|
||||
# --description--
|
||||
|
||||
次の式の x, y, n は正の整数です。
|
||||
|
||||
$$\frac{1}{x} + \frac{1}{y} = \frac{1}{n}$$
|
||||
|
||||
`n` = 1260 の場合に 113 個の相異なる解があり、1260 は相異なる解の総数が 100 を超える `n` の最小値です。
|
||||
|
||||
相異なる解の数が 400 万を超える最小の `n` を求めなさい。
|
||||
|
||||
**注:** これは、問題 108 をかなり難しくした問題です。総当たりで解ける限界をはるかに超えているので、賢い方法が必要です。
|
||||
|
||||
# --hints--
|
||||
|
||||
`diophantineTwo()` は `9350130049860600` を返す必要があります。
|
||||
|
||||
```js
|
||||
assert.strictEqual(diophantineTwo(), 9350130049860600);
|
||||
```
|
||||
|
||||
# --seed--
|
||||
|
||||
## --seed-contents--
|
||||
|
||||
```js
|
||||
function diophantineTwo() {
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
diophantineTwo();
|
||||
```
|
||||
|
||||
# --solutions--
|
||||
|
||||
```js
|
||||
// solution required
|
||||
```
|
@ -0,0 +1,61 @@
|
||||
---
|
||||
id: 5900f3db1000cf542c50feee
|
||||
title: '問題 111: 素数内の反復数字'
|
||||
challengeType: 5
|
||||
forumTopicId: 301736
|
||||
dashedName: problem-111-primes-with-runs
|
||||
---
|
||||
|
||||
# --description--
|
||||
|
||||
同じ数字が繰り返し使われている 4 桁の素数について考える場合、当然ながら、すべての桁が同じ数字にはなり得ません。1111 は 11 で割り切れ、22222 は 22で割り切れ、以降も同様だからです。 しかし、1 を 3 つ含む 4 桁の素数は 9 つあります。
|
||||
|
||||
$$1117, 1151, 1171, 1181, 1511, 1811, 2111, 4111, 8111$$
|
||||
|
||||
反復数字を d とし、n 桁の素数について反復数字の最大個数を $M(n, d)$ と表すことにします。また、そのような素数の個数を $N(n, d)$ と表し、これらの素数の和を $S(n, d)$ と表すことにします。
|
||||
|
||||
$M(4, 1) = 3 は、4 桁の素数に含まれる反復数字 1 が最大 3 個であること、$N(4, 1) = 9 は、そのような 4 桁の素数が 9 つあること、そして $S(4, 1) = 22275$ は、それらの素数の和を表します。 d = 0 のとき、$M(4, 0) = 2$ (反復数字は最大 2 つ) で、$N(4, 0) = 13$ (そのようなケースが 13 個) であることが分かります。
|
||||
|
||||
同様にして、4 桁の素数に対して次の結果が得られます。
|
||||
|
||||
| 数字 d | $M(4, d)$ | $N(4, d)$ | $S(4, d)$ |
|
||||
| ---- | --------- | --------- | --------- |
|
||||
| 0 | 2 | 13 | 67061 |
|
||||
| 1 | 3 | 9 | 22275 |
|
||||
| 2 | 3 | 1 | 2221 |
|
||||
| 3 | 3 | 12 | 46214 |
|
||||
| 4 | 3 | 2 | 8888 |
|
||||
| 5 | 3 | 1 | 5557 |
|
||||
| 6 | 3 | 1 | 6661 |
|
||||
| 7 | 3 | 9 | 57863 |
|
||||
| 8 | 3 | 1 | 8887 |
|
||||
| 9 | 3 | 7 | 48073 |
|
||||
|
||||
d = 0 ~ 9 のとき、$S(4, d)$ の総和は 273700 です。 $S(10, d)$ の総和を求めなさい。
|
||||
|
||||
# --hints--
|
||||
|
||||
`primesWithRuns()` は `612407567715` を返す必要があります。
|
||||
|
||||
```js
|
||||
assert.strictEqual(primesWithRuns(), 612407567715);
|
||||
```
|
||||
|
||||
# --seed--
|
||||
|
||||
## --seed-contents--
|
||||
|
||||
```js
|
||||
function primesWithRuns() {
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
primesWithRuns();
|
||||
```
|
||||
|
||||
# --solutions--
|
||||
|
||||
```js
|
||||
// solution required
|
||||
```
|
@ -0,0 +1,48 @@
|
||||
---
|
||||
id: 5900f3dd1000cf542c50feef
|
||||
title: '問題 112: 弾み数'
|
||||
challengeType: 5
|
||||
forumTopicId: 301738
|
||||
dashedName: problem-112-bouncy-numbers
|
||||
---
|
||||
|
||||
# --description--
|
||||
|
||||
ある数を左から右へ見ていき、すべての数字がその左側の数字を下回らない場合、その数は増加数と呼ばれます。例えば 134468 です。
|
||||
|
||||
同様に、すべての数字がその右側の数字を下回らない場合、その数は減少数と呼ばれます。例えば 66420 です。
|
||||
|
||||
増加数、減少数のどちらでもない正の整数を「弾み」数と呼ぶことにします。例えば 155349 です。
|
||||
|
||||
当然、100 未満には弾み数がありませんが、1000 未満の数の半数強 (525 個) が弾み数です。 実際、弾み数の割合が最初に 50% に達する最小の数は 538 です。
|
||||
|
||||
意外にも弾み数の割合は次第に増え、21780 に達する時点で弾み数の割合は 90% に達します。
|
||||
|
||||
弾み数の割合がちょうど 99% になる最小の数を求めなさい。
|
||||
|
||||
# --hints--
|
||||
|
||||
`bouncyNumbers()` は `1587000` を返す必要があります。
|
||||
|
||||
```js
|
||||
assert.strictEqual(bouncyNumbers(), 1587000);
|
||||
```
|
||||
|
||||
# --seed--
|
||||
|
||||
## --seed-contents--
|
||||
|
||||
```js
|
||||
function bouncyNumbers() {
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bouncyNumbers();
|
||||
```
|
||||
|
||||
# --solutions--
|
||||
|
||||
```js
|
||||
// solution required
|
||||
```
|
@ -0,0 +1,46 @@
|
||||
---
|
||||
id: 5900f3dd1000cf542c50fef0
|
||||
title: '問題 113: 弾み数ではない数'
|
||||
challengeType: 5
|
||||
forumTopicId: 301739
|
||||
dashedName: problem-113-non-bouncy-numbers
|
||||
---
|
||||
|
||||
# --description--
|
||||
|
||||
ある数を左から右へ見ていき、すべての数字がその左側の数字を下回らない場合、その数は増加数と呼ばれます。例えば 134468 です。
|
||||
|
||||
同様に、すべての数字がその右側の数字を下回らない場合、その数は減少数と呼ばれます。例えば 66420 です。
|
||||
|
||||
増加数、減少数のどちらでもない正の整数を「弾み」数と呼ぶことにします。例えば 155349 です。
|
||||
|
||||
n が大きくなるにつれ、n 未満の弾み数の割合も大きくなります。弾み数ではない数は 100万未満で 12951 個、${10}^{10}$ 未満で 277032 個しかありません。
|
||||
|
||||
グーゴル数 (${10}^{100}$) 未満で弾み数でない数はいくつありますか。
|
||||
|
||||
# --hints--
|
||||
|
||||
`nonBouncyNumbers()` は `51161058134250` を返す必要があります。
|
||||
|
||||
```js
|
||||
assert.strictEqual(nonBouncyNumbers(), 51161058134250);
|
||||
```
|
||||
|
||||
# --seed--
|
||||
|
||||
## --seed-contents--
|
||||
|
||||
```js
|
||||
function nonBouncyNumbers() {
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
nonBouncyNumbers();
|
||||
```
|
||||
|
||||
# --solutions--
|
||||
|
||||
```js
|
||||
// solution required
|
||||
```
|
@ -0,0 +1,44 @@
|
||||
---
|
||||
id: 5900f3e01000cf542c50fef2
|
||||
title: '問題 114: ブロックの組み合わせを数え上げる (1)'
|
||||
challengeType: 5
|
||||
forumTopicId: 301740
|
||||
dashedName: problem-114-counting-block-combinations-i
|
||||
---
|
||||
|
||||
# --description--
|
||||
|
||||
長さ 7 単位の 1 列に、長さ 3 単位以上の赤ブロックが置かれています。2 つの赤ブロック (長さが異なっていても良い) がある場合、それらは少なくとも 1 つの黒マスで区切られています。 このようにブロックを置く方法はちょうど 17 通りあります。
|
||||
|
||||
<img class="img-responsive center-block" alt="長さ 7 単位の列に長さ 3 単位以上のブロックを置く方法" src="https://cdn.freecodecamp.org/curriculum/project-euler/counting-block-combinations-i.png" style="background-color: white; padding: 10px;" />
|
||||
|
||||
長さ 50 単位の 1 列にブロックを置く方法は何通りありますか。
|
||||
|
||||
**注:** 上の例ではあり得ませんが、通常はブロックの大きさが混在することが許されます。 例えば、長さ 8 単位の 1 列に赤 (3)、黒 (1)、赤 (4) を使用できます。
|
||||
|
||||
# --hints--
|
||||
|
||||
`countingBlockOne()` は `16475640049` を返す必要があります。
|
||||
|
||||
```js
|
||||
assert.strictEqual(countingBlockOne(), 16475640049);
|
||||
```
|
||||
|
||||
# --seed--
|
||||
|
||||
## --seed-contents--
|
||||
|
||||
```js
|
||||
function countingBlockOne() {
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
countingBlockOne();
|
||||
```
|
||||
|
||||
# --solutions--
|
||||
|
||||
```js
|
||||
// solution required
|
||||
```
|
@ -0,0 +1,50 @@
|
||||
---
|
||||
id: 5900f3df1000cf542c50fef1
|
||||
title: '問題 115: ブロックの組み合わせを数え上げる (2)'
|
||||
challengeType: 5
|
||||
forumTopicId: 301741
|
||||
dashedName: problem-115-counting-block-combinations-ii
|
||||
---
|
||||
|
||||
# --description--
|
||||
|
||||
長さ `n` 単位の 1 列に、長さ `m` 単位以上の赤ブロックが置かれています。2 つの赤ブロック (長さが異なっていても良い) がある場合、それらは少なくとも 1 つの黒マスで区切られています。
|
||||
|
||||
列を埋める方法が何通りあるかを、fill-count 関数 $F(m, n)$ で表すことにします。
|
||||
|
||||
例えば、$F(3, 29) = 673135$, $F(3, 30) = 1089155$ です。
|
||||
|
||||
したがって、m = 3 のとき、fill-count 関数が初めて 100 万を超える n の最小値は 30 です。
|
||||
|
||||
同様に、m = 10 のときに $F(10, 56) = 880711$ および $F(10, 57) = 1148904$ であることが分かります。したがって、fill-count 関数が初めて100 万を超える n の最小値は 57 です。
|
||||
|
||||
m = 50のとき、fill-count 関数が初めて 100 万を超える `n` の最小値を見つけなさい。
|
||||
|
||||
**注:** これは、問題 114 をより難しくした問題です。
|
||||
|
||||
# --hints--
|
||||
|
||||
`countingBlockTwo()` は `168` を返す必要があります。
|
||||
|
||||
```js
|
||||
assert.strictEqual(countingBlockTwo(), 168);
|
||||
```
|
||||
|
||||
# --seed--
|
||||
|
||||
## --seed-contents--
|
||||
|
||||
```js
|
||||
function countingBlockTwo() {
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
countingBlockTwo();
|
||||
```
|
||||
|
||||
# --solutions--
|
||||
|
||||
```js
|
||||
// solution required
|
||||
```
|
@ -0,0 +1,54 @@
|
||||
---
|
||||
id: 5900f3e01000cf542c50fef3
|
||||
title: '問題 116: 赤タイル・緑タイル・青タイルのいずれか'
|
||||
challengeType: 5
|
||||
forumTopicId: 301742
|
||||
dashedName: problem-116-red-green-or-blue-tiles
|
||||
---
|
||||
|
||||
# --description--
|
||||
|
||||
黒の正方形タイルを 5 枚並べた列を、赤 (長さ 2)、緑 (長さ 3)、または青 (長さ 4) のいずれか 1 色の長方形タイルで置き換えます。
|
||||
|
||||
赤のタイルを選んだ場合、それを行う方法はちょうど 7 通りあります。
|
||||
|
||||
<img class="img-responsive center-block" alt="長さ 5 単位の列に赤のタイルを置く場合に考えられる方法" src="https://cdn.freecodecamp.org/curriculum/project-euler/red-green-or-blue-tiles-1.png" style="background-color: white; padding: 10px;" />
|
||||
|
||||
緑のタイルを選んだ場合は 3 通りあります。
|
||||
|
||||
<img class="img-responsive center-block" alt="長さ 5 単位の列に緑のタイルを置く場合に考えられる方法" src="https://cdn.freecodecamp.org/curriculum/project-euler/red-green-or-blue-tiles-2.png" style="background-color: white; padding: 10px;" />
|
||||
|
||||
青のタイルを選んだ場合は 2 通りあります。
|
||||
|
||||
<img class="img-responsive center-block" alt="長さ 5 単位の列に青のタイルを置く場合に考えられる方法" src="https://cdn.freecodecamp.org/curriculum/project-euler/red-green-or-blue-tiles-3.png" style="background-color: white; padding: 10px;" />
|
||||
|
||||
1 列に 1 色だけ使えるものとすると、長さ 5 単位の列にある黒のタイルを置き換える方法は 7 + 3 + 2 = 12 通りあります。 1 列に 1 色だけ使用でき、かつ、少なくとも 1 枚の色付きタイルを使用する必要がある場合、長さ 50 単位の黒のタイルの列を置き換える方法は何通りありますか。
|
||||
|
||||
**注:** この問題は、問題 117と関連しています。
|
||||
|
||||
# --hints--
|
||||
|
||||
`redGreenBlueOne()` は `20492570929` を返す必要があります 。
|
||||
|
||||
```js
|
||||
assert.strictEqual(redGreenBlueOne(), 20492570929);
|
||||
```
|
||||
|
||||
# --seed--
|
||||
|
||||
## --seed-contents--
|
||||
|
||||
```js
|
||||
function redGreenBlueOne() {
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
redGreenBlueOne();
|
||||
```
|
||||
|
||||
# --solutions--
|
||||
|
||||
```js
|
||||
// solution required
|
||||
```
|
@ -0,0 +1,44 @@
|
||||
---
|
||||
id: 5900f3e21000cf542c50fef4
|
||||
title: '問題 117: 赤タイル・緑タイル・青タイルの組み合わせ'
|
||||
challengeType: 5
|
||||
forumTopicId: 301743
|
||||
dashedName: problem-117-red-green-and-blue-tiles
|
||||
---
|
||||
|
||||
# --description--
|
||||
|
||||
正方形の黒のタイルと、赤 (長さ 2)、緑 (長さ 3)、または青 (長さ 4) の長方形タイルを組み合わせて、長さ 5 単位の 1 列にタイルを敷く方法はちょうど 15 通りあります。
|
||||
|
||||
<img class="img-responsive center-block" alt="長さ 5 単位の列に赤、緑、青のタイルを置く場合に考えられる方法" src="https://cdn.freecodecamp.org/curriculum/project-euler/red-green-and-blue-tiles.png" style="background-color: white; padding: 10px;" />
|
||||
|
||||
長さ 50 単位の 1 列にタイルを敷く方法は何通りありますか。
|
||||
|
||||
**注**: この問題は、問題 116と関連しています。
|
||||
|
||||
# --hints--
|
||||
|
||||
`redGreenBlueTilesTwo()` は `100808458960497` を返す必要があります 。
|
||||
|
||||
```js
|
||||
assert.strictEqual(redGreenBlueTilesTwo(), 100808458960497);
|
||||
```
|
||||
|
||||
# --seed--
|
||||
|
||||
## --seed-contents--
|
||||
|
||||
```js
|
||||
function redGreenBlueTilesTwo() {
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
redGreenBlueTilesTwo();
|
||||
```
|
||||
|
||||
# --solutions--
|
||||
|
||||
```js
|
||||
// solution required
|
||||
```
|
@ -0,0 +1,40 @@
|
||||
---
|
||||
id: 5900f3e21000cf542c50fef5
|
||||
title: '問題 118: パンデジタル素数集合'
|
||||
challengeType: 5
|
||||
forumTopicId: 301744
|
||||
dashedName: problem-118-pandigital-prime-sets
|
||||
---
|
||||
|
||||
# --description--
|
||||
|
||||
1 から 9 までのすべての数字を自由につなげて 10 進数の整数を作ると、さまざまな集合を作ることができます。 興味深いことに、集合 $\\{2, 5, 47, 89, 631\\}$ は、それに属するすべての要素が素数です。
|
||||
|
||||
1 から 9 までの数字をそれぞれちょうど 1 回含む相異なる集合のうち、素数のみを含むものはいくつありますか。
|
||||
|
||||
# --hints--
|
||||
|
||||
`pandigitalPrimeSets()` は `44680` を返す必要があります。
|
||||
|
||||
```js
|
||||
assert.strictEqual(pandigitalPrimeSets(), 44680);
|
||||
```
|
||||
|
||||
# --seed--
|
||||
|
||||
## --seed-contents--
|
||||
|
||||
```js
|
||||
function pandigitalPrimeSets() {
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
pandigitalPrimeSets();
|
||||
```
|
||||
|
||||
# --solutions--
|
||||
|
||||
```js
|
||||
// solution required
|
||||
```
|
@ -0,0 +1,44 @@
|
||||
---
|
||||
id: 5900f3e41000cf542c50fef6
|
||||
title: '問題 119: 各位の和の累乗'
|
||||
challengeType: 5
|
||||
forumTopicId: 301745
|
||||
dashedName: problem-119-digit-power-sum
|
||||
---
|
||||
|
||||
# --description--
|
||||
|
||||
512 は興味深い数字です。各位の和の累乗と等しいからです。すなわち、$5 + 1 + 2 = 8$, $8^3 = 512$ です。 この性質を持つ数は他にも $614656 = 28^4$ などがあります。
|
||||
|
||||
$a_n$ をこの数列の第 $n$ 項と定義し、また、和を持つには 2 桁以上の数でなければならないものとします。
|
||||
|
||||
$a_2 = 512$ と $a_{10} = 614656$ が与えられます。
|
||||
|
||||
$a_{30} $ を求めなさい。
|
||||
|
||||
# --hints--
|
||||
|
||||
`digitPowerSum()` は `248155780267521` を返す必要があります。
|
||||
|
||||
```js
|
||||
assert.strictEqual(digitPowerSum(), 248155780267521);
|
||||
```
|
||||
|
||||
# --seed--
|
||||
|
||||
## --seed-contents--
|
||||
|
||||
```js
|
||||
function digitPowerSum() {
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
digitPowerSum();
|
||||
```
|
||||
|
||||
# --solutions--
|
||||
|
||||
```js
|
||||
// solution required
|
||||
```
|
@ -0,0 +1,139 @@
|
||||
---
|
||||
id: 5900f3781000cf542c50fe8b
|
||||
title: '問題 12: 約数が多い三角数'
|
||||
challengeType: 5
|
||||
forumTopicId: 301746
|
||||
dashedName: problem-12-highly-divisible-triangular-number
|
||||
---
|
||||
|
||||
# --description--
|
||||
|
||||
三角数の数列は、自然数の和を求めることによって得られます。 したがって 7 番目の三角数は 1 + 2 + 3 + 4 + 5 + 6 + 7 = 28 になります。 最初の 10 項は次のとおりです。
|
||||
|
||||
<div style='text-align: center;'>1, 3, 6, 10, 15, 21, 28, 36, 45, 55, ...</div>
|
||||
|
||||
最初の 7 つの三角数の約数を列挙すると、次のようになります。
|
||||
|
||||
<div style='padding-left: 4em;'><b>1:</b> 1</div>
|
||||
<div style='padding-left: 4em;'><b>3:</b> 1, 3</div>
|
||||
<div style='padding-left: 4em;'><b>6:</b> 1, 2, 3, 6</div>
|
||||
<div style='padding-left: 4em;'><b>10:</b> 1, 2, 5, 10</div>
|
||||
<div style='padding-left: 4em;'><b>15:</b> 1, 3, 5, 15</div>
|
||||
<div style='padding-left: 4em;'><b>21:</b> 1, 3, 7, 21</div>
|
||||
<div style='padding-left: 4em;'><b>28:</b> 1, 2, 4, 7, 14, 28</div>
|
||||
|
||||
5 つより多い約数を持つ最初の三角数は 28 であることが分かります。
|
||||
|
||||
`n` 個より多い約数を持つ最初の三角数の値を求めなさい。
|
||||
|
||||
# --hints--
|
||||
|
||||
`divisibleTriangleNumber(5)` は数値を返す必要があります。
|
||||
|
||||
```js
|
||||
assert(typeof divisibleTriangleNumber(5) === 'number');
|
||||
```
|
||||
|
||||
`divisibleTriangleNumber(5)` は 28 を返す必要があります。
|
||||
|
||||
```js
|
||||
assert.strictEqual(divisibleTriangleNumber(5), 28);
|
||||
```
|
||||
|
||||
`divisibleTriangleNumber(23)` は 630 を返す必要があります。
|
||||
|
||||
```js
|
||||
assert.strictEqual(divisibleTriangleNumber(23), 630);
|
||||
```
|
||||
|
||||
`divisibleTriangleNumber(167)` は 1385280 を返す必要があります。
|
||||
|
||||
```js
|
||||
assert.strictEqual(divisibleTriangleNumber(167), 1385280);
|
||||
```
|
||||
|
||||
`divisibleTriangleNumber(374)` は 17907120 を返す必要があります。
|
||||
|
||||
```js
|
||||
assert.strictEqual(divisibleTriangleNumber(374), 17907120);
|
||||
```
|
||||
|
||||
`divisibleTriangleNumber(500)` は 76576500 を返す必要があります。
|
||||
|
||||
```js
|
||||
assert.strictEqual(divisibleTriangleNumber(500), 76576500);
|
||||
```
|
||||
|
||||
# --seed--
|
||||
|
||||
## --seed-contents--
|
||||
|
||||
```js
|
||||
function divisibleTriangleNumber(n) {
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
divisibleTriangleNumber(500);
|
||||
```
|
||||
|
||||
# --solutions--
|
||||
|
||||
```js
|
||||
function divisibleTriangleNumber(n) {
|
||||
if (n === 1) return 3;
|
||||
let counter = 1;
|
||||
let triangleNumber = counter++;
|
||||
|
||||
|
||||
while (noOfFactors(triangleNumber) < n) {
|
||||
triangleNumber += counter++;
|
||||
}
|
||||
return triangleNumber;
|
||||
}
|
||||
|
||||
function noOfFactors(num) {
|
||||
const primeFactors = getPrimeFactors(num);
|
||||
let prod = 1;
|
||||
for(let p in primeFactors) {
|
||||
prod *= (primeFactors[p] + 1)
|
||||
}
|
||||
return prod;
|
||||
}
|
||||
|
||||
function getPrimeFactors(num) {
|
||||
let n = num;
|
||||
let primes = {};
|
||||
|
||||
let p = 2;
|
||||
let sqrt = Math.sqrt(num);
|
||||
|
||||
function checkAndUpdate(inc) {
|
||||
if (n % p === 0) {
|
||||
const curr = primes[p];
|
||||
if (curr) {
|
||||
primes[p]++
|
||||
} else {
|
||||
primes[p] = 1;
|
||||
}
|
||||
n /= p;
|
||||
} else {
|
||||
p += inc;
|
||||
}
|
||||
}
|
||||
|
||||
while(p === 2 && p <= n) {
|
||||
checkAndUpdate(1);
|
||||
}
|
||||
|
||||
while (p <= n && p <= sqrt) {
|
||||
checkAndUpdate(2);
|
||||
}
|
||||
if(Object.keys(primes).length === 0) {
|
||||
primes[num] = 1;
|
||||
} else if(n !== 1) {
|
||||
primes[n] = 1;
|
||||
}
|
||||
return primes;
|
||||
}
|
||||
```
|
@ -0,0 +1,42 @@
|
||||
---
|
||||
id: 5900f3e41000cf542c50fef7
|
||||
title: '問題 120: 平方数で除した余り'
|
||||
challengeType: 5
|
||||
forumTopicId: 301747
|
||||
dashedName: problem-120-square-remainders
|
||||
---
|
||||
|
||||
# --description--
|
||||
|
||||
${(a − 1)}^n + {(a + 1)}^n$ を $a^2$ で除した余りを `r` とします。
|
||||
|
||||
例えば、$a = 7$ かつ $n = 3$ のとき、$r = 42: 6^3 + 8^3 = 728 ≡ 42 \\ \text{mod}\\ 49$ です。 `n` が変わると `r` も変わりますが、$a = 7$ のときに $r_{max} = 42$ となります。
|
||||
|
||||
$3 ≤ a ≤ 1000$ のとき、$\sum{r}_{max}$ を求めなさい。
|
||||
|
||||
# --hints--
|
||||
|
||||
`squareRemainders()` は `333082500` を返す必要があります。
|
||||
|
||||
```js
|
||||
assert.strictEqual(squareRemainders(), 333082500);
|
||||
```
|
||||
|
||||
# --seed--
|
||||
|
||||
## --seed-contents--
|
||||
|
||||
```js
|
||||
function squareRemainders() {
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
squareRemainders();
|
||||
```
|
||||
|
||||
# --solutions--
|
||||
|
||||
```js
|
||||
// solution required
|
||||
```
|
@ -0,0 +1,44 @@
|
||||
---
|
||||
id: 5900f3e51000cf542c50fef8
|
||||
title: '問題 121: 円盤ゲームの賞金額'
|
||||
challengeType: 5
|
||||
forumTopicId: 301748
|
||||
dashedName: problem-121-disc-game-prize-fund
|
||||
---
|
||||
|
||||
# --description--
|
||||
|
||||
袋の中に、赤い円盤 1 枚と青い円盤 1 枚が入っています。 運で勝負が決まるゲームにおいて、プレイヤーは無作為に円盤を取り、その色が記録されます。 ターンごとに円盤が袋に戻され、赤い円盤が 1 枚追加され、またプレイヤーが無作為に円盤を 1 枚取ります。
|
||||
|
||||
プレイヤーは 1 ポンド払ってゲームに参加し、ゲーム終了時に赤い円盤よりも青い円盤を多く取っていたら勝ちです。
|
||||
|
||||
このゲームが 4 ターン行われた場合、プレイヤーの勝率はちょうど 11/120 なので、胴元が確率的に損失を出さないようにこのゲームの勝利に割り当てるべき賞金額は、最大 10 ポンドです。 なお、支払いは 1 ポンド単位であり、ゲームをプレイするために支払った最初の 1 ポンドも含まれています。したがってこの例では、プレイヤーが実際に得る利益は 9 ポンドになります。
|
||||
|
||||
15 ターンが行われる 1 回のゲームに割り当てるべき最大賞金額を求めなさい。
|
||||
|
||||
# --hints--
|
||||
|
||||
`discGamePrize()` は `2269` を返す必要があります。
|
||||
|
||||
```js
|
||||
assert.strictEqual(discGamePrize(), 2269);
|
||||
```
|
||||
|
||||
# --seed--
|
||||
|
||||
## --seed-contents--
|
||||
|
||||
```js
|
||||
function discGamePrize() {
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
discGamePrize();
|
||||
```
|
||||
|
||||
# --solutions--
|
||||
|
||||
```js
|
||||
// solution required
|
||||
```
|
@ -0,0 +1,52 @@
|
||||
---
|
||||
id: 5900f3e61000cf542c50fef9
|
||||
title: '問題 122: 効率的な累乗法'
|
||||
challengeType: 5
|
||||
forumTopicId: 301749
|
||||
dashedName: problem-122-efficient-exponentiation
|
||||
---
|
||||
|
||||
# --description--
|
||||
|
||||
$n^{15}$ の最も単純な計算方法では、14 回の乗算が必要です。
|
||||
|
||||
$$n × n × \ldots × n = n^{15}$$
|
||||
|
||||
しかし、2 進法を使えば 6 回の乗算で計算できます。
|
||||
|
||||
$$\begin{align} & n × n = n^2\\\\ & n^2 × n^2 = n^4\\\\ & n^4 × n^4 = n^8\\\\ & n^8 × n^4 = n^{12}\\\\ & n^{12} × n^2 = n^{14}\\\\ & n^{14} × n = n^{15} \end{align}$$
|
||||
|
||||
しかし、わずか 5 回の乗算で計算することも可能です。
|
||||
|
||||
$$\begin{align} & n × n = n^2\\\\ & n^2 × n = n^3\\\\ & n^3 × n^3 = n^6\\\\ & n^6 × n^6 = n^{12}\\\\ & n^{12} × n^3 = n^{15} \end{align}$$
|
||||
|
||||
ここで、$n^k$ を計算するための最小の乗算回数を $m(k)$ とします。例えば $m(15) = 5$ です。
|
||||
|
||||
$1 ≤ a ≤ 200$ のとき、$\sum{m(k)}$ を求めなさい。
|
||||
|
||||
# --hints--
|
||||
|
||||
`efficientExponentation()` は `1582` を返す必要があります。
|
||||
|
||||
```js
|
||||
assert.strictEqual(efficientExponentation(), 1582);
|
||||
```
|
||||
|
||||
# --seed--
|
||||
|
||||
## --seed-contents--
|
||||
|
||||
```js
|
||||
function efficientExponentation() {
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
efficientExponentation();
|
||||
```
|
||||
|
||||
# --solutions--
|
||||
|
||||
```js
|
||||
// solution required
|
||||
```
|
@ -0,0 +1,44 @@
|
||||
---
|
||||
id: 5900f3e71000cf542c50fefa
|
||||
title: '問題 123: 素数の平方数で除した余り'
|
||||
challengeType: 5
|
||||
forumTopicId: 301750
|
||||
dashedName: problem-123-prime-square-remainders
|
||||
---
|
||||
|
||||
# --description--
|
||||
|
||||
$n$ 番目の素数 (2, 3, 5, 7, 11, ...) を $p_n$ とし、${(p_n−1)}^n + {(p_n+1)}^n$ を ${p_n}^2$ で除した余りを $r$ とします。
|
||||
|
||||
例えば、$n = 3 のとき、p_3 = 5$, $4^3 + 6^3 = 280 ≡ 5\\ mod\\ 25$ となります。
|
||||
|
||||
余りが初めて $10^9$ を超える $n$ の最小値は 7037です。
|
||||
|
||||
余りが初めて $10^{10}$ を超える $n$ の最小値を求めなさい。
|
||||
|
||||
# --hints--
|
||||
|
||||
`primeSquareRemainders()` は `21035` を返す必要があります。
|
||||
|
||||
```js
|
||||
assert.strictEqual(primeSquareRemainders(), 21035);
|
||||
```
|
||||
|
||||
# --seed--
|
||||
|
||||
## --seed-contents--
|
||||
|
||||
```js
|
||||
function primeSquareRemainders() {
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
primeSquareRemainders();
|
||||
```
|
||||
|
||||
# --solutions--
|
||||
|
||||
```js
|
||||
// solution required
|
||||
```
|
@ -0,0 +1,142 @@
|
||||
---
|
||||
id: 5900f3e81000cf542c50fefb
|
||||
title: '問題 124: 順序付き累乗根'
|
||||
challengeType: 5
|
||||
forumTopicId: 301751
|
||||
dashedName: problem-124-ordered-radicals
|
||||
---
|
||||
|
||||
# --description--
|
||||
|
||||
$n$ の累乗根 $rad(n)$ は、$n$ の相異なる素因数の積です。 例えば、$504 = 2^3 × 3^2 × 7$ なので、$rad(504) = 2 × 3 × 7 = 42$ です。
|
||||
|
||||
$1 ≤ n ≤ 10$ に対して $rad(n)$ を求め、それらを $rad(n)$ でソートし、累乗根の値が等しい場合は $n$ でソートすると、次のようになります。
|
||||
|
||||
<div style="text-align: center;">
|
||||
<table cellpadding="2" cellspacing="0" border="0" align="center">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td colspan="2">$未ソート$</td>
|
||||
<td></td>
|
||||
<td colspan="3">$ソート済み$</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>$n$</td>
|
||||
<td>$rad(n)$</td>
|
||||
<td></td>
|
||||
<td>$n$</td>
|
||||
<td>$rad(n)$</td>
|
||||
<td>$k$</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>1</td>
|
||||
<td>1</td>
|
||||
<td></td>
|
||||
<td>1</td>
|
||||
<td>1</td>
|
||||
<td>1</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>2</td>
|
||||
<td>2</td>
|
||||
<td></td>
|
||||
<td>2</td>
|
||||
<td>2</td>
|
||||
<td>2</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>3</td>
|
||||
<td>3</td>
|
||||
<td></td>
|
||||
<td>4</td>
|
||||
<td>2</td>
|
||||
<td>3</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>4</td>
|
||||
<td>2</td>
|
||||
<td></td>
|
||||
<td>8</td>
|
||||
<td>2</td>
|
||||
<td>4</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>5</td>
|
||||
<td>5</td>
|
||||
<td></td>
|
||||
<td>3</td>
|
||||
<td>3</td>
|
||||
<td>5</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>6</td>
|
||||
<td>6</td>
|
||||
<td></td>
|
||||
<td>9</td>
|
||||
<td>3</td>
|
||||
<td>6</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>7</td>
|
||||
<td>7</td>
|
||||
<td></td>
|
||||
<td>5</td>
|
||||
<td>5</td>
|
||||
<td>7</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>8</td>
|
||||
<td>2</td>
|
||||
<td></td>
|
||||
<td>6</td>
|
||||
<td>6</td>
|
||||
<td>8</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>9</td>
|
||||
<td>3</td>
|
||||
<td></td>
|
||||
<td>7</td>
|
||||
<td>7</td>
|
||||
<td>9</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>10</td>
|
||||
<td>10</td>
|
||||
<td></td>
|
||||
<td>10</td>
|
||||
<td>10</td>
|
||||
<td>10</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div><br>
|
||||
|
||||
ソート済みの $n$ 列の $k$ 番目の要素を $E(k)$ とします。例えば、$E(4) = 8$, $E(6) = 9$ です。 $1 ≤ n ≤ 100000$ のとき、$rad(n)$ をソートした場合の $E(10000)$ を求めなさい。
|
||||
|
||||
# --hints--
|
||||
|
||||
`orderedRadicals()` は `21417` を返す必要があります。
|
||||
|
||||
```js
|
||||
assert.strictEqual(orderedRadicals(), 21417);
|
||||
```
|
||||
|
||||
# --seed--
|
||||
|
||||
## --seed-contents--
|
||||
|
||||
```js
|
||||
function orderedRadicals() {
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
orderedRadicals();
|
||||
```
|
||||
|
||||
# --solutions--
|
||||
|
||||
```js
|
||||
// solution required
|
||||
```
|
@ -0,0 +1,42 @@
|
||||
---
|
||||
id: 5900f3e91000cf542c50fefc
|
||||
title: '問題 125: 回文数の和'
|
||||
challengeType: 5
|
||||
forumTopicId: 301752
|
||||
dashedName: problem-125-palindromic-sums
|
||||
---
|
||||
|
||||
# --description--
|
||||
|
||||
回文数 595 は、連続する平方数の和 ($6^2 + 7^2 + 8^2 + 9^2 + 10^2 + 10^2 + 11^2 + 12^2$) として表せる興味深い数です。
|
||||
|
||||
連続した平方数の和で表せる 1,000 未満の回文数はちょうど 11 個あり、それらの回文数の和は 4164 です。 なお、この問題では正の整数の平方数のみを扱うので、$1 = 0^2 + 1^2$ は含まれません。
|
||||
|
||||
回文数であり、かつ、連続する平方数の和として表すことができる、$10^8$ 未満の数の総和を求めなさい。
|
||||
|
||||
# --hints--
|
||||
|
||||
`palindromicSums()` は `2906969179` を返す必要があります。
|
||||
|
||||
```js
|
||||
assert.strictEqual(palindromicSums(), 2906969179);
|
||||
```
|
||||
|
||||
# --seed--
|
||||
|
||||
## --seed-contents--
|
||||
|
||||
```js
|
||||
function palindromicSums() {
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
palindromicSums();
|
||||
```
|
||||
|
||||
# --solutions--
|
||||
|
||||
```js
|
||||
// solution required
|
||||
```
|
@ -0,0 +1,50 @@
|
||||
---
|
||||
id: 5900f3ea1000cf542c50fefd
|
||||
title: '問題 126: 直方体の層'
|
||||
challengeType: 5
|
||||
forumTopicId: 301753
|
||||
dashedName: problem-126-cuboid-layers
|
||||
---
|
||||
|
||||
# --description--
|
||||
|
||||
寸法が 3 x 2 x 1 の直方体の表面をすべて覆うには、少なくとも 22 個の立方体が必要です。
|
||||
|
||||
<img class="img-responsive center-block" alt="1 x 1 x 1 の立方体 22 個 で覆われた 3 x 2 x 1 の直方体" src="https://cdn.freecodecamp.org/curriculum/project-euler/cuboid-layers.png" style="background-color: white; padding: 10px;" />
|
||||
|
||||
この立体に 2 層目を加える場合、表面をすべて覆うには 46 個の立方体が必要になります。さらに 3 層目では 78 個、4 層目では 118 個の立方体が必要です。
|
||||
|
||||
しかし、5 × 1 × 1 の直方体でも 1 層目に 22 個の立方体が必要であり、同様に、5 × 3 × 1, 7 × 2 × 1, 11 × 1 × 1 の直方体はいずれも 1 層目が 46 個の立方体からなります。
|
||||
|
||||
いずれか 1 つの層が $n$ 個の立方体からなるような直方体の個数を、$C(n)$ とします。 したがって、$C(22) = 2$, $C(46) = 4$, $C(78) = 5$, $C(118) = 8$ です。
|
||||
|
||||
$C(n) = 10$ のとき、最小の $n$ が 154 であることが分かります。
|
||||
|
||||
$C(n) = 1000$ のとき、$n$ の最小値を求めなさい。
|
||||
|
||||
# --hints--
|
||||
|
||||
`cuboidLayers()` は `18522` を返す必要があります。
|
||||
|
||||
```js
|
||||
assert.strictEqual(cuboidLayers(), 18522);
|
||||
```
|
||||
|
||||
# --seed--
|
||||
|
||||
## --seed-contents--
|
||||
|
||||
```js
|
||||
function cuboidLayers() {
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
cuboidLayers();
|
||||
```
|
||||
|
||||
# --solutions--
|
||||
|
||||
```js
|
||||
// solution required
|
||||
```
|
@ -0,0 +1,56 @@
|
||||
---
|
||||
id: 5900f3ec1000cf542c50fefe
|
||||
title: '問題 127: abc-hit'
|
||||
challengeType: 5
|
||||
forumTopicId: 301754
|
||||
dashedName: problem-127-abc-hits
|
||||
---
|
||||
|
||||
# --description--
|
||||
|
||||
$n$ の累乗根 $rad(n)$ は、$n$ の相異なる素数の積です。 例えば、$504 = 2^3 × 3^2 × 7$ なので、$rad(504) = 2 × 3 × 7 = 42$ です。
|
||||
|
||||
以下が成り立つとき、正の整数 (a, b, c) の三つ組数を "abc-hit" と呼ぶことにします。
|
||||
|
||||
1. $GCD(a, b) = GCD(a, c) = GCD(b, c) = 1$
|
||||
2. $a < b$
|
||||
3. $a + b = c$
|
||||
4. $rad(abc) < c$
|
||||
|
||||
例えば、(5, 27, 32) は abc-hit です。
|
||||
|
||||
1. $GCD(5, 27) = GCD(5, 32) = GCD(27, 32) = 1$
|
||||
2. $5 < 27$
|
||||
3. $5 + 27 = 32$
|
||||
4. $rad(4320) = 30 < 32$
|
||||
|
||||
abc-hit は極めてまれです。$c < 1000$ のとき、abc-hits はわずか 31 個であり $\sum{c} = 12523$ です。
|
||||
|
||||
$c < 120000$ のとき、$\sum{c}$ を求めなさい。
|
||||
|
||||
# --hints--
|
||||
|
||||
`abcHits()` は `18407904` を返す必要があります。
|
||||
|
||||
```js
|
||||
assert.strictEqual(abcHits(), 18407904);
|
||||
```
|
||||
|
||||
# --seed--
|
||||
|
||||
## --seed-contents--
|
||||
|
||||
```js
|
||||
function abcHits() {
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
abcHits();
|
||||
```
|
||||
|
||||
# --solutions--
|
||||
|
||||
```js
|
||||
// solution required
|
||||
```
|
@ -0,0 +1,54 @@
|
||||
---
|
||||
id: 5900f3ec1000cf542c50feff
|
||||
title: '問題 128: 六角形タイルの差'
|
||||
challengeType: 5
|
||||
forumTopicId: 301755
|
||||
dashedName: problem-128-hexagonal-tile-differences
|
||||
---
|
||||
|
||||
# --description--
|
||||
|
||||
1 番の六角形タイルは、12 時の位置から反時計回りに配置された 2 番から 7 番の 6 枚の六角形タイルの輪に囲まれています。
|
||||
|
||||
同様に、8 番から 19 番、20 番から 37 番、38 番から 61 番、… という具合に新しい輪が追加されていきます。 下図は、最初の 3 個の輪を示しています。
|
||||
|
||||
<img class="img-responsive center-block" alt="1 ~ 37 番の六角形タイルを並べて作られた最初の 3 つの輪。タイル 8 番と 17 番は色付き" src="https://cdn.freecodecamp.org/curriculum/project-euler/hexagonal-tile-differences.png" style="background-color: white; padding: 10px;" />
|
||||
|
||||
タイル $n$ 番と、それに隣接する 6 枚の各タイルとの差を求め、差が素数となるタイルの枚数を $PD(n) とします。
|
||||
|
||||
例えば、タイル 8 番の周りを時計回りに差を求めると、12, 29, 11, 6, 1, 13 となります。 したがって、$PD(8) = 3$ です。
|
||||
|
||||
同様に、タイル 17 番とその周囲との差は 1, 17, 16, 1, 11, 10 なので、$PD(17) = 2$ です。
|
||||
|
||||
$PD(n)$ の最大値が $3$ であることを示すことができます。
|
||||
|
||||
$PD(n) = 3$ が成り立つすべてのタイルを昇順に並べて数列を作ると、第 10 項はタイル 271 番です。
|
||||
|
||||
この数列の 第 2000 項のタイルの番号を求めなさい。
|
||||
|
||||
# --hints--
|
||||
|
||||
`hexagonalTile()` は `14516824220` を返す必要があります。
|
||||
|
||||
```js
|
||||
assert.strictEqual(hexagonalTile(), 14516824220);
|
||||
```
|
||||
|
||||
# --seed--
|
||||
|
||||
## --seed-contents--
|
||||
|
||||
```js
|
||||
function hexagonalTile() {
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
hexagonalTile();
|
||||
```
|
||||
|
||||
# --solutions--
|
||||
|
||||
```js
|
||||
// solution required
|
||||
```
|
@ -0,0 +1,44 @@
|
||||
---
|
||||
id: 5900f3ef1000cf542c50ff01
|
||||
title: '問題 129: レピュニット数の被整除性'
|
||||
challengeType: 5
|
||||
forumTopicId: 301756
|
||||
dashedName: problem-129-repunit-divisibility
|
||||
---
|
||||
|
||||
# --description--
|
||||
|
||||
1 のみで構成される数はレピュニット数と呼ばれます。 ここでは、長さ $k$ のレピュニット数を $R(k)$ とします。例えば、$R(6) = 111111$ です。
|
||||
|
||||
$n$ を正の整数とし、$GCD(n, 10) = 1$ が与えられる場合、$R(k)$ が $n$ で割り切れるような値 $k$ が必ず存在することを証明できます。また、そのような $k$ の最小値を $A(n)$ とします。例えば、$A(7) = 6$, $A(41) = 5$ です。
|
||||
|
||||
$A(n)$ が初めて 10 を超えるときの $n$ の最小値は 17 です。
|
||||
|
||||
$A(n)$ が初めて 100 万を超えるときの $n$ の最小値を求めなさい。
|
||||
|
||||
# --hints--
|
||||
|
||||
`repunitDivisibility()` は `1000023` を返す必要があります。
|
||||
|
||||
```js
|
||||
assert.strictEqual(repunitDivisibility(), 1000023);
|
||||
```
|
||||
|
||||
# --seed--
|
||||
|
||||
## --seed-contents--
|
||||
|
||||
```js
|
||||
function repunitDivisibility() {
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
repunitDivisibility();
|
||||
```
|
||||
|
||||
# --solutions--
|
||||
|
||||
```js
|
||||
// solution required
|
||||
```
|
@ -0,0 +1,286 @@
|
||||
---
|
||||
id: 5900f37a1000cf542c50fe8c
|
||||
title: '問題 13: 大きな数の和'
|
||||
challengeType: 5
|
||||
forumTopicId: 301757
|
||||
dashedName: problem-13-large-sum
|
||||
---
|
||||
|
||||
# --description--
|
||||
|
||||
下に、50 桁の数が 100 個あります。これらの和の最初の10 桁を求めなさい。
|
||||
|
||||
<div style='padding-left: 4em;'>
|
||||
37107287533902102798797998220837590246510135740250<br>
|
||||
46376937677490009712648124896970078050417018260538<br>
|
||||
74324986199524741059474233309513058123726617309629<br>
|
||||
91942213363574161572522430563301811072406154908250<br>
|
||||
23067588207539346171171980310421047513778063246676<br>
|
||||
89261670696623633820136378418383684178734361726757<br>
|
||||
28112879812849979408065481931592621691275889832738<br>
|
||||
44274228917432520321923589422876796487670272189318<br>
|
||||
47451445736001306439091167216856844588711603153276<br>
|
||||
70386486105843025439939619828917593665686757934951<br>
|
||||
62176457141856560629502157223196586755079324193331<br>
|
||||
64906352462741904929101432445813822663347944758178<br>
|
||||
92575867718337217661963751590579239728245598838407<br>
|
||||
58203565325359399008402633568948830189458628227828<br>
|
||||
80181199384826282014278194139940567587151170094390<br>
|
||||
35398664372827112653829987240784473053190104293586<br>
|
||||
86515506006295864861532075273371959191420517255829<br>
|
||||
71693888707715466499115593487603532921714970056938<br>
|
||||
54370070576826684624621495650076471787294438377604<br>
|
||||
53282654108756828443191190634694037855217779295145<br>
|
||||
36123272525000296071075082563815656710885258350721<br>
|
||||
45876576172410976447339110607218265236877223636045<br>
|
||||
17423706905851860660448207621209813287860733969412<br>
|
||||
81142660418086830619328460811191061556940512689692<br>
|
||||
51934325451728388641918047049293215058642563049483<br>
|
||||
62467221648435076201727918039944693004732956340691<br>
|
||||
15732444386908125794514089057706229429197107928209<br>
|
||||
55037687525678773091862540744969844508330393682126<br>
|
||||
18336384825330154686196124348767681297534375946515<br>
|
||||
80386287592878490201521685554828717201219257766954<br>
|
||||
78182833757993103614740356856449095527097864797581<br>
|
||||
16726320100436897842553539920931837441497806860984<br>
|
||||
48403098129077791799088218795327364475675590848030<br>
|
||||
87086987551392711854517078544161852424320693150332<br>
|
||||
59959406895756536782107074926966537676326235447210<br>
|
||||
69793950679652694742597709739166693763042633987085<br>
|
||||
41052684708299085211399427365734116182760315001271<br>
|
||||
65378607361501080857009149939512557028198746004375<br>
|
||||
35829035317434717326932123578154982629742552737307<br>
|
||||
94953759765105305946966067683156574377167401875275<br>
|
||||
88902802571733229619176668713819931811048770190271<br>
|
||||
25267680276078003013678680992525463401061632866526<br>
|
||||
36270218540497705585629946580636237993140746255962<br>
|
||||
24074486908231174977792365466257246923322810917141<br>
|
||||
91430288197103288597806669760892938638285025333403<br>
|
||||
34413065578016127815921815005561868836468420090470<br>
|
||||
23053081172816430487623791969842487255036638784583<br>
|
||||
11487696932154902810424020138335124462181441773470<br>
|
||||
63783299490636259666498587618221225225512486764533<br>
|
||||
67720186971698544312419572409913959008952310058822<br>
|
||||
95548255300263520781532296796249481641953868218774<br>
|
||||
76085327132285723110424803456124867697064507995236<br>
|
||||
37774242535411291684276865538926205024910326572967<br>
|
||||
23701913275725675285653248258265463092207058596522<br>
|
||||
29798860272258331913126375147341994889534765745501<br>
|
||||
18495701454879288984856827726077713721403798879715<br>
|
||||
38298203783031473527721580348144513491373226651381<br>
|
||||
34829543829199918180278916522431027392251122869539<br>
|
||||
40957953066405232632538044100059654939159879593635<br>
|
||||
29746152185502371307642255121183693803580388584903<br>
|
||||
41698116222072977186158236678424689157993532961922<br>
|
||||
62467957194401269043877107275048102390895523597457<br>
|
||||
23189706772547915061505504953922979530901129967519<br>
|
||||
86188088225875314529584099251203829009407770775672<br>
|
||||
11306739708304724483816533873502340845647058077308<br>
|
||||
82959174767140363198008187129011875491310547126581<br>
|
||||
97623331044818386269515456334926366572897563400500<br>
|
||||
42846280183517070527831839425882145521227251250327<br>
|
||||
55121603546981200581762165212827652751691296897789<br>
|
||||
32238195734329339946437501907836945765883352399886<br>
|
||||
75506164965184775180738168837861091527357929701337<br>
|
||||
62177842752192623401942399639168044983993173312731<br>
|
||||
32924185707147349566916674687634660915035914677504<br>
|
||||
99518671430235219628894890102423325116913619626622<br>
|
||||
73267460800591547471830798392868535206946944540724<br>
|
||||
76841822524674417161514036427982273348055556214818<br>
|
||||
97142617910342598647204516893989422179826088076852<br>
|
||||
87783646182799346313767754307809363333018982642090<br>
|
||||
10848802521674670883215120185883543223812876952786<br>
|
||||
71329612474782464538636993009049310363619763878039<br>
|
||||
62184073572399794223406235393808339651327408011116<br>
|
||||
66627891981488087797941876876144230030984490851411<br>
|
||||
60661826293682836764744779239180335110989069790714<br>
|
||||
85786944089552990653640447425576083659976645795096<br>
|
||||
66024396409905389607120198219976047599490197230297<br>
|
||||
64913982680032973156037120041377903785566085089252<br>
|
||||
16730939319872750275468906903707539413042652315011<br>
|
||||
94809377245048795150954100921645863754710598436791<br>
|
||||
78639167021187492431995700641917969777599028300699<br>
|
||||
15368713711936614952811305876380278410754449733078<br>
|
||||
40789923115535562561142322423255033685442488917353<br>
|
||||
44889911501440648020369068063960672322193204149535<br>
|
||||
41503128880339536053299340368006977710650566631954<br>
|
||||
81234880673210146739058568557934581403627822703280<br>
|
||||
82616570773948327592232845941706525094512325230608<br>
|
||||
22918802058777319719839450180888072429661980811197<br>
|
||||
77158542502016545090413245809786882778948721859617<br>
|
||||
72107838435069186155435662884062257473692284509516<br>
|
||||
20849603980134001723930671666823555245252804609722<br>
|
||||
53503534226472524250874054075591789781264330331690<br>
|
||||
</div>
|
||||
|
||||
# --hints--
|
||||
|
||||
`largeSum(testNums)` は数値を返す必要があります。
|
||||
|
||||
```js
|
||||
assert(typeof largeSum(testNums) === 'number');
|
||||
```
|
||||
|
||||
`largeSum(testNums)` は8348422521 を返す必要があります。
|
||||
|
||||
```js
|
||||
assert.strictEqual(largeSum(testNums), 8348422521);
|
||||
```
|
||||
|
||||
`largeSum(fiftyDigitNums)` は 5537376230 を返す必要があります。
|
||||
|
||||
```js
|
||||
assert.strictEqual(largeSum(fiftyDigitNums), 5537376230);
|
||||
```
|
||||
|
||||
# --seed--
|
||||
|
||||
## --before-user-code--
|
||||
|
||||
```js
|
||||
const fiftyDigitNums = [
|
||||
'37107287533902102798797998220837590246510135740250',
|
||||
'46376937677490009712648124896970078050417018260538',
|
||||
'74324986199524741059474233309513058123726617309629',
|
||||
'91942213363574161572522430563301811072406154908250',
|
||||
'23067588207539346171171980310421047513778063246676',
|
||||
'89261670696623633820136378418383684178734361726757',
|
||||
'28112879812849979408065481931592621691275889832738',
|
||||
'44274228917432520321923589422876796487670272189318',
|
||||
'47451445736001306439091167216856844588711603153276',
|
||||
'70386486105843025439939619828917593665686757934951',
|
||||
'62176457141856560629502157223196586755079324193331',
|
||||
'64906352462741904929101432445813822663347944758178',
|
||||
'92575867718337217661963751590579239728245598838407',
|
||||
'58203565325359399008402633568948830189458628227828',
|
||||
'80181199384826282014278194139940567587151170094390',
|
||||
'35398664372827112653829987240784473053190104293586',
|
||||
'86515506006295864861532075273371959191420517255829',
|
||||
'71693888707715466499115593487603532921714970056938',
|
||||
'54370070576826684624621495650076471787294438377604',
|
||||
'53282654108756828443191190634694037855217779295145',
|
||||
'36123272525000296071075082563815656710885258350721',
|
||||
'45876576172410976447339110607218265236877223636045',
|
||||
'17423706905851860660448207621209813287860733969412',
|
||||
'81142660418086830619328460811191061556940512689692',
|
||||
'51934325451728388641918047049293215058642563049483',
|
||||
'62467221648435076201727918039944693004732956340691',
|
||||
'15732444386908125794514089057706229429197107928209',
|
||||
'55037687525678773091862540744969844508330393682126',
|
||||
'18336384825330154686196124348767681297534375946515',
|
||||
'80386287592878490201521685554828717201219257766954',
|
||||
'78182833757993103614740356856449095527097864797581',
|
||||
'16726320100436897842553539920931837441497806860984',
|
||||
'48403098129077791799088218795327364475675590848030',
|
||||
'87086987551392711854517078544161852424320693150332',
|
||||
'59959406895756536782107074926966537676326235447210',
|
||||
'69793950679652694742597709739166693763042633987085',
|
||||
'41052684708299085211399427365734116182760315001271',
|
||||
'65378607361501080857009149939512557028198746004375',
|
||||
'35829035317434717326932123578154982629742552737307',
|
||||
'94953759765105305946966067683156574377167401875275',
|
||||
'88902802571733229619176668713819931811048770190271',
|
||||
'25267680276078003013678680992525463401061632866526',
|
||||
'36270218540497705585629946580636237993140746255962',
|
||||
'24074486908231174977792365466257246923322810917141',
|
||||
'91430288197103288597806669760892938638285025333403',
|
||||
'34413065578016127815921815005561868836468420090470',
|
||||
'23053081172816430487623791969842487255036638784583',
|
||||
'11487696932154902810424020138335124462181441773470',
|
||||
'63783299490636259666498587618221225225512486764533',
|
||||
'67720186971698544312419572409913959008952310058822',
|
||||
'95548255300263520781532296796249481641953868218774',
|
||||
'76085327132285723110424803456124867697064507995236',
|
||||
'37774242535411291684276865538926205024910326572967',
|
||||
'23701913275725675285653248258265463092207058596522',
|
||||
'29798860272258331913126375147341994889534765745501',
|
||||
'18495701454879288984856827726077713721403798879715',
|
||||
'38298203783031473527721580348144513491373226651381',
|
||||
'34829543829199918180278916522431027392251122869539',
|
||||
'40957953066405232632538044100059654939159879593635',
|
||||
'29746152185502371307642255121183693803580388584903',
|
||||
'41698116222072977186158236678424689157993532961922',
|
||||
'62467957194401269043877107275048102390895523597457',
|
||||
'23189706772547915061505504953922979530901129967519',
|
||||
'86188088225875314529584099251203829009407770775672',
|
||||
'11306739708304724483816533873502340845647058077308',
|
||||
'82959174767140363198008187129011875491310547126581',
|
||||
'97623331044818386269515456334926366572897563400500',
|
||||
'42846280183517070527831839425882145521227251250327',
|
||||
'55121603546981200581762165212827652751691296897789',
|
||||
'32238195734329339946437501907836945765883352399886',
|
||||
'75506164965184775180738168837861091527357929701337',
|
||||
'62177842752192623401942399639168044983993173312731',
|
||||
'32924185707147349566916674687634660915035914677504',
|
||||
'99518671430235219628894890102423325116913619626622',
|
||||
'73267460800591547471830798392868535206946944540724',
|
||||
'76841822524674417161514036427982273348055556214818',
|
||||
'97142617910342598647204516893989422179826088076852',
|
||||
'87783646182799346313767754307809363333018982642090',
|
||||
'10848802521674670883215120185883543223812876952786',
|
||||
'71329612474782464538636993009049310363619763878039',
|
||||
'62184073572399794223406235393808339651327408011116',
|
||||
'66627891981488087797941876876144230030984490851411',
|
||||
'60661826293682836764744779239180335110989069790714',
|
||||
'85786944089552990653640447425576083659976645795096',
|
||||
'66024396409905389607120198219976047599490197230297',
|
||||
'64913982680032973156037120041377903785566085089252',
|
||||
'16730939319872750275468906903707539413042652315011',
|
||||
'94809377245048795150954100921645863754710598436791',
|
||||
'78639167021187492431995700641917969777599028300699',
|
||||
'15368713711936614952811305876380278410754449733078',
|
||||
'40789923115535562561142322423255033685442488917353',
|
||||
'44889911501440648020369068063960672322193204149535',
|
||||
'41503128880339536053299340368006977710650566631954',
|
||||
'81234880673210146739058568557934581403627822703280',
|
||||
'82616570773948327592232845941706525094512325230608',
|
||||
'22918802058777319719839450180888072429661980811197',
|
||||
'77158542502016545090413245809786882778948721859617',
|
||||
'72107838435069186155435662884062257473692284509516',
|
||||
'20849603980134001723930671666823555245252804609722',
|
||||
'53503534226472524250874054075591789781264330331690'
|
||||
];
|
||||
|
||||
const testNums = [
|
||||
'37107287533902102798797998220837590246510135740250',
|
||||
'46376937677490009712648124896970078050417018260538'
|
||||
];
|
||||
```
|
||||
|
||||
## --seed-contents--
|
||||
|
||||
```js
|
||||
function largeSum(arr) {
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
// Only change code above this line
|
||||
|
||||
const testNums = [
|
||||
'37107287533902102798797998220837590246510135740250',
|
||||
'46376937677490009712648124896970078050417018260538'
|
||||
];
|
||||
|
||||
largeSum(testNums);
|
||||
```
|
||||
|
||||
# --solutions--
|
||||
|
||||
```js
|
||||
function largeSum(arr) {
|
||||
|
||||
let sum = 0;
|
||||
|
||||
arr.forEach(function(num) {
|
||||
sum += parseInt(num, 10);
|
||||
});
|
||||
|
||||
sum = sum.toString(10);
|
||||
|
||||
sum = sum.substr(0, 1) + sum.substr(2);
|
||||
|
||||
let firstTen = sum.slice(0, 10);
|
||||
return parseInt(firstTen, 10);
|
||||
}
|
||||
```
|
@ -0,0 +1,46 @@
|
||||
---
|
||||
id: 5900f3ee1000cf542c50ff00
|
||||
title: '問題 130: 素数レピュニットの性質を持つ合成数'
|
||||
challengeType: 5
|
||||
forumTopicId: 301758
|
||||
dashedName: problem-130-composites-with-prime-repunit-property
|
||||
---
|
||||
|
||||
# --description--
|
||||
|
||||
1 のみで構成される数はレピュニット数と呼ばれます。 ここでは、長さ $k$ のレピュニット数を $R(k)$ と定義します。例えば、$R(6) = 111111$ です。
|
||||
|
||||
$n$ を正の整数とし、$GCD(n, 10) = 1$ が与えられる場合、$R(k)$ が $n$ で割り切れるような値 $k$ が必ず存在することを証明できます。また、そのような $k$ の最小値を $A(n)$ とします。例えば、$A(7) = 6$, $A(41) = 5$ です。
|
||||
|
||||
すべての素数 $p > 5$ について、$p − 1$ は $A(p)$ で割り切れるとします。 例えば、$p = 41 のとき、A(41) = 5$ であり、40 は 5 で割り切れます。
|
||||
|
||||
しかし、これが当てはまる合成数もまれに存在し、最初の 5 例は 91, 259, 451, 481, 703 です。
|
||||
|
||||
$GCD(n, 10) = 1$ であり、$n − 1$ が $A(n)$ で割り切れるような合成数 $n$ について、その最初の 25 個の総和を求めなさい。
|
||||
|
||||
# --hints--
|
||||
|
||||
`compositeRepunit()` は `149253` を返す必要があります。
|
||||
|
||||
```js
|
||||
assert.strictEqual(compositeRepunit(), 149253);
|
||||
```
|
||||
|
||||
# --seed--
|
||||
|
||||
## --seed-contents--
|
||||
|
||||
```js
|
||||
function compositeRepunit() {
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
compositeRepunit();
|
||||
```
|
||||
|
||||
# --solutions--
|
||||
|
||||
```js
|
||||
// solution required
|
||||
```
|
@ -0,0 +1,44 @@
|
||||
---
|
||||
id: 5900f3ef1000cf542c50ff02
|
||||
title: '問題 131: 素数と立方数の関係'
|
||||
challengeType: 5
|
||||
forumTopicId: 301759
|
||||
dashedName: problem-131-prime-cube-partnership
|
||||
---
|
||||
|
||||
# --description--
|
||||
|
||||
一部の素数 $p$ に対して、$n^3 + n^{2}p$ が立方数になるような正の整数 $n$ が 3 つ存在します。
|
||||
|
||||
例えば、$p = 19,\\ 8^3 + 8^2 × 19 = {12}^3$ です。
|
||||
|
||||
最も驚くべきことは、この性質を持つ各素数に対して $n$ の値が一意であることです。 このような性質を持つ 100 未満の素数は 4 つしかありません。
|
||||
|
||||
この驚くべき性質を持つ 100 万未満の素数はいくつありますか。
|
||||
|
||||
# --hints--
|
||||
|
||||
`primeCubePartnership()` は `173` を返す必要があります。
|
||||
|
||||
```js
|
||||
assert.strictEqual(primeCubePartnership(), 173);
|
||||
```
|
||||
|
||||
# --seed--
|
||||
|
||||
## --seed-contents--
|
||||
|
||||
```js
|
||||
function primeCubePartnership() {
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
primeCubePartnership();
|
||||
```
|
||||
|
||||
# --solutions--
|
||||
|
||||
```js
|
||||
// solution required
|
||||
```
|
@ -0,0 +1,42 @@
|
||||
---
|
||||
id: 5900f3f11000cf542c50ff03
|
||||
title: '問題 132: 巨大なレピュニット数の因数'
|
||||
challengeType: 5
|
||||
forumTopicId: 301760
|
||||
dashedName: problem-132-large-repunit-factors
|
||||
---
|
||||
|
||||
# --description--
|
||||
|
||||
1 のみで構成される数はレピュニット数と呼ばれます。 ここでは、長さ $k$ のレピュニット数を $R(k)$ とします。
|
||||
|
||||
例えば、$R(10) = 1111111111 = 11 × 41 × 271 × 9091$ で、これらの素因数の和は 9414 です。
|
||||
|
||||
$R({10}^9)$ の最初の 40 個の素因数の和を求めなさい。
|
||||
|
||||
# --hints--
|
||||
|
||||
`largeRepunitFactors()` は `843296` を返す必要があります。
|
||||
|
||||
```js
|
||||
assert.strictEqual(largeRepunitFactors(), 843296);
|
||||
```
|
||||
|
||||
# --seed--
|
||||
|
||||
## --seed-contents--
|
||||
|
||||
```js
|
||||
function largeRepunitFactors() {
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
largeRepunitFactors();
|
||||
```
|
||||
|
||||
# --solutions--
|
||||
|
||||
```js
|
||||
// solution required
|
||||
```
|
@ -0,0 +1,44 @@
|
||||
---
|
||||
id: 5900f3f21000cf542c50ff04
|
||||
title: '問題 133: レピュニット数の非因数'
|
||||
challengeType: 5
|
||||
forumTopicId: 301761
|
||||
dashedName: problem-133-repunit-nonfactors
|
||||
---
|
||||
|
||||
# --description--
|
||||
|
||||
1 のみで構成される数はレピュニット数と呼ばれます。 ここでは、長さ $k$ のレピュニット数を $R(k)$ とします。例えば、$R(6) = 111111$ です。
|
||||
|
||||
$R({10}^n)$ で表されるレピュニット数について考えます。
|
||||
|
||||
$R(10)$, $R(100)$, $R(1000)$ はいずれも 17 で割り切れませんが、$R(10000)$ は 17 で割り切れます。 しかし、$R({10}^n)$ が 19 で割り切れるような n の値は存在しません。 意外にも、$R({10}^n)$ の因数になり得る 100 未満の素数は 11, 17, 41, 73 の 4 つだけです。
|
||||
|
||||
$R({10}^n)$ の因数になり得ない 10 万未満の素数の総和を求めなさい。
|
||||
|
||||
# --hints--
|
||||
|
||||
`repunitNonfactors()` は `453647705` を返す必要があります。
|
||||
|
||||
```js
|
||||
assert.strictEqual(repunitNonfactors(), 453647705);
|
||||
```
|
||||
|
||||
# --seed--
|
||||
|
||||
## --seed-contents--
|
||||
|
||||
```js
|
||||
function repunitNonfactors() {
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
repunitNonfactors();
|
||||
```
|
||||
|
||||
# --solutions--
|
||||
|
||||
```js
|
||||
// solution required
|
||||
```
|
@ -0,0 +1,42 @@
|
||||
---
|
||||
id: 5900f3f21000cf542c50ff05
|
||||
title: '問題 134: 素数ペアのつながり'
|
||||
challengeType: 5
|
||||
forumTopicId: 301762
|
||||
dashedName: problem-134-prime-pair-connection
|
||||
---
|
||||
|
||||
# --description--
|
||||
|
||||
連続する素数 $p_1 = 19$ と $p_2 = 23$ について考えます。 1219 は下位の数字が $p_1$ であり、かつ、$p_2$ によって割り切れる最小の数であることを確認できます。
|
||||
|
||||
実際、$p_1 = 3$ と $p_2 = 5$ を除くと、連続する素数 ($p_2 > p_1$) のすべてのペアに対して、下位の桁が $p_1$ であり $n$ が$p_2$ で割り切れるような $n$ の値が存在します。 これらの $n$ の最小値を $S$ とします。
|
||||
|
||||
$5 ≤ p_1 ≤ 1000000$ のとき、連続する素数の全ペアの $\sum{S}$ を求めなさい。
|
||||
|
||||
# --hints--
|
||||
|
||||
`primePairConnection()` は `18613426663617120` を返す必要があります。
|
||||
|
||||
```js
|
||||
assert.strictEqual(primePairConnection(), 18613426663617120);
|
||||
```
|
||||
|
||||
# --seed--
|
||||
|
||||
## --seed-contents--
|
||||
|
||||
```js
|
||||
function primePairConnection() {
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
primePairConnection();
|
||||
```
|
||||
|
||||
# --solutions--
|
||||
|
||||
```js
|
||||
// solution required
|
||||
```
|
@ -0,0 +1,44 @@
|
||||
---
|
||||
id: 5900f3f31000cf542c50ff06
|
||||
title: '問題 135: 同一の差違'
|
||||
challengeType: 5
|
||||
forumTopicId: 301763
|
||||
dashedName: problem-135-same-differences
|
||||
---
|
||||
|
||||
# --description--
|
||||
|
||||
正の整数 $x$, $y$, $z$ が等差数列の連続項であるとき、式 $x^2 − y^2 − z^2 = n$ がちょうど 2 つの解を持つような最小の正の整数 $n$ は、$n = 27$ です。
|
||||
|
||||
$$34^2 − 27^2 − 20^2 = 12^2 − 9^2 − 6^2 = 27$$
|
||||
|
||||
$n = 1155$ は、ちょうど 10 個の解を持つ最小値であることが分かります。
|
||||
|
||||
相異なる解をちょうど 10 個持つ 100 万未満 の$n$ の値はいくつありますか。
|
||||
|
||||
# --hints--
|
||||
|
||||
`sameDifferences()` は `4989` を返す必要があります。
|
||||
|
||||
```js
|
||||
assert.strictEqual(sameDifferences(), 4989);
|
||||
```
|
||||
|
||||
# --seed--
|
||||
|
||||
## --seed-contents--
|
||||
|
||||
```js
|
||||
function sameDifferences() {
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
sameDifferences();
|
||||
```
|
||||
|
||||
# --solutions--
|
||||
|
||||
```js
|
||||
// solution required
|
||||
```
|
@ -0,0 +1,44 @@
|
||||
---
|
||||
id: 5900f3f51000cf542c50ff07
|
||||
title: '問題 136: 単体の差違'
|
||||
challengeType: 5
|
||||
forumTopicId: 301764
|
||||
dashedName: problem-136-singleton-difference
|
||||
---
|
||||
|
||||
# --description--
|
||||
|
||||
正の整数 $x$, $y$, $z$ は等差数列の連続項です。 $n$ を正の整数とすると、式 $x^2 − y^2 − z^2 = n$ は、$n = 20$ のときちょうど 1 つの解を持ちます。
|
||||
|
||||
$$13^2 − 10^2 − 7^2 = 20$$
|
||||
|
||||
実は、この式の解が 1 つのみになるような $n$ の値は 100 未満で 25 個あります。
|
||||
|
||||
この等式の解がちょうど 1 つになるような、5000 万未満 の $n$ の値はいくつありますか。
|
||||
|
||||
# --hints--
|
||||
|
||||
`singletonDifference()` は `2544559` を返す必要があります。
|
||||
|
||||
```js
|
||||
assert.strictEqual(singletonDifference(), 2544559);
|
||||
```
|
||||
|
||||
# --seed--
|
||||
|
||||
## --seed-contents--
|
||||
|
||||
```js
|
||||
function singletonDifference() {
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
singletonDifference();
|
||||
```
|
||||
|
||||
# --solutions--
|
||||
|
||||
```js
|
||||
// solution required
|
||||
```
|
@ -0,0 +1,58 @@
|
||||
---
|
||||
id: 5900f3f51000cf542c50ff08
|
||||
title: '問題 137: フィボナッチ金塊'
|
||||
challengeType: 5
|
||||
forumTopicId: 301765
|
||||
dashedName: problem-137-fibonacci-golden-nuggets
|
||||
---
|
||||
|
||||
# --description--
|
||||
|
||||
無限多項式級数 $A_{F}(x) = xF_1 + x^2F_2 + x^3F_3 + \ldots$ について考えます。ここで、$F_k$ はフィボナッチ数列 $1, 1, 2, 3, 5, 8, \ldots$ (すなわち $F_k = F_{k − 1} + F_{k − 2}, F_1 = 1$, $F_2 = 1$) の第 $k$ 項です。
|
||||
|
||||
この問題では、$A_{F}(x)$ が正の整数となるような $x$ の値に注目します。
|
||||
|
||||
驚くべきことに、次の式が成り立ちます。
|
||||
|
||||
$$\begin{align} A_F(\frac{1}{2}) & = (\frac{1}{2}) × 1 + {(\frac{1}{2})}^2 × 1 + {(\frac{1}{2})}^3 × 2 + {(\frac{1}{2})}^4 × 3 + {(\frac{1}{2})}^5 × 5 + \cdots \\\\ & = \frac{1}{2} + \frac{1}{4} + \frac{2}{8} + \frac{3}{16} + \frac{5}{32} + \cdots \\\\ & = 2 \end{align}$$
|
||||
|
||||
最初の 5 つの自然数に対応する $x$ の値を下表に示します。
|
||||
|
||||
| $x$ | $A_F(x)$ |
|
||||
| --------------------------- | -------- |
|
||||
| $\sqrt{2} − 1$ | $1$ |
|
||||
| $\frac{1}{2}$ | $2$ |
|
||||
| $\frac{\sqrt{13} − 2}{3}$ | $3$ |
|
||||
| $\frac{\sqrt{89} − 5}{8}$ | $4$ |
|
||||
| $\frac{\sqrt{34} − 3}{5}$ | $5$ |
|
||||
|
||||
$x$ が有理数である $A_F(x)$ の値は次第にまれになるので、それを「金塊」と呼ぶことにします。例えば、10 番目の金塊は 74049690 です。
|
||||
|
||||
15 番目の金塊を求めなさい。
|
||||
|
||||
# --hints--
|
||||
|
||||
`goldenNugget()` は `1120149658760` を返す必要があります。
|
||||
|
||||
```js
|
||||
assert.strictEqual(goldenNugget(), 1120149658760);
|
||||
```
|
||||
|
||||
# --seed--
|
||||
|
||||
## --seed-contents--
|
||||
|
||||
```js
|
||||
function goldenNugget() {
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
goldenNugget();
|
||||
```
|
||||
|
||||
# --solutions--
|
||||
|
||||
```js
|
||||
// solution required
|
||||
```
|
@ -0,0 +1,46 @@
|
||||
---
|
||||
id: 5900f3f61000cf542c50ff09
|
||||
title: '問題 138: 特殊な二等辺三角形'
|
||||
challengeType: 5
|
||||
forumTopicId: 301766
|
||||
dashedName: problem-138-special-isosceles-triangles
|
||||
---
|
||||
|
||||
# --description--
|
||||
|
||||
底辺の長さが $b = 16$、2 本の等辺の長さが $L = 17$ の二等辺三角形を考えます。
|
||||
|
||||
<img class="img-responsive center-block" alt="辺 L (2 本の等辺)、底辺 b、および、三角形の底辺から 2 本の辺 L の間の角までの長さ h を持つ二等辺三角形" src="https://cdn.freecodecamp.org/curriculum/project-euler/special-isosceles-triangles.png" style="background-color: white; padding: 10px;" />
|
||||
|
||||
ピタゴラスの定理を使えば、三角形の高さは $h = \sqrt{{17}^2 − 8^2} = 15$ で、底辺の長さより 1 短いことが分かります。
|
||||
|
||||
$b = 272$, $L = 305$ のとき、$h = 273$ であり、高さが底辺の長さより 1 長くなります。これは、$h=b±1$ という性質を持つ 2 番目に小さい二等辺三角形です。
|
||||
|
||||
$h = b ± 1$ を満たし、$b$ と $L$ が正の整数であるような、12 個の最小の二等辺三角形に対する $\sum{L}$ を求めなさい。
|
||||
|
||||
# --hints--
|
||||
|
||||
`isoscelesTriangles()` は `1118049290473932` を返す必要があります。
|
||||
|
||||
```js
|
||||
assert.strictEqual(isoscelesTriangles(), 1118049290473932);
|
||||
```
|
||||
|
||||
# --seed--
|
||||
|
||||
## --seed-contents--
|
||||
|
||||
```js
|
||||
function isoscelesTriangles() {
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
isoscelesTriangles();
|
||||
```
|
||||
|
||||
# --solutions--
|
||||
|
||||
```js
|
||||
// solution required
|
||||
```
|
@ -0,0 +1,46 @@
|
||||
---
|
||||
id: 5900f3f71000cf542c50ff0a
|
||||
title: '問題 139: ピタゴラスのタイル'
|
||||
challengeType: 5
|
||||
forumTopicId: 301767
|
||||
dashedName: problem-139-pythagorean-tiles
|
||||
---
|
||||
|
||||
# --description--
|
||||
|
||||
(a, b, c) は、辺の長さが整数である直角三角形を表します。 そのような三角形を 4 つ配置して、辺の長さが c の正方形を作ることができます。
|
||||
|
||||
例えば、(3, 4, 5) の三角形を並べると 5 × 5 の正方形ができ、中央に 1 × 1 の穴があります。この 5 × 5 の正方形は、1 × 1 の正方形 25 個で埋めることができます。
|
||||
|
||||
<img class="img-responsive center-block" alt="2 つの 5 × 5 の正方形: 1 つ目は、3 × 4 × 5 の三角形を 4 つ配置し中央に 1 x 1 の穴ができたもの。2 つ目は、1 x 1 の正方形を 25 個配置したもの" src="https://cdn.freecodecamp.org/curriculum/project-euler/pythagorean-tiles.png" style="background-color: white; padding: 10px;" />
|
||||
|
||||
しかし、(5, 12, 13) の三角形を使うと、穴は 7 × 7 の大きさになります。 これらの 7 x 7 の正方形では、13 x 13 の正方形を埋めることが使用できません。
|
||||
|
||||
周長が 1 億未満である直角三角形について、上のように埋めることができるピタゴラスの三角形はいくつありますか。
|
||||
|
||||
# --hints--
|
||||
|
||||
`pythagoreanTiles()` は `10057761` を返す必要があります。
|
||||
|
||||
```js
|
||||
assert.strictEqual(pythagoreanTiles(), 10057761);
|
||||
```
|
||||
|
||||
# --seed--
|
||||
|
||||
## --seed-contents--
|
||||
|
||||
```js
|
||||
function pythagoreanTiles() {
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
pythagoreanTiles();
|
||||
```
|
||||
|
||||
# --solutions--
|
||||
|
||||
```js
|
||||
// solution required
|
||||
```
|
@ -0,0 +1,111 @@
|
||||
---
|
||||
id: 5900f37a1000cf542c50fe8d
|
||||
title: '問題 14: 最長のコラッツ数列'
|
||||
challengeType: 5
|
||||
forumTopicId: 301768
|
||||
dashedName: problem-14-longest-collatz-sequence
|
||||
---
|
||||
|
||||
# --description--
|
||||
|
||||
正の整数の集合について、次の反復数列が定義されています。
|
||||
|
||||
<div style='padding-left: 4em;'><var>n</var> → <var>n</var>/2 (<var>n</var> は偶数)</div>
|
||||
|
||||
<div style='padding-left: 4em;'><var>n</var> → 3<var>n</var> + 1 (<var>n</var> は奇数)</div>
|
||||
|
||||
13 から始めて上のルールに従うと、次の数列になります。
|
||||
|
||||
<div style='text-align: center;'>13 → 40 → 20 → 10 → 5 → 16 → 8 → 4 → 2 → 1</div>
|
||||
|
||||
この数列 (13 から始まり、1 で終わる) に 10 個の項が含まれていることが分かります。 まだ証明されていませんが (コラッツ問題)、どの数から始めても 1 で終わると考えられています。
|
||||
|
||||
与えられた `limit` より小さい数のうち、どの数から始めると連鎖が最も長くなりますか。
|
||||
|
||||
**注:** 連鎖が始まった後であれば項が `limit` を超えても構いません。
|
||||
|
||||
# --hints--
|
||||
|
||||
`longestCollatzSequence(14)` は数値を返す必要があります。
|
||||
|
||||
```js
|
||||
assert(typeof longestCollatzSequence(14) === 'number');
|
||||
```
|
||||
|
||||
`longestCollatzSequence(14)` は 9 を返す必要があります。
|
||||
|
||||
```js
|
||||
assert.strictEqual(longestCollatzSequence(14), 9);
|
||||
```
|
||||
|
||||
`longestCollatzSequence(5847)` は 3711 を返す必要があります。
|
||||
|
||||
```js
|
||||
assert.strictEqual(longestCollatzSequence(5847), 3711);
|
||||
```
|
||||
|
||||
`longestCollatzSequence(46500)` は 35655 を返す必要があります。
|
||||
|
||||
```js
|
||||
assert.strictEqual(longestCollatzSequence(46500), 35655);
|
||||
```
|
||||
|
||||
`longestCollatzSequence(54512)` は 52527 を返す必要があります。
|
||||
|
||||
```js
|
||||
assert.strictEqual(longestCollatzSequence(54512), 52527);
|
||||
```
|
||||
|
||||
`longestCollatzSequence(100000)` は 77031 を返す必要があります。
|
||||
|
||||
```js
|
||||
assert.strictEqual(longestCollatzSequence(100000), 77031);
|
||||
```
|
||||
|
||||
`longestCollatzSequence(1000000)` は 837799 を返す必要があります。
|
||||
|
||||
```js
|
||||
assert.strictEqual(longestCollatzSequence(1000000), 837799);
|
||||
```
|
||||
|
||||
# --seed--
|
||||
|
||||
## --seed-contents--
|
||||
|
||||
```js
|
||||
function longestCollatzSequence(limit) {
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
longestCollatzSequence(14);
|
||||
```
|
||||
|
||||
# --solutions--
|
||||
|
||||
```js
|
||||
function longestCollatzSequence(limit) {
|
||||
let longest = 1;
|
||||
let maxLength = 1;
|
||||
for (let i = Math.floor(limit / 2); i < limit; i++) {
|
||||
let len = colLen(i);
|
||||
if (len > maxLength) {
|
||||
longest = i;
|
||||
maxLength = len;
|
||||
}
|
||||
}
|
||||
return longest;
|
||||
}
|
||||
|
||||
const knownSequence = { '1': 1 };
|
||||
|
||||
function colLen(n) {
|
||||
if (knownSequence[n]) {
|
||||
return knownSequence[n];
|
||||
} else {
|
||||
const len = n % 2 === 0 ? colLen(n / 2) + 1 : colLen((3 * n + 1) / 2) + 2;
|
||||
knownSequence[n] = len;
|
||||
return len;
|
||||
}
|
||||
}
|
||||
```
|
@ -0,0 +1,52 @@
|
||||
---
|
||||
id: 5900f3fa1000cf542c50ff0c
|
||||
title: '問題 140: 変形フィボナッチ金塊'
|
||||
challengeType: 5
|
||||
forumTopicId: 301769
|
||||
dashedName: problem-140-modified-fibonacci-golden-nuggets
|
||||
---
|
||||
|
||||
# --description--
|
||||
|
||||
無限多項式級数 $A_G(x) = xG_1 + x^2G_2 + x^3G_3 + \cdots$ について考えます。ここで、$G_k$ は二次漸化式 $G_k = G_{k − 1} + G_{k − 2}, G_1 = 1$, $G_2 = 4$ (すなわち $1, 4, 5, 9, 14, 23, \ldots$) の第 $k$ 項です。
|
||||
|
||||
この問題では、$A_G(x)$ が正の整数となるような $x$ の値に注目します。
|
||||
|
||||
最初の 5 つの自然数に対応する $x$ の値を下表に示します。
|
||||
|
||||
| $x$ | $A_G(x)$ |
|
||||
| ----------------------------- | -------- |
|
||||
| $\frac{\sqrt{5} − 1}{4}$ | $1$ |
|
||||
| $\frac{2}{5}$ | $2$ |
|
||||
| $\frac{\sqrt{22} − 2}{6}$ | $3$ |
|
||||
| $\frac{\sqrt{137} − 5}{14}$ | $4$ |
|
||||
| $\frac{1}{2}$ | $5$ |
|
||||
|
||||
$x$ が有理数である $A_G(x)$ の値は次第にまれになるので、それを「金塊」と呼ぶことにします。例えば、20 番目の金塊は 211345365 です。 最初の 30 個の金塊の和を求めなさい。
|
||||
|
||||
# --hints--
|
||||
|
||||
`modifiedGoldenNuggets()` は `5673835352990` を返す必要があります。
|
||||
|
||||
```js
|
||||
assert.strictEqual(modifiedGoldenNuggets(), 5673835352990);
|
||||
```
|
||||
|
||||
# --seed--
|
||||
|
||||
## --seed-contents--
|
||||
|
||||
```js
|
||||
function modifiedGoldenNuggets() {
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
modifiedGoldenNuggets();
|
||||
```
|
||||
|
||||
# --solutions--
|
||||
|
||||
```js
|
||||
// solution required
|
||||
```
|
@ -0,0 +1,46 @@
|
||||
---
|
||||
id: 5900f3f91000cf542c50ff0b
|
||||
title: '問題 141: 平方数でもある漸増数 n を調べ上げる'
|
||||
challengeType: 5
|
||||
forumTopicId: 301770
|
||||
dashedName: problem-141-investigating-progressive-numbers-n-which-are-also-square
|
||||
---
|
||||
|
||||
# --description--
|
||||
|
||||
正の整数 $n$ を $d$ で除し、商を $q$、余りを $r$ と表します。 さらに、$d$, $q$, $r$ は等比数列内の連続した正の整数項ですが、必ずしもこの順序ではありません。
|
||||
|
||||
例えば、58 を 6で割ると商が 9、余りが 4 です。 4, 6, 9 が、等比数列 (公比 $\frac{3}{2}$) 内の連続した項であることも分かります 。
|
||||
|
||||
このような数 $n$ を「漸増的」な数と呼ぶことにします。
|
||||
|
||||
一部の漸増的な数、例えば 9 や 10404 = ${102}^2$ は完全平方数でもあります。 10 万未満の漸増的な完全平方数の総和は 124657です。
|
||||
|
||||
1 兆 (${10}^{12}$) 未満の漸増的な完全平方数の総和を求めなさい。
|
||||
|
||||
# --hints--
|
||||
|
||||
`progressivePerfectSquares()` は `878454337159` を返す必要があります。
|
||||
|
||||
```js
|
||||
assert.strictEqual(progressivePerfectSquares(), 878454337159);
|
||||
```
|
||||
|
||||
# --seed--
|
||||
|
||||
## --seed-contents--
|
||||
|
||||
```js
|
||||
function progressivePerfectSquares() {
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
progressivePerfectSquares();
|
||||
```
|
||||
|
||||
# --solutions--
|
||||
|
||||
```js
|
||||
// solution required
|
||||
```
|
@ -0,0 +1,38 @@
|
||||
---
|
||||
id: 5900f3fa1000cf542c50ff0d
|
||||
title: '問題 142: 完全平方数コレクション'
|
||||
challengeType: 5
|
||||
forumTopicId: 301771
|
||||
dashedName: problem-142-perfect-square-collection
|
||||
---
|
||||
|
||||
# --description--
|
||||
|
||||
整数 $x > y > z > 0$ について、$x + y$, $x − y$, $x + z$, $x − z$, $y + z$, $y − z$ がすべて完全平方数となるような最小の $x + y + z$ を求めなさい。
|
||||
|
||||
# --hints--
|
||||
|
||||
`perfectSquareCollection()` は `1006193` を返す必要があります。
|
||||
|
||||
```js
|
||||
assert.strictEqual(perfectSquareCollection(), 1006193);
|
||||
```
|
||||
|
||||
# --seed--
|
||||
|
||||
## --seed-contents--
|
||||
|
||||
```js
|
||||
function perfectSquareCollection() {
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
perfectSquareCollection();
|
||||
```
|
||||
|
||||
# --solutions--
|
||||
|
||||
```js
|
||||
// solution required
|
||||
```
|
@ -0,0 +1,46 @@
|
||||
---
|
||||
id: 5900f3fc1000cf542c50ff0e
|
||||
title: '三角形のトリチェリ点を調べ上げる'
|
||||
challengeType: 5
|
||||
forumTopicId: 301772
|
||||
dashedName: problem-143-investigating-the-torricelli-point-of-a-triangle
|
||||
---
|
||||
|
||||
# --description--
|
||||
|
||||
三角形 ABC は、すべての内角が 120 度未満の三角形です。 三角形内の任意の点を X とし、$XA = p$, $XC = q$, $XB = r$ とします。
|
||||
|
||||
フェルマーはトリチェリに対し、P + q + r が最小になるような X の位置を見つけるよう挑みました。
|
||||
|
||||
トリチェリは、三角形 ABC の各辺に正三角形 AOB, BNC, AMC を作ると、AOB, BNC, AMC の 3 つの外接円が ABC 内の 1 点 T で交わることを証明しました。 さらに、T (トリチェリ-フェルマー点と呼ばれます) が $p + q + r$ を最小化することも証明しました。 さらに驚くべきことに、その和が最小のとき、$AN = BM = CO = p + q + r$ であり、AN, BM, CO も T で交わるということも証明できます。
|
||||
|
||||
<img class="img-responsive center-block" alt="三角形 ABC の各辺に作られた正三角形 AOB, BNC, AMC。AOB, BNC, AMC の 3 つの外接円が ABC 内の 1 点 T で交差する" src="https://cdn.freecodecamp.org/curriculum/project-euler/investigating-the-torricelli-point-of-a-triangle.png" style="background-color: white; padding: 10px;" />
|
||||
|
||||
和が最小化され、a, b, c, p, q, r がすべて正の整数である場合、三角形 ABC を「トリチェリ三角形」と呼ぶことにします。 例えば、$a = 399$, $b = 455$, $c = 511$ はトリチェリ三角形の一例であり、$p + q + r = 784$ です。 トリチェリ三角形について、$p + q + r ≤ 120000$ の相異なる値の総和を求めなさい。
|
||||
|
||||
# --hints--
|
||||
|
||||
`sumTorricelliTriangles()` は `30758397` を返す必要があります。
|
||||
|
||||
```js
|
||||
assert.strictEqual(sumTorricelliTriangles(), 30758397);
|
||||
```
|
||||
|
||||
# --seed--
|
||||
|
||||
## --seed-contents--
|
||||
|
||||
```js
|
||||
function sumTorricelliTriangles() {
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
sumTorricelliTriangles();
|
||||
```
|
||||
|
||||
# --solutions--
|
||||
|
||||
```js
|
||||
// solution required
|
||||
```
|
@ -0,0 +1,61 @@
|
||||
---
|
||||
id: 5900f3fc1000cf542c50ff0f
|
||||
title: '問題 144: レーザー光線の多重反射を調べ上げる'
|
||||
challengeType: 5
|
||||
forumTopicId: 301773
|
||||
dashedName: problem-144-investigating-multiple-reflections-of-a-laser-beam
|
||||
---
|
||||
|
||||
# --description--
|
||||
|
||||
レーザー物理学において、「ホワイトセル」(white cell) はレーザー光線に対して遅延線の働きをするミラー系のことです。 光線はホワイトセルに入り、ミラーで反射し、最終的に出て行きます。
|
||||
|
||||
ここでは、特定のホワイトセルを式 $4{x}^2 + y^2 = 100$ で表される楕円と考えます。
|
||||
|
||||
その上部には $−0.01 ≤ x ≤ +0.01$ に対応する個所に穴があり、そこから光線が出入りできます。
|
||||
|
||||
<div style="text-align: center">
|
||||
<img class="img-responsive center-block" alt="点 (0.0, 10.1) から出発し、点 (1.4, -9.6) でミラーに当たる光線" src="https://cdn.freecodecamp.org/curriculum/project-euler/investigating-multiple-reflections-of-a-laser-beam-1.png" style="display: inline-block; background-color: white; padding: 10px;">
|
||||
<img class="img-responsive center-block" alt="光線の最初の 10 回の反射を示すアニメーション" src="https://cdn.freecodecamp.org/curriculum/project-euler/investigating-multiple-reflections-of-a-laser-beam-2.gif" style="display: inline-block; background-color: white; padding: 10px;">
|
||||
</div><br>
|
||||
|
||||
この問題では、光線はホワイトセルのすぐ外側 (0.0, 10.1) から発射され、まず (1.4, -9.6) でミラーに反射します。
|
||||
|
||||
光線は、楕円の内側に当たるたびに、「入射角と反射角は等しい」という反射の一般法則に従って進みます。 つまり、入射光線と反射光線の両方が、入射点における法線に対して同じ角度を成します。
|
||||
|
||||
上に示した左側の図では、赤い線は光線がホワイトセルの壁に接する最初の 2 点を示し、青い線は最初に反射する入射点における楕円の接線を示しています。
|
||||
|
||||
与えられた楕円の任意の点 (x, y) における接線の m の傾きは $m = −4 × \frac{x}{y}$ です。
|
||||
|
||||
法線は、入射点における接線に対して直角を成します。
|
||||
|
||||
右側のアニメーションは、最初の 10 回の反射を示しています。
|
||||
|
||||
光線は、ホワイトセルから出るまでの間にその内側に何回当たりますか。
|
||||
|
||||
# --hints--
|
||||
|
||||
`laserBeamReflections()` は `354` を返す必要があります。
|
||||
|
||||
```js
|
||||
assert.strictEqual(laserBeamReflections(), 354);
|
||||
```
|
||||
|
||||
# --seed--
|
||||
|
||||
## --seed-contents--
|
||||
|
||||
```js
|
||||
function laserBeamReflections() {
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
laserBeamReflections();
|
||||
```
|
||||
|
||||
# --solutions--
|
||||
|
||||
```js
|
||||
// solution required
|
||||
```
|
@ -0,0 +1,42 @@
|
||||
---
|
||||
id: 5900f3fd1000cf542c50ff10
|
||||
title: '問題 145: 10 億未満に可逆数はいくつあるか'
|
||||
challengeType: 5
|
||||
forumTopicId: 301774
|
||||
dashedName: problem-145-how-many-reversible-numbers-are-there-below-one-billion
|
||||
---
|
||||
|
||||
# --description--
|
||||
|
||||
いくつかの正の整数 $n$ は、和 [ $n + reverse(n)$] の桁がすべて奇数 (10 進数) であるという性質を持ちます。 例えば、$36 + 63 = 99$, $409 + 904 = 1313$ です。 このような数字を「可逆数」と呼ぶことにします。36, 63, 409, 904 は可逆数です。 先行ゼロは、$n$ と $reverse(n)$ のいずれにも使用できません。
|
||||
|
||||
1000 未満の可逆数は 120 個あります。
|
||||
|
||||
10 億 (${10}^9$) 未満の可逆数はいくつありますか。
|
||||
|
||||
# --hints--
|
||||
|
||||
`reversibleNumbers()` は `608720` を返す必要があります。
|
||||
|
||||
```js
|
||||
assert.strictEqual(reversibleNumbers(), 608720);
|
||||
```
|
||||
|
||||
# --seed--
|
||||
|
||||
## --seed-contents--
|
||||
|
||||
```js
|
||||
function reversibleNumbers() {
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
reversibleNumbers();
|
||||
```
|
||||
|
||||
# --solutions--
|
||||
|
||||
```js
|
||||
// solution required
|
||||
```
|
@ -0,0 +1,40 @@
|
||||
---
|
||||
id: 5900f3fe1000cf542c50ff11
|
||||
title: '問題 146: 素数パターンを調べ上げる'
|
||||
challengeType: 5
|
||||
forumTopicId: 301775
|
||||
dashedName: problem-146-investigating-a-prime-pattern
|
||||
---
|
||||
|
||||
# --description--
|
||||
|
||||
$n^2 + 1$, $n^2 + 3$, $n^2 + 7$, $n^2 + 9$, $n^2 + 13$, $n^2 + 27$ が連続する素数になるような最小の正の整数 $n$ は 10 です。 100 万未満のそのような整数 $n$ の総和は 1242490 です。
|
||||
|
||||
1 億 5000 万未満のそのような整数 $n$ の総和を求めなさい。
|
||||
|
||||
# --hints--
|
||||
|
||||
`primePattern()` は `676333270` を返す必要があります。
|
||||
|
||||
```js
|
||||
assert.strictEqual(primePattern(), 676333270);
|
||||
```
|
||||
|
||||
# --seed--
|
||||
|
||||
## --seed-contents--
|
||||
|
||||
```js
|
||||
function primePattern() {
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
primePattern();
|
||||
```
|
||||
|
||||
# --solutions--
|
||||
|
||||
```js
|
||||
// solution required
|
||||
```
|
@ -0,0 +1,48 @@
|
||||
---
|
||||
id: 5900f3ff1000cf542c50ff12
|
||||
title: '問題 147: 斜交平行格子内の長方形'
|
||||
challengeType: 5
|
||||
forumTopicId: 301776
|
||||
dashedName: problem-147-rectangles-in-cross-hatched-grids
|
||||
---
|
||||
|
||||
# --description--
|
||||
|
||||
下図に示すとおり、3 x 2 の斜交平行格子の場合、格子内に計 37 個の異なる長方形を配置できます。
|
||||
|
||||
<img class="img-responsive center-block" alt="3 x 2 の斜交平行格子に配置されたさまざまな長方形" src="https://cdn.freecodecamp.org/curriculum/project-euler/rectangles-in-cross-hatched-grids.png" style="background-color: white; padding: 10px;" />
|
||||
|
||||
縦と横の寸法を考慮した場合、3 x 2 よりも小さい格子は 1x1, 2x1, 3x1, 1x2, 2x2 の 5 つです。 それぞれが斜交平行格子である場合、それらの小さな格子内に配置できる異なる長方形の数は次のとおりです。
|
||||
|
||||
$$\begin{array}{|c|c|} \hline 1 \times 1 & 1 \\\\ \hline 2 \times 1 & 4 \\\\ \hline 3 \times 1 & 8 \\\\ \hline 1 \times 2 & 4 \\\\ \hline 2 \times 2 & 18 \\\\ \hline \end{array}$$
|
||||
|
||||
これらを 3 x 2 の格子の 37 個に加えると、3 x 2 の格子とそれより小さい格子の中に計 72 個の異なる長方形を配置できます。
|
||||
|
||||
47 x 43 の格子とそれより小さい格子の中に、異なる長方形をいくつ配置できますか。
|
||||
|
||||
# --hints--
|
||||
|
||||
`crossHatchedRectangles()` は `846910284` を返す必要があります。
|
||||
|
||||
```js
|
||||
assert.strictEqual(crossHatchedRectangles(), 846910284);
|
||||
```
|
||||
|
||||
# --seed--
|
||||
|
||||
## --seed-contents--
|
||||
|
||||
```js
|
||||
function crossHatchedRectangles() {
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
crossHatchedRectangles();
|
||||
```
|
||||
|
||||
# --solutions--
|
||||
|
||||
```js
|
||||
// solution required
|
||||
```
|
@ -0,0 +1,54 @@
|
||||
---
|
||||
id: 5900f4021000cf542c50ff14
|
||||
title: '問題 148: パスカルの三角形を探索する'
|
||||
challengeType: 5
|
||||
forumTopicId: 301777
|
||||
dashedName: problem-148-exploring-pascals-triangle
|
||||
---
|
||||
|
||||
# --description--
|
||||
|
||||
パスカルの三角形の最初の 7 段には 7 で割り切れる要素がないことを、簡単に確認できます。
|
||||
|
||||
```
|
||||
1
|
||||
1 1
|
||||
1 2 1
|
||||
1 3 3 1
|
||||
1 4 6 4 1
|
||||
1 5 10 10 5 1
|
||||
1 6 15 20 15 6 1
|
||||
```
|
||||
|
||||
しかし最初の 100 段を調べると、7 で割り切れない要素は 5050 個の要素のうち 2361 個に過ぎません。
|
||||
|
||||
# --instructions--
|
||||
|
||||
パスカルの三角形の最初の 10 億段 (${10}^9$) にある要素のうち、7 で割り切れない要素はいくつありますか。
|
||||
|
||||
# --hints--
|
||||
|
||||
`entriesOfPascalsTriangle()` は `2129970655314432` を返す必要があります。
|
||||
|
||||
```js
|
||||
assert.strictEqual(entriesOfPascalsTriangle(), 2129970655314432);
|
||||
```
|
||||
|
||||
# --seed--
|
||||
|
||||
## --seed-contents--
|
||||
|
||||
```js
|
||||
function entriesOfPascalsTriangle() {
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
entriesOfPascalsTriangle();
|
||||
```
|
||||
|
||||
# --solutions--
|
||||
|
||||
```js
|
||||
// solution required
|
||||
```
|
@ -0,0 +1,54 @@
|
||||
---
|
||||
id: 5900f4021000cf542c50ff13
|
||||
title: '問題 149: 和が最大である部分列を探索する'
|
||||
challengeType: 5
|
||||
forumTopicId: 301778
|
||||
dashedName: problem-149-searching-for-a-maximum-sum-subsequence
|
||||
---
|
||||
|
||||
# --description--
|
||||
|
||||
下表において、任意の方向 (縦、横、対角、反対角) に隣り合う数の最大和が 16 (= 8 + 7 + 1) であることは簡単に確認できます。
|
||||
|
||||
$$\begin{array}{|r|r|r|r|} \hline −2 & 5 & 3 & 2 \\\\ \hline 9 & −6 & 5 & 1 \\\\ \hline 3 & 2 & 7 & 3 \\\\ \hline −1 & 8 & −4 & 8 \\\\ \hline \end{array}$$
|
||||
|
||||
ここでは、この探索を巨大な規模で繰り返します。
|
||||
|
||||
まず、「ラグ付きフィボナッチ法」と呼ばれる特定の形式を使用して、400 万個の疑似乱数を生成します。
|
||||
|
||||
$1 ≤ k ≤ 55$ のとき、$s_k = (100003 − 200003k + 300007{k}^3) \\ (mod\\ 1000000) − 500000$ です。
|
||||
|
||||
$56 ≤ k ≤ 4000000$ のとき、$s_k = (s_{k − 24} + s_{k − 55} + 1000000) \\ (mod\\ 1000000) − 500000$ です。
|
||||
|
||||
したがって、$s_{10} = −393027$ および $s_{100} = 86613$ となります。
|
||||
|
||||
次に、項 $s$ は、最初の 2000 個の数を 1 行目 (順番に)、次の 2000 個の数を 2 行目に、それ以降も同様に 2000 x 2000 の表の中に配置されます。
|
||||
|
||||
最後に、任意の方向 (縦、横、対角、反対角) に隣接する要素 (個数は任意) の最大和を求めなさい。
|
||||
|
||||
# --hints--
|
||||
|
||||
`maximumSubSequence()` は `52852124` を返す必要があります。
|
||||
|
||||
```js
|
||||
assert.strictEqual(maximumSubSequence(), 52852124);
|
||||
```
|
||||
|
||||
# --seed--
|
||||
|
||||
## --seed-contents--
|
||||
|
||||
```js
|
||||
function maximumSubSequence() {
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
maximumSubSequence();
|
||||
```
|
||||
|
||||
# --solutions--
|
||||
|
||||
```js
|
||||
// solution required
|
||||
```
|
@ -0,0 +1,68 @@
|
||||
---
|
||||
id: 5900f37b1000cf542c50fe8e
|
||||
title: '問題 15: 格子の経路'
|
||||
challengeType: 5
|
||||
forumTopicId: 301780
|
||||
dashedName: problem-15-lattice-paths
|
||||
---
|
||||
|
||||
# --description--
|
||||
|
||||
2×2 格子の左上隅から始まり、右下にのみ移動できる場合、右下隅への経路はちょうど 6 つあります。
|
||||
|
||||
<img class="img-responsive center-block" alt="右下隅へのすべての経路を示す 6×2 格子の図" src="https://cdn-media-1.freecodecamp.org/project-euler/1Atixoj.gif" style="background-color: white; padding: 10px;" />
|
||||
|
||||
与えられた `gridSize` にそのような経路はいくつありますか。
|
||||
|
||||
# --hints--
|
||||
|
||||
`latticePaths(4)` は数値を返す必要があります。
|
||||
|
||||
```js
|
||||
assert(typeof latticePaths(4) === 'number');
|
||||
```
|
||||
|
||||
`latticePaths(4)` は 70 を返す必要があります。
|
||||
|
||||
```js
|
||||
assert.strictEqual(latticePaths(4), 70);
|
||||
```
|
||||
|
||||
`latticePaths(9)` は 48620 を返す必要があります。
|
||||
|
||||
```js
|
||||
assert.strictEqual(latticePaths(9), 48620);
|
||||
```
|
||||
|
||||
`latticePaths(20)` は 137846528820 を返す必要があります。
|
||||
|
||||
```js
|
||||
assert.strictEqual(latticePaths(20), 137846528820);
|
||||
```
|
||||
|
||||
# --seed--
|
||||
|
||||
## --seed-contents--
|
||||
|
||||
```js
|
||||
function latticePaths(gridSize) {
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
latticePaths(4);
|
||||
```
|
||||
|
||||
# --solutions--
|
||||
|
||||
```js
|
||||
function latticePaths(gridSize) {
|
||||
let paths = 1;
|
||||
|
||||
for (let i = 0; i < gridSize; i++) {
|
||||
paths *= (2 * gridSize) - i;
|
||||
paths /= i + 1;
|
||||
}
|
||||
return paths;
|
||||
}
|
||||
```
|
@ -0,0 +1,59 @@
|
||||
---
|
||||
id: 5900f4031000cf542c50ff15
|
||||
title: >-
|
||||
問題 150: 三角配列内で最小和を持つ部分三角形を探す
|
||||
challengeType: 5
|
||||
forumTopicId: 301781
|
||||
dashedName: problem-150-searching-a-triangular-array-for-a-sub-triangle-having-minimum-sum
|
||||
---
|
||||
|
||||
# --description--
|
||||
|
||||
正と負の整数からなる三角配列内で、含まれる数の和が最小である部分三角形を見つけたいとします。
|
||||
|
||||
下図の例では、赤で示された三角形がこの条件を -42 で満たしていることを簡単に確認できます。
|
||||
|
||||
<img class="img-responsive center-block" alt="三角配列の中に部分三角形 (和が -42) が赤で示されている" src="https://cdn.freecodecamp.org/curriculum/project-euler/searching-a-triangular-array-for-a-sub-triangle-having-minimum-sum.gif" style="background-color: white; padding: 10px;" />
|
||||
|
||||
ここでは 1000 段のそのような三角配列を作りたいので、次のように無作為数生成法 (線形合同法と呼ばれます) によって、値の範囲が $±2^{19}$ の擬似乱数 $s_k$ を 500500 個生成します。
|
||||
|
||||
$$\begin{align} t := & \\ 0\\\\ \\ & k = 1\\ \text{から}\\ k = 500500 \text{ に対して、}:\\\\ & t := (615949 × t + 797807)\\ \text{mod}\\ 2^{20}\\\\ & s_k := t − 219\\\\ \end{align}$$
|
||||
|
||||
したがって、$s_1 = 273519$, $s_2 = -153582$, $s_3 = 450905$ などのようになります。
|
||||
|
||||
次のように、疑似乱数からなる三角配列が得られます。
|
||||
|
||||
$$ s_1 \\\\ s_2\\;s_3 \\\\ s_4\\; s_5\\; s_6 \\\\ s_7\\; s_8\\; s_9\\; s_{10} \\\\ \ldots $$
|
||||
|
||||
部分三角形は、配列内の任意の要素から開始し、好きなだけ下へ広げることができます (真下の段の 2 要素を次の段から取り、真下の3 要素をさらにその次の段から取り、それ以降も同様にします)。
|
||||
|
||||
「部分三角形の和」は、それが含むすべての要素の和として定義されます。
|
||||
|
||||
部分三角形の最小和を求めなさい。
|
||||
|
||||
# --hints--
|
||||
|
||||
`smallestSubTriangleSum()` は `-271248680` を返す必要があります。
|
||||
|
||||
```js
|
||||
assert.strictEqual(smallestSubTriangleSum(), -271248680);
|
||||
```
|
||||
|
||||
# --seed--
|
||||
|
||||
## --seed-contents--
|
||||
|
||||
```js
|
||||
function smallestSubTriangleSum() {
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
smallestSubTriangleSum();
|
||||
```
|
||||
|
||||
# --solutions--
|
||||
|
||||
```js
|
||||
// solution required
|
||||
```
|
@ -0,0 +1,52 @@
|
||||
---
|
||||
id: 5900f4031000cf542c50ff16
|
||||
title: '問題 151: 標準サイズの用紙: 期待値の問題'
|
||||
challengeType: 5
|
||||
forumTopicId: 301782
|
||||
dashedName: problem-151-paper-sheets-of-standard-sizes-an-expected-value-problem
|
||||
---
|
||||
|
||||
# --description--
|
||||
|
||||
ある印刷所は毎週 16 回の印刷を行っており、毎回、A5 サイズの特殊な色校正紙が必要です。
|
||||
|
||||
毎週月曜日の朝、班長は A1 サイズの特殊な大判用紙が入った新しい封筒を開封します。
|
||||
|
||||
班長は A1 用紙を半分に切って A2 用紙を 2 枚作ります。 次に、そのうち 1 枚を半分に切って A3 用紙を 2 枚作ります。週の最初の印刷に必要な A5 用紙ができるまで、この作業を繰り返します。
|
||||
|
||||
使われなかった用紙はすべて封筒に戻されます。
|
||||
|
||||
<img class="img-responsive center-block" alt="各 1 枚の A2, A3, A4 と 2 枚の A5 に分割された A1 サイズの用紙" src="https://cdn.freecodecamp.org/curriculum/project-euler/paper-sheets-of-standard-sizes-an-expected-value-problem.png" style="background-color: white; padding: 10px;" />
|
||||
|
||||
印刷を始めるときは毎回、班長が封筒から無作為に紙を 1 枚取り出します。 それが A5 サイズであればそれを使用します。 A5 より大きければ、半分に切る作業を繰り返して A5 用紙を 1 枚使用し、残りを封筒に戻します。
|
||||
|
||||
週の最初と最後の印刷以外で、封筒に紙が 1 枚だけ入っている回数の期待値 (1 週当たり) を求めなさい。
|
||||
|
||||
回答は、四捨五入して小数第 6 位まで求め、`x.xxxxxx` の形式にすること。
|
||||
|
||||
# --hints--
|
||||
|
||||
`expectedValueProblem()` は `0.464399` を返す必要があります。
|
||||
|
||||
```js
|
||||
assert.strictEqual(expectedValueProblem(), 0.464399);
|
||||
```
|
||||
|
||||
# --seed--
|
||||
|
||||
## --seed-contents--
|
||||
|
||||
```js
|
||||
function expectedValueProblem() {
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
expectedValueProblem();
|
||||
```
|
||||
|
||||
# --solutions--
|
||||
|
||||
```js
|
||||
// solution required
|
||||
```
|
@ -0,0 +1,46 @@
|
||||
---
|
||||
id: 5900f4041000cf542c50ff17
|
||||
title: '問題 152: 1/2 を平方数の逆数の和で表す'
|
||||
challengeType: 5
|
||||
forumTopicId: 301783
|
||||
dashedName: problem-152-writing-one-half-as-a-sum-of-inverse-squares
|
||||
---
|
||||
|
||||
# --description--
|
||||
|
||||
相異なる整数を使用して、その平方数の逆数の和として $\frac{1}{2}$ を表す方法はいくつかあります。
|
||||
|
||||
例えば、次のように {2,3,4,5,7,12,15,20,28,35} を使用できます。
|
||||
|
||||
$$\frac{1}{2} = \frac{1}{2^2} + \frac{1}{3^2} + \frac{1}{4^2} + \frac{1}{5^2} + \frac{1}{7^2} + \frac{1}{{12}^2} + \frac{1}{{15}^2} + \frac{1}{{20}^2} + \frac{1}{{28}^2} + \frac{1}{{35}^2}$$
|
||||
|
||||
実際、2 から 45 までの整数を使うとちょうど 3 通りの方法があります。上記以外の方法で使用するのは、{2,3,4,6,7,9,10,20,28,35,36,45} と {2,3,4,6,7,9,12,15,28,30,35,36,45} です。
|
||||
|
||||
2 から 80 までの相異なる整数について、その平方数の逆数の和として $\frac{1}{2}$ を表す方法は何通りありますか。
|
||||
|
||||
# --hints--
|
||||
|
||||
`sumInverseSquares()` は `301` を返す必要があります。
|
||||
|
||||
```js
|
||||
assert.strictEqual(sumInverseSquares(), 301);
|
||||
```
|
||||
|
||||
# --seed--
|
||||
|
||||
## --seed-contents--
|
||||
|
||||
```js
|
||||
function sumInverseSquares() {
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
sumInverseSquares();
|
||||
```
|
||||
|
||||
# --solutions--
|
||||
|
||||
```js
|
||||
// solution required
|
||||
```
|
@ -0,0 +1,84 @@
|
||||
---
|
||||
id: 5900f4051000cf542c50ff18
|
||||
title: 'ガウス整数を調べ上げる'
|
||||
challengeType: 5
|
||||
forumTopicId: 301784
|
||||
dashedName: problem-153-investigating-gaussian-integers
|
||||
---
|
||||
|
||||
# --description--
|
||||
|
||||
式 $x^2 = -1$ が実数 $x$ に対する解を持たないことは周知のとおりです。
|
||||
|
||||
しかし虚数 $i$ を導入すると、この式は 2 つの解を持ちます。$x = i$ と $x = -i$ です。
|
||||
|
||||
さらに一歩進めると、式 ${(x - 3)}^2 = -4$ は 2 つの複素数の解を持ちます。$x = 3 + 2i$ と $x = 3 - 2i$ です。これらは互いの共役複素数と呼ばれます。
|
||||
|
||||
$a + bi$ の形式で表される数は複素数と呼ばれます。
|
||||
|
||||
一般に、$a + bi$ と $a − bi$ は互いに共役複素数です。 ガウス整数とは、$a$ と $b$ の両方が整数である複素数 $a + bi$ です。
|
||||
|
||||
普通の整数はガウス整数 ($b = 0$ の場合) でもあります。
|
||||
|
||||
$b ≠ 0$ であるガウス整数と区別するために、普通の整数を「有理整数」と呼びます。
|
||||
|
||||
有理整数 $n$ をガウス整数で割った結果もガウス整数である場合、有理整数を割った方のガウス整数を約数 (divisor) と呼びます。
|
||||
|
||||
例えば、5 を $1 + 2i$ で割る場合は次のように簡略化できます。
|
||||
|
||||
分子と分母に $1 + 2i$ の共役複素数 ($1 − 2i$) を乗じます。
|
||||
|
||||
結果:
|
||||
|
||||
$$\frac{5}{1 + 2i} = \frac{5}{1 + 2i} \frac{1 - 2i}{1 - 2i} = \frac{5(1 - 2i)}{1 - {(2i)}^2} = \frac{5(1 - 2i)}{1 - (-4)} = \frac{5(1 - 2i)}{5} = 1 - 2i$$
|
||||
|
||||
したがって、$1 + 2i$ は 5 の約数です。
|
||||
|
||||
$1 + i$ が 5 の約数ではないことに注意してください。理由を次に示します。
|
||||
|
||||
$$\frac{5}{1 + i} = \frac{5}{2} - \frac{5}{2}i$$
|
||||
|
||||
また、ガウス整数 ($a + bi$) が有理整数 $n$ の約数である場合、その共役複素数 ($a − bi$) も $n$ の約数であることに注意してください。 実際、5 は 実部が正である約数を 6 つ持ち、それらは {1, 1 + 2i, 1 − 2i, 2 + i, 2 − i, 5} です。
|
||||
|
||||
下表は、最初の 5 つの正の有理整数の約数を示しています。
|
||||
|
||||
| n | 実部が正であるガウス整数の約数 | 約数の和 s(n) |
|
||||
| - | ------------------------------------- | --------- |
|
||||
| 1 | 1 | 1 |
|
||||
| 2 | 1, 1 + i, 1 - i, 2 | 5 |
|
||||
| 3 | 1, 3 | 4 |
|
||||
| 4 | 1, 1 + i, 1 - i, 2, 2 + 2i, 2 - 2i, 4 | 13 |
|
||||
| 5 | 1, 1 + 2i, 1 - 2i, 2 + i, 2 - i, 5 | 12 |
|
||||
|
||||
これにより、実部が正である約数について $\displaystyle\sum_{n=1}^5 (n) = 35$ が得られます。
|
||||
|
||||
$1 ≤ n ≤ {10}^5$ のとき、$\displaystyle\sum_{n = 1}^{{10}^5} s(n) = 17924657155$ です。
|
||||
|
||||
$\displaystyle\sum_{n=1}^{{10}^8} s(n)$ を求めなさい。
|
||||
|
||||
# --hints--
|
||||
|
||||
`sumGaussianIntegers()` は `17971254122360636` を返す必要があります。
|
||||
|
||||
```js
|
||||
assert.strictEqual(sumGaussianIntegers(), 17971254122360636);
|
||||
```
|
||||
|
||||
# --seed--
|
||||
|
||||
## --seed-contents--
|
||||
|
||||
```js
|
||||
function sumGaussianIntegers() {
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
sumGaussianIntegers();
|
||||
```
|
||||
|
||||
# --solutions--
|
||||
|
||||
```js
|
||||
// solution required
|
||||
```
|
@ -0,0 +1,46 @@
|
||||
---
|
||||
id: 5900f4071000cf542c50ff19
|
||||
title: '問題 154: パスカルの三角錐を探索する'
|
||||
challengeType: 5
|
||||
forumTopicId: 301785
|
||||
dashedName: problem-154-exploring-pascals-pyramid
|
||||
---
|
||||
|
||||
# --description--
|
||||
|
||||
それぞれの球がすぐ下の層の 3 つの球の上に乗っているような構造を繰り返し、三角錐を作ります。
|
||||
|
||||
<img class="img-responsive center-block" alt="球が 4 段に積まれた三角錐" src="https://cdn.freecodecamp.org/curriculum/project-euler/exploring-pascals-pyramid.png" style="background-color: white; padding: 10px;" />
|
||||
|
||||
次に、頂点から各位置への経路の数を計算します。経路は頂点から始まり、現在の位置のすぐ下にある 3 つの球のいずれかに下がっていきます。 したがって、ある位置に到達する経路の数は、その位置の上にある数字の和です (位置によって異なりますが、1 つの位置の上に最大 3 つの数字があります)。
|
||||
|
||||
その結果として作られるのがパスカルの三角錐であり、各段 n にある数字は三項展開 ${(x + y + z)}^n$ の係数です。
|
||||
|
||||
${(x + y + z)}^{200000}$ の展開における係数のうち、${10}^{12} $ の倍数はいくつありますか。
|
||||
|
||||
# --hints--
|
||||
|
||||
`pascalsPyramid()` は `479742450` を返す必要があります。
|
||||
|
||||
```js
|
||||
assert.strictEqual(pascalsPyramid(), 479742450);
|
||||
```
|
||||
|
||||
# --seed--
|
||||
|
||||
## --seed-contents--
|
||||
|
||||
```js
|
||||
function pascalsPyramid() {
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
pascalsPyramid();
|
||||
```
|
||||
|
||||
# --solutions--
|
||||
|
||||
```js
|
||||
// solution required
|
||||
```
|
@ -0,0 +1,50 @@
|
||||
---
|
||||
id: 5900f4081000cf542c50ff1a
|
||||
title: '問題 155: キャパシタ回路を数え上げる'
|
||||
challengeType: 5
|
||||
forumTopicId: 301786
|
||||
dashedName: problem-155-counting-capacitor-circuits
|
||||
---
|
||||
|
||||
# --description--
|
||||
|
||||
ある電気回路は、C (電気容量) の値が同じである同一のキャパシタのみを使用しています。
|
||||
|
||||
いくつかのキャパシタを直列または並列に接続してサブユニットを作ります。そのサブユニットを別のキャパシタやサブユニットと直列または並列に接続して、サブユニットを拡張することができます。これを繰り返すことで最終的な回路が完成します。
|
||||
|
||||
この簡単な手順と、最大 n 個の同一キャパシタを使用して、さまざまな総容量の回路を作ることができます。 例えば、それぞれ $60 μF$ のキャパシタを最大 $n = 3$ 個使用すると、次に示す 7 種類の総容量値が得られます。
|
||||
|
||||
<img class="img-responsive center-block" alt="各 60 μF のキャパシタを最大 3 個持つ回路の例" src="https://cdn.freecodecamp.org/curriculum/project-euler/counting-capacitor-circuits.gif" style="background-color: white; padding: 10px;" />
|
||||
|
||||
最大 $n$ 個の同一値のキャパシタと、上述の簡単な手順とを使って得られる総容量値の種類の数を $D(n)$ とすると、$D(1) = 1, D(2) = 3, D(3)=7, \ldots$ となります。
|
||||
|
||||
$D(18)$ を求めなさい。
|
||||
|
||||
注: キャパシタ $C_1$, $C_2$ などを並列に接続したときの総電気容量は $C_T = C_1 + C_2 + \cdots$ であり、直列に接続したときの総電気容量は $\frac{1}{C_T} = \frac{1}{C_1} + \frac{1}{C_2} + \cdots$ です。
|
||||
|
||||
# --hints--
|
||||
|
||||
`capacitanceValues()` は `3857447` を返す必要があります。
|
||||
|
||||
```js
|
||||
assert.strictEqual(capacitanceValues(), 3857447);
|
||||
```
|
||||
|
||||
# --seed--
|
||||
|
||||
## --seed-contents--
|
||||
|
||||
```js
|
||||
function capacitanceValues() {
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
capacitanceValues();
|
||||
```
|
||||
|
||||
# --solutions--
|
||||
|
||||
```js
|
||||
// solution required
|
||||
```
|
@ -0,0 +1,68 @@
|
||||
---
|
||||
id: 5900f4091000cf542c50ff1b
|
||||
title: '問題 156: 数字を数え上げる'
|
||||
challengeType: 5
|
||||
forumTopicId: 301787
|
||||
dashedName: problem-156-counting-digits
|
||||
---
|
||||
|
||||
# --description--
|
||||
|
||||
0 から始めて自然数を 10 進数で書くと、次のようになります。
|
||||
|
||||
0 1 2 3 4 5 6 7 8 9 10 11 12....
|
||||
|
||||
桁の数字 $d = 1$ について考えます。 それぞれの数 n を書いた後、それまでに出現した 1 の個数を更新します。この個数を $f(n, 1)$ とします。 最初のいくつかの $f(n, 1)$ の値は次のとおりです。
|
||||
|
||||
| $n$ | $f(n, 1)$ |
|
||||
| --- | --------- |
|
||||
| 0 | 0 |
|
||||
| 1 | 1 |
|
||||
| 2 | 1 |
|
||||
| 3 | 1 |
|
||||
| 4 | 1 |
|
||||
| 5 | 1 |
|
||||
| 6 | 1 |
|
||||
| 7 | 1 |
|
||||
| 8 | 1 |
|
||||
| 9 | 1 |
|
||||
| 10 | 2 |
|
||||
| 11 | 4 |
|
||||
| 12 | 5 |
|
||||
|
||||
$f(n, 1)$ が決して 3 にならないことに注目してください。
|
||||
|
||||
つまり、式 $f(n, 1) = n$ の最初の 2 つの解は $n = 0$ と $n = 1$ です。 その次の解は $n = 199981$ です。 同様に、関数 $f(n, d) は、$n$ が書かれた時点で桁の数字 d が出現した総数を導くものとします。
|
||||
|
||||
実のところ、$d ≠ 0$ のすべての数字 d について、式 $f(n, d) = n$ の最初の解は 0 です。 $f(n, d) = n$ の解の総和を $s(d)$ とします。
|
||||
|
||||
$s(1) = 22786974071$ が与えられます。 $1 ≤ d ≤ 9$ のとき、$\sum{s(d)}$ を求めなさい。
|
||||
|
||||
注: 一部の $n$ について、複数の $d$ の値に対して $f(n, d) = n$ となった場合、この $n$ 値は $f(n, d) = n$ である $d$ の値ごとに再びカウントされます。
|
||||
|
||||
# --hints--
|
||||
|
||||
`countingDigits()` は `21295121502550` を返す必要があります。
|
||||
|
||||
```js
|
||||
assert.strictEqual(countingDigits(), 21295121502550);
|
||||
```
|
||||
|
||||
# --seed--
|
||||
|
||||
## --seed-contents--
|
||||
|
||||
```js
|
||||
function countingDigits() {
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
countingDigits();
|
||||
```
|
||||
|
||||
# --solutions--
|
||||
|
||||
```js
|
||||
// solution required
|
||||
```
|
@ -0,0 +1,44 @@
|
||||
---
|
||||
id: 5900f4091000cf542c50ff1c
|
||||
title: '問題 157: ディオファントス方程式を解く'
|
||||
challengeType: 5
|
||||
forumTopicId: 301788
|
||||
dashedName: problem-157-solving-the-diophantine-equation
|
||||
---
|
||||
|
||||
# --description--
|
||||
|
||||
$a$, $b$, $p$, $n$ を正の整数とし、$a ≤ b$ を満たすディオファントス方程式 $\frac{1}{a} + \frac{1}{b} = \frac{p}{{10}^n}$ について考えます。
|
||||
|
||||
$n = 1$ のとき、この方程式は次の 20 個の解を持ちます。
|
||||
|
||||
$$\begin{array}{lllll} \frac{1}{1} + \frac{1}{1} = \frac{20}{10} & \frac{1}{1} + \frac{1}{2} = \frac{15}{10} & \frac{1}{1} + \frac{1}{5} = \frac{12}{10} & \frac{1}{1} + \frac{1}{10} = \frac{11}{10} & \frac{1}{2} + \frac{1}{2} = \frac{10}{10} \\\\ \frac{1}{2} + \frac{1}{5} = \frac{7}{10} & \frac{1}{2} + \frac{1}{10} = \frac{6}{10} & \frac{1}{3} + \frac{1}{6} = \frac{5}{10} & \frac{1}{3} + \frac{1}{15} = \frac{4}{10} & \frac{1}{4} + \frac{1}{4} = \frac{5}{10} \\\\ \frac{1}{4} + \frac{1}{4} = \frac{5}{10} & \frac{1}{5} + \frac{1}{5} = \frac{4}{10} & \frac{1}{5} + \frac{1}{10} = \frac{3}{10} & \frac{1}{6} + \frac{1}{30} = \frac{2}{10} & \frac{1}{10} + \frac{1}{10} = \frac{2}{10} \\\\ \frac{1}{11} + \frac{1}{110} = \frac{1}{10} & \frac{1}{12} + \frac{1}{60} = \frac{1}{10} & \frac{1}{14} + \frac{1}{35} = \frac{1}{10} & \frac{1}{15} + \frac{1}{30} = \frac{1}{10} & \frac{1}{20} + \frac{1}{20} = \frac{1}{10} \end{array}$$
|
||||
|
||||
$1 ≤ n ≤ 9$ のとき、この方程式の解はいくつありますか。
|
||||
|
||||
# --hints--
|
||||
|
||||
`diophantineEquation()` は `53490` を返す必要があります。
|
||||
|
||||
```js
|
||||
assert.strictEqual(diophantineEquation(), 53490);
|
||||
```
|
||||
|
||||
# --seed--
|
||||
|
||||
## --seed-contents--
|
||||
|
||||
```js
|
||||
function diophantineEquation() {
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
diophantineEquation();
|
||||
```
|
||||
|
||||
# --solutions--
|
||||
|
||||
```js
|
||||
// solution required
|
||||
```
|
@ -0,0 +1,54 @@
|
||||
---
|
||||
id: 5900f40a1000cf542c50ff1d
|
||||
title: >-
|
||||
問題 158: 辞書順で左隣りの文字より後ろになる文字が 1 つだけ含まれる文字列を探す
|
||||
challengeType: 5
|
||||
forumTopicId: 301789
|
||||
dashedName: >-
|
||||
problem-158-exploring-strings-for-which-only-one-character-comes-lexicographically-after-its-neighbour-to-the-left
|
||||
---
|
||||
|
||||
# --description--
|
||||
|
||||
26 文字のアルファベットから 3 つの異なる文字を取り、長さ 3 の文字列を作ります。
|
||||
|
||||
例えば、'abc'、'hat'、'zyx' です。
|
||||
|
||||
これらの 3 例を調べると、'abc' については、辞書順で見た場合に、2 文字が左隣の文字より後ろの文字であることがわかります。
|
||||
|
||||
'hat' については、辞書順で見た場合に、ちょうど 1 文字が左隣の文字より後ろの文字です。 'zyx' については、辞書順で見た場合に、左隣の文字より後ろに位置する文字はありません。
|
||||
|
||||
辞書順で見た場合に、ちょうど 1 文字が左隣の文字より後ろの文字であるような長さ 3 の文字列は、全部で 10400 個あります。
|
||||
|
||||
ここで、$n (≤ 26)$ 個の異なるアルファベットからなる文字列について考えます。
|
||||
|
||||
すべての $n$ について、$p(n)$ は、辞書順で見た場合にちょうど 1 文字が左隣の文字より後ろの文字である、長さ $n$ の文字列の個数です。
|
||||
|
||||
$p(n)$ の最大値を求めなさい。
|
||||
|
||||
# --hints--
|
||||
|
||||
`lexicographicNeighbours()` は `409511334375` を返す必要があります。
|
||||
|
||||
```js
|
||||
assert.strictEqual(lexicographicNeighbours(), 409511334375);
|
||||
```
|
||||
|
||||
# --seed--
|
||||
|
||||
## --seed-contents--
|
||||
|
||||
```js
|
||||
function lexicographicNeighbours() {
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
lexicographicNeighbours();
|
||||
```
|
||||
|
||||
# --solutions--
|
||||
|
||||
```js
|
||||
// solution required
|
||||
```
|
@ -0,0 +1,60 @@
|
||||
---
|
||||
id: 5900f40c1000cf542c50ff1e
|
||||
title: '問題 159: 因数分解の数字根和'
|
||||
challengeType: 5
|
||||
forumTopicId: 301790
|
||||
dashedName: problem-159-digital-root-sums-of-factorisations
|
||||
---
|
||||
|
||||
# --description--
|
||||
|
||||
合成数はさまざまな方法で因数分解できます。
|
||||
|
||||
例えば、1 による乗算を除くと、24 は次の 7 通りに因数分解できます。
|
||||
|
||||
$$\begin{align} & 24 = 2 \times 2 \times 2 \times 3\\\\ & 24 = 2 \times 3 \times 4 \\\\ & 24 = 2 \times 2 \times 6 \\\\ & 24 = 4 \times 6 \\\\ & 24 = 3 \times 8 \\\\ & 24 = 2 \times 12 \\\\ & 24 = 24 \end{align}$$
|
||||
|
||||
数字根とは何かを思い出してください。ある数の各位の和を求め、その結果が 10 未満になるまでそれを繰り返したときに得られる 10 進数が数字根です。 したがって、467 の数字根は 8 です。
|
||||
|
||||
ここでは、ある数の各因数の数字根の和を「数字根和」 (DRS: Digital Root Sum) と呼ぶことにします。 下表に、24 の DRS 値をすべて示します。
|
||||
|
||||
| 因数分解 | 数字根和 |
|
||||
| ------- | ---- |
|
||||
| 2x2x2x3 | 9 |
|
||||
| 2x3x4 | 9 |
|
||||
| 2x2x6 | 10 |
|
||||
| 4x6 | 10 |
|
||||
| 3x8 | 11 |
|
||||
| 2x12 | 5 |
|
||||
| 24 | 6 |
|
||||
|
||||
24 の最大の数字根和は 11 です。 $n$ の最大の数字根和を関数 $mdrs(n)$ と定義します。 したがって、$mdrs(24) = 11$ です。
|
||||
|
||||
$1 < n < 1,000,000$ のとき、$\sum{mdrs(n)}$ を求めなさい。
|
||||
|
||||
# --hints--
|
||||
|
||||
`euler159()` は `14489159` を返す必要があります。
|
||||
|
||||
```js
|
||||
assert.strictEqual(euler159(), 14489159);
|
||||
```
|
||||
|
||||
# --seed--
|
||||
|
||||
## --seed-contents--
|
||||
|
||||
```js
|
||||
function euler159() {
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
euler159();
|
||||
```
|
||||
|
||||
# --solutions--
|
||||
|
||||
```js
|
||||
// solution required
|
||||
```
|
@ -0,0 +1,85 @@
|
||||
---
|
||||
id: 5900f37d1000cf542c50fe8f
|
||||
title: '問題 16: 累乗の各位の和'
|
||||
challengeType: 5
|
||||
forumTopicId: 301791
|
||||
dashedName: problem-16-power-digit-sum
|
||||
---
|
||||
|
||||
# --description--
|
||||
|
||||
2<sup>15</sup> = 32768 であり、各位の和は 3 + 2 + 7 + 6 + 8 = 26 となります。
|
||||
|
||||
数字 2<sup><code>exponent</code></sup> の各位の和を求めなさい。
|
||||
|
||||
# --hints--
|
||||
|
||||
`powerDigitSum(15)` は数値を返す必要があります。
|
||||
|
||||
```js
|
||||
assert(typeof powerDigitSum(15) === 'number');
|
||||
```
|
||||
|
||||
`powerDigitSum(15)` は 26を返す必要があります。
|
||||
|
||||
```js
|
||||
assert.strictEqual(powerDigitSum(15), 26);
|
||||
```
|
||||
|
||||
`powerDigitSum(128)` は 166 を返す必要があります。
|
||||
|
||||
```js
|
||||
assert.strictEqual(powerDigitSum(128), 166);
|
||||
```
|
||||
|
||||
`powerDigitSum(1000)` は 1366 を返す必要があります。
|
||||
|
||||
```js
|
||||
assert.strictEqual(powerDigitSum(1000), 1366);
|
||||
```
|
||||
|
||||
# --seed--
|
||||
|
||||
## --seed-contents--
|
||||
|
||||
```js
|
||||
function powerDigitSum(exponent) {
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
powerDigitSum(15);
|
||||
```
|
||||
|
||||
# --solutions--
|
||||
|
||||
```js
|
||||
function powerDigitSum(exponent) {
|
||||
const bigNum = [1];
|
||||
let sum = 0;
|
||||
|
||||
for (let i = 1; i <= exponent; i++) {
|
||||
let count = bigNum.length + 1;
|
||||
let overflow = 0;
|
||||
for (let j = 0; j < count; j++) {
|
||||
let digit = bigNum[j] || 0;
|
||||
digit = 2 * digit + overflow;
|
||||
|
||||
if (digit > 9) {
|
||||
digit -= 10;
|
||||
overflow = 1;
|
||||
} else {
|
||||
overflow = 0;
|
||||
}
|
||||
|
||||
bigNum[j] = digit;
|
||||
}
|
||||
}
|
||||
|
||||
bigNum.forEach(function(num) {
|
||||
return sum += num;
|
||||
});
|
||||
|
||||
return sum;
|
||||
}
|
||||
```
|
@ -0,0 +1,44 @@
|
||||
---
|
||||
id: 5900f40d1000cf542c50ff1f
|
||||
title: '問題 160: 階乗の下位桁'
|
||||
challengeType: 5
|
||||
forumTopicId: 301794
|
||||
dashedName: problem-160-factorial-trailing-digits
|
||||
---
|
||||
|
||||
# --description--
|
||||
|
||||
任意の $N$ について、$N!$ の末尾のゼロより前にある最後の 5 桁を $f(N)$ とします。
|
||||
|
||||
例えば次のようになります。
|
||||
|
||||
$$\begin{align} & 9! = 362880 \\; \text{したがって、} \\; f(9) = 36288 \\\\ & 10! = 3628800 \\; \text{したがって、} \\; f(10) = 36288 \\\\ & 20! = 2432902008176640000 \\; \text{したがって、} \\; f(20) = 17664 \end{align}$$
|
||||
|
||||
$f(1,000,000,000,000)$ を求めなさい。
|
||||
|
||||
# --hints--
|
||||
|
||||
`factorialTrailingDigits()` は `16576` を返す必要があります。
|
||||
|
||||
```js
|
||||
assert.strictEqual(factorialTrailingDigits(), 16576);
|
||||
```
|
||||
|
||||
# --seed--
|
||||
|
||||
## --seed-contents--
|
||||
|
||||
```js
|
||||
function factorialTrailingDigits() {
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
factorialTrailingDigits();
|
||||
```
|
||||
|
||||
# --solutions--
|
||||
|
||||
```js
|
||||
// solution required
|
||||
```
|
@ -0,0 +1,52 @@
|
||||
---
|
||||
id: 5900f40d1000cf542c50ff20
|
||||
title: '問題 161: トリオミノ'
|
||||
challengeType: 5
|
||||
forumTopicId: 301795
|
||||
dashedName: problem-161-triominoes
|
||||
---
|
||||
|
||||
# --description--
|
||||
|
||||
トリオミノは、3 つの正方形を互いの辺で連結したものです。
|
||||
|
||||
下図のような 2 つの基本形があります。
|
||||
|
||||
<img class="img-responsive center-block" alt="トリオミノの 2 つの基本形" src="https://cdn.freecodecamp.org/curriculum/project-euler/triominoes-1.gif" style="background-color: white; padding: 10px;" />
|
||||
|
||||
考えられるすべての方向が考慮された場合、次の 6 つがあります。
|
||||
|
||||
<img class="img-responsive center-block" alt="方向を考慮したトリオミノの形" src="https://cdn.freecodecamp.org/curriculum/project-euler/triominoes-2.gif" style="background-color: white; padding: 10px;" />
|
||||
|
||||
n x m が 3 で割り切れるとき、その n x m 格子は必ずトリオミノで埋めることができます。 反転や回転によって得られる埋め方を異なる埋め方とみなす場合、2 x 9 の格子を埋める方法は 41 通りあります。
|
||||
|
||||
<img class="img-responsive center-block" alt="2 x 9 の格子をトリオミノで埋める 41 通りの方法を示すアニメーション" src="https://cdn.freecodecamp.org/curriculum/project-euler/triominoes-3.gif" style="background-color: white; padding: 10px;" />
|
||||
|
||||
トリオミノで 9 x 12 の格子を埋める方法は何通りありますか。
|
||||
|
||||
# --hints--
|
||||
|
||||
`triominoes()` は `20574308184277972` を返す必要があります。
|
||||
|
||||
```js
|
||||
assert.strictEqual(triominoes(), 20574308184277972);
|
||||
```
|
||||
|
||||
# --seed--
|
||||
|
||||
## --seed-contents--
|
||||
|
||||
```js
|
||||
function triominoes() {
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
triominoes();
|
||||
```
|
||||
|
||||
# --solutions--
|
||||
|
||||
```js
|
||||
// solution required
|
||||
```
|
@ -0,0 +1,58 @@
|
||||
---
|
||||
id: 5900f40e1000cf542c50ff21
|
||||
title: '問題 162: 16 進数'
|
||||
challengeType: 5
|
||||
forumTopicId: 301796
|
||||
dashedName: problem-162-hexadecimal-numbers
|
||||
---
|
||||
|
||||
# --description--
|
||||
|
||||
16 進法では、次の 16 種類の英数字を使って数を表します。
|
||||
|
||||
$$0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F$$
|
||||
|
||||
16 進数の AF を 10 進法で表すと、$10 \times 16 + 15 = 175$ となります。
|
||||
|
||||
3 桁の 16 進数 10A, 1A0, A10, A01 には 0, 1, A のすべてが含まれています。
|
||||
|
||||
10 進数で表す場合と同様、16 進数では先行ゼロを付けずに表します。
|
||||
|
||||
16 進数の英数字をたかだか 16 個含む 16 進数のうち、0, 1, A のすべてが 1 回以上出現するものはいくつありますか。
|
||||
|
||||
回答は、16 進数の文字列にすること。
|
||||
|
||||
**注:** (A, B, C, D, E, F は大文字です。16 進数であることを表すコードを先頭や末尾に付けず、先行ゼロも付けません。例: 1A3F を 1a3f, 0x1a3f, $1A3F, #1A3F, 0000001A3F とは書きません)
|
||||
|
||||
# --hints--
|
||||
|
||||
`hexadecimalNumbers()` は文字列を返す必要があります。
|
||||
|
||||
```js
|
||||
assert(typeof hexadecimalNumbers() === 'string');
|
||||
```
|
||||
|
||||
`hexadecimalNumbers()` は文字列 `3D58725572C62302` を返す必要があります。
|
||||
|
||||
```js
|
||||
assert.strictEqual(hexadecimalNumbers(), '3D58725572C62302');
|
||||
```
|
||||
|
||||
# --seed--
|
||||
|
||||
## --seed-contents--
|
||||
|
||||
```js
|
||||
function hexadecimalNumbers() {
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
hexadecimalNumbers();
|
||||
```
|
||||
|
||||
# --solutions--
|
||||
|
||||
```js
|
||||
// solution required
|
||||
```
|
@ -0,0 +1,50 @@
|
||||
---
|
||||
id: 5900f40f1000cf542c50ff22
|
||||
title: '斜交平行三角形'
|
||||
challengeType: 5
|
||||
forumTopicId: 301797
|
||||
dashedName: problem-163-cross-hatched-triangles
|
||||
---
|
||||
|
||||
# --description--
|
||||
|
||||
各頂点から対辺の中点に線を引いた正三角形を考えます。下図の左側は、大きさ 1 の三角形の例です。
|
||||
|
||||
<img class="img-responsive center-block" alt="大きさ 1 と大きさ 2 の三角形" src="https://cdn.freecodecamp.org/curriculum/project-euler/cross-hatched-triangles.gif" style="background-color: white; padding: 10px;" />
|
||||
|
||||
この三角形の中に、形状、大きさ、方向、位置のいずれかが異なる 16 個の三角形を見つけることができます。 大きさ 1 の三角形をブロックとして使用して、より大きな三角形を作ることができます。大きさ 2 の三角形の例を上図の右側に示しています。 大きさ 2 の三角形の中に、形状、大きさ、方向、位置のいずれかが異なる 104 個の三角形を見つけることができます。
|
||||
|
||||
大きさ 2 の三角形に、大きさ 1 の三角ブロックが 4 つ含まれていることが分かります。 大きさ 3 の三角形には、大きさ 1 の三角ブロックが 9 つ含まれるはずです。したがって、大きさ $n$ の三角形には、大きさ 1 の三角ブロックが $n^2$ 個含まれるでしょう。
|
||||
|
||||
大きさ $n$ の三角形に含まれる三角形の数を $T(n)$ とすると、次のようになります。
|
||||
|
||||
$$\begin{align} & T(1) = 16 \\\\ & T(2) = 104 \end{align}$$
|
||||
|
||||
$T(36)$ を求めなさい。
|
||||
|
||||
# --hints--
|
||||
|
||||
`crossHatchedTriangles()` は `343047` を返す必要があります。
|
||||
|
||||
```js
|
||||
assert.strictEqual(crossHatchedTriangles(), 343047);
|
||||
```
|
||||
|
||||
# --seed--
|
||||
|
||||
## --seed-contents--
|
||||
|
||||
```js
|
||||
function crossHatchedTriangles() {
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
crossHatchedTriangles();
|
||||
```
|
||||
|
||||
# --solutions--
|
||||
|
||||
```js
|
||||
// solution required
|
||||
```
|
@ -0,0 +1,40 @@
|
||||
---
|
||||
id: 5900f4111000cf542c50ff23
|
||||
title: >-
|
||||
問題 164: 3 つの連続桁の和がいずれも所与の値以下であるような数
|
||||
challengeType: 5
|
||||
forumTopicId: 301798
|
||||
dashedName: >-
|
||||
problem-164-numbers-for-which-no-three-consecutive-digits-have-a-sum-greater-than-a-given-value
|
||||
---
|
||||
|
||||
# --description--
|
||||
|
||||
$n$ の 3 つの連続桁の和がいずれも 9 以下であるような、20 桁の数 $n$ (先行ゼロなし) はいくつありますか。
|
||||
|
||||
# --hints--
|
||||
|
||||
`consecutiveDigitsSum()` は `378158756814587` を返す必要があります。
|
||||
|
||||
```js
|
||||
assert.strictEqual(consecutiveDigitsSum(), 378158756814587);
|
||||
```
|
||||
|
||||
# --seed--
|
||||
|
||||
## --seed-contents--
|
||||
|
||||
```js
|
||||
function consecutiveDigitsSum() {
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
consecutiveDigitsSum();
|
||||
```
|
||||
|
||||
# --solutions--
|
||||
|
||||
```js
|
||||
// solution required
|
||||
```
|
@ -0,0 +1,60 @@
|
||||
---
|
||||
id: 5900f4111000cf542c50ff24
|
||||
title: '問題 165: 交点'
|
||||
challengeType: 5
|
||||
forumTopicId: 301799
|
||||
dashedName: problem-165-intersections
|
||||
---
|
||||
|
||||
# --description--
|
||||
|
||||
線分は 2 つの端点によって一意に定義されます。 平面上にある 2 本の線分について考えると、共有点がない、共有点が 1 つある、共有点が無数にある、という 3 つの可能性があります。
|
||||
|
||||
さらに、2 本の線分が共有点をちょうど 1 つ持つ場合、その共通点が、いずれかまたは両方の線分の端点であり得ます。 2 本の線分の共有点がいずれの線分の端点でもない場合、それは両方の線分の内点です。
|
||||
|
||||
点 $T$ が 2 本の線分 $L_1$ と $L_2$ の唯一の共有点であり、かつ、$T$ が両方の線分の内点である場合、$L_1$ と $L_2$ の共有点 $T$ を $L_1$ と $L_2$ の「真の交点」と呼ぶことにします。
|
||||
|
||||
3 本の線分 $L_1$, $L_2$, $L_3$ について考えます。
|
||||
|
||||
$$\begin{align} & L_1: (27, 44) \\;\text{から}\\; (12, 32) \\\\ & L_2: (46, 53) \\;\text{から}\\; (17, 62) \\\\ & L_3: (46, 70) \\;\text{から}\\; (22, 40) \\\\ \end{align}$$
|
||||
|
||||
線分 $L_2$ と $L_3$ が真の交点を持つことを確認できます。 なお、$L_3$ の一方の端点 (22, 40) は $L_1$ 上にありますが、これを真の交点とはみなしません。 $L_1$ と $L_2$ に共有点はありません。 したがって、この 3 本の線分には真の交差点が 1 つあります。
|
||||
|
||||
次に、5000 本の線分について同じことをします。 このために、"Blum Blum Shub" と呼ばれる擬似乱数法を使用して 20000 個の数を生成します。
|
||||
|
||||
$$\begin{align} & s_0 = 290797 \\\\ & s_{n + 1} = s_n × s_n (\text{mod}\\; 50515093) \\\\ & t_n = s_n (\text{mod}\\; 500) \\\\ \end{align}$$
|
||||
|
||||
それぞれの線分を作成するには、4 つの連続数字 $t_n$ を使用します。 つまり、最初の線分は次によって与えられます。
|
||||
|
||||
($_t$1, $t_2$) から ($t_3$, $t_4$)
|
||||
|
||||
上の生成法によって計算される最初の 4 つの数は 27, 144, 12, 232 です。 したがって、最初の線分は (27, 144) から (12, 232) となります。
|
||||
|
||||
これらの 5000 本の線分には、相異なる真の交点がいくつありますか。
|
||||
|
||||
# --hints--
|
||||
|
||||
`distinctIntersections()` は `2868868` を返す必要があります 。
|
||||
|
||||
```js
|
||||
assert.strictEqual(distinctIntersections(), 2868868);
|
||||
```
|
||||
|
||||
# --seed--
|
||||
|
||||
## --seed-contents--
|
||||
|
||||
```js
|
||||
function distinctIntersections() {
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
distinctIntersections();
|
||||
```
|
||||
|
||||
# --solutions--
|
||||
|
||||
```js
|
||||
// solution required
|
||||
```
|
@ -0,0 +1,46 @@
|
||||
---
|
||||
id: 5900f4131000cf542c50ff25
|
||||
title: '問題 166: 十字'
|
||||
challengeType: 5
|
||||
forumTopicId: 301800
|
||||
dashedName: problem-166-criss-cross
|
||||
---
|
||||
|
||||
# --description--
|
||||
|
||||
4 x 4 の格子が数字 $d$ ($0 ≤ d ≤ 9$) で埋められています。
|
||||
|
||||
次のような格子です。
|
||||
|
||||
$$\begin{array}{} 6 & 3 & 3 & 0 \\\\ 5 & 0 & 4 & 3 \\\\ 0 & 7 & 1 & 4 \\\\ 1 & 2 & 4 & 5 \end{array}$$
|
||||
|
||||
この格子の各行と各列の和はそれぞれ 12 です。 また、各対角線の和も 12 です。
|
||||
|
||||
4 x 4 の格子を、各行、各列、および各対角線の和がそれぞれ等しくなるように $d$ (0 ≤ d ≤ 9) で埋める方法は何通りありますか。
|
||||
|
||||
# --hints--
|
||||
|
||||
`crissCross()` は `7130034` を返す必要があります。
|
||||
|
||||
```js
|
||||
assert.strictEqual(crissCross(), 7130034);
|
||||
```
|
||||
|
||||
# --seed--
|
||||
|
||||
## --seed-contents--
|
||||
|
||||
```js
|
||||
function crissCross() {
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
crissCross();
|
||||
```
|
||||
|
||||
# --solutions--
|
||||
|
||||
```js
|
||||
// solution required
|
||||
```
|
@ -0,0 +1,46 @@
|
||||
---
|
||||
id: 5900f4141000cf542c50ff26
|
||||
title: '問題 167: ウラム数列を調べ上げる'
|
||||
challengeType: 5
|
||||
forumTopicId: 301801
|
||||
dashedName: problem-167-investigating-ulam-sequences
|
||||
---
|
||||
|
||||
# --description--
|
||||
|
||||
正の整数 $a$ と $b$ について、ウラム数列 $U (a,b)$ は ${U{(a,b)}\_1} = a$, ${U{(a,b)}\_2} = b$ と定義されます。$k > 2$ のとき、${U{(a,b)}\_k}$ は、$U(a,b)$ の相異なる前の 2 つの要素の値の和としてちょうど 1 通りで表せるような、${U{(a,b)}\_{(k-1)}}$ より大きい最小の整数です。
|
||||
|
||||
例えば、数列 $U(1,2)$ は次のように始まります。
|
||||
|
||||
$$1, 2, 3 = 1 + 2, 4 = 1 + 3, 6 = 2 + 4, 8 = 2 + 6, 11 = 3 + 8$$
|
||||
|
||||
5 はこれに含まれません。$5 = 1 + 4 = 2 + 3$ であり、前の 2 つの要素の和として 2 通りで表せるからです。$7 = 1 + 6 = 3 + 4$ も同じことです。
|
||||
|
||||
$2 ≤ n ≤ 10$, $k = {10}^{11} のとき、$\sum {U(2, 2n + 1)_k}$ を求めなさい。
|
||||
|
||||
# --hints--
|
||||
|
||||
`ulamSequences()` は `3916160068885` を返す必要があります。
|
||||
|
||||
```js
|
||||
assert.strictEqual(ulamSequences(), 3916160068885);
|
||||
```
|
||||
|
||||
# --seed--
|
||||
|
||||
## --seed-contents--
|
||||
|
||||
```js
|
||||
function ulamSequences() {
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
ulamSequences();
|
||||
```
|
||||
|
||||
# --solutions--
|
||||
|
||||
```js
|
||||
// solution required
|
||||
```
|
@ -0,0 +1,44 @@
|
||||
---
|
||||
id: 5900f4151000cf542c50ff27
|
||||
title: '問題 168: 数の循環'
|
||||
challengeType: 5
|
||||
forumTopicId: 301802
|
||||
dashedName: problem-168-number-rotations
|
||||
---
|
||||
|
||||
# --description--
|
||||
|
||||
142857 という数について考えます。 最下位の数字 (7) を最上位に移すことによりこの数を右に循環させると、714285 が得られます。
|
||||
|
||||
$714285 = 5 × 142857$ であることを確認できます。
|
||||
|
||||
これは、右に循環させた数の約数であるという、142857 が持つ珍しい性質を示しています。
|
||||
|
||||
$10 < n < 10100$ のとき、この性質を持つ整数 $n$ の総和の下位 5 桁を求めなさい。
|
||||
|
||||
# --hints--
|
||||
|
||||
`numberRotations()` は `59206` を返す必要があります。
|
||||
|
||||
```js
|
||||
assert.strictEqual(numberRotations(), 59206);
|
||||
```
|
||||
|
||||
# --seed--
|
||||
|
||||
## --seed-contents--
|
||||
|
||||
```js
|
||||
function numberRotations() {
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
numberRotations();
|
||||
```
|
||||
|
||||
# --solutions--
|
||||
|
||||
```js
|
||||
// solution required
|
||||
```
|
@ -0,0 +1,46 @@
|
||||
---
|
||||
id: 5900f4151000cf542c50ff28
|
||||
title: >-
|
||||
問題 169: 数を 2 の累乗の和で表す方法の数を求める
|
||||
challengeType: 5
|
||||
forumTopicId: 301803
|
||||
dashedName: >-
|
||||
problem-169-exploring-the-number-of-different-ways-a-number-can-be-expressed-as-a-sum-of-powers-of-2
|
||||
---
|
||||
|
||||
# --description--
|
||||
|
||||
$f(0)=1$ と定義し、$n$ を 2 の整数乗の和で表す方法が何通りあるかを $f(n)$ で表すものとします。ただし、それぞれの整数乗は最大 2 回しか使えないものとします。
|
||||
|
||||
例えば、10 を表す方法は次のように 5 通りあるので、$f(10)=5$ です。
|
||||
|
||||
$$\begin{align} & 1 + 1 + 8 \\\\ & 1 + 1 + 4 + 4 \\\\ & 1 + 1 + 2 + 2 + 4 \\\\ & 2 + 4 + 4 \\\\ & 2 + 8 \end{align}$$
|
||||
|
||||
$f({10}^{25})$ を求めなさい。
|
||||
|
||||
# --hints--
|
||||
|
||||
`numberOfWaysToExpress()` は `178653872807` を返す必要があります。
|
||||
|
||||
```js
|
||||
assert.strictEqual(numberOfWaysToExpress(), 178653872807);
|
||||
```
|
||||
|
||||
# --seed--
|
||||
|
||||
## --seed-contents--
|
||||
|
||||
```js
|
||||
function numberOfWaysToExpress() {
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
numberOfWaysToExpress();
|
||||
```
|
||||
|
||||
# --solutions--
|
||||
|
||||
```js
|
||||
// solution required
|
||||
```
|
@ -0,0 +1,130 @@
|
||||
---
|
||||
id: 5900f37d1000cf542c50fe90
|
||||
title: '問題 17: 数を表す単語の文字数'
|
||||
challengeType: 5
|
||||
forumTopicId: 301804
|
||||
dashedName: problem-17-number-letter-counts
|
||||
---
|
||||
|
||||
# --description--
|
||||
|
||||
1 から 5 までの数を単語で表すと、one, two, three, four, five であり、使われている文字数の合計は 3 + 5 + 4 + 4 = 19 です。
|
||||
|
||||
数字 1 から始め、与えられた `limit` までの数をすべて単語で書いた場合、何文字が使用されますか。
|
||||
|
||||
**注:** スペースやハイフンは数えません。 例えば、342 (three hundred and forty-two) には 23 文字、115 (one hundred and fifteen) には20 文字が使われています。 数を単語に書き出す際の "and" の使用は、英国での使用法に従ったものです。
|
||||
|
||||
# --hints--
|
||||
|
||||
`numberLetterCounts(5)` は数値を返す必要があります。
|
||||
|
||||
```js
|
||||
assert(typeof numberLetterCounts(5) === 'number');
|
||||
```
|
||||
|
||||
`numberLetterCounts(5)` は 19 を返す必要があります。
|
||||
|
||||
```js
|
||||
assert.strictEqual(numberLetterCounts(5), 19);
|
||||
```
|
||||
|
||||
`numberLetterCounts(150)` は 1903 を返す必要があります。
|
||||
|
||||
```js
|
||||
assert.strictEqual(numberLetterCounts(150), 1903);
|
||||
```
|
||||
|
||||
`numberLetterCounts(1000)` は 21124 を返す必要があります。
|
||||
|
||||
```js
|
||||
assert.strictEqual(numberLetterCounts(1000), 21124);
|
||||
```
|
||||
|
||||
# --seed--
|
||||
|
||||
## --seed-contents--
|
||||
|
||||
```js
|
||||
function numberLetterCounts(limit) {
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
numberLetterCounts(5);
|
||||
```
|
||||
|
||||
# --solutions--
|
||||
|
||||
```js
|
||||
function numberLetterCounts(limit) {
|
||||
const dictionary = {
|
||||
0: '',
|
||||
1: 'one',
|
||||
2: 'two',
|
||||
3: 'three',
|
||||
4: 'four',
|
||||
5: 'five',
|
||||
6: 'six',
|
||||
7: 'seven',
|
||||
8: 'eight',
|
||||
9: 'nine',
|
||||
10: 'ten',
|
||||
11: 'eleven',
|
||||
12: 'twelve',
|
||||
13: 'thirteen',
|
||||
14: 'fourteen',
|
||||
15: 'fifteen',
|
||||
16: 'sixteen',
|
||||
17: 'seventeen',
|
||||
18: 'eighteen',
|
||||
19: 'nineteen',
|
||||
20: 'twenty',
|
||||
30: 'thirty',
|
||||
40: 'forty',
|
||||
50: 'fifty',
|
||||
60: 'sixty',
|
||||
70: 'seventy',
|
||||
80: 'eighty',
|
||||
90: 'ninety',
|
||||
1000: 'onethousand'
|
||||
};
|
||||
|
||||
let numString = '';
|
||||
|
||||
function convertToString(num) {
|
||||
// check dictionary for number
|
||||
if (dictionary[num]) {
|
||||
return dictionary[num];
|
||||
} else {
|
||||
const hundreds = Math.floor(num / 100);
|
||||
const tens = Math.floor((num / 10) % 10) * 10;
|
||||
const remainder = num % 10;
|
||||
|
||||
let tempStr = '';
|
||||
|
||||
if (hundreds === 0) {
|
||||
tempStr += dictionary[tens] + dictionary[remainder];
|
||||
} else {
|
||||
tempStr += dictionary[hundreds] + 'hundred';
|
||||
|
||||
if (tens !== 0 || remainder !== 0) {
|
||||
tempStr += 'and';
|
||||
}
|
||||
|
||||
if (tens < 20) {
|
||||
const lessThanTwenty = tens + remainder;
|
||||
tempStr += dictionary[lessThanTwenty];
|
||||
} else {
|
||||
tempStr += dictionary[tens] + dictionary[remainder];
|
||||
}
|
||||
}
|
||||
return tempStr;
|
||||
}
|
||||
}
|
||||
|
||||
for (let i = 1; i <= limit; i++) {
|
||||
numString += convertToString(i);
|
||||
}
|
||||
return numString.length;
|
||||
}
|
||||
```
|
@ -0,0 +1,48 @@
|
||||
---
|
||||
id: 5900f4161000cf542c50ff29
|
||||
title: >-
|
||||
問題 170: 積を連結して作られる 0 ~ 9 のパンデジタル数の最大値を求める
|
||||
challengeType: 5
|
||||
forumTopicId: 301805
|
||||
dashedName: >-
|
||||
problem-170-find-the-largest-0-to-9-pandigital-that-can-be-formed-by-concatenating-products
|
||||
---
|
||||
|
||||
# --description--
|
||||
|
||||
6 に 1273 と 9854 をそれぞれ掛けると、次のようになります。
|
||||
|
||||
$$\begin{align} & 6 × 1273 = 7638 \\\\ & 6 × 9854 = 59124 \\\\ \end{align}$$
|
||||
|
||||
これらの積を連結すると、1 から 9 のパンデジタル数 763859124 になります。 ここでは、763859124 を「6 と (1273, 9854) の連結積」と呼ぶことにします。 注目すべき点として、元の 3 つの数を連結した数 612739854 もまた 1 から 9 のパンデジタル数になっています。
|
||||
|
||||
0 から 9 のパンデジタル数についても同じことを行えます。
|
||||
|
||||
ある整数と 2 つ以上の他の整数との連結積で作られる、0 から 9 の 10 桁のパンデジタル数の最大値を求めなさい。ただし、元の 3 つの数を連結した数も、0 から 9 の 10 桁のパンデジタル数でなければなりません。
|
||||
|
||||
# --hints--
|
||||
|
||||
`largestPandigital()` は `9857164023` を返す必要があります。
|
||||
|
||||
```js
|
||||
assert.strictEqual(largestPandigital(), 9857164023);
|
||||
```
|
||||
|
||||
# --seed--
|
||||
|
||||
## --seed-contents--
|
||||
|
||||
```js
|
||||
function largestPandigital() {
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
largestPandigital();
|
||||
```
|
||||
|
||||
# --solutions--
|
||||
|
||||
```js
|
||||
// solution required
|
||||
```
|
@ -0,0 +1,44 @@
|
||||
---
|
||||
id: 5900f4181000cf542c50ff2a
|
||||
title: >-
|
||||
問題 171: 各位の平方和が平方数となる数を求める
|
||||
challengeType: 5
|
||||
forumTopicId: 301806
|
||||
dashedName: >-
|
||||
problem-171-finding-numbers-for-which-the-sum-of-the-squares-of-the-digits-is-a-square
|
||||
---
|
||||
|
||||
# --description--
|
||||
|
||||
正の整数 $n$ について、$n$ の各位 (10 進数) の平方和を $f(n)$ とします。下に例を示します。
|
||||
|
||||
$$\begin{align} & f(3) = 3^2 = 9 \\\\ & f(25) = 2^2 + 5^2 = 4 + 25 = 29 \\\\ & f(442) = 4^2 + 4^2 + 2^2 = 16 + 16 + 4 = 36 \\\\ \end{align}$$
|
||||
|
||||
$0 < n < {10}^{20}$ のとき、$f(n)$ が完全平方数になるような $n$ の総和の下位 9 桁を求めなさい。
|
||||
|
||||
# --hints--
|
||||
|
||||
`lastDigitsSumOfPerfectSquare()` は `142989277` を返す必要があります。
|
||||
|
||||
```js
|
||||
assert.strictEqual(lastDigitsSumOfPerfectSquare(), 142989277);
|
||||
```
|
||||
|
||||
# --seed--
|
||||
|
||||
## --seed-contents--
|
||||
|
||||
```js
|
||||
function lastDigitsSumOfPerfectSquare() {
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
lastDigitsSumOfPerfectSquare();
|
||||
```
|
||||
|
||||
# --solutions--
|
||||
|
||||
```js
|
||||
// solution required
|
||||
```
|
@ -0,0 +1,38 @@
|
||||
---
|
||||
id: 5900f4181000cf542c50ff2b
|
||||
title: '問題 172: 数字の反復が少ない数を調べ上げる'
|
||||
challengeType: 5
|
||||
forumTopicId: 301807
|
||||
dashedName: problem-172-investigating-numbers-with-few-repeated-digits
|
||||
---
|
||||
|
||||
# --description--
|
||||
|
||||
$n$ に含まれるどの数字も 3 回以下しか出現しないような、18 桁の数 $n$ (先行ゼロなし) はいくつありますか。
|
||||
|
||||
# --hints--
|
||||
|
||||
`numbersWithRepeatedDigits()` は `227485267000992000` を返す必要があります。
|
||||
|
||||
```js
|
||||
assert.strictEqual(numbersWithRepeatedDigits(), 227485267000992000);
|
||||
```
|
||||
|
||||
# --seed--
|
||||
|
||||
## --seed-contents--
|
||||
|
||||
```js
|
||||
function numbersWithRepeatedDigits() {
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
numbersWithRepeatedDigits();
|
||||
```
|
||||
|
||||
# --solutions--
|
||||
|
||||
```js
|
||||
// solution required
|
||||
```
|
@ -0,0 +1,44 @@
|
||||
---
|
||||
id: 5900f41a1000cf542c50ff2c
|
||||
title: >-
|
||||
問題 173: 最大 100 万枚のタイルを使って「穴あき」正方層を何通り作れるか
|
||||
challengeType: 5
|
||||
forumTopicId: 301808
|
||||
dashedName: >-
|
||||
problem-173-using-up-to-one-million-tiles-how-many-different-hollow-square-laminae-can-be-formed
|
||||
---
|
||||
|
||||
# --description--
|
||||
|
||||
輪郭が正方形であり、正方形の「穴」があり、上下対称かつ左右対称であるものを「正方層」と呼ぶことにします。 例えば、ちょうど 32 枚の正方形タイルを使用して、下図のような 2 通りの正方層を作ることができます。
|
||||
|
||||
<img class="img-responsive center-block" alt="それぞれ 2 x 2 と 7 x 7 の穴がある 2 つの正方層" src="https://cdn.freecodecamp.org/curriculum/project-euler/using-up-to-one-million-tiles-how-many-different-hollow-square-laminae-can-be-formed.gif" style="background-color: white; padding: 10px;" />
|
||||
|
||||
必ずしも一度にすべてのタイルを使用する必要がないとすると、100 枚のタイルで 41 通りの正方層を作成できます。 最大 100 万枚のタイルを使って正方層を何通り作れますか。
|
||||
|
||||
# --hints--
|
||||
|
||||
`differentHollowSquareLaminae()` は `1572729` を返す必要があります。
|
||||
|
||||
```js
|
||||
assert.strictEqual(differentHollowSquareLaminae(), 1572729);
|
||||
```
|
||||
|
||||
# --seed--
|
||||
|
||||
## --seed-contents--
|
||||
|
||||
```js
|
||||
function differentHollowSquareLaminae() {
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
differentHollowSquareLaminae();
|
||||
```
|
||||
|
||||
# --solutions--
|
||||
|
||||
```js
|
||||
// solution required
|
||||
```
|
@ -0,0 +1,50 @@
|
||||
---
|
||||
id: 5900f41a1000cf542c50ff2d
|
||||
title: >-
|
||||
問題 174: 1, 2, 3, ... 種類の配置を作れる「穴あき」正方層を数え上げる
|
||||
challengeType: 5
|
||||
forumTopicId: 301809
|
||||
dashedName: >-
|
||||
problem-174-counting-the-number-of-hollow-square-laminae-that-can-form-one-two-three-----distinct-arrangements
|
||||
---
|
||||
|
||||
# --description--
|
||||
|
||||
輪郭が正方形であり、正方形の「穴」があり、上下対称かつ左右対称であるものを「正方層」と呼ぶことにします。
|
||||
|
||||
8 枚のタイルを使って作れる正方層は 1 通り (1 x 1 の穴を持つ 3 x 3) のみです。 しかし、32 枚のタイルを使うと 2 通りの正方層を作成できます。
|
||||
|
||||
<img class="img-responsive center-block" alt="それぞれ 2 x 2 と 7 x 7 の穴がある 2 つの正方層" src="https://cdn.freecodecamp.org/curriculum/project-euler/using-up-to-one-million-tiles-how-many-different-hollow-square-laminae-can-be-formed.gif" style="background-color: white; padding: 10px;" />
|
||||
|
||||
使用するタイルの枚数を $t$ で表し、$t = 8$ は $L(1)$ 型、$t = 32$ は $L(2)$ 型であると表現することにします。
|
||||
|
||||
$t$ が $L(n)$ 型であるような $t (≤ 1000000)$ の数を $N(n)$ とします。例えば、$N(15) = 832$ です。
|
||||
|
||||
$1 ≤ n ≤ 10$ のとき、$\sum N(n)$ を求めなさい。
|
||||
|
||||
# --hints--
|
||||
|
||||
`hollowSquareLaminaeDistinctArrangements()` は `209566` を返す必要があります。
|
||||
|
||||
```js
|
||||
assert.strictEqual(hollowSquareLaminaeDistinctArrangements(), 209566);
|
||||
```
|
||||
|
||||
# --seed--
|
||||
|
||||
## --seed-contents--
|
||||
|
||||
```js
|
||||
function hollowSquareLaminaeDistinctArrangements() {
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
hollowSquareLaminaeDistinctArrangements();
|
||||
```
|
||||
|
||||
# --solutions--
|
||||
|
||||
```js
|
||||
// solution required
|
||||
```
|
@ -0,0 +1,62 @@
|
||||
---
|
||||
id: 5900f41c1000cf542c50ff2e
|
||||
title: >-
|
||||
問題 175: ある数を 2 の累乗の和で表す方法が何通りあるかに関わる分数
|
||||
challengeType: 5
|
||||
forumTopicId: 301810
|
||||
dashedName: >-
|
||||
problem-175-fractions-involving-the-number-of-different-ways-a-number-can-be-expressed-as-a-sum-of-powers-of-2
|
||||
---
|
||||
|
||||
# --description--
|
||||
|
||||
$f(0)=1$ と定義し、$n$ を 2 の累乗の和で表す方法が何通りあるかを $f(n)$ で表すものとします。ただし、それぞれの累乗は最大 2 回しか使えないものとします。
|
||||
|
||||
例えば、10 を表す方法は次のように 5 通りあるので、$f(10) = 5$ です。
|
||||
|
||||
$$10 = 8 + 2 = 8 + 1 + 1 = 4 + 4 + 2 = 4 + 2 + 2 + 1 + 1 = 4 + 4 + 1 + 1$$
|
||||
|
||||
すべての分数 $\frac{p}{q}\\; (p>0, q>0)$ について、$\frac{f(n)}{f(n - 1)} = \frac{p}{q}$ となるような整数 $n$ が少なくとも 1 つあることが分かっています。
|
||||
|
||||
例えば、$\frac{f(n)}{f(n - 1)} = \frac{13}{17}$ となるような最小の $n$ は 241 です。 241 の 2 進展開は 11110001 です。
|
||||
|
||||
この 2 進数の最上位の桁から最下位の桁までを読むと、1 が 4 つ、0 が 3つ、1 が 1 つ並んでいます。 この 4, 3, 1 を、241 の「短縮型 2 進展開」と呼ぶことにします。
|
||||
|
||||
次の式が成り立つ最小の $n$ の短縮型 2 進展開を求めなさい。
|
||||
|
||||
$$\frac{f(n)}{f(n - 1)} = \frac{123456789}{987654321}$$
|
||||
|
||||
回答は、スペースを含まないカンマ区切りの整数にすること。
|
||||
|
||||
# --hints--
|
||||
|
||||
`shortenedBinaryExpansionOfNumber()` は文字列を返す必要があります
|
||||
|
||||
```js
|
||||
assert(typeof shortenedBinaryExpansionOfNumber() === 'string');
|
||||
```
|
||||
|
||||
`shortenedBinaryExpansionOfNumber()` は文字列 `1,13717420,8` を返す必要があります。
|
||||
|
||||
```js
|
||||
assert.strictEqual(shortenedBinaryExpansionOfNumber(), '1,13717420,8');
|
||||
```
|
||||
|
||||
# --seed--
|
||||
|
||||
## --seed-contents--
|
||||
|
||||
```js
|
||||
function shortenedBinaryExpansionOfNumber() {
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
shortenedBinaryExpansionOfNumber();
|
||||
```
|
||||
|
||||
# --solutions--
|
||||
|
||||
```js
|
||||
// solution required
|
||||
```
|
@ -0,0 +1,40 @@
|
||||
---
|
||||
id: 5900f41c1000cf542c50ff2f
|
||||
title: '問題 176: 隣辺を共有する直角三角形'
|
||||
challengeType: 5
|
||||
forumTopicId: 301811
|
||||
dashedName: problem-176-right-angled-triangles-that-share-a-cathetus
|
||||
---
|
||||
|
||||
# --description--
|
||||
|
||||
辺の長さが (9,12,15), (12,16,20), (5,12,13), (12,35,37) の 4 つの直角三角形はすべて、隣辺 (最長でない辺) のいずれかが 12 です。 辺の長さが整数、かつ隣辺のいずれかが 12 である直角三角形がこの 4 つのみであることが分かっています。
|
||||
|
||||
整数辺を持つちょうど 47547 個の異なる直角三角形の隣辺の長さとなり得る、最小の整数を求めなさい。
|
||||
|
||||
# --hints--
|
||||
|
||||
`trianglesSharingCathetus()` は `96818198400000` を返す必要があります。
|
||||
|
||||
```js
|
||||
assert.strictEqual(trianglesSharingCathetus(), 96818198400000);
|
||||
```
|
||||
|
||||
# --seed--
|
||||
|
||||
## --seed-contents--
|
||||
|
||||
```js
|
||||
function trianglesSharingCathetus() {
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
trianglesSharingCathetus();
|
||||
```
|
||||
|
||||
# --solutions--
|
||||
|
||||
```js
|
||||
// solution required
|
||||
```
|
@ -0,0 +1,48 @@
|
||||
---
|
||||
id: 5900f41e1000cf542c50ff30
|
||||
title: '問題 177: 整角四角形'
|
||||
challengeType: 5
|
||||
forumTopicId: 301812
|
||||
dashedName: problem-177-integer-angled-quadrilaterals
|
||||
---
|
||||
|
||||
# --description--
|
||||
|
||||
対角線 AC と BD を持つ 凸四角形を ABCD とします。 各頂点で、対角線を引くと 2 辺のそれぞれを使って角が作られ、計 8 つの角ができます。
|
||||
|
||||
<img class="img-responsive center-block" alt="対角線 AC と BD が引かれた凸四角形 ABCD" src="https://cdn.freecodecamp.org/curriculum/project-euler/integer-angled-quadrilaterals.gif" style="background-color: white; padding: 10px;" />
|
||||
|
||||
例えば、頂点 A では CAD, CAB という 2 つの角ができます。
|
||||
|
||||
8 つすべての角の角度が整数値である四角形を、「整角四角形」と呼びます。 整角四角形の一例は正方形で、8 つの角がすべて 45° になります。 別の例は、DAC = 20°, BAC = 60°, ABD = 50°, CBD = 30°, BCA = 40°, DCA = 30°, CDB = 80°, ADB = 50° です。
|
||||
|
||||
相似でない整角四角形は全部でいくつありますか。
|
||||
|
||||
**注:** 角度の計算において、整数値の許容誤差 ${10}^{-9}$ の範囲内であれば計算値を整数とみなすことができます。
|
||||
|
||||
# --hints--
|
||||
|
||||
`integerAngledQuadrilaterals()` は `129325` を返す必要があります。
|
||||
|
||||
```js
|
||||
assert.strictEqual(integerAngledQuadrilaterals(), 129325);
|
||||
```
|
||||
|
||||
# --seed--
|
||||
|
||||
## --seed-contents--
|
||||
|
||||
```js
|
||||
function integerAngledQuadrilaterals() {
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
integerAngledQuadrilaterals();
|
||||
```
|
||||
|
||||
# --solutions--
|
||||
|
||||
```js
|
||||
// solution required
|
||||
```
|
@ -0,0 +1,46 @@
|
||||
---
|
||||
id: 5900f41e1000cf542c50ff31
|
||||
title: '問題 178: ステップ数'
|
||||
challengeType: 5
|
||||
forumTopicId: 301813
|
||||
dashedName: problem-178-step-numbers
|
||||
---
|
||||
|
||||
# --description--
|
||||
|
||||
45656 という数について考えます。
|
||||
|
||||
45656 の中で連続する 2 桁の差がそれぞれ 1 であることが分かります。
|
||||
|
||||
連続する 2 桁の差がすべて 1 である数はステップ数と呼ばれます。
|
||||
|
||||
パンデジタル数とは、数字 0 から 9 がそれぞれ少なくとも 1 回現れる数です。
|
||||
|
||||
${10}^{40}$ 未満で、パンデジタルなステップ数はいくつありますか。
|
||||
|
||||
# --hints--
|
||||
|
||||
`stepNumbers()` は `126461847755` を返す必要があります。
|
||||
|
||||
```js
|
||||
assert.strictEqual(stepNumbers(), 126461847755);
|
||||
```
|
||||
|
||||
# --seed--
|
||||
|
||||
## --seed-contents--
|
||||
|
||||
```js
|
||||
function stepNumbers() {
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
stepNumbers();
|
||||
```
|
||||
|
||||
# --solutions--
|
||||
|
||||
```js
|
||||
// solution required
|
||||
```
|
@ -0,0 +1,38 @@
|
||||
---
|
||||
id: 5900f41f1000cf542c50ff32
|
||||
title: '問題 179: 連続する正の約数'
|
||||
challengeType: 5
|
||||
forumTopicId: 301814
|
||||
dashedName: problem-179-consecutive-positive-divisors
|
||||
---
|
||||
|
||||
# --description--
|
||||
|
||||
$n$ と $n + 1$ とで正の約数の個数が同じになるような $1 < n < {10}^7$ の整数はいくつありますか。 例えば、14 の正の約数は 1, 2, 7, 14 で、15 の正の約数は 1, 3, 5, 15 です。
|
||||
|
||||
# --hints--
|
||||
|
||||
`consecutivePositiveDivisors()` は `986262` を返す必要があります。
|
||||
|
||||
```js
|
||||
assert.strictEqual(consecutivePositiveDivisors(), 986262);
|
||||
```
|
||||
|
||||
# --seed--
|
||||
|
||||
## --seed-contents--
|
||||
|
||||
```js
|
||||
function consecutivePositiveDivisors() {
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
consecutivePositiveDivisors();
|
||||
```
|
||||
|
||||
# --solutions--
|
||||
|
||||
```js
|
||||
// solution required
|
||||
```
|
@ -0,0 +1,109 @@
|
||||
---
|
||||
id: 5900f37e1000cf542c50fe91
|
||||
title: '問題 18: 経路の最大和 (1)'
|
||||
challengeType: 5
|
||||
forumTopicId: 301815
|
||||
dashedName: problem-18-maximum-path-sum-i
|
||||
---
|
||||
|
||||
# --description--
|
||||
|
||||
下の三角形の頂点から開始し、下の段にある隣接する数字へと移動していくと、頂点から一番下までの最大和は 23 になります。
|
||||
|
||||
<span style='display: block; text-align: center;'>
|
||||
<strong style='color: red;'>3</strong><br>
|
||||
<strong style='color: red;'>7</strong> 4<br>
|
||||
2 <strong style='color: red;'>4</strong> 6<br>
|
||||
8 5 <strong style='color: red;'>9</strong> 3
|
||||
</span>
|
||||
|
||||
すなわち、3 + 7 + 4 + 9 = 23 です。
|
||||
|
||||
下の三角形の頂点から一番下までの最大和を求めなさい。
|
||||
|
||||
75
|
||||
95 64
|
||||
17 47 82
|
||||
18 35 87 10
|
||||
20 04 82 47 65
|
||||
19 01 23 75 03 34
|
||||
88 02 77 73 07 63 67
|
||||
99 65 04 28 06 16 70 92
|
||||
41 41 26 56 83 40 80 70 33
|
||||
41 48 72 33 47 32 37 16 94 29
|
||||
53 71 44 65 25 43 91 52 97 51 14
|
||||
70 11 33 28 77 73 17 78 39 68 17 57
|
||||
91 71 52 38 17 14 91 43 58 50 27 29 48
|
||||
63 66 04 68 89 53 67 30 73 16 69 87 40 31
|
||||
04 62 98 27 23 09 70 98 73 93 38 53 60 04 23
|
||||
|
||||
**注:** 経路は 16384 通りしかないため、すべての経路を試せばこの問題を解くことができます。 しかし、問題 67 では 100 段の三角形で同じチャレンジをします。総当たりでは解けないので、賢い方法が必要です! ;o)
|
||||
|
||||
# --hints--
|
||||
|
||||
`maximumPathSumI(testTriangle)` は数値を返す必要があります。
|
||||
|
||||
```js
|
||||
assert(typeof maximumPathSumI(testTriangle) === 'number');
|
||||
```
|
||||
|
||||
`maximumPathSumI(testTriangle)` は 23 を返す必要があります。
|
||||
|
||||
```js
|
||||
assert.strictEqual(maximumPathSumI(testTriangle), 23);
|
||||
```
|
||||
|
||||
`maximumPathSumI(numTriangle)` は 1074 を返す必要があります。
|
||||
|
||||
```js
|
||||
assert.strictEqual(maximumPathSumI(numTriangle), 1074);
|
||||
```
|
||||
|
||||
# --seed--
|
||||
|
||||
## --before-user-code--
|
||||
|
||||
```js
|
||||
const numTriangle = [[75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [95, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [17, 47, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [18, 35, 87, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [20, 4, 82, 47, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [19, 1, 23, 75, 3, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0], [88, 2, 77, 73, 7, 63, 67, 0, 0, 0, 0, 0, 0, 0, 0], [99, 65, 4, 28, 6, 16, 70, 92, 0, 0, 0, 0, 0, 0, 0], [41, 41, 26, 56, 83, 40, 80, 70, 33, 0, 0, 0, 0, 0, 0], [41, 48, 72, 33, 47, 32, 37, 16, 94, 29, 0, 0, 0, 0, 0], [53, 71, 44, 65, 25, 43, 91, 52, 97, 51, 14, 0, 0, 0, 0], [70, 11, 33, 28, 77, 73, 17, 78, 39, 68, 17, 57, 0, 0, 0], [91, 71, 52, 38, 17, 14, 91, 43, 58, 50, 27, 29, 48, 0, 0], [63, 66, 4, 68, 89, 53, 67, 30, 73, 16, 69, 87, 40, 31, 0], [4, 62, 98, 27, 23, 9, 70, 98, 73, 93, 38, 53, 60, 4, 23]];
|
||||
```
|
||||
|
||||
## --seed-contents--
|
||||
|
||||
```js
|
||||
function maximumPathSumI(triangle) {
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
const testTriangle = [[3, 0, 0, 0],
|
||||
[7, 4, 0, 0],
|
||||
[2, 4, 6, 0],
|
||||
[8, 5, 9, 3]];
|
||||
|
||||
maximumPathSumI(testTriangle);
|
||||
```
|
||||
|
||||
# --solutions--
|
||||
|
||||
```js
|
||||
const testTriangle = [[3, 0, 0, 0],
|
||||
[7, 4, 0, 0],
|
||||
[2, 4, 6, 0],
|
||||
[8, 5, 9, 3]];
|
||||
|
||||
function maximumPathSumI(triangle) {
|
||||
let maxSum = triangle.slice();
|
||||
|
||||
for (let i = triangle.length - 1; i > 0; i--) {
|
||||
let currentRow = maxSum[i];
|
||||
let previousRow = maxSum[i - 1];
|
||||
const temp = [];
|
||||
for (let j = 0; j < i; j++) {
|
||||
temp.push(Math.max((currentRow[j] + previousRow[j]), (currentRow[j + 1] + previousRow[j])));
|
||||
}
|
||||
maxSum[i - 1] = temp;
|
||||
maxSum.pop();
|
||||
}
|
||||
return maxSum[0][0];
|
||||
}
|
||||
```
|
@ -0,0 +1,52 @@
|
||||
---
|
||||
id: 5900f4201000cf542c50ff33
|
||||
title: '問題 180: 3 つの変数を持つ関数の有理数の零点'
|
||||
challengeType: 5
|
||||
forumTopicId: 301816
|
||||
dashedName: problem-180-rational-zeros-of-a-function-of-three-variables
|
||||
---
|
||||
|
||||
# --description--
|
||||
|
||||
任意の整数 $n$ について、次の 3 つの関数を考えます。
|
||||
|
||||
$$\begin{align} & f_{1,n}(x,y,z) = x^{n + 1} + y^{n + 1} − z^{n + 1}\\\\ & f_{2,n}(x,y,z) = (xy + yz + zx) \times (x^{n - 1} + y^{n - 1} − z^{n - 1})\\\\ & f_{3,n}(x,y,z) = xyz \times (x^{n - 2} + y^{n - 2} − z^{n - 2}) \end{align}$$
|
||||
|
||||
これらを合体させたものを次のように定義します。
|
||||
|
||||
$$\begin{align} & f_n(x,y,z) = f_{1,n}(x,y,z) + f_{2,n}(x,y,z) − f_{3,n}(x,y,z) \end{align}$$
|
||||
|
||||
$x$, $y$, $z$ がいずれも $\frac{a}{b}$ ($0 < a < b ≤ k$) で表される有理数であり、かつ、$f_n(x,y,z) = 0$ となる整数 $n$が (少なくとも 1 つ) 存在するとき、$(x,y,z)$ を「位数 $k$ の黄金の三つ組数」と呼ぶことにします。
|
||||
|
||||
$s(x,y,z) = x + y + z$ と定義します。
|
||||
|
||||
位数 35 の黄金の三つ組数のすべてについて、相異なる $s(x,y,z)$ の総和 を $t = \frac{u}{v}$ とします。 $s(x,y,z)$ と $t$ はすべて既約形式でなければなりません。
|
||||
|
||||
$u + v$ を求めなさい。
|
||||
|
||||
# --hints--
|
||||
|
||||
`rationalZeros()` は `285196020571078980` を返す必要があります。
|
||||
|
||||
```js
|
||||
assert.strictEqual(rationalZeros(), 285196020571078980);
|
||||
```
|
||||
|
||||
# --seed--
|
||||
|
||||
## --seed-contents--
|
||||
|
||||
```js
|
||||
function rationalZeros() {
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
rationalZeros();
|
||||
```
|
||||
|
||||
# --solutions--
|
||||
|
||||
```js
|
||||
// solution required
|
||||
```
|
@ -0,0 +1,44 @@
|
||||
---
|
||||
id: 5900f4231000cf542c50ff34
|
||||
title: >-
|
||||
問題 181: 2 色の物体を何通りにグループ分けできるかを調べ上げる
|
||||
challengeType: 5
|
||||
forumTopicId: 301817
|
||||
dashedName: >-
|
||||
problem-181-investigating-in-how-many-ways-objects-of-two-different-colours-can-be-grouped
|
||||
---
|
||||
|
||||
# --description--
|
||||
|
||||
3 つの黒い物体 $B$ と 1 つの白い物体 $W$ があるとき、これらを次のように 7 通りにグループ分けできます。
|
||||
|
||||
$$(BBBW)\\;(B,BBW)\\;(B,B,BW)\\;(B,B,B,W)\\;(B,BB,W)\\;(BBB,W)\\;(BB,BW)$$
|
||||
|
||||
60 個の黒い物体 $B$ と 40 個の白い物体 $W$ をグループ分けする方法は何通りありますか。
|
||||
|
||||
# --hints--
|
||||
|
||||
`colorsGrouping()` は `83735848679360670` を返す必要があります。
|
||||
|
||||
```js
|
||||
assert.strictEqual(colorsGrouping(), 83735848679360670);
|
||||
```
|
||||
|
||||
# --seed--
|
||||
|
||||
## --seed-contents--
|
||||
|
||||
```js
|
||||
function colorsGrouping() {
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
colorsGrouping();
|
||||
```
|
||||
|
||||
# --solutions--
|
||||
|
||||
```js
|
||||
// solution required
|
||||
```
|
@ -0,0 +1,102 @@
|
||||
---
|
||||
id: 5900f4231000cf542c50ff35
|
||||
title: '問題 182: RSA 暗号化'
|
||||
challengeType: 5
|
||||
forumTopicId: 301818
|
||||
dashedName: problem-182-rsa-encryption
|
||||
---
|
||||
|
||||
# --description--
|
||||
|
||||
RSA 暗号化は次の手順で行われます。
|
||||
|
||||
2 つの相異なる素数 `p` と `q` を生成します。 `n=p*q` と `φ=(p-1)(q-1)` を計算します。 `1 < e < φ` に対して、`gcd(e,φ) = 1` となる整数 `e` を見つけます。
|
||||
|
||||
この方式におけるメッセージは、区間 `[0,n-1]` の中の数です。 次に、暗号化される文は何らかの形でメッセージ (区間 `[0,n-1]` の中の数) に変換されます。 文を暗号化するために、メッセージごとに `m`, c=m<sup>e</sup> mod n が計算されます。
|
||||
|
||||
文を復号するには、`ed=1 mod φ` となるような `d` を計算し、暗号化されたメッセージ `c` ごとに、m=c<sup>d</sup> mod n を計算するという手順が必要です。
|
||||
|
||||
m<sup>e</sup> mod n = m となるような `e` と `m` の値が存在します。 m<sup>e</sup> mod n = m となるメッセージ `m` を非隠蔽メッセージと呼びます。
|
||||
|
||||
`e` を選択する際の問題は、非隠蔽メッセージが多すぎてはいけないという点です。 例えば、`p=19`, `q=37` とします。 このとき、`n=19*37=703`, `φ=18*36=648` となります。 `e=181` を選択した場合、`gcd(181,648)=1` ですが、m<sup>e</sup> mod n の計算時に、考えられるすべてのメッセージ m `(0≤m≤n-1)` が非隠蔽メッセージとなります。 `e` についてどのような有効な選択を行っても、非隠蔽メッセージがいくつか存在します。 非隠蔽メッセージの数が最小限であることが重要です。
|
||||
|
||||
`1 < e < φ(p,q)` かつ `gcd(e,φ)=1` のとき、与えられた任意の `p` と `q` について、`e` 値に対する非隠蔽メッセージの数が最小になるような `e` 値の総和を求めなさい。
|
||||
|
||||
# --hints--
|
||||
|
||||
`RSAEncryption` は関数でなければなりません。
|
||||
|
||||
```js
|
||||
assert(typeof RSAEncryption === 'function')
|
||||
```
|
||||
|
||||
`RSAEncryption` は数値を返す必要があります。
|
||||
|
||||
```js
|
||||
assert.strictEqual(typeof RSAEncryption(19, 37), 'number');
|
||||
```
|
||||
|
||||
`RSAEncryption(19, 37)` は `17766` を返す必要があります。
|
||||
|
||||
```js
|
||||
assert.strictEqual(RSAEncryption(19, 37), 17766);
|
||||
```
|
||||
|
||||
`RSAEncryption(283, 409)` は `466196580` を返す必要があります。
|
||||
|
||||
```js
|
||||
assert.strictEqual(RSAEncryption(283, 409), 466196580);
|
||||
```
|
||||
|
||||
`RSAEncryption(1009, 3643)` は `399788195976` を返す必要があります。
|
||||
|
||||
```js
|
||||
assert.strictEqual(RSAEncryption(19, 37), 17766);
|
||||
```
|
||||
|
||||
# --seed--
|
||||
|
||||
## --seed-contents--
|
||||
|
||||
```js
|
||||
function RSAEncryption(p, q) {
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
RSAEncryption(19, 37);
|
||||
```
|
||||
|
||||
# --solutions--
|
||||
|
||||
```js
|
||||
function gcd(a, b) {
|
||||
if (b)
|
||||
return gcd(b, a % b);
|
||||
else
|
||||
return a;
|
||||
}
|
||||
|
||||
function RSAEncryption(p, q) {
|
||||
let phi = (p - 1) * (q - 1);
|
||||
|
||||
let best = Number.MAX_SAFE_INTEGER;
|
||||
let sum = 0;
|
||||
|
||||
for (let e = 0; e < phi; ++e) {
|
||||
if (!(gcd(e, phi) == 1))
|
||||
continue;
|
||||
|
||||
let msg = (gcd(p - 1, e - 1) + 1) * (gcd(q - 1, e - 1) + 1);
|
||||
|
||||
if (best == msg) {
|
||||
sum += e;
|
||||
} else if (best > msg) {
|
||||
best = msg;
|
||||
sum = e;
|
||||
}
|
||||
}
|
||||
|
||||
return sum;
|
||||
}
|
||||
```
|
@ -0,0 +1,54 @@
|
||||
---
|
||||
id: 5900f4231000cf542c50ff36
|
||||
title: '問題 183: 分割された数の最大積'
|
||||
challengeType: 5
|
||||
forumTopicId: 301819
|
||||
dashedName: problem-183-maximum-product-of-parts
|
||||
---
|
||||
|
||||
# --description--
|
||||
|
||||
$N$ を正の整数とし、$N$ を $k$ 個に等分します。$r = \frac{N}{k}$ とすると、$N = r + \cdots + r$ です。
|
||||
|
||||
分割された各部の積を $P$ とすると、$P = r × r × \cdots × r = r^k$ となります。
|
||||
|
||||
例えば、11 を 5 等分すると 11 = 2.2 + 2.2 + 2.2 + 2.2 + 2.2 なので、$P = {2.2}^5 = 51.53632$ です。
|
||||
|
||||
与えられた任意の値 $N$ について、$M(N) = P_{max}$ と定義します。
|
||||
|
||||
$N = 11$ のときの最大値を求めるには 11 を 4 等分し、$P_{max} = {(\frac{11}{4})}^4$ を導きます。つまり、$M(11) = \frac{14641}{256} = 57.9140625$ であり、これは有限小数です。
|
||||
|
||||
しかし $N = 8 のときは、最大値を求めるには 3 等分します。$M(8) = \frac{512}{27}$ となり、これは無限小数です。
|
||||
|
||||
$M(N) が無限小数であれば $D(N)=N$ とし、$M(N) が有限小数であれば $D(N)=-N とします。
|
||||
|
||||
例えば、$5 ≤ N ≤ 100$ のとき、$\sum D(N)$ は 2438 です。
|
||||
|
||||
$5 ≤ N ≤ 10000$ のとき、$\sum D(N)$ を求めなさい。
|
||||
|
||||
# --hints--
|
||||
|
||||
`maximumProductOfParts()` は `48861552` を返す必要があります。
|
||||
|
||||
```js
|
||||
assert.strictEqual(maximumProductOfParts(), 48861552);
|
||||
```
|
||||
|
||||
# --seed--
|
||||
|
||||
## --seed-contents--
|
||||
|
||||
```js
|
||||
function maximumProductOfParts() {
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
maximumProductOfParts();
|
||||
```
|
||||
|
||||
# --solutions--
|
||||
|
||||
```js
|
||||
// solution required
|
||||
```
|
@ -0,0 +1,46 @@
|
||||
---
|
||||
id: 5900f4241000cf542c50ff37
|
||||
title: '問題 184: 原点を内包する三角形'
|
||||
challengeType: 5
|
||||
forumTopicId: 301820
|
||||
dashedName: problem-184-triangles-containing-the-origin
|
||||
---
|
||||
|
||||
# --description--
|
||||
|
||||
座標の原点を円心とする半径 $r$ の円に内包される、整数座標を持つ点 $(x,y)$ (すなわち $x^2 + y^2 < r^2$) の集合 $I_r$ を考えます。
|
||||
|
||||
半径が 2 の場合、$I_2$ には 9 つの点 (0,0), (1,0), (1,1), (0,1), (-1,1), (-1,0), (-1,-1), (0,-1), (1,-1) が含まれます。 原点を内包し、かつ、3 つの頂点がすべて $I_2$ に含まれるような三角形は 8 つあります。 そのうち 2 つを下図に示します。他の 6 つはこれらを回転すると得られます。
|
||||
|
||||
<img class="img-responsive center-block" alt="座標の原点を円心とする半径 2 の円の中に、9 つの点と、2 つの三角形 ((-1,0), (0,1), (1,-1) と (-1,1), (0,-1), (1,1)) がある" src="https://cdn.freecodecamp.org/curriculum/project-euler/triangles-containing-the-origin.gif" style="background-color: white; padding: 10px;" />
|
||||
|
||||
半径が 3 の場合、すべての頂点が $I_3$ に含まれ、かつ原点を内包するような三角形は 360 個あり、$I_5$ では 10600 個あります。
|
||||
|
||||
3 つ頂点がすべて $I_{105}$ に含まれ、かつ原点を内包するような三角形はいくつありますか。
|
||||
|
||||
# --hints--
|
||||
|
||||
`trianglesConttainingOrigin()` は `1725323624056` を返す必要があります。
|
||||
|
||||
```js
|
||||
assert.strictEqual(trianglesConttainingOrigin(), 1725323624056);
|
||||
```
|
||||
|
||||
# --seed--
|
||||
|
||||
## --seed-contents--
|
||||
|
||||
```js
|
||||
function trianglesContainingOrigin() {
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
trianglesContainingOrigin();
|
||||
```
|
||||
|
||||
# --solutions--
|
||||
|
||||
```js
|
||||
// solution required
|
||||
```
|
@ -0,0 +1,52 @@
|
||||
---
|
||||
id: 5900f4251000cf542c50ff38
|
||||
title: '問題 185: ナンバーマインド'
|
||||
challengeType: 5
|
||||
forumTopicId: 301821
|
||||
dashedName: problem-185-number-mind
|
||||
---
|
||||
|
||||
# --description--
|
||||
|
||||
ナンバーマインドというゲームは、有名なゲームであるマスターマインドの変形版です。
|
||||
|
||||
マスターマインドで使う色付きピンの代わりに、秘密の数列を推理します。 推理するたびに、推理どおりの桁がいくつあったかだけを知らされます。 つまり、数列が 1234 で、あなたが 2036 と推理したら、1 桁だけ合っていることが知らされます。しかし、数字は合っているが桁の位置が違うという情報は教えてもらえません。
|
||||
|
||||
例えば、5 桁の秘密の数列について次の推理が与えられます。
|
||||
|
||||
$$\begin{align} & 90342 ;2\\;\text{個正しい}\\\\ & 70794 ;0\\;\text{個正しい}\\\\ & 39458 ;2\\;\text{個正しい}\\\\ & 34109 ;1\\;\text{個正しい}\\\\ & 51545 ;2\\;\text{個正しい}\\\\ & 12531 ;1\\;\text{個正しい} \end{align}$$
|
||||
|
||||
正解の数列は 39542 だけです。
|
||||
|
||||
次の推理が与えられたとします。
|
||||
|
||||
$$\begin{align} & 5616185650518293 ;2\\;\text{個正しい}\\\\ & 3847439647293047 ;1\\;\text{個正しい}\\\\ & 5855462940810587 ;3\\;\text{個正しい}\\\\ & 9742855507068353 ;3\\;\text{個正しい}\\\\ & 4296849643607543 ;3\\;\text{個正しい}\\\\ & 3174248439465858 ;1\\;\text{個正しい}\\\\ & 4513559094146117 ;2\\;\text{個正しい}\\\\ & 7890971548908067 ;3\\;\text{個正しい}\\\\ & 8157356344118483 ;1\\;\text{個正しい}\\\\ & 2615250744386899 ;2\\;\text{個正しい}\\\\ & 8690095851526254 ;3\\;\text{個正しい}\\\\ & 6375711915077050 ;1\\;\text{個正しい}\\\\ & 6913859173121360 ;1\\;\text{個正しい}\\\\ & 6442889055042768 ;2\\;\text{個正しい}\\\\ & 2321386104303845 ;0\\;\text{個正しい}\\\\ & 2326509471271448 ;2\\;\text{個正しい}\\\\ & 5251583379644322 ;2\\;\text{個正しい}\\\\ & 1748270476758276 ;3\\;\text{個正しい}\\\\ & 4895722652190306 ;1\\;\text{個正しい}\\\\ & 3041631117224635 ;3\\;\text{個正しい}\\\\ & 1841236454324589 ;3\\;\text{個正しい}\\\\ & 2659862637316867 ;2\\;\text{個正しい} \end{align}$$
|
||||
|
||||
これらに基づき、唯一の正解である 16 桁の数列を求めなさい。
|
||||
|
||||
# --hints--
|
||||
|
||||
`numberMind()` は `4640261571849533` を返す必要があります。
|
||||
|
||||
```js
|
||||
assert.strictEqual(numberMind(), 4640261571849533);
|
||||
```
|
||||
|
||||
# --seed--
|
||||
|
||||
## --seed-contents--
|
||||
|
||||
```js
|
||||
function numberMind() {
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
numberMind();
|
||||
```
|
||||
|
||||
# --solutions--
|
||||
|
||||
```js
|
||||
// solution required
|
||||
```
|
@ -0,0 +1,57 @@
|
||||
---
|
||||
id: 5900f4281000cf542c50ff39
|
||||
title: '問題 186: ネットワークのつながり'
|
||||
challengeType: 5
|
||||
forumTopicId: 301822
|
||||
dashedName: problem-186-connectedness-of-a-network
|
||||
---
|
||||
|
||||
# --description--
|
||||
|
||||
下表は、100 万人のユーザーを持つ混雑した電話システムの記録です。
|
||||
|
||||
| 記録 No. | 発信者 | 着信者 |
|
||||
| ------ | ------ | ------ |
|
||||
| 1 | 200007 | 100053 |
|
||||
| 2 | 600183 | 500439 |
|
||||
| 3 | 600863 | 701497 |
|
||||
| ... | ... | ... |
|
||||
|
||||
記録 No. $n$ における発信者の電話番号と着信者の電話番号は、$Caller(n) = S_{2n - 1}$ と $Called(n) = S_{2n}$ であり、ここで、${S}_{1,2,3,\ldots}$ は「ラグ付きフィボナッチ 法」で生成されます。
|
||||
|
||||
$1 ≤ k ≤ 55$ のとき、$S_k = [100003 - 200003k + 300007{k}^3]\\;(\text{mod}\\;1000000)$ です。
|
||||
|
||||
$56 ≤ k$ のとき、$S_k = [S_{k - 24} + S_{k - 55}]\\;(\text{mod}\\;1000000)$ です。
|
||||
|
||||
$Caller(n) = Called(n)$ の場合、ユーザーがかけ間違えたものとされ、発信は失敗します。それ以外の場合、発信は成功します。
|
||||
|
||||
記録の開始時点から、$X$ が $Y$ に、またはその逆に電話をかけたら、「ユーザ $X$ とユーザ $Y$ の対は友達である」ということにします。 同様に、$X$ が $Y$ の友達であり、$Y$ が $Z$ の友達であれば、$X$ は $Z$ の友達です。このように友達の輪が広がっていきます。
|
||||
|
||||
首相の電話番号は 524287 です。 間違い電話を除き、発信が何回成功すれば、ユーザーの 99% (首相を含む) が首相の友達、友達の友達、または友達の友達の友達… (以下同様) になりますか。
|
||||
|
||||
# --hints--
|
||||
|
||||
`connectednessOfANetwork()` は `2325629` を返す必要があります。
|
||||
|
||||
```js
|
||||
assert.strictEqual(connectednessOfANetwork(), 2325629);
|
||||
```
|
||||
|
||||
# --seed--
|
||||
|
||||
## --seed-contents--
|
||||
|
||||
```js
|
||||
function connectednessOfANetwork() {
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
connectednessOfANetwork();
|
||||
```
|
||||
|
||||
# --solutions--
|
||||
|
||||
```js
|
||||
// solution required
|
||||
```
|
@ -0,0 +1,42 @@
|
||||
---
|
||||
id: 5900f4291000cf542c50ff3a
|
||||
title: '問題 187: 半素数'
|
||||
challengeType: 5
|
||||
forumTopicId: 301823
|
||||
dashedName: problem-187-semiprimes
|
||||
---
|
||||
|
||||
# --description--
|
||||
|
||||
合成数は、2 つ以上の素因数が含まれている整数です。 例えば、$15 = 3 × 5, 9 = 3 × 3, 12 = 2 × 2 × 3$ です。
|
||||
|
||||
30 未満では、ちょうど 2 つの素因数 (相異なる素因数でなくても良い) が含まれている合成数は 4, 6, 9, 10, 14, 15, 21, 22, 25, 26 の 10 個です。
|
||||
|
||||
合成数 $n < {10}^8$ のうち、ちょうど 2 つの素因数からなる合成数 (相異なる素因数でなくても良い) はいくつありますか。
|
||||
|
||||
# --hints--
|
||||
|
||||
`semiPrimes()` は `17427258` を返す必要があります。
|
||||
|
||||
```js
|
||||
assert.strictEqual(euler187(), 17427258);
|
||||
```
|
||||
|
||||
# --seed--
|
||||
|
||||
## --seed-contents--
|
||||
|
||||
```js
|
||||
function semiPrimes() {
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
semiPrimes();
|
||||
```
|
||||
|
||||
# --solutions--
|
||||
|
||||
```js
|
||||
// solution required
|
||||
```
|
@ -0,0 +1,44 @@
|
||||
---
|
||||
id: 5900f4291000cf542c50ff3b
|
||||
title: 'Problem 188: 数の超累乗'
|
||||
challengeType: 5
|
||||
forumTopicId: 301824
|
||||
dashedName: problem-188-the-hyperexponentiation-of-a-number
|
||||
---
|
||||
|
||||
# --description--
|
||||
|
||||
数 $a$ を正の整数 $b$ によって超累乗またはテトレーション (tetration) することを $a↑↑b$ または ${}^ba$ と表記し、次のように再帰的に定義します。
|
||||
|
||||
$a↑↑1 = a$
|
||||
|
||||
$a↑↑(k+1) = a^{(a↑↑k)}$
|
||||
|
||||
したがって、例えば、$3↑↑2 = 3^3 = 27$, $3↑↑3 = 3^{27} = 7625597484987$ であり、$3↑↑4$ は大まかに ${10}^{3.6383346400240996 \times {10}^{12}}$ です。 $1777↑↑1855$ の下位 8 桁を求めなさい。
|
||||
|
||||
# --hints--
|
||||
|
||||
`hyperexponentation()` は `95962097` を返す必要があります。
|
||||
|
||||
```js
|
||||
assert.strictEqual(hyperexponentation(), 95962097);
|
||||
```
|
||||
|
||||
# --seed--
|
||||
|
||||
## --seed-contents--
|
||||
|
||||
```js
|
||||
function hyperexponentation() {
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
hyperexponentation();
|
||||
```
|
||||
|
||||
# --solutions--
|
||||
|
||||
```js
|
||||
// solution required
|
||||
```
|
@ -0,0 +1,50 @@
|
||||
---
|
||||
id: 5900f4291000cf542c50ff3c
|
||||
title: '問題 189: 三角格子を 3 色で塗る'
|
||||
challengeType: 5
|
||||
forumTopicId: 301825
|
||||
dashedName: problem-189-tri-colouring-a-triangular-grid
|
||||
---
|
||||
|
||||
# --description--
|
||||
|
||||
下の 64 個の三角形の構成について考えます。
|
||||
|
||||
<img class="img-responsive center-block" alt="64 個の三角形を並べて作られた、辺長 8 の大きな三角形" src="https://cdn.freecodecamp.org/curriculum/project-euler/tri-colouring-a-triangular-grid-1.gif" style="background-color: white; padding: 10px;" />
|
||||
|
||||
隣接する三角形が同じ色にならないように、それぞれの三角形の中を赤、緑、青のいずれかの色で塗ります。 このような色の塗り方を、「有効な塗り方」と呼ぶことにします。 ここでは、辺を共有している三角形を「隣接する三角形」と呼びます。 注: 頂点のみを共有している場合は「隣接する三角形」ではありません。
|
||||
|
||||
例えば、下図は上の三角形の有効な塗り方です。
|
||||
|
||||
<img class="img-responsive center-block" alt="64 個の三角形からなる色付き格子" src="https://cdn.freecodecamp.org/curriculum/project-euler/tri-colouring-a-triangular-grid-2.gif" style="background-color: white; padding: 10px;" />
|
||||
|
||||
C の回転または反転によって得られる塗り方 C' は、C と同一でない限り C とは異なるものとみなされます。
|
||||
|
||||
上の構成の場合、相異なる有効な塗り方は何通りありますか。
|
||||
|
||||
# --hints--
|
||||
|
||||
`triangularGridColoring()` は `10834893628237824` を返す必要があります。
|
||||
|
||||
```js
|
||||
assert.strictEqual(triangularGridColoring(), 10834893628237824);
|
||||
```
|
||||
|
||||
# --seed--
|
||||
|
||||
## --seed-contents--
|
||||
|
||||
```js
|
||||
function triangularGridColoring() {
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
triangularGridColoring();
|
||||
```
|
||||
|
||||
# --solutions--
|
||||
|
||||
```js
|
||||
// solution required
|
||||
```
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user