耳、指、頭から犯罪者を見つける


17

指紋とDNA検査の発見に先立ち、英国の警察は人体計測システムを使用して、繰り返し犯人を特定しました。犯罪者の身体の特定の部分が測定され、記録に保存されました-身体のこれらの部分は、成人後にサイズが変化しないと仮定されました。このシステムは bertillonnageました

次の図は、警察がこれらの記録にすばやくアクセスするために使用するファイリングシステムを示しています。

テーブル 図1:番号付きの引き出し付きのファイリングシステム。
注:イメージが表示されない場合は、imgurミラーを試す か、自分でコンパイルします

ファイリングキャビネットには、81個の番号付きの引き出しがあります。各引き出しにはカードが含まれており、各カードには犯罪者の身体の特定の部分の測定値が含まれています。

  • 頭の長さ(H
  • 頭の幅(B
  • 右耳の幅(E
  • 人差し指の長さ(F

各測定は、小、中、大のいずれかに分類されます。

例えば、引出し56は、以下の特性を有するカードを含んでいる:小H、大きなB、培地E、及び小F.これは文字を用いて表記することができSMおよびL小、中、大の代わりに:

SH,LB,ME,SF

サイズ文字が最初に表示され、次に測定値が表示されます。さらに、感嘆符!を前に置いてネガティブにすることもできます。

!SH,LB,!ME,SF

これは、次の特性を持つカードを示します:小Hではなく、大B、中Eではなく、小F。これらの特性(58、60、61、および63)を持つカードを含む4つの引き出しがあります。

あなたの仕事は、いくつかの特性を示す文字列が与えられると、それらの特性を持つカードを含むすべての引き出しを出力するプログラムを書くことです。特定の特性を持つカードを含むドロワーがない場合、output 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分のことほどにより複雑であり、したがってより複雑なファイリングシステムここに描かれているもの。
アブサン14

4
大野!別の数独の質問ではありません;-)
Level River St 14

1
私は実際に数独テンプレートからダイアグラムを作っ@steveverrillので、その中にいくつかの真実があります:oを
アブサン

回答:



6

Ruby 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。あなたは交換することにより、他の2つの文字をトリミングすることができy[-2..-1]y[-2,2]使用することにより、よりまだ、および3 ==[]の代わりに.empty?
三つの場合はウィスキー

@ThreeIfByWhiskey素晴らしいヒント、ありがとう!回答を編集しました。
クリスチャンルパスク14

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

T-SQL- 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

Mathematica 191 235

基数3の各セル番号を表します。各桁位置は身体の特徴を表します。数字の値{0,1,2}は、それぞれ「小」、「中」、「大」を表します。

機能は次のように数字に対応しています。

{「breadthOfHead」、「IndexFingerLength」、「LengthOfHead」、「WidthOfRightEar」}

たとえば、入力、

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

意味します:

「LB」は、breadthOfHead = 2(大)を意味します

「SF」はIndexFingerLength = 0(小さい)を意味します

「SH」は、LengthOfHead = 0(小さい)を意味します

「ME」はWidthOfRightEar = 1(中)を意味します

2001ベース3の55はベース10の55です。

ゼロではなく1からセルをカウントしているため、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"}]

{1、2、3、4、5、6、7、8、9}


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

0


1

Python 3-192- 試してみてください!

from itertools import*
S=input().split(',')
print([i+1for i in range(81)if eval('*'.join('(list(product(*["SML"]*4))[i][%d]%s="%s")'%('BFHE'.find(s[-1]),'!='[s[0]>'!'],s[-2])for s in S))]or 0)

1

Python 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]

出力には括弧があり、出力の順序を気にしません


はい、入力を角括弧で囲んでも大丈夫です。
アブサン14

順番どおりにする必要がありますか?
Bizangles 14

良い質問。実際には、出力が順序である必要はありません-私は別の順序でそれらを出力する文字を救うかどうかはわかりませんが。
アブサン

私はpython set()sを使用し、それらをリストに変換し、製品を取得し、ベース3の数値に変換してintに戻しています。そのすべてにおいて、順序は少し乱雑になります。正しい順序に戻すには、sorted()を使用する必要があります。
Bizangles 14

そうですか。順序は重要ではないため、sorted()は削除されます。いい解決策。
アブサン14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.