Kulağı, parmağı ve kafasından bir suçlu bulun


17

Parmak izlerini ve DNA testlerini keşfetmeden önce, İngiliz polisi tekrar suçluları tanımlamak için antropometrik bir sistem kullandı. Suçluların cesetlerinin bazı bölümleri ölçüldü ve kayıtlarda saklandı - vücudun bu kısımlarının yetişkinlikten sonra boyutta değişmediği varsayıldı. Bu sistem bertillonnage olarak biliniyordu .

Aşağıdaki şema, polis tarafından bu kayıtlara hızlı bir şekilde erişmek için kullanılan bir dosyalama sistemini göstermektedir.

tablo Şema 1: Numaralı çekmeceli bir dosyalama sistemi.
Not: Görüntüyü göremiyorsanız, imgur aynasını deneyin veya kendiniz derleyin .

Dosya dolabı 81 numaralı çekmeceden oluşur. Her çekmece kart içerir ve her kart bir suçlunun vücudunun belirli bölümlerinin ölçümlerine sahiptir:

  • Kafalarının uzunluğu ( H)
  • Başlarının genişliği ( B)
  • Sağ kulaklarının genişliği ( E)
  • İşaret parmağının uzunluğu ( F)

Her ölçüm küçük, orta veya büyük olarak sınıflandırılır.

Küçük, H, yaygın büyük B, E ortamı ve küçük F. Bu harfler kullanılarak notated edilebilir: Örneğin, çekmece 56, aşağıdaki özelliklere sahip kartı içerir S, Mve Lküçük, orta yerine ve büyük:

SH,LB,ME,SF

Önce boyut harfinin, ardından ölçümün ne olduğuna dikkat edin. Ek olarak, !bir olumsuzluğa neden olmak için öne bir ünlem işareti yerleştirilebilir:

!SH,LB,!ME,SF

Bu, aşağıdaki özelliklere sahip kartı göstermektedir olmayan küçük, H, yaygın büyük B, değil - 58, 60, 61 ve 63, orta E ve küçük F. dört, bu özelliklere sahip olan kart içeren çekmece vardır.

Göreviniz, bazı özellikleri gösteren bir dize verildiğinde, bu özelliklere sahip kartlar içeren tüm çekmecelerin çıktısını veren bir program yazmaktır. Belirtilen özelliklere sahip kartlar içeren çekmece yoksa çıktı alın 0.

İşte bazı örnek giriş ve çıkışlar.

  1. Giriş: SH,LB,ME,SF
    Çıkış:56
  2. Giriş: !SH,LB,!ME,SF
    Çıkış:58,60,61,63
  3. Giriş: SB,!MF,!LF
    Çıkış:1,2,3,4,5,6,7,8,9
  4. Giriş: MH,!MH
    Çıkış:0

Bu kod golf, bu yüzden en kısa giriş kazanır. Şartnamenin net olup olmadığı yorumlarda soru sorun.


Doğruluk için tarihsel bir not olarak, bertillonnage sistemleri aslında bu basitleştirilmiş versiyondan çok daha karmaşıktı, 4 yerine 9 ölçüm kullanarak ve dolayısıyla daha karmaşık bir dosyalama sistemi kullanıyordu. burada tasvir edilen.
absinthe

4
Oh hayır! BAŞKA bir Sudoku sorusu değil ;-)
Level River St

1
@steveverrill Aslında bir sudoku şablonundan diyagramı yaptım, bu yüzden bazı gerçekler var: o
absinthe

Yanıtlar:


1

GolfScript 95 ( DEMO )

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

6

Yakut 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

Düzenle:

  • Three If By Whisky'nin ipuçlarını uyguladı .
  • daha fazla karakter kaydetmek için komut satırından parametreler aldı

Çevrimiçi demo: http://ideone.com/lodTLt


selectiçin daha kısa bir eşanlamlıdır find_all. Sen değiştirerek başka iki karakter Döşeme olabilir y[-2..-1]ile y[-2,2]kullanarak yine üç tane daha, ve ==[]yerine .empty?.
Three If By Whisky tarafından

@ThreeIfByWhiskey Harika ipuçları, teşekkürler! Cevabımı düzenledim.
Cristian Lupascu

2

Scala - 951

Kesinlikle bu bir kazanmayacak, esas olarak yerleşik fonksiyonların isimleri nedeniyle düşünüyorum.

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

Bağımsız değişken işleve aktarılır f

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


2

T-SQL - 547 544

Kazanan bir giriş değil, bu tür problemlere uygundur.

Izgara Tablosu Kurulumu - 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)

Sorgu - 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)

Giriş sorgudan önce @ i bildirilerek yapılır

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

Çıktının virgülle ayrılmış satır olması gerekmiyorsa 89 karakter daha kaydedebilirim

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

Taban 3'teki her hücre numarasını temsil eder. Her basamak konumu bedensel bir özelliği temsil eder. Rakamın değeri, {0,1,2}, sırasıyla "Küçük", "Orta", "Büyük" ü temsil eder.

Özellikler aşağıdaki rakamlara karşılık gelir:

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

Örneğin, girdi,

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

anlamı:

"LB", genişlik = 2 (büyük) anlamına gelir

"SF" IndexFingerLength = 0 (küçük) anlamına gelir

"SH", LengthOfHead = 0 (küçük) anlamına gelir

"ME" WidthOfRightEar = 1 (orta) anlamına gelir

2001taban 3'te taban 10'da 55'tir.

Bir tane eklemeliyiz çünkü sıfırdan değil 1'den hücreleri sayıyoruz.


kod

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

Test Durumları

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 - Deneyin!

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]

Çıktının köşeli parantezleri vardır ve çıktı sırasına aldırış etmeyin
Falko'nun bazı önerileri ve kendimden birkaç karakter 10 karakter çıkarması için.


Evet, girdinin parantez içine alınması iyi bir şey.
Absinthe

Düzgün olmaları gerekiyor mu?
Bizangles

İyi soru. Emin karakterleri kurtaracak farklı bir sırada çıktılamayıp nasıl değilim rağmen - Aslında çıkış sırada olması gerekmez.
pelin otu

Ben python set () s, bunları listelere geri dönüştürmek, ürün almak, tekrar ints için 3 taban sayı dönüştürmek kullanıyorum. Tüm bunlar, sipariş biraz karışık alır ve ben onları doğru sırayla istiyorum eğer sıralanmış () kullanmanız gerekir.
Bizangles

Anlıyorum. Sıralama önemli değildir, bu nedenle sıralanmış () kaldırılabilir. Güzel çözüm.
Absinthe
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.