代码暴力破解 '2018年刑侦科推理试题'

据说是2018年刑侦科推理试题,感受一下。

1.png
作为一个学渣,瞅一眼头就晕了,那就按老师说的‘不会的就选C吧’,不过仔细分析一下这题挺有意思的。

正常推理的话是这个样子:

读题知,第五题为核心题目。先假设第五题为A,则2为C,8为A。由8知,2、5、10与1相邻,则1为B。可知第6题排除A B,可知第9题中x与5答案相同,第9题若选A,则6为A不符合;不选C;若选D,矛盾;故9为B。则10为A。第6题排除D,故6为C。第4题为C。第3题为A。至此,选A有4,选C有3,选B有2,则7为D。证毕。(若第五题不为A,应继续假设为其他项证明之)

最后得出答案 BCACACDABA.

对于我这种脑子笨的人来说,推出来也差不多半个小时了。。。

那这题让程序员来做会怎么样呢?

上代码。

Python

def p0(ans, hypo):
    return True


def p1(ans, hypo):
    if ans == 'A':
        return hypo[4] == 'C'
    if ans == 'B':
        return hypo[4] == 'D'
    if ans == 'C':
        return hypo[4] == 'A'
    if ans == 'D':
        return hypo[4] == 'B'
    return None


def p2(ans, hypo):
    if ans == 'A':
        return hypo[2] != hypo[5] and hypo[2] != hypo[1] and hypo[2] != hypo[3]
    if ans == 'B':
        return hypo[5] != hypo[2] and hypo[5] != hypo[1] and hypo[5] != hypo[3]
    if ans == 'C':
        return hypo[1] != hypo[2] and hypo[1] != hypo[5] and hypo[1] != hypo[3]
    if ans == 'D':
        return hypo[3] != hypo[2] and hypo[3] != hypo[5] and hypo[3] != hypo[1]
    return None


def p3(ans, hypo):
    if ans == 'A':
        return hypo[0] == hypo[4]
    if ans == 'B':
        return hypo[1] == hypo[6]
    if ans == 'C':
        return hypo[0] == hypo[8]
    if ans == 'D':
        return hypo[5] == hypo[9]
    return None


def p4(ans, hypo):
    if ans == 'A':
        return hypo[4] == hypo[7]
    if ans == 'B':
        return hypo[4] == hypo[1]
    if ans == 'C':
        return hypo[4] == hypo[8]
    if ans == 'D':
        return hypo[4] == hypo[6]
    return None


def p5(ans, hypo):
    if ans == 'A':
        return hypo[7] == hypo[1] and hypo[7] == hypo[3]
    if ans == 'B':
        return hypo[7] == hypo[0] and hypo[7] == hypo[5]
    if ans == 'C':
        return hypo[7] == hypo[2] and hypo[7] == hypo[9]
    if ans == 'D':
        return hypo[7] == hypo[4] and hypo[7] == hypo[8]
    return None


def p6(ans, hypo):
    na, nb, nc, nd = 0, 0, 0, 0
    for x in hypo:
        if x == 'A':
            na += 1
        if x == 'B':
            nb += 1
        if x == 'C':
            nc += 1
        if x == 'D':
            nd += 1
    min_opt = min(na, nb, nc, nd)
    if ans == 'A':
        return nc == min_opt
    if ans == 'B':
        return nb == min_opt
    if ans == 'C':
        return na == min_opt
    if ans == 'D':
        return nd == min_opt
    return None


def p7(ans, hypo):
    x = ord(hypo[0])
    if ans == 'A':
        return abs(x - ord(hypo[6])) != 1
    if ans == 'B':
        return abs(x - ord(hypo[4])) != 1
    if ans == 'C':
        return abs(x - ord(hypo[1])) != 1
    if ans == 'D':
        return abs(x - ord(hypo[9])) != 1
    return None


def p8(ans, hypo):
    a = hypo[0] == hypo[5]
    if ans == 'A':
        return a != hypo[5] == hypo[4]
    if ans == 'B':
        return a != hypo[9] == hypo[4]
    if ans == 'C':
        return a != hypo[1] == hypo[4]
    if ans == 'D':
        return a != hypo[8] == hypo[4]
    return None


def p9(ans, hypo):
    na, nb, nc, nd = 0, 0, 0, 0
    for x in hypo:
        if x == 'A':
            na += 1
        if x == 'B':
            nb += 1
        if x == 'C':
            nc += 1
        if x == 'D':
            nd += 1
    delta = max(na, nb, nc, nd) - min(na, nb, nc, nd)
    if ans == 'A':
        return delta == 3
    if ans == 'B':
        return delta == 2
    if ans == 'C':
        return delta == 4
    if ans == 'D':
        return delta == 1
    return None


