mirror of
https://github.com/freeCodeCamp/freeCodeCamp.git
synced 2026-04-13 04:00:12 -04:00
Co-authored-by: Naomi Carrigan <nhcarrigan@gmail.com> Co-authored-by: Oliver Eyton-Williams <ojeytonwilliams@gmail.com>
179 lines
5.6 KiB
Markdown
179 lines
5.6 KiB
Markdown
---
|
|
id: 59e09e6d412c5939baa02d16
|
|
title: マルコフアルゴリズム
|
|
challengeType: 1
|
|
forumTopicId: 302260
|
|
dashedName: execute-a-markov-algorithm
|
|
---
|
|
|
|
# --description--
|
|
|
|
Markov Concepts are used in machine learning, because of its simple approach in data manipulation. With a set number of `rules` you can manipulate given `data` to create a desired `output`.
|
|
|
|
以下のものが用意されています:
|
|
|
|
ネストされた配列の形式の `rules`、同じく配列の形式の `data`、 そして、期待する `outputs` です。
|
|
|
|
`rules`:
|
|
|
|
```js
|
|
let rules=[
|
|
[
|
|
"A -> apple","B -> bag","S -> shop","T -> the",
|
|
"the shop -> my brother","a never used -> .terminating rule"
|
|
],
|
|
|
|
[
|
|
"A -> apple","B -> bag","S -> .shop","T -> the",
|
|
"the shop -> my brother","a never used -> .terminating rule"
|
|
],
|
|
|
|
[
|
|
"A -> apple","WWWW -> with","Bgage -> ->.*","B -> bag",
|
|
"->.* -> money","W -> WW","S -> .shop","T -> the",
|
|
"the shop -> my brother","a never used -> .terminating rule"
|
|
],
|
|
|
|
[
|
|
"_+1 -> _1+","1+1 -> 11+","1! -> !1",",! -> !+","_! -> _","1*1 -> x,@y","1x -> xX",
|
|
"X, -> 1,1","X1 -> 1X","_x -> _X",",x -> ,X","y1 -> 1y","y_ -> _","1@1 -> x,@y",
|
|
"1@_ -> @_",",@_ -> !_","++ -> +","_1 -> 1","1+_ -> 1","_+_ -> "
|
|
],
|
|
|
|
[
|
|
"A0 -> 1B","0A1 -> C01","1A1 -> C11","0B0 -> A01","1B0 -> A11",
|
|
"B1 -> 1B","0C0 -> B01","1C0 -> B11","0C1 -> H01","1C1 -> H11"
|
|
]
|
|
|
|
];
|
|
```
|
|
|
|
`data`:
|
|
|
|
```js
|
|
let data=[
|
|
"I bought a B of As from T S.",
|
|
"I bought a B of As from T S.",
|
|
"I bought a B of As W my Bgage from T S.",
|
|
"_1111*11111_",
|
|
"000000A000000"
|
|
];
|
|
```
|
|
|
|
`outputs`:
|
|
|
|
```js
|
|
let outputs=[
|
|
"I bought a bag of apples from my brother.",
|
|
"I bought a bag of apples from T shop.",
|
|
"I bought a bag of apples with my money from T shop.",
|
|
"11111111111111111111",
|
|
"00011H1111000"
|
|
]
|
|
```
|
|
|
|
マルコフのアルゴリズムを使用して、与えられた `rules` を使用して `data` を望ましい `outputs` に変更します。
|
|
|
|
# --hints--
|
|
|
|
`markov` は関数でなければなりません。
|
|
|
|
```js
|
|
assert(typeof markov === 'function');
|
|
```
|
|
|
|
`markov(["A -> apple","B -> bag","S -> shop","T -> the","the shop -> my brother","a never used -> .terminating rule"],"I bought a B of As from T S.")` は文字列 `I bought a bag of apples from my brother.` を返します。
|
|
|
|
```js
|
|
assert.deepEqual(markov(rules[0], datas[0]), outputs[0]);
|
|
```
|
|
|
|
`markov(["A -> apple","B -> bag","S -> .shop","T -> the","the shop -> my brother","a never used -> .terminating rule"],"I bought a B of As from T S.")` は文字列 `I bought a bag of apples from T shop.` を返します。
|
|
|
|
```js
|
|
assert.deepEqual(markov(rules[1], datas[1]), outputs[1]);
|
|
```
|
|
|
|
`markov(["A -> apple","WWWW -> with","Bgage -> ->.*","B -> bag","->.* -> money","W -> WW","S -> .shop","T -> the","the shop -> my brother","a never used -> .terminating rule"],"I bought a B of As W my Bgage from T S.")` は文字列 `I bought a bag of apples with my money from T shop.` を返します。
|
|
|
|
```js
|
|
assert.deepEqual(markov(rules[2], datas[2]), outputs[2]);
|
|
```
|
|
|
|
`markov(["_+1 -> _1+","1+1 -> 11+","1! -> !1",",! -> !+","_! -> _","1*1 -> x,@y","1x -> xX","X, -> 1,1","X1 -> 1X","_x -> _X",",x -> ,X","y1 -> 1y","y_ -> _","1@1 -> x,@y","1@_ -> @_",",@_ -> !_","++ -> +","_1 -> 1","1+_ -> 1","_+_ -> "],"_1111*11111_")` should return the string `11111111111111111111`.
|
|
|
|
```js
|
|
assert.deepEqual(markov(rules[3], datas[3]), outputs[3]);
|
|
```
|
|
|
|
`markov(["A0 -> 1B","0A1 -> C01","1A1 -> C11","0B0 -> A01","1B0 -> A11","B1 -> 1B","0C0 -> B01","1C0 -> B11","0C1 -> H01","1C1 -> H11"],"")` は文字列 `00011H1111000` を返します。
|
|
|
|
```js
|
|
assert.deepEqual(markov(rules[4], datas[4]), outputs[4]);
|
|
```
|
|
|
|
# --seed--
|
|
|
|
## --after-user-code--
|
|
|
|
```js
|
|
|
|
let rules=[["A -> apple","B -> bag","S -> shop","T -> the","the shop -> my brother","a never used -> .terminating rule"],
|
|
["A -> apple","B -> bag","S -> .shop","T -> the","the shop -> my brother","a never used -> .terminating rule"],
|
|
["A -> apple","WWWW -> with","Bgage -> ->.*","B -> bag","->.* -> money","W -> WW","S -> .shop","T -> the","the shop -> my brother","a never used -> .terminating rule"],
|
|
["_+1 -> _1+","1+1 -> 11+","1! -> !1",",! -> !+","_! -> _","1*1 -> x,@y","1x -> xX","X, -> 1,1","X1 -> 1X","_x -> _X",",x -> ,X","y1 -> 1y","y_ -> _","1@1 -> x,@y","1@_ -> @_",",@_ -> !_","++ -> +","_1 -> 1","1+_ -> 1","_+_ -> "],
|
|
["A0 -> 1B","0A1 -> C01","1A1 -> C11","0B0 -> A01","1B0 -> A11","B1 -> 1B","0C0 -> B01","1C0 -> B11","0C1 -> H01","1C1 -> H11"]];
|
|
let datas=["I bought a B of As from T S.",
|
|
"I bought a B of As from T S.",
|
|
"I bought a B of As W my Bgage from T S.",
|
|
"_1111*11111_",
|
|
"000000A000000"];
|
|
let outputs=["I bought a bag of apples from my brother.",
|
|
"I bought a bag of apples from T shop.",
|
|
"I bought a bag of apples with my money from T shop.",
|
|
"11111111111111111111",
|
|
"00011H1111000"]
|
|
|
|
```
|
|
|
|
|
|
## --seed-contents--
|
|
|
|
```js
|
|
function markov(rules,data) {
|
|
|
|
}
|
|
```
|
|
|
|
# --solutions--
|
|
|
|
```js
|
|
function markov(rules,data) {
|
|
let pattern = new RegExp("^([^#]*?)\\s+->\\s+(\\.?)(.*)");
|
|
let origData = data;
|
|
|
|
let captures = [];
|
|
|
|
rules.forEach(function(rule){
|
|
let m = pattern.exec(rule);
|
|
for (let j = 0; j < m.length; j++)
|
|
m[j] = m[j + 1];
|
|
captures.push(m);
|
|
});
|
|
|
|
data = origData;
|
|
let copy = data;
|
|
for (let j = 0; j < captures.length; j++) {
|
|
let c = captures[j];
|
|
data = data.replace(c[0], c[2]);
|
|
if (c[1]==".")
|
|
break;
|
|
if (data!=copy) {
|
|
j = -1;
|
|
copy = data;
|
|
}
|
|
}
|
|
return data;
|
|
}
|
|
```
|