उसके कान, उंगली और सिर से एक अपराधी का पता लगाएं


17

अंगुलियों के निशान और डीएनए परीक्षण की खोज से पहले, ब्रिटिश पुलिस ने दोहराने वाले अपराधियों की पहचान करने के लिए मानवविज्ञान प्रणाली का उपयोग किया। अपराधियों के शरीर के कुछ हिस्सों को रिकॉर्ड में मापा और संग्रहीत किया गया था - शरीर के इन हिस्सों को वयस्कता के बाद आकार में नहीं बदलने के लिए माना गया था। इस प्रणाली को बर्टिलॉनेज के रूप में जाना जाता था ।

नीचे दिए गए आरेख में इन रिकॉर्ड्स को जल्दी से एक्सेस करने के लिए पुलिस द्वारा उपयोग किया जाने वाला एक फाइलिंग सिस्टम दिखाया गया है।

तालिका आरेख 1: गिने हुए दराज के साथ एक फाइलिंग सिस्टम।
नोट: यदि आप छवि नहीं देख सकते हैं, तो imgur दर्पण की कोशिश करें या इसे स्वयं संकलित करें

फाइलिंग कैबिनेट में 81 नम्बरदार ड्रावर होते हैं। प्रत्येक ड्रॉअर में कार्ड होते हैं, और प्रत्येक कार्ड में एक अपराधी के शरीर के विशेष भागों का माप होता है:

  • उनके सिर की लंबाई ( H)
  • उनके सिर की चौड़ाई ( B)
  • उनके दाहिने कान की चौड़ाई ( E)
  • उनकी तर्जनी की लंबाई ( F)

प्रत्येक माप को छोटे, मध्यम या बड़े के रूप में वर्गीकृत किया जाता है।

छोटे एच, बड़े बी, मध्यम ई, और छोटे एफ इस पत्र का उपयोग कर notated जा सकता है: उदाहरण के लिए, दराज 56 निम्नलिखित विशेषताओं के साथ कार्ड शामिल हैं S, Mऔर Lछोटे, मध्यम के स्थान पर, और बड़े:

SH,LB,ME,SF

ध्यान दें कि आकार पत्र पहले जाता है, फिर माप क्या है। इसके अलावा, एक विस्मयादिबोधक बिंदु !को एक नकारात्मक कारण के सामने रखा जा सकता है:

!SH,LB,!ME,SF

: यह कार्ड है कि निम्न विशेषताओं को इंगित करता है नहीं छोटे एच, बड़े बी, नहीं - 58, 60, 61, और 63 मध्यम ई, और छोटे एफ चार दराज कि इन विशेषताओं के साथ कार्ड शामिल हैं।

आपका कार्य एक प्रोग्राम लिखना है, जब, कुछ विशेषताओं को ध्यान में रखते हुए एक स्ट्रिंग दी जाती है, उन सभी ड्रॉर्स को आउटपुट करता है जिनमें उन विशेषताओं के साथ कार्ड होते हैं। यदि कोई भी दराज नहीं है जिसमें दिए गए विशेषताओं, आउटपुट के साथ कार्ड हैं 0

यहां कुछ नमूना इनपुट और आउटपुट दिए गए हैं।

  1. इनपुट: SH,LB,ME,SF
    आउटपुट:56
  2. इनपुट: !SH,LB,!ME,SF
    आउटपुट:58,60,61,63
  3. इनपुट: SB,!MF,!LF
    आउटपुट:1,2,3,4,5,6,7,8,9
  4. इनपुट: MH,!MH
    आउटपुट:0

यह कोड गोल्फ है, इसलिए सबसे छोटी प्रविष्टि जीतती है। यदि विनिर्देश स्पष्ट नहीं हैं, तो टिप्पणियों में प्रश्न पूछें।


सटीकता के लिए एक ऐतिहासिक नोट के रूप में, बर्टिलॉन्ज सिस्टम वास्तव में इस सरलीकृत संस्करण की तुलना में बहुत अधिक जटिल थे , 4 के बजाय 9 मापों का उपयोग करते हुए, और इस प्रकार एक अधिक शामिल फाइलिंग सिस्टम का उपयोग करके यहाँ दिखाया गया है।
एबिन्थे सेप

