Tìm một tên tội phạm từ tai, ngón tay và đầu của anh ta


17

Trước khi phát hiện dấu vân tay và xét nghiệm DNA, cảnh sát Anh đã sử dụng hệ thống nhân trắc học để xác định những kẻ phạm tội lặp lại. Một số bộ phận của cơ thể của tội phạm đã được đo và lưu trữ trong hồ sơ - những bộ phận này của cơ thể được cho là không thay đổi kích thước sau khi trưởng thành. Hệ thống này được gọi là bertillonnage .

Sơ đồ dưới đây cho thấy một hệ thống nộp đơn được cảnh sát sử dụng để truy cập các hồ sơ này một cách nhanh chóng.

Bàn Sơ đồ 1: Một hệ thống lưu trữ với các ngăn kéo được đánh số.
Lưu ý: nếu bạn không thể nhìn thấy hình ảnh, hãy thử gương imgur hoặc tự biên dịch nó .

Tủ hồ sơ bao gồm 81 ngăn kéo được đánh số. Mỗi ngăn chứa thẻ và mỗi thẻ có số đo các bộ phận cụ thể của cơ thể tội phạm:

  • Độ dài của đầu họ ( H)
  • Độ rộng của đầu của họ ( B)
  • Chiều rộng của tai phải của họ ( E)
  • Độ dài của ngón trỏ ( F)

Mỗi phép đo được phân loại là nhỏ, trung bình hoặc lớn.

Ví dụ, ngăn kéo 56 chứa thẻ với các đặc điểm sau: H nhỏ, lớn B, trung bình E và F. nhỏ này có thể được ký hiệu bằng các chữ cái S, MLở vị trí của nhỏ, vừa và lớn:

SH,LB,ME,SF

Lưu ý rằng kích thước chữ đi trước, sau đó đo là gì. Ngoài ra, một dấu chấm than !có thể được đặt ở phía trước để gây ra tiêu cực:

!SH,LB,!ME,SF

Điều này biểu thị các thẻ có các đặc điểm sau: không nhỏ H, B lớn, không trung bình E và nhỏ F. Có bốn ngăn chứa các thẻ có các đặc điểm này - 58, 60, 61 và 63.

Nhiệm vụ của bạn là viết một chương trình, khi được cung cấp một chuỗi ký hiệu một số đặc điểm, sẽ xuất ra tất cả các ngăn chứa thẻ có các đặc điểm đó. Nếu không có ngăn kéo chứa thẻ với các đặc điểm nhất định, đầu ra 0.

Dưới đây là một số mẫu đầu vào và đầu ra.

  1. Đầu vào: SH,LB,ME,SF
    Đầu ra:56
  2. Đầu vào: !SH,LB,!ME,SF
    Đầu ra:58,60,61,63
  3. Đầu vào: SB,!MF,!LF
    Đầu ra:1,2,3,4,5,6,7,8,9
  4. Đầu vào: MH,!MH
    Đầu ra:0

Đây là mã golf, vì vậy mục ngắn nhất sẽ thắng. Đặt câu hỏi trong các ý kiến ​​nếu đặc điểm kỹ thuật không rõ ràng.


Là một lưu ý lịch sử về tính chính xác, hệ thống bertillonnage đã thực sự nhiều hơn phức tạp hơn so với phiên bản đơn giản này, sử dụng 9 đo thay vì 4, và do đó sử dụng một hệ thống nộp đơn tham gia hơn một mô tả ở đây.
absinthe

4
Ôi không! không phải câu hỏi Sudoku KHÁC ;-)
Level River St

1
@steveverrill Tôi thực sự đã tạo sơ đồ từ một mẫu sudoku, vì vậy có một sự thật trong đó: o
absinthe

Câu trả lời:


1

GolfScript 95 ( DEMO )

','/:r;81,{r{1$[[.9%3/\.3%\.27/\9/3%]{'SML'=}%'HEBF']zip{''+}%\.,3=\1${(;}*@?)!!=},!\;},{)}%0or

6

Hồng ngọc 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

Biên tập:

  • áp dụng lời khuyên của Three If By Whiskey .
  • lấy tham số từ dòng lệnh để lưu thêm một số ký tự

Bản demo trực tuyến: http://ideone.com/lodTLt


selectlà một từ đồng nghĩa ngắn hơn cho find_all. Bạn có thể cắt hai ký tự khác bằng cách thay thế y[-2..-1]bằng y[-2,2], và ba ký tự khác bằng cách sử dụng ==[]thay vì .empty?.
Three If By Whiskey

@Three IfByWhiskey Lời khuyên tuyệt vời, cảm ơn! Tôi đã chỉnh sửa câu trả lời của mình.
Cristian Lupascu

2

Scala - 951

Tôi chắc chắn sẽ không giành được cái này, chủ yếu là do tên của các chức năng được xây dựng mà tôi nghĩ.

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 ","
}

Đối số được truyền vào hàm f

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


2

T-SQL - 547 544

Không phải là một mục chiến thắng, nhưng phù hợp với loại vấn đề này.

Thiết lập bảng lưới - 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)

Truy vấn - 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)

Đầu vào được thực hiện bằng cách khai báo @i trước khi truy vấn

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

Tôi có thể lưu thêm 89 ký tự nếu đầu ra không phải là hàng được phân cách bằng dấu phẩy

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

Toán học 191 235

Đại diện cho mỗi số ô trong cơ sở 3. Mỗi vị trí chữ số đại diện cho một tính năng cơ thể. Giá trị của chữ số, {0,1,2}, tương ứng là "Nhỏ", "Trung bình", "Lớn".

Các tính năng tương ứng với các chữ số như sau:

{"BreadthOfHead", "IndexFingerLpm", "LengthOfHead", "WidthOfRightEar"}

Ví dụ: đầu vào,

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

biểu thị:

"LB" ngụ ý BreadthOfHead = 2 (lớn)

"SF" ngụ ý IndexFingerLpm = 0 (nhỏ)

"SH" ngụ ý Độ dàiOfHead = 0 (nhỏ)

"ME" ngụ ý WidthOfRightEar = 1 (trung bình)

2001ở cơ sở 3 là 55 ở cơ sở 10.

Chúng ta cần thêm một vì chúng ta đang đếm các ô từ 1 chứ không phải không.


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

Các trường hợp thử nghiệm

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 - Hãy thử nó!

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

Con trăn 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]

Đầu ra có dấu ngoặc và không quan tâm đến thứ tự đầu ra
Một số gợi ý từ Falko và một vài từ bản thân tôi để đưa ra 10 ký tự.


Có, không có vấn đề gì khi đóng gói trong ngoặc.
absinthe

Họ có cần phải theo thứ tự?
Bizangles

Câu hỏi hay. Trên thực tế, sản lượng không nhất thiết phải theo thứ tự - mặc dù tôi không chắc chắn như thế nào xuất ra chúng theo một thứ tự khác nhau sẽ tiết kiệm ký tự.
absinthe

Tôi đang sử dụng python set (), chuyển đổi chúng trở lại danh sách, nhận sản phẩm, chuyển đổi thành 3 số cơ bản trở lại ints. Trong tất cả điều đó, thứ tự bị xáo trộn một chút và tôi cần sử dụng sort () nếu tôi muốn chúng trở lại theo đúng thứ tự.
Bizangles

Tôi hiểu rồi. Thứ tự không quan trọng để sắp xếp () có thể bị xóa. Giải pháp tốt đẹp.
absinthe
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.