def test_hypo(problem_list, hypo):
    index = 0
    for p in problem_list:
        if not p.__call__(hypo[index], hypo):
            return False
        index += 1
    return True


def hypo_generator(size):
    num = 1
    for x in range(size):
        num *= 4
    hypo = [None] * size
    for i in xrange(num):
        for j in range(size):
            hypo[j] = ['A', 'B', 'C', 'D'][(i >> (j << 1)) & 3]
        yield hypo


def main():
    problem_list = [p0, p1, p2, p3, p4, p5, p6, p7, p8, p9]
    for hypo in hypo_generator(len(problem_list)):
        if test_hypo(problem_list, hypo):
            print 'Answer:', hypo


if __name__ == '__main__':
main()
C++

#include 
#include 
using namespace std;

int stat(const vector &v, const char target) {
  int cnt[4] = {0};
  for (char c : v) {
    ++cnt[c - 'A'];
  }
  int m = 0, x = 0;
  for (int j = 1; j < 4; ++j) {
    if (cnt[m] > cnt[j]) { m = j; }
    if (cnt[x] < cnt[j]) { x = j; }
  }
  return target == 'm' ? m : (cnt[x] - cnt[m]);
}

bool solve(vector &v, const int i, const char c) { // i: 1~11, c: A~E
  if (i > 10) {
    return true;
  }
  if (c > 'D'){
    return false;
  }

  v[i] = c;
  if (!solve(v, i + 1, 'A') && !solve(v, i, c + 1)) {
    return false;
  }

  const int x = (c - 'A');
  switch (i) {
    case 1:
      return true;
    case 2:
      if (v[5] == "CDAB"[x]) {
        return true;
      }
      break;
    case 3:
      {
        const int w[4] = { 3,6,2,4 };
        int j = 0;
        for (; j < 4; ++j) {
          if (j != x && v[w[j]] == v[w[x]]) {
            break;
          }
        }
        if (j >= 4) {
          return true;
        }
        break;
      }
    case 4:
      if (v["1216"[x] - '0'] == v["579:"[x] - '0']) { // '9' + 1 = ':'
        return true;
      }
      break;
    case 5:
      if (c == v["8497"[x] - '0']) {
        return true;
      }
      break;
    case 6:
      if ((v["2135"[x] - '0'] == v["46:9"[x] - '0']) &&
          (v["2135"[x] - '0'] == v[8])) {
        return true;
      }
      break;
    case 7:
      if ("CBAD"[x] - 'A' == stat(v, 'm')) {
        return true;
      }
      break;
    case 8:
      if (abs(v["752:"[x] - '0'] - v[1]) > 1) {
        return true;
      }
      break;
    case 9:
      if ((v[1] == v[6]) != (v["6:29"[x] - '0'] == v[5])) {
        return true;
      }
      break;
    case 10:
      if (("3241"[x] - '0') == stat(v, 'd')) {
        return true;
      }
      break;
  }
  return solve(v, i, c + 1);
}

int main() {
  const int n = 11;
  vector v(n);
  if (solve(v, 1, 'A')) {
    for (int i = 1; i < n; ++i) { cout << i    << ' '; } cout << endl;
    for (int i = 1; i < n; ++i) { cout << v[i] << ' '; } cout << endl;
  }
  }
C#


public class HardLogic
{
    private static readonly string[] keyList = new string[] { "A", "B", "C", "D" }; 

    public static void Logic()
    {
        int[] answer = new int[10];

        int len = (int)Math.Pow(4, 10);

        for (int i = 0; i < len; i++)
        {
            int k = 0;

            while (k < 10)
            {
                answer[k] += 1;
                if (answer[k] > 3)
                {
                    answer[k] = 0;
                    k++;
                }
                else
                {
                    break;
                }
            }

            bool isTrue = Topic(answer);

            if (isTrue)
            {
                ConsoleAnswer(answer);
            }
        }
    }

    private static void ConsoleAnswer(int[] answer)
    {
        for (int i = 0; i < 10; i++)
        {
            Console.Write(keyList[answer[i]]);
        }
        Console.WriteLine();
    }

