我正在解决代码降临2015年的问题,以练习我的生 rust 技能。
问题描述如下:
圣诞老人意识到了自己的错误,他转而采用了一种更好的方法来判断一根绳子是好是坏。
现在,一个好的字符串是具有以下所有属性的字符串:
- 它包含一对在字符串中至少出现两次且不重叠的任意两个字母,如
xyxy
(xy
)或aabcdefgaa
(aa
),但不像aaa
(aa
,但它重叠)。 - 它包含至少一个字母,并且每个字母之间只有一个字母重复,例如
xyx
、abcdefeghi
(efe
),甚至aaa
。例如:
qjhvhtzxzqqjkmpb
很好,因为它有一个出现两次的对(qj
)和一个重复的字母,两个字母之间只有一个字母(zxz
)。xxyxx
很好,因为它有一个出现两次的对和一个重复的字母,中间有一个,即使每个规则使用的字母重叠。uurcxstgmygtbstg
是顽皮的,因为它有一对(tg
),但没有重复,它们之间有一个字母。ieodomkazucvgmuy
是顽皮的,因为它有一个重复的字母,其中一个在(odo
)之间,但没有出现两次的对。
在这些新规则下,有多少字符串是好的?
这是我目前所能想到的
pub fn part2(strings: &[String]) -> usize {
strings.iter().filter(|x| is_nice(x)).count()
/* for s in [
String::from("qjhvhtzxzqqjkmpb"),
String::from("xxyxx"),
String::from("uurcxstgmygtbstg"),
String::from("ieodomkazucvgmuy"),
String::from("aaa"),
]
.iter()
{
is_nice(s);
}
0 */
}
fn is_nice(s: &String) -> bool {
let repeat = has_repeat(s);
let pair = has_pair(s);
/* println!(
"s = {}: repeat = {}, pair = {}, nice = {}",
s,
repeat,
pair,
repeat && pair
); */
repeat && pair
}
fn has_repeat(s: &String) -> bool {
for (c1, c2) in s.chars().zip(s.chars().skip(2)) {
if c1 == c2 {
return true;
}
}
false
}
fn has_pair(s: &String) -> bool {
// Generate all possible pairs
let mut pairs = Vec::new();
for (c1, c2) in s.chars().zip(s.chars().skip(1)) {
pairs.push((c1, c2));
}
// Look for overlap
for (value1, value2) in pairs.iter().zip(pairs.iter().skip(1)) {
if value1 == value2 {
// Overlap has occurred
return false;
}
}
// Look for matching pair
for value in pairs.iter() {
if pairs.iter().filter(|x| *x == value).count() >= 2 {
//println!("Repeat pair: {:?}", value);
return true;
}
}
// No pair found
false
}
然而,尽管得到了注解掉的测试值的预期结果,但我在actual puzzle input上运行时的结果与社区验证的基于regex的实现无法比较。尽管用已知的测试值彻底测试了每个函数,但我似乎看不出问题出在哪里。
如果可能的话,我宁愿不使用regex。
1条答案
按热度按时间qzwqbdag1#
我认为
has_pairs
有一个bug:在单词
aaabbaa
中,我们有重叠的aa
(在开头的aaa
),但我认为你不允许马上出现return false
,因为在单词的结尾还有另一个--非重叠的--aa
。