编程解决谁是凶手的问题

*/-->

pre.src {background-color: #292b2e; color: #b2b2b2;}

pre.src {background-color: #292b2e; color: #b2b2b2;}

pre.src {background-color: #292b2e; color: #b2b2b2;}

pre.src {background-color: #292b2e; color: #b2b2b2;}

编程解决谁是凶手的问题

目录

  • 1. 简介
  • 2. 具体实现

1 简介

使用代码来解决小学问题,具体题目如下图。

图1  谁是凶手

2 具体实现

主要在于条件判断。每句话所指的都不是说话者自身;只有无辜者说真话,并且至少有一句话是无辜者说的。

(defn permutations
  "计算排列"
  [s]
  (lazy-seq
   (if (seq (rest s))
     (apply concat (for [x s]
                     (map #(cons x %) (permutations (remove #{x} s)))))
     [s])))

(permutations [1 2 3])
;; => ((1 2 3) (1 3 2) (2 1 3) (2 3 1) (3 1 2) (3 2 1))

;; 所有可能结果的集合
(def results (map zipmap (cycle [guys]) (permutations [:凶手 :帮凶 :无辜者])))

;; 要检测的语句
(def exps {:甲 #(not= (:甲 %) :帮凶)
           :乙 #(not= (:乙 %) :凶手)
           :丙 #(not= (:丙 %) :无辜者)})

(def guys (set (keys exps)))

(doseq [r results]
  (let [good-guy (:无辜者 (clojure.set/map-invert r))]
    ;;找到正确答案的条件
    (when (and (not ((exps good-guy) r))
               ;; 只有无辜者说真话,因此关于无辜者自己的话(另外的人说的)必须为假

               (some #(% r) (->> (disj guys good-guy)
                                 (select-keys exps)
                                 vals))
               ;; 与无辜者不相关的话至少有一个为真
               )
      (println "result:" r "\n"
               "甲不是帮凶:" ((:甲 exps) r) "\n"
               "乙不是凶手:" ((:乙 exps) r) "\n"
               "丙不是无辜者:" ((:丙 exps) r)))))
result: {:乙 :帮凶, :甲 :凶手, :丙 :无辜者}
 甲不是帮凶: true
 乙不是凶手: true
 丙不是无辜者: false
nil

作者: ntestoc

Created: 2020-01-31 五 22:04

原文地址:https://www.cnblogs.com/ntestoc/p/12246965.html

时间: 2024-08-29 16:03:12

编程解决谁是凶手的问题的相关文章

编程确定谁是凶手

3.日本某地发生了一件谋杀案,警察通过排查确定杀人凶手必为4个嫌疑犯的一个.以下为4个嫌疑犯的供词.A说:不是我.B说:是C.C说:是D.D说:C在胡说已知3个人说了真话,1个人说的是假话.现在请根据这些信息,写一个程序来确定到底谁是凶手. #include<stdio.h> #include<stdlib.h> int main() { int killer = 'A'; for (killer = 'A'; killer <= 'D'; killer++) { if ((

编程解决实际问题--预测比赛结果,确定凶手

2. 5位运动员参加了10米台跳水比赛,有人让他们预测比赛结果 A选手说:B第一,我第三. B选手说:我第二,E第四. C选手说:我第一,D第二. D选手说:C最后,我第三. E选手说:我第四,A第一. 比赛结束后,每位选手都说对了一半,请编程确定比赛的名次. #include <stdio.h> int main() {     int a,b,c,d,e;      for(a=1;a<=5;a++)       for(b=1;b<=5;b++)         for(c=

编程解决Linux下解压zip乱码问题

JDK7 的ZipInputStream新添了一个构造方法,第二个参数可以指定字符集.这样一来我们就能用这个类写一个解压程序解决zip乱码问题了. 下面是代码: package cn.fh; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.nio.charset.Charset; import

编程:递归编程解决汉诺塔问题(用java实现)

//Li Cuiyun,October 14,2016.//用递归方法编程解决汉诺塔问题package tutorial_3_5;import java.util.*; public class HanoiTower { public static void main(String[] args) { // TODO Auto-generated method stub @SuppressWarnings("resource") Scanner sc=new Scanner(Syste

c语言:日本某地发生了一件谋杀案,写一个程序来确定到底谁是凶手。

日本某地发生了一件谋杀案,警察通过排查确定杀人凶手必为4个嫌疑犯的一个.以下为4个嫌疑犯的供词. A说:不是我. B说:是C. C说:是D. D说:C在胡说 已知3个人说了真话,1个人说的是假话. 现在请根据这些信息,写一个程序来确定到底谁是凶手. 程序: #include<stdio.h> int main() { int killer=0; for (killer = 'A'; killer <= 'D'; killer++) { if ((killer != 'A') + (kil

C语言实现之谁是凶手,杀死比尔5

问题:日本某地发生了一件谋杀案,警察通过排查确定杀人凶手必为4个嫌疑犯的一个.以下为4个嫌疑犯的供词.A说:不是我.B说:是C.C说:是D.D说:C在胡说已知3个人说了真话,1个人说的是假话.现在请根据这些信息,写一个程序来确定到底谁是凶手. 代码实现: #include <stdio.h> int main() {  int killer=0;  for(killer='a';killer<='d';killer++)  {   if((killer!='a')+(killer=='c

3个人说了真话,1个人说的是假话。写一个程序来确定到底谁是凶手

日本某地发生了一件谋杀案,警察通过排查确定杀人凶手必为4个嫌疑犯的一个.以下为4个嫌疑犯的供词.A说:不是我.B说:是C. C说:是D. D说:C在胡说.   等同于"不是D" 已知3个人说了真话,1个人说的是假话. 现在请根据这些信息,写一个程序来确定到底谁是凶手. 做之前的做题思路: 如果说A说的是假话,即BCD说的都是真话.即  是A,是C,是D,不是D.他们的说法相互矛盾,所以这种推论是错误的. 如果说B说的是假话,即ACD说的都是真话.即  不是A,不是C,是D,不是D.他们

Matlab与.NET混合编程解决人脸识别问题

原文:[原创]Matlab与.NET混合编程解决人脸识别问题 如果这些文章对你有用,有帮助,期待更多开源组件介绍,请不要吝啬手中的鼠标. [原创分享]Matlab.NET混编调用Figure窗体 http://www.cnblogs.com/asxinyu/archive/2013/04/14/3020813.html [原创]Matlab与.NET基于类型安全的接口编程入门 http://www.cnblogs.com/asxinyu/archive/2013/05/16/3082299.ht

C++ 多线程编程解决CPU占用率高问题

在用C++进行多线程编程的时候,时常需要写一些类似于死循环的结构来执行代码,这些死循环如果没有经过处理一直开着,那么CPU的占用率就会居高不下的做着很多无用的操做.为解决这个问题我们可以通过在各线程中的适当位置添加Sleep函数来休眠该线程,使其少做这些无用的操作.经过这个处理,正常能压缩掉一半以上的CPU占用.C++ 多线程编程解决CPU占用率高问题