    private static bool Topic(int[] answer)
    {
        for (int i = 0; i < 10; i++)
        {
            bool result = false;

            switch (i)
            {
                case 0:
                    result = Topic1(answer);
                    break;
                case 1:
                    result = Topic2(answer);
                    break;
                case 2:
                    result = Topic3(answer);
                    break;
                case 3:
                    result = Topic4(answer);
                    break;
                case 4:
                    result = Topic5(answer);
                    break;
                case 5:
                    result = Topic6(answer);
                    break;
                case 6:
                    result = Topic7(answer);
                    break;
                case 7:
                    result = Topic8(answer);
                    break;
                case 8:
                    result = Topic9(answer);
                    break;
                case 9:
                    result = Topic10(answer);
                    break;
            }

            if (!result)
            {
                return false;
            }
        }

        return true;
    }

    private static bool Topic1(int[] answer)
    {
        return true;
    }

    private static bool Topic2(int[] answer)
    {
        int a2 = GetAnswer(answer, 2);
        int a5 = GetAnswer(answer, 5);

        bool result = false;

        switch (a2)
        {
            case 0:
                result = Compare(a5, "C");
                break;
            case 1:
                result = Compare(a5, "D");
                break;
            case 2:
                result = Compare(a5, "A");
                break;
            case 3:
                result = Compare(a5, "B");
                break;
        }

        return result;
    }

    private static bool Topic3(int[] answer)
    {
        int a3 = GetAnswer(answer, 3);
        int a6 = GetAnswer(answer, 6);
        int a2 = GetAnswer(answer, 2);
        int a4 = GetAnswer(answer, 4);

        bool result = false;

        switch (a3)
        {
            case 0:
                result = a3 != a6 && a6 == a2 && a6 == a4;
                break;
            case 1:
                result = a6 != a3 && a3 == a2 && a3 == a4;
                break;
            case 2:
                result = a2 != a3 && a3 == a6 && a3 == a4;
                break;
            case 3:
                result = a4 != a3 && a3 == a2 && a3 == a6;
                break;
        }

        return result;
    }

    private static bool Topic4(int[] answer)
    {
        int a4 = GetAnswer(answer, 4);

        int a1 = GetAnswer(answer, 1);
        int a5 = GetAnswer(answer, 5);
        int a2 = GetAnswer(answer, 2);
        int a7 = GetAnswer(answer, 7);
        int a9 = GetAnswer(answer, 9);
        int a6 = GetAnswer(answer, 6);
        int a10 = GetAnswer(answer, 10);

        bool result = false;

        switch (a4)
        {
            case 0:
                result = a1 == a5 && a2 != a7 && a1 != a9 && a6 != a10;
                break;
            case 1:
                result = a1 != a5 && a2 == a7 && a1 != a9 && a6 != a10;
                break;
            case 2:
                result = a1 != a5 && a2 != a7 && a1 == a9 && a6 != a10;
                break;
            case 3:
                result = a1 != a5 && a2 != a7 && a1 != a9 && a6 == a10;
                break;
        }

        return result;
    }

    private static bool Topic5(int[] answer)
    {
        int a5 = GetAnswer(answer, 5);

        int a8 = GetAnswer(answer, 8);
        int a4 = GetAnswer(answer, 4);
        int a9 = GetAnswer(answer, 9);
        int a7 = GetAnswer(answer, 7);

        bool result = false;

        switch (a5)
        {
            case 0:
                result = a5 == a8 && a5 != a4 && a5 != a9 && a5 != a7;
                break;
            case 1:
                result = a5 != a8 && a5 == a4 && a5 != a9 && a5 != a7;
                break;
            case 2:
                result = a5 != a8 && a5 != a4 && a5 == a9 && a5 != a7;
                break;
            case 3:
                result = a5 != a8 && a5 != a4 && a5 != a9 && a5 == a7;
                break;
        }

        return result;
    }

    private static bool Topic6(int[] answer)
    {
        int a6 = GetAnswer(answer, 6);

        int a8 = GetAnswer(answer, 8);
        int a2 = GetAnswer(answer, 2);
        int a4 = GetAnswer(answer, 4);
        int a1 = GetAnswer(answer, 1);
        int a3 = GetAnswer(answer, 3);
        int a10 = GetAnswer(answer, 10);
        int a5 = GetAnswer(answer, 5);
        int a9 = GetAnswer(answer, 9);

        bool result1 = a8 == a2 && a8 == a4;
        bool result2 = a8 == a1 && a8 == a6;
        bool result3 = a8 == a3 && a8 == a10;
        bool result4 = a8 == a5 && a8 == a9;

        bool result = false;

        switch (a6)
        {
            case 0:
                result = result1 && !result2 && !result3 && !result4;
                break;
            case 1:
                result = !result1 && result2 && !result3 && !result4;
                break;
            case 2:
                result = !result1 && !result2 && result3 && !result4;
                break;
            case 3:
                result = !result1 && !result2 && !result3 && result4;
                break;
        }

        return result;
    }

