10瓶毒药其中只有一瓶有毒至少需要几只老鼠可以找到有毒的那瓶
身似浮云,心如飞絮,气若游丝。

/**
* binary : 0001 : 第1瓶药水
* binary : 0010 : 第2瓶药水
* binary : 0011 : 第3瓶药水
* binary : 0100 : 第4瓶药水
* binary : 0101 : 第5瓶药水
* binary : 0110 : 第6瓶药水
* binary : 0111 : 第7瓶药水
* binary : 1000 : 第8瓶药水
* binary : 1001 : 第9瓶药水
* binary : 1010 : 第10瓶药水
* 药液混合后的数组1: [1, 3, 5, 7, 9]
* 药液混合后的数组2: [2, 3, 6, 7, 10]
* 药液混合后的数组3: [4, 5, 6, 7]
* 药液混合后的数组4: [8, 9, 10]
*
* 打印结果如上,此时就可以按照二进制逻辑判定哪瓶是毒药了。
* 此时用四只老鼠分别去喝四组混合后的药液,即老鼠1和混合要和后的数组1,老鼠2喝混合数组2,老鼠3喝混合数组3,老鼠4和混合数组4
* 假设第七瓶是毒药
* 那么可以观察到混合药液后的数组1、数组2、数组3 都混入的毒药7
* 所以就是第一只老鼠死亡,第二只老鼠死亡,第三只老鼠死亡,第四只存活,之前混合药液的逻辑就是 1有毒 0无毒
* 所以它们对应的二进制就是:1110,也就是上述的:binary : 0111 : 第7瓶药水
*
* 假设第六瓶是毒药就是对应着:0110,也就是第一只老鼠存活、第二只老鼠死亡、第三只老鼠死亡、第四只老鼠存活
*
* 所以,最后可以根据老鼠的死亡和存活状态 & 结合混合后的药液数组 判定哪瓶是毒药
* 同理 1000瓶毒药至少需要10只老鼠可以找出那瓶有毒
* 2∧10 = 1024
*/
1 package com.bebird.vote;
2
3 import java.util.ArrayList;
4 import java.util.Arrays;
5 import java.util.List;
6
7 public class TestVirus {
8
9 public static void main(String[] args) {
10 // 给十瓶毒药标序号,用1~10标记,并转为二进制
11 List<Integer> virusArr = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
12 // 四个药液混合的数组
13 List<Integer> list1 = new ArrayList<>();
14 List<Integer> list2 = new ArrayList<>();
15 List<Integer> list3 = new ArrayList<>();
16 List<Integer> list4 = new ArrayList<>();
17 for(int i = 0; i < virusArr.size(); i++) {
18 Integer num = virusArr.get(i);
19 // 设置返回至少4位数字:使用5位数字并切掉第一位数字。
20 String binary = Integer.toBinaryString(num + 0b10000).substring(1);
21 System.out.println("binary : " + binary.concat(" : 第").concat(String.valueOf(i + 1)).concat("瓶药水"));
22 /**
23 * 把二进制数组中,个位数为1的 十位数为1的 和百位数为1的 千位数为一的 分别组成一个数组
24 * 为什么这样做,其实就假设二进制中,1位的是有毒,0位是无毒,按这种逻辑把十瓶药水混合成四平给四只老鼠喝
25 */
26 // 判断二进制 个十百千 位数是否为1:
27 // 个位为1
28 boolean flagGe = (Integer.parseInt(binary) >> 0 & 1) == 1;
29 if (flagGe) {
30 list1.add(i + 1);
31 }
32 // 十位为1
33 boolean flagShi = (Integer.parseInt(binary) >> 1 & 1) == 1;
34 if (flagShi) {
35 list2.add(i + 1);
36 }
37 // 百威为1
38 boolean flagBai = (Integer.parseInt(binary) >> 2 & 1) == 1;
39 if (flagBai) {
40 list3.add(i + 1);
41 }
42 // 千位为1
43 if (binary.startsWith("1")) {
44 list4.add(i + 1);
45 }
46
47 }
48 System.out.println("药液混合后的数组1: "+ list1);
49 System.out.println("药液混合后的数组2: "+ list2);
50 System.out.println("药液混合后的数组3: "+ list3);
51 System.out.println("药液混合后的数组4: "+ list4);
52 /**
53 * binary : 0001 : 第1瓶药水
54 * binary : 0010 : 第2瓶药水
55 * binary : 0011 : 第3瓶药水
56 * binary : 0100 : 第4瓶药水
57 * binary : 0101 : 第5瓶药水
58 * binary : 0110 : 第6瓶药水
59 * binary : 0111 : 第7瓶药水
60 * binary : 1000 : 第8瓶药水
61 * binary : 1001 : 第9瓶药水
62 * binary : 1010 : 第10瓶药水
63 * 药液混合后的数组1: [1, 3, 5, 7, 9]
64 * 药液混合后的数组2: [2, 3, 6, 7, 10]
65 * 药液混合后的数组3: [4, 5, 6, 7]
66 * 药液混合后的数组4: [8, 9, 10]
67 *
68 * 打印结果如上,此时就可以按照二进制逻辑判定哪瓶是毒药了。
69 * 此时用四只老鼠分别去喝四组混合后的药液,即老鼠1和混合要和后的数组1,老鼠2喝混合数组2,老鼠3喝混合数组3,老鼠4和混合数组4
70 * 假设第七瓶是毒药
71 * 那么可以观察到混合药液后的数组1、数组2、数组3 都混入的毒药7
72 * 所以就是第一只老鼠死亡,第二只老鼠死亡,第三只老鼠死亡,第四只存活,之前混合药液的逻辑就是 1有毒 0无毒
73 * 所以它们对应的二进制就是:1110,也就是上述的:binary : 0111 : 第7瓶药水
74 *
75 * 假设第六瓶是毒药就是对应着:0110,也就是第一只老鼠存活、第二只老鼠死亡、第三只老鼠死亡、第四只老鼠存活
76 *
77 * 所以,最后可以根据老鼠的死亡和存活状态 & 结合混合后的药液数组 判定哪瓶是毒药
78 * 同理 1000瓶毒药至少需要10只老鼠可以找出那瓶有毒
79 * 2∧10 = 1024
80 */
81
82
83 }
84
85
86 }
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta
查看Ruby的CSV库的文档,我非常确定这是可能且简单的。我只需要使用Ruby删除CSV文件的前三列,但我没有成功运行它。 最佳答案 csv_table=CSV.read(file_path_in,:headers=>true)csv_table.delete("header_name")csv_table.to_csv#=>ThenewCSVinstringformat检查CSV::Table文档:http://ruby-doc.org/stdlib-1.9.2/libdoc/csv/rdoc/CSV/Table.html
我发现ActiveRecord::Base.transaction在复杂方法中非常有效。我想知道是否可以在如下事务中从AWSS3上传/删除文件:S3Object.transactiondo#writeintofiles#raiseanexceptionend引发异常后,每个操作都应在S3上回滚。S3Object这可能吗?? 最佳答案 虽然S3API具有批量删除功能,但它不支持事务,因为每个删除操作都可以独立于其他操作成功/失败。该API不提供任何批量上传功能(通过PUT或POST),因此每个上传操作都是通过一个独立的API调用完成的
我正在阅读SandiMetz的POODR,并且遇到了一个我不太了解的编码原则。这是代码:classBicycleattr_reader:size,:chain,:tire_sizedefinitialize(args={})@size=args[:size]||1@chain=args[:chain]||2@tire_size=args[:tire_size]||3post_initialize(args)endendclassMountainBike此代码将为其各自的属性输出1,2,3,4,5。我不明白的是查找方法。当一辆山地自行车被实例化时,因为它没有自己的initialize方法
我们的git存储库中目前有一个Gemfile。但是,有一个gem我只在我的环境中本地使用(我的团队不使用它)。为了使用它,我必须将它添加到我们的Gemfile中,但每次我checkout到我们的master/dev主分支时,由于与跟踪的gemfile冲突,我必须删除它。我想要的是类似Gemfile.local的东西,它将继承从Gemfile导入的gems,但也允许在那里导入新的gems以供使用只有我的机器。此文件将在.gitignore中被忽略。这可能吗? 最佳答案 设置BUNDLE_GEMFILE环境变量:BUNDLE_GEMFI
我喜欢使用Textile或Markdown为我的项目编写自述文件,但是当我生成RDoc时,自述文件被解释为RDoc并且看起来非常糟糕。有没有办法让RDoc通过RedCloth或BlueCloth而不是它自己的格式化程序运行文件?它可以配置为自动检测文件后缀的格式吗?(例如README.textile通过RedCloth运行,但README.mdown通过BlueCloth运行) 最佳答案 使用YARD直接代替RDoc将允许您包含Textile或Markdown文件,只要它们的文件后缀是合理的。我经常使用类似于以下Rake任务的东西:
我想让一个yaml对象引用另一个,如下所示:intro:"Hello,dearuser."registration:$introThanksforregistering!new_message:$introYouhaveanewmessage!上面的语法只是它如何工作的一个例子(这也是它在thiscpanmodule中的工作方式。)我正在使用标准的rubyyaml解析器。这可能吗? 最佳答案 一些yaml对象确实引用了其他对象:irb>require'yaml'#=>trueirb>str="hello"#=>"hello"ir
当谈到运行时自省(introspection)和动态代码生成时,我认为ruby没有任何竞争对手,可能除了一些lisp方言。前几天,我正在做一些代码练习来探索ruby的动态功能,我开始想知道如何向现有对象添加方法。以下是我能想到的3种方法:obj=Object.new#addamethoddirectlydefobj.new_method...end#addamethodindirectlywiththesingletonclassclass这只是冰山一角,因为我还没有探索instance_eval、module_eval和define_method的各种组合。是否有在线/离线资
我正在学习http://ruby.railstutorial.org/chapters/static-pages上的RubyonRails教程并遇到以下错误StaticPagesHomepageshouldhavethecontent'SampleApp'Failure/Error:page.shouldhave_content('SampleApp')Capybara::ElementNotFound:Unabletofindxpath"/html"#(eval):2:in`text'#./spec/requests/static_pages_spec.rb:7:in`(root)'