4
अरे नहीं! नहीं ANOTHER सुडोकू प्रश्न ;-)
लेवल रिवर सेंट।

1
@steveverrill मैंने वास्तव में एक सुडोकू टेम्पलेट से आरेख बनाया है, इसलिए इसमें कुछ सच्चाई है: o
absinthe

जवाबों:



6

रूबी 1.9.3 - 173 157 143

x=(1..81).select{|j|$*[0].split(?,).all?{|y|i=j-1
z='SML'
[z[i%9/3]+?H,z[i%3]+?E,z[i/27]+?B,z[i/9%3]+?F].member?(y[-2,2])^y[?!]}}
p x==[]?[0]:x

संपादित करें:

  • व्हिस्की की युक्तियों के अनुसार थ्री अप्लाइड ।
  • कुछ और चार्ट को बचाने के लिए कमांड लाइन से पैरामीटर लिया गया

ऑनलाइन डेमो: http://ideone.com/lodTLt


selectके लिए एक छोटा पर्याय है find_all। आप की जगह एक और दो अक्षर ट्रिम कर सकता है y[-2..-1]के साथ y[-2,2]का उपयोग करके अभी भी, और तीन और ==[]के बजाय .empty?
तीन अगर व्हिस्की

@ThreeIfByWhiskey बढ़िया टिप्स, धन्यवाद! मैंने अपना उत्तर संपादित कर दिया है।
क्रिस्टियन लुपस्कू

2

स्काला - 951

निश्चित रूप से यह एक नहीं जीतेगा, मुख्य रूप से निर्मित कार्यों के नाम के कारण जो मुझे लगता है।

def m(a: List[Int]) = 0 to 8 flatMap (x => a map (_ + 9*x)) toSet
var SH = m(List(1,2,3))
var MH = m(List(4,5,6))
var LH = m(List(7,8,9))
var SE = m(List(1,4,7))
var ME = m(List(2,5,8))
var LE = m(List(3,6,9))
var SB = 1 to 27 toSet
var MB = 28 to 54 toSet
var LB = 55 to 81 toSet
def l(a: List[Int]) = 0 to 2 flatMap (x => a map (_+27*x)) toSet
var SF = l(1 to 9 toList)
var MF = l(10 to 18 toList)
var LF = l(19 to 27 toList)

var j = Map(("LH",LH),("MH",MH),("SH",SH),("LB",LB),("MB",MB),("SB",SB),("LF",LF),("MF",MF),("SF",SF),("LE",LE),("ME",ME),("SE",SE))

def f(x : String) = {
  def h(i : List[String], k : Set[Int]) : Set[Int] = {
      if(i isEmpty) k
      else if(i.head.startsWith("!")) h(i.tail, k filterNot (j(i.head.replace("!","")) contains _))
      else h(i.tail, k intersect j(i.head))
  }
  h(x split "," toList, 1 to 81 toSet) mkString ","
}

तर्क को समारोह में पारित किया जाता है f

f("SH,LB,ME,SF") = 56


2

टी-एसक्यूएल - 547 544

एक विजेता प्रविष्टि नहीं है, लेकिन इस प्रकार की समस्या के अनुकूल है।

ग्रिड टेबल सेटअप - 254

SELECT ROW_NUMBER()OVER(ORDER BY (SELECT $))I,LEFT(Z,1)E,RIGHT(Z,1)H,LEFT(Y,1)F,RIGHT(Y,1)B INTO G FROM(VALUES('SS'),('MS'),('LS'),('SM'),('MM'),('LM'),('SL'),('ML'),('LL'))FB(Y),(VALUES('SS'),('MS'),('LS'),('SM'),('MM'),('LM'),('SL'),('ML'),('LL'))EH(Z)

प्रश्न - 293 290

DECLARE @S CHAR(400)='SELECT ISNULL(SUBSTRING(O,2,99),0)FROM (SELECT CONCAT('','',I)FROM G WHERE '+REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REVERSE(@i),',',' AND '),'S!','!S'),'M!','!M'),'L!','!L'),'S','=''S'''),'M','=''M'''),'L','=''L''')+' FOR XML PATH(''''))O(O)';EXEC(@S)

क्वेरी से पहले @i घोषित करके इनपुट किया जाता है

DECLARE @I VARCHAR(50) = 'SB,!MF,!LF';

अगर आउटपुट कॉमा सीमांकित पंक्ति के लिए नहीं होता है तो मैं एक और 89 अक्षर बचा सकता हूं

DECLARE @S CHAR(400)='SELECT I FROM G WHERE '+REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REVERSE(@i),',',' AND '),'S!','!S'),'M!','!M'),'L!','!L'),'S','=''S'''),'M','=''M'''),'L','=''L''')

