我试图返回猜测,公牛队代表正确的数字和指数,而小牛队只显示正确的数字



我试图解决的问题是:

你正在和你的朋友玩下面的牛牛游戏:你写下一个数字,让你的朋友猜这个数字是什么。每次你的朋友猜测,你提供了一个提示,表明所述猜测中有多少数字在数字和位置上与你的秘密号码完全匹配(称为"公牛"(,以及有多少数字与秘密号码匹配但位置错误(称为"奶牛"(。你的朋友会使用连续的猜测和提示,最终得出秘密号码。

根据秘密数字和朋友的猜测,编写一个函数来返回提示,用a表示公牛,用B表示奶牛。

请注意,密码和朋友的猜测都可能包含重复的数字。

以下是我正在编写的函数应该发生的情况的示例:

示例1:输入:secret="1807",guess="7810"输出:"1A3B"解说:1头公牛和3头牛。公牛8岁,母牛分别是0岁、1岁和7岁。

示例2:输入:secret="1123",guess="0111"输出:"1A1B"说明:朋友猜测的第一个1是公牛,第二个或第三个1是奶牛。

我编写的代码在第三个for循环时不起作用。它似乎没有迭代数组的所有成员,我也不明白为什么。

const getHint = (secret, guess) => {
s = secret.split('')
g = guess.split('')
const secretHash = {}
const guessHash = {}
let bulls = 0
let cows = 0
for (let i = 0; i < secret.length; i++) {
secretHash[i] = s[i]
guessHash[i] = g[i]
}
for (let key in secretHash) {
if (secretHash[key] === guessHash[key]) {
bulls++
delete secretHash[key]
delete guessHash[key]
}
}
let values = Object.values(secretHash)
//let guessVal = Array.from(new Set(Object.values(guessHash))) //works for the first two but not the last
let guessVal = Object.values(guessHash) //amended, but now breaks the code for the previous two examples
console.log(values, 'i am the values')
console.log(guessVal, 'i am the guessVal')
//amended but won't work for the last example which includes duplicates
for (let key of guessVal) {
console.log(key);
if (values.includes(key)) {
delete values[key]
delete guessVal[key]
cows++
}
}
return `${bulls}A${cows}B`
}
console.log(getHint('1807', '7810')) //'1A3B'
console.log(getHint('1123', '0111')) //'1A1B'
console.log(getHint('1122', '2211')) //'0A4B'

逻辑似乎是正确的,但它并没有按照我期望的方式迭代。有什么想法或建议可以解释为什么它不起作用?

我用以下方式解决了它,不确定是否有任何优化建议。我找不到比这更优化的方法了。

const getHint = (secret, guess) => {
s = secret.split('')
g = guess.split('')
const secretHash = {}
const guessHash = {}
let bulls = 0
let cows = 0
for (let i = 0; i < secret.length; i++) {
secretHash[i] = s[i]
guessHash[i] = g[i]
}
for (let key in secretHash) {
if (secretHash[key] === guessHash[key]) {
bulls++
delete secretHash[key]
delete guessHash[key]
}
}
let values = Object.values(secretHash)
let guessVal = Object.values(guessHash)
let findIndex

for (let i = 0; i < guessVal.length; i++) {
if (values.includes(guessVal[i])) {
findIndex = values.findIndex(val => val === guessVal[i])
values[findIndex] = -1
guessVal[i] = -1
cows++
}
}
return `${bulls}A${cows}B`
}

最新更新