rust 代码2015的到来:第5天,第2部分未知假阳性

hgb9j2n6  于 2022-12-04  发布在  其他
关注(0)|答案(1)|浏览(98)

我正在解决代码降临2015年的问题,以练习我的生 rust 技能。
问题描述如下:
圣诞老人意识到了自己的错误,他转而采用了一种更好的方法来判断一根绳子是好是坏。
现在,一个好的字符串是具有以下所有属性的字符串:

  • 它包含一对在字符串中至少出现两次且不重叠的任意两个字母,如xyxyxy)或aabcdefgaaaa),但不像aaaaa,但它重叠)。
  • 它包含至少一个字母,并且每个字母之间只有一个字母重复,例如xyxabcdefeghiefe),甚至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。

qzwqbdag

qzwqbdag1#

我认为has_pairs有一个bug:
在单词aaabbaa中,我们有重叠的aa(在开头的aaa),但我认为你不允许马上出现return false,因为在单词的结尾还有另一个--非重叠的--aa

相关问题