그의 귀, 손가락 및 머리에서 범죄자를 찾으십시오


17

지문과 DNA 테스트를 발견하기 전에 영국 경찰은 인체 측정 시스템을 사용하여 반복 범죄자를 식별했습니다. 범죄자 신체의 특정 부분을 측정하고 기록으로 저장했습니다.이 신체 부분은 성인 후에는 크기가 변하지 않은 것으로 가정되었습니다. 이 시스템은 bertillonnage라고 합니다.

아래 다이어그램은 경찰이 이러한 기록에 빠르게 액세스하기 위해 사용하는 신고 시스템을 보여줍니다.

표 그림 1 : 서랍이있는 서류 정리 시스템.
참고 : 이미지를 볼 수 없으면 이미지 미러를 시도 하거나 직접 컴파일하십시오 .

파일 캐비넷은 81 개의 서랍으로 구성되어 있습니다. 각 서랍에는 카드가 들어 있으며 각 카드에는 범죄자의 신체의 특정 부분에 대한 측정 값이 있습니다.

  • 머리 길이 ( H)
  • 그들의 머리 너비 ( B)
  • 오른쪽 귀의 너비 ( E)
  • 검지 길이 ( F)

각 측정은 소규모, 중간 또는 대규모로 분류됩니다.

작은 H 큰 B, E 매질과 작은 F. 이것은 문자를 사용하여 표기 할 수있다 : 예를 들어, 카세트 (56)는 다음의 특성을 갖는 카드를 포함 S, ML중소 대신에, 대형 :

SH,LB,ME,SF

크기 문자가 먼저 표시된 다음 측정 값에 유의하십시오. 또한 느낌표 !를 앞에 놓아 부정을 일으킬 수 있습니다.

!SH,LB,!ME,SF

이 특징은 다음 카드가 나타내고 있지 작은 H 큰 B, 아니 - 58, 60, 61, 63 중 E, 작은 F. 네 이러한 특성으로 카드를 포함하는 서랍이있다.

당신의 임무는 일부 특성을 나타내는 문자열이 주어지면 해당 특성을 가진 카드가 들어있는 모든 서랍을 출력하는 프로그램을 작성하는 것입니다. 주어진 특성을 가진 카드가 들어있는 드로어가없는 경우 출력하십시오 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 개의 측정을 사용하므로보다 복잡한 파일링 시스템을 사용합니다. 여기에 묘사 된 것.
absinthe

4
아뇨! 다른 스도쿠 질문이 아닙니다 ;-)
Level River St

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?.
Three If By Whisky

@ThreeIfByWhiskey 훌륭한 팁, 감사합니다! 내 답변을 편집했습니다.
Cristian Lupascu

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

매스 매 티카 (191) (235)

밑 3의 각 셀 번호를 나타냅니다. 각 숫자 위치는 신체 특징을 나타냅니다. 숫자 {0,1,2}의 값은 각각 "Small", "Medium", "Large"를 나타냅니다.

기능은 다음과 같은 숫자에 해당합니다.

{ "breadthOfHead", "IndexFingerLength", "LengthOfHead", "WidthOfRightEar"}

예를 들어, 입력

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

의미합니다 :

"LB"는 breadthOfHead = 2 (대)를 의미합니다

"SF"는 IndexFingerLength = 0 (소)을 의미합니다

"SH"는 LengthOfHead = 0 (소)을 의미합니다

"ME"는 WidthOfRightEar = 1 (중간)을 의미합니다

2001밑 3의 밑은 10의 55입니다.

우리는 0이 아닌 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

파이썬 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]

출력에는 대괄호가 있으며 출력 순서는 신경 쓰지 않습니다.
Falko의 몇 가지 제안과 10자를 내릴 수있는 나 자신의 커플.


그렇습니다. 입력을 괄호로 묶어도 괜찮습니다.
absinthe

순서대로해야합니까?
Bizangles

좋은 질문. 나는 확실히 문자를 절약 할 다른 순서로 출력하는 방법을 모르겠어요하지만 - 사실, 출력 순서에있을 필요는 없습니다.
압생트

파이썬 set ()을 사용하여 목록으로 다시 변환하고 제품을 가져오고 기본 3 숫자를 정수로 다시 변환합니다. 이 모든 순서에서 순서가 약간 뒤죽박죽이며 올바른 순서로 다시 정렬하려면 sorted ()를 사용해야합니다.
Bizangles

내가 참조. 순서는 중요하지 않으므로 sorted ()가 제거 될 수 있습니다. 좋은 해결책.
absinthe
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.