python考试编程题九道_一道逻辑推理题的程序实现(纯属娱乐)
一份邏輯推理題的程序求解(純屬自娛自樂)
閑來無聊,看到QQ空間上轉載了一份變態推理題的,至少表示我看了十多分鐘無處下手,認識的人中有大神居然真的做出來了。。。我不知道他是們那么做的,不過作為編程愛好者,我第一時間想到的是寫個程序把答案找出來(不要吐槽)。于是我就動手了。。。不過,這個簡單的還是花了我2個小時。。。
下面,先給大家看一看題目:
這十道題可謂喪心病狂,因為題目答案高度關聯,居然出現了多少個A多少個B這樣的選項,不做完全卷根本不知道每道題對錯。。。我簡單分析了一下,也只看出切入點大概在第七八九題和第二題的樣子吧,簡單的分析就可以大概知道答案整體的A選項數量,然后慢慢推,不過期間貌似也有好幾步要靠試才能試出來。。。。
我承認我沒有那推理能力,所以我想到了用一個小程序。。。十層循環遍歷所有可能方案,然后用十層判斷過濾方案,找到正確答案。
我的程序是用python寫的,用0 1 2 3來代表ABCD,每層循環變量的取值就代表了每道題的答案,構建一個當前方案t_result,比如i0 = 1 i1 = 0就對應著第一題選B第二題選A。遍歷十層的效果就是這樣,
考慮到可能結果不止一個,我另外定義一個叫final_result的列表來保存所有符合要求的結果。
然后是按照題目要求進行規則判斷,即進行十層(實際只有九層)if判斷來遍歷所有方案,得到符合要求的結果,一旦某一環節不符合就由continue語句跳出當前結果,進入下一輪,一直留到最后的就是正確結果了!
每道題具體分析與對應的代碼如下:
1、第一個答案是A的題目是哪個?()
A、1 B、2 C、3 D、4
對第一道題的約束條件,我使用了for循環找到當前方案中第一個答案是A的題目序號,并與第一題答案對應的題目進行比較,選項一致的才能通過進入下一層過濾。由于觀察發現ABCD選項答案對應的index序號且與ABCD的表示相等,所以最后的判斷可以直接簡化為比較答案序號與答案,如:當前方案第一題選A,那么第一道選A的題正好就是第一題,通過。
#規則一:第一個答案是A的結果
index = 0
for each_answer in t_result:
if each_answer == 0:
break
else:
if index < 4:
index+=1
#print '第一個答案是A的題是:',index+1
if not (t_result[index] == index):
#print '不符合第一條'
continue
else:
#規則二:唯一具有兩個相同答案的問題:……
2、唯一兩個具有連續相同答案的問題是:()
A、5,6? B、6,7? C、7,.8 D、8,9
對于第二題,要求找到唯一兩個連續相同答案,所以我另寫了一個方法find_same_answer,來得到有連續相同答案的個數。
#尋找有相同答案問題的方法
def find_same_answer(result):
count = 0
for i in range(9):
if result[i] == result[i+1]:
count += 1
return count
只有連續相同答案個數為1,并且它的位置正好出先在當前方案答案對應的位置,才能通過。如:當前方案選B,find_same_answer返回1,而第6,7題結果恰好相等,且方案通過。
#規則二:唯一具有兩個連續相同答案的問題:
if not ((find_same_answer(t_result) == 1) and ((t_result[1] == 0 and t_result[4] == t_result[5]) or \
(t_result[1] == 1 and t_result[5] == t_result[6]) or \
(t_result[1] == 2 and t_result[6] == t_result[7]) or \
(t_result[1] == 3 and t_result[7] == t_result[8]))):
#print '不符合第二條'
continue
else:
#規則三:本問題與哪個問題答案相同……
3、本問題答案與那一個問題答案相同?()
A、4? B、9? C、8? D、2
這題相對容易些,只要判斷第三題答案是否與選項對應的題目答案相同即可。、
#規則三:本問題與哪個問題答案相同
if not ((t_result[2] == 0 and t_result[2] == t_result[3]) or\
(t_result[2] == 1 and t_result[2] == t_result[8]) or\
(t_result[2] == 2 and t_result[2] == t_result[7]) or\
(t_result[2] == 3 and t_result[2] == t_result[1]) ):
#print '不符合第三條'
continue
else:
#規則四:答案是A的個數……
4、答案是A的問題個數是:()
A、5? B、4? C、3? D、2
為了搞定這道題并方便后面的判斷,我又寫了一個函數X_count,來計算當前方案中答案為X的題目個數:
#計算答案是X的個數的方法:
def X_count(result,x):
count = 0
for each in result:
if each == x:
count += 1
return count
如果對應的選項答案符合,就可以通過。
#規則四:答案是A的個數
if not ((t_result[3] == 0 and X_count(t_result,0) == 5) or\
(t_result[3] == 1 and X_count(t_result,0) == 4) or\
(t_result[3] == 2 and X_count(t_result,0) == 3) or\
(t_result[3] == 3 and X_count(t_result,0) == 2) ):
#print '不符合第四條'
continue
else:
#規則五:本問題與哪個問題答案相同……
5、本問題答案與那一道題問題答案相同?()
A、1? B、2? C、3? D、4
這道題也好說,只要判斷選項是否成立即可
#規則五:本問題與哪個問題答案相同
if not ((t_result[4] == 0 and t_result[4] == t_result[0]) or\
(t_result[4] == 1 and t_result[4] == t_result[1]) or\
(t_result[4] == 2 and t_result[4] == t_result[2]) or\
(t_result[4] == 3 and t_result[4] == t_result[3]) ):
#print '不符合第五條'
continue
else:
#規則六:選A問題個數與選什么的問題個數相同……
6、答案選A的問題個數與答案選勝的的問題個數相等?()
A、無????? B、C????? C、C??????? D、D
借用X_count方法,道題的判斷不難實現,遇上一題類似,只不過對于選項A、無,要麻煩一些,確保選A的個數與選BCD的個數都不相同。
#規則六:選A問題個數與選什么的問題個數相同
if not ((t_result[5] == 0 and not((X_count(t_result,0) == X_count(t_result,1)) or\
(X_count(t_result,0) == X_count(t_result,2)) or\
(X_count(t_result,0) == X_count(t_result,3)))) or\
(t_result[5] == 1 and X_count(t_result,0) == X_count(t_result,2)) or\
(t_result[5] == 2 and X_count(t_result,0) == X_count(t_result,2)) or\
(t_result[5] == 1 and X_count(t_result,0) == X_count(t_result,3)) ):
#print '不符合第六條'
continue
else:
#規則七:與下一題相差……
7、按照字母順序,本題答案與下一題相差()(A與B間,B與A間都差1)
A、3? B、2?? C、1? D、0
這道題如果直接按照題目描述,判斷條件會很麻煩,還涉及到求絕對值,所以我進行了簡單的分析,發現第7題選A的話下一題(第8題)只能選D,選B的話下一題只能選D,選C的話下一題可選A或D,選D的話下一題也只能選D,所以得到這道題的判斷條件:
#規則七:與下一題相差
if not ((t_result[6] == 0 and t_result[7] == 3) or\
(t_result[6] == 1 and t_result[7] == 3) or\
(t_result[6] == 2 and (t_result[7] == 3 or t_result[7] == 1))or\
(t_result[6] == 3 and t_result[7] == 3) ):
#print '不符合第七條'
continue
else:
#規則八、九:十道題中元音題數目……
8、十道題中答案為元音的題目數為()
A、0? B、1? C、2? D、3
9、是道題中答案為輔音的題目數為()
A、是合數? B、是質數?? C、<= 5?? D、是平方數
這兩道題雖然看起來很嚇人,不過其實如果稍加分析的話,可以排除很多答案,完全可以作為解整份題的突破點。
首先,元音只有A,輔音為BCD。第八題決定了選元音答案(即A)的數只能為0 1 2 3 ,那么第九題中輔音答案(BCD)個數也只能為7 8 9 10,不可能小于等于5,第九題C排除,而這四個數中8 9 10為合數,9又為平方數,所以第九題選D那么A也正確,因此第九題D也排除,又因為第一題就決定了題目中有A選項,所以第八題不選A而輔音數為7 或 8,所以這兩道題只剩兩種情況可選:輔音數為7,8選D 9選B;或者輔音數為8,8選C 9選A。因此判斷條件也就簡化了:
#規則八、九:十道題中元音題數目
if not ((t_result[7] == 2 and X_count(t_result,0) == 2) or\
(t_result[7] == 3 and X_count(t_result,0) == 3)):
#print '不符合第八九條'
continue
else:
print '得到了一個結果!'
10、本題答案為()
A、A????? B、B???? C、C???? D、D
這道題明顯屬于打醬油,答案完全取決于之前的九道題目,不管選什么,只要使得之前的九道題目都合理就好,因此不需要再加判斷。
好了,上面我們寫了那么多,終于可以遍歷并過濾了所有4^10種方案,得到合理的結果,所以我們還差最后一步,那就是打印的顯示出最終答案。所以,我有的一些了一個打印函數,把列表里的數字改為祖母選項打印出來:
#打印結果的方法
def print_result(result):
new = []
for each in result:
if each == 0:
new.append('A')
if each == 1:
new.append('B')
if each == 2:
new.append('C')
if each == 3:
new.append('D')
print new
最后調用一下這個方法,并把結果存到final_result列表里:
print '得到了一個結果!'
print_result(t_result)
final_result.append(t_result)
最后可以再打印一下final_result,看看所有結果:
print 'final_result',final_result
Ok,大功告成,完整的程序我附在了附件里,按F5運行,就得到了打印出的結果:
于是,借助計算機,我們費了很少的腦力解出了一份讓無數人頭疼的邏輯推理題。現在,我們拍著胸脯向周圍的小伙伴們說:這十道題有唯一的答案A, C, B, C, A, C, D, D, B, A? 了!
喬布斯說過,計算機是人類思想的自行車,學會用計算機是一門很重要的技能,它可以讓普通人也有能力做到天才能做的事,甚至完成的更好。所以,下次在生活中遇到令人頭疼的難題時,不妨開拓一下思路,想想可不可以用計算機程序來解決,可能就會事半功倍呦!
總結
以上是生活随笔為你收集整理的python考试编程题九道_一道逻辑推理题的程序实现(纯属娱乐)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: md5会重复吗_自媒体平台视频重复审查机
- 下一篇: mybatis update返回值_my