1

गणितज्ञ 191 235

आधार में प्रत्येक सेल नंबर का प्रतिनिधित्व करता है 3. प्रत्येक अंक की स्थिति एक शारीरिक विशेषता का प्रतिनिधित्व करती है। अंक का मान, {0,1,2}, क्रमशः "स्मॉल", "मीडियम", "लार्ज" को दर्शाता है।

विशेषताएं निम्नानुसार अंकों के अनुरूप हैं:

{"ब्रेडऑफहेड", "इंडेक्सफिंगर लैंथ", "लेंथऑफहेड", "विडथऑफराइट" "}

उदाहरण के लिए, इनपुट,

{"SH","LB","ME","SF"}

प्रतीक:

"LB" का अर्थ है ब्रेडऑफहेड = 2 (बड़ा)

"SF" का तात्पर्य है IndexFingerLength = 0 (छोटा)

"SH" से तात्पर्य है लंबाईऑफहेड = 0 (छोटा)

"ME" का अर्थ है WidthOfRightEar = 1 (माध्यम)

2001बेस 3 में बेस 10 में 55 है।

हमें एक जोड़ने की आवश्यकता है क्योंकि हम 1 से कोशिकाओं की गिनती कर रहे हैं, शून्य नहीं।


कोड

c=Characters;t=Table[IntegerDigits[k,3,4],{k,0,80}];
f@i_:=1+FromDigits[#,3]&/@Intersection@@(Cases[t,#]&/@(ReplacePart[{_,_,_,_},{#}]&/@(c/@i
/.Thread[c@"BFHESML"-> {1,2,3,4,0,1,2}]/.{{"!",v_,n_}:> (n-> Except[v]),{v_Integer,n_}:> n-> v})))
/.{}:>0

परीक्षण के मामलों

f[{"SH","LB","ME","SF"}]

{56}


f[{"!SH","LB","!ME","SF"}]

{58, 60, 61, 63}


f[{"SB","!MF","!LF"}]

{, 2, 3, 4, 5, 6, 7, 8, 9}


f[{"MH","!MH"}]

0



1

अजगर 2 - 194

from itertools import*
n=map(set,['012']*4)
for x in raw_input().split(','):n['BFHE'.find(x[-1])]&=set(`'SML'.find(x[-2])`)^set('012'*(x<'"'))
print[1+int(''.join(x),3)for x in product(*n)]or[0]

आउटपुट में कोष्ठक होते हैं, और आउटपुट के आदेश की परवाह नहीं करते हैं
। फालको के कुछ सुझाव, और खुद से कुछ जोड़े 10 वर्णों को हटाने के लिए।


हां, कोष्ठक में लिपटा हुआ इनपुट होना ठीक है।
अनुप

क्या उन्हें क्रम में रहने की आवश्यकता है?
2

अच्छा प्रश्न। वास्तव में, उत्पादन क्रम में होने की जरूरत नहीं है - हालांकि मुझे यकीन है कि कैसे एक अलग आदेश पात्रों की बचत होगी में उन्हें outputting नहीं हूँ।
चिरायता

मैं अजगर सेट () का उपयोग कर रहा हूं, उन्हें वापस सूचियों में परिवर्तित कर रहा हूं, उत्पाद प्राप्त कर रहा हूं, बेस 3 नंबरों को वापस ints में परिवर्तित कर रहा हूं। उस सब में, आदेश थोड़ा गड़बड़ हो जाता है और मुझे क्रमबद्ध () का उपयोग करने की आवश्यकता होती है यदि मैं उन्हें सही क्रम में वापस चाहता हूं।
2

समझा। आदेश महत्वपूर्ण नहीं है इसलिए छंटनी () को हटाया जा सकता है। अच्छा समाधान है।
अनुप
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.