据说是2018年刑侦科推理试题,感受一下。
作为一个学渣,瞅一眼头就晕了,那就按老师说的‘不会的就选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.
神奇吧。