Mathematica,% 100, 141 bayt
f@x_:=Count[1>0]@Table[ImageInstanceQ[x,"caprine animal",RecognitionThreshold->i/100],{i,0,50}];If[f@#>f@ImageReflect@#,"Up","Down"]<>"goat"&
Peki, bu hile yapmaktan biraz daha fazlasını hissediyor. Ayrıca aptal olmanın yanı sıra inanılmaz derecede yavaş. İşlev f
, Tanıma eşiğini Mathematica'nın bilgisayarlı görme yerleşiklerinden birinde ne kadar yükseğe ayarlayabileceğinizi ve yine de görüntüyü bir Caprine hayvanı olarak tanıyabildiğinizi kabaca görür.
Daha sonra görüntünün veya çevrilen görüntünün daha keçi olup olmadığını görürüz. Profil resminizde çalışır, çünkü kravat indirilmekten yanadır. Muhtemelen, resmin Bovidleri veya Caprine hayvan varlık tipinin diğer genellemelerini temsil edip etmediğini sormak da dahil olmak üzere, bunun geliştirilebileceği birçok yol vardır.
İlk test setinde% 100 ve ikinci test setinde% 94, algoritma ise keçi 1 için sonuçsuz bir sonuç verdiğinden, yazılı puanlar olarak yanıtlayın. daha fazla değerin test edilmesi RecognitionThreshold
. Dan Raising 100
için 1000
sufficies; nedense Mathematica bunun çok çirkin bir görüntü olduğunu düşünüyor! Tanınma varlığının Caprine hayvanından Hoofed Mammal'a değiştirilmesi de işe yarıyor.
Ungolfed:
goatness[image_] := Count[
Table[
ImageInstanceQ[
image, Entity["Concept", "CaprineAnimal::4p79r"],
RecognitionThreshold -> threshold
],
{threshold, 0, 0.5, 0.01}
],
True
]
Function[{image},
StringJoin[
If[goatness[image] > goatness[ImageReflect[image]],
"Up",
"Down"
],
"goat"
]
]
Alternatif çözüm,% 100 + bonus
g[t_][i_] := ImageInstanceQ[i, "caprine animal", RecognitionThreshold -> t]
f[i_, l_: 0, u_: 1] := Module[{m = (2 l + u)/3, r},
r = g[m] /@ {i, ImageReflect@i};
If[Equal @@ r,
If[First@r, f[i, m, u], f[i, l, m]],
If[First@r, "Up", "Down"] <> "goat"
]
]
Bu, daha önce olduğu gibi aynı stratejiyi kullanır, ancak eşik üzerinde ikili bir arama yapar. Burada yer alan iki fonksiyon vardır:
g[t]
argümanının eşikli bir keçi resmi olup olmadığını döndürür t
.
f
üç parametre alır: bir görüntü ve eşik üzerinde bir üst ve alt sınır. Özyinelemeli; m
alt ve üst eşikler arasındaki bir eşiği test ederek çalışır (aşağıya doğru eğilimli). Görüntü ve yansıyan görüntü hem keçi ise hem de keçi olmayansa, aralığın alt veya üst kısmını uygun şekilde ortadan kaldırır ve kendini tekrar çağırır. Aksi takdirde, bir görüntü keçi, diğeri keçi Upgoat
değilse, ilk görüntü keçi Downgoat
ise ve ikinci ise (ikinci, yansıtılan görüntü keçi ise) döner.
İşlev tanımları küçük bir açıklamayı hak eder. İlk olarak, fonksiyon uygulaması sol ilişkilidir. Bu, gibi bir g[x][y]
şeyin yorumlandığı anlamına gelir (g[x])[y]
; "sonucu g[x]
uygulanan y
".
İkincisi, Mathematica'daki atama kabaca bir değiştirme kuralını tanımlamaya eşdeğerdir. Yani, f[x_] := x^2
yok değil demek "adında bir işlev bildirmek f
parametresi ile x
döner x^2
;" anlamı, "ne zaman bir şey görürsen f[ ... ]
, içindeki şeyi çağır x
ve tüm şeyi değiştir x^2
."
Bu ikisini bir araya getirerek, tanımının g
Mathematica'ya formun herhangi bir ifadesini (g[ ... ])[ ... ]
atamanın sağ tarafıyla değiştirmesini söylediğini görebiliriz .
Mathematica ifadesiyle g[m]
(ikinci satırında f
) karşılaştığında, ifadenin bildiği herhangi bir kuralla eşleşmediğini ve değişmediğini görür. Ardından , argümanları olan Map
operatör ve liste ile eşleşir . ( infix notasyonu; bu ifade tam olarak eşdeğerdir .) İlk argümanını, ikinci argümanının her bir elemanına uygulayarak değiştirilir . Şimdi Mathematica, her bir elemanın tanımla eşleştiğini ve yerine geçtiğini görüyor ./@
g[m]
{i, ImageReflect@i}
/@
Map[g[m], { ... }]
Map
{(g[m])[i], (g[m])[ ... ]}
g
Bu şekilde g
başka bir işlevi döndüren bir işlev gibi hareket etmeliyiz; yani, yazdığımız gibi kabaca davranır:
g[t_] := Function[{i}, ImageInstanceQ[i, "caprine animal", RecognitionThreshold -> t]]
(Bu durumda hariç g[t]
, kendi başına a değerlendirir Function
, oysa önce g[t]
kendi başına hiç dönüşmemiş.)
Kullandığım son numara isteğe bağlı bir kalıp. Desen l_ : 0
"Herhangi ifadeyle eşleşen ve mevcut olarak yapmak demektir l
, ya da hiçbir şey maç ve yapmak 0
olarak kullanılabilir l
." Yani, f[i]
bir argümanla (test edilecek görüntü) çağırırsanız , aramışsınız gibi olur f[i, 0, 1]
.
İşte kullandığım test kablo demeti:
gist = Import["https://api.github.com/gists/3fb94bfaa7364ccdd8e2", "JSON"];
{names, urls} = Transpose[{"filename", "raw_url"} /. Last /@ ("files" /. gist)];
images = Import /@ urls;
result = f /@ images
Tally@MapThread[StringContainsQ[##, IgnoreCase -> True] &, {names, result}]
(* {{True, 18}} *)
user = "items" /.
Import["https://api.stackexchange.com/2.2/users/40695?site=codegolf", "JSON"];
pic = Import[First["profile_image" /. user]];
name = First["display_name" /. user];
name == f@pic
(* True *)