    private static bool Topic7(int[] answer)
    {
        int a7 = GetAnswer(answer, 7);

        int[] nums = new int[4];

        for (int i = 0; i < 10; i++)
        {
            int index = answer[i];

            nums[index] += 1;
        }

        int min = 4;

        int minIndex = -1;

        for (int i = 0; i < 4; i++)
        {
            if (min > nums[i])
            {
                min = nums[i];

                minIndex = i;
            }
        }

        bool result = false;

        switch (a7)
        {
            case 0:
                result = Compare(minIndex, "C");
                break;
            case 1:
                result = Compare(minIndex, "B");
                break;
            case 2:
                result = Compare(minIndex, "A");
                break;
            case 3:
                result = Compare(minIndex, "D");
                break;
        }

        return result;
    }

    private static bool Topic8(int[] answer)
    {
        int a8 = GetAnswer(answer, 8);
        int a1 = GetAnswer(answer, 1);

        int a7 = GetAnswer(answer, 7);
        int a5 = GetAnswer(answer, 5);
        int a2 = GetAnswer(answer, 2);
        int a10 = GetAnswer(answer, 10);

        bool result = false;

        switch (a8)
        {
            case 0:
                result = Math.Abs(a1 - a7) != 1;
                break;
            case 1:
                result = Math.Abs(a1 - a5) != 1;
                break;
            case 2:
                result = Math.Abs(a1 - a2) != 1;
                break;
            case 3:
                result = Math.Abs(a1 - a10) != 1;
                break;
        }

        return result;
    }

    private static bool Topic9(int[] answer)
    {
        int a9 = GetAnswer(answer, 9);

        int a1 = GetAnswer(answer, 1);
        int a6 = GetAnswer(answer, 6);
        int a5 = GetAnswer(answer, 5);

        int a10 = GetAnswer(answer, 10);
        int a2 = GetAnswer(answer, 2);

        bool result = false;

        switch (a9)
        {
            case 0:
                result = (a1 == a6 && a6 != a5) || (a1 != a6 && a6 == a5);
                break;
            case 1:
                result = (a1 == a6 && a10 != a5) || (a1 != a6 && a10 == a5);
                break;
            case 2:
                result = (a1 == a6 && a2 != a5) || (a1 != a6 && a2 == a5);
                break;
            case 3:
                result = (a1 == a6 && a9 != a5) || (a1 != a6 && a9 == a5);
                break;
        }

        return result;
    }

    private static bool Topic10(int[] answer)
    {
        int a10 = GetAnswer(answer, 10);

        int[] nums = new int[4];

        for (int i = 0; i < 10; i++)
        {
            int index = answer[i];

            nums[index] += 1;
        }

        int min = 4;

        int max = 0;

        for (int i = 0; i < 4; i++)
        {
            min = Math.Min(nums[i], min);
            max = Math.Max(nums[i], max);
        }

        bool result = false;

        switch (a10)
        {
            case 0:
                result = max - min == 3;
                break;
            case 1:
                result = max - min == 2;
                break;
            case 2:
                result = max - min == 4;
                break;
            case 3:
                result = max - min == 1;
                break;
        }

        return result;
    }

    private static int GetAnswer(int[] answer, int index)
    {
        return answer[index - 1];
    }

    private static bool Compare(int index, string key)
    {
        return keyList[index] == key;
    }
    }

 ‘VB
Option Explicit
Dim p1, p2, p3, p4, p5, p6, p7, p8, p9, p10
Dim pass As Integer, total
Sub main()
total = Array(0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
Debug.Print “计算中”
For p1 = 1 To 4
For p2 = 1 To 4
For p3 = 1 To 4
For p4 = 1 To 4
For p5 = 1 To 4
For p6 = 1 To 4
For p7 = 1 To 4
For p8 = 1 To 4
For p9 = 1 To 4
For p10 = 1 To 4
checkwhile
If pass < 10 Then total(pass) = total(pass) + 1
pass = 0
Next
Next
Next
Next
Next
Next
Next
Next
Next
Next
Debug.Print “完毕”
Debug.Print Join(total)
End Sub
Sub checkwhile()
‘q 1
pass = pass + 1
‘q 2
Select Case True
Case p2 = 1 And p5 = 3
Case p2 = 2 And p5 = 4
Case p2 = 3 And p5 = 1
Case p2 = 4 And p5 = 2
Case Else: Exit Sub
End Select
pass = pass + 1
‘q 3
Dim d31, d32
d31 = False
Select Case p3 ‘p6 p2 p4
Case 1 ‘测试如果第3题答案是A,必须保证6、2和4都不是A
If p6 <> 1 And p2 <> 1 And p4 <> 1 Then d31 = True
Case 2 ‘测试如果第3题答案是B,必须保证6不是B,并且6的答案不同于2和4
If p6 <> 2 And p6 <> p2 And p6 <> p4 Then d31 = True
Case 3 ‘测试如果第3题答案是C,必须保证2不是C,并且2的答案不同于6和4
If p2 <> 3 And p2 <> p6 And p2 <> p4 Then d31 = True
Case 4 ‘测试如果第3题答案是D,必须保证4不是D,并且4的答案不同于2和6
If p4 <> 4 And p4 <> p2 And p4 <> p6 Then d31 = True
End Select
If Not d31 Then Exit Sub
pass = pass + 1
‘q 4
Select Case True
Case p4 = 1 And p1 = p5
Case p4 = 2 And p2 = p7
Case p4 = 3 And p1 = p9
Case p4 = 4 And p6 = p10
Case Else: Exit Sub
End Select
pass = pass + 1
‘q 5
Select Case True
Case p5 = 1 And p5 = p8
Case p5 = 2 And p5 = p4
Case p5 = 3 And p5 = p9
Case p5 = 4 And p5 = p7
Case Else: Exit Sub
End Select
pass = pass + 1
‘q 6
Select Case True
Case p6 = 1 And p8 = p2 And p8 = p4
Case p6 = 2 And p8 = p1 And p8 = p6
Case p6 = 3 And p8 = p3 And p8 = p10
Case p6 = 4 And p8 = p5 And p8 = p9
Case Else: Exit Sub
End Select
pass = pass + 1
‘q 7
Dim d71, d72, d73, d74 ‘ 71=everychose’s count; 72=all answer; 73=looper; 74=most less’s chose’s count
d71 = Array(0, 0, 0, 0)
d72 = Array(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10)
For d73 = 0 To 9 ‘统计每个选项的次数
d71(d72(d73) - 1) = d71(d72(d73) - 1) + 1
Next
d74 = 10 ‘初始化D74到一个比较大的值
For d73 = 0 To 3 ‘得到选中次数最少的选项的次数
If d71(d73) < d74 Then d74 = d71(d73)
Next
Select Case True
Case p7 = 1 And d71(3 - 1) = d74
Case p7 = 2 And d71(2 - 1) = d74
Case p7 = 3 And d71(1 - 1) = d74
Case p7 = 4 And d71(4 - 1) = d74
Case Else: Exit Sub
End Select
pass = pass + 1
‘q 8 ‘不相邻,可以直接用加减法计算
Select Case True
Case p8 = 1 And p7 + 1 <> p1 And p7 - 1 <> p1
Case p8 = 2 And p5 + 1 <> p1 And p5 - 1 <> p1
Case p8 = 3 And p2 + 1 <> p1 And p2 - 1 <> p1
Case p8 = 4 And p10 + 1 <> p1 And p10 - 1 <> p1
Case Else: Exit Sub
End Select
pass = pass + 1
‘q 9
Dim d91, d92
d91 = (p1 = p6)
d92 = False
Select Case True
Case p9 = 1
If (p5 = p6) Xor d91 Then d92 = True
Case p9 = 2
If (p5 = p10) Xor d91 Then d92 = True
Case p9 = 3
If (p5 = p2) Xor d91 Then d92 = True
Case p9 = 4
If (p5 = p9) Xor d91 Then d92 = True
Case Else: Exit Sub
End Select
If Not d92 Then Exit Sub
pass = pass + 1
‘q 10
‘已忽略
Debug.Print “ “ & p1 & “ “ & p2 & “ “ & p3 & “ “ & p4 & “ “ & p5 & “ “ & p6 & “ “ & p7 & “ “ & p8 & “ “ & p9 & “ “ & p10
End Sub

最后的出来答案:BCACACDABA.

神奇吧。

-------------本文结束感谢您的阅读-------------
hao14293 wechat
交流或订阅,请扫描上方微信二维码