Mathematica, 100%, 141 byte
f@x_:=Count[1>0]@Table[ImageInstanceQ[x,"caprine animal",RecognitionThreshold->i/100],{i,0,50}];If[f@#>f@ImageReflect@#,"Up","Down"]<>"goat"&
Yah, ini terasa lebih dari sedikit seperti curang. Ini juga sangat lambat dan juga sangat konyol. Fungsi fmelihat kira-kira seberapa tinggi Anda dapat mengatur ambang Pengakuan di salah satu builtin visi komputer Mathematica, dan masih mengenali gambar sebagai hewan Caprine.
Kita kemudian melihat apakah gambar atau gambar yang dibalik itu lebih konyol. Bekerja pada gambar profil Anda hanya karena dasi rusak karena downgoat. Mungkin ada banyak cara ini dapat diperbaiki termasuk menanyakan apakah gambar tersebut mewakili Bovids atau generalisasi lain dari jenis entitas hewan Caprine.
Jawaban sebagai skor tertulis 100% untuk set pengujian pertama dan 94% untuk set pengujian kedua, karena algoritma menghasilkan hasil yang tidak meyakinkan untuk kambing 1. Ini dapat dinaikkan kembali hingga 100% dengan mengorbankan waktu komputasi yang lebih lama oleh menguji lebih banyak nilai RecognitionThreshold. Budidaya dari 100ke 1000sufficies; untuk beberapa alasan, Mathematica menganggap itu gambar yang sangat tidak sopan! Mengubah entitas pengenalan dari hewan Caprine ke Hoofed Mammal juga tampaknya berhasil.
Tidak Terkumpul:
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"
]
]
Solusi alternatif, 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"
]
]
Yang ini menggunakan strategi yang sama seperti sebelumnya, tetapi dengan pencarian biner di atas ambang batas. Ada dua fungsi yang terlibat di sini:
g[t]mengembalikan apakah argumennya adalah gambar kambing dengan ambang batas t.
fmengambil tiga parameter: gambar, dan batas atas dan bawah pada ambang batas. Itu rekursif; ini bekerja dengan menguji ambang batas mantara ambang atas dan bawah (bias ke arah bawah). Jika gambar dan gambar yang dipantulkan keduanya adalah kambing atau non-kambing, itu menghilangkan bagian bawah atau atas rentang yang sesuai dan menyebut dirinya lagi. Kalau tidak, jika satu gambar adalah kambing dan yang lain adalah non-kambing, ia mengembalikan Upgoatjika gambar pertama adalah kambing dan Downgoatsebaliknya (jika yang kedua, gambar yang dipantulkan adalah kambing)
Definisi fungsi perlu sedikit penjelasan. Pertama, aplikasi fungsi adalah asosiatif kiri. Ini berarti bahwa sesuatu seperti g[x][y]ditafsirkan sebagai (g[x])[y]; "Hasil g[x]diterapkan ke y."
Kedua, penugasan dalam Mathematica kira-kira setara dengan mendefinisikan aturan penggantian. Artinya, f[x_] := x^2tidak tidak berarti "mendeklarasikan fungsi bernama fdengan parameter xyang mengembalikan x^2;" artinya lebih dekat dengan, "setiap kali Anda melihat sesuatu seperti f[ ... ], panggil benda itu di dalam xdan ganti semuanya dengan x^2."
Menyatukan keduanya, kita dapat melihat bahwa definisi gmemberi tahu Mathematica untuk mengganti ekspresi apa pun dari formulir (g[ ... ])[ ... ]dengan sisi kanan penugasan.
Ketika Mathematica menemukan ekspresi g[m](di baris kedua f), ia melihat bahwa ekspresi tidak cocok dengan aturan apa pun yang diketahuinya dan membiarkannya tidak berubah. Kemudian cocok dengan Mapoperator /@, yang argumennya g[m]dan daftar {i, ImageReflect@i}. ( /@adalah notasi infiks; ungkapan ini persis sama dengan Map[g[m], { ... }].) MapDigantikan dengan menerapkan argumen pertama untuk setiap elemen argumen kedua, jadi kita dapatkan {(g[m])[i], (g[m])[ ... ]}. Sekarang Mathematica melihat bahwa setiap elemen cocok dengan definisi gdan melakukan penggantian.
Dengan cara ini kita harus gbertindak seperti fungsi yang mengembalikan fungsi lain; yaitu, ia bertindak kurang lebih seperti yang kami tulis:
g[t_] := Function[{i}, ImageInstanceQ[i, "caprine animal", RecognitionThreshold -> t]]
(Kecuali dalam hal ini g[t]sendiri mengevaluasi ke Function, sedangkan sebelumnya g[t]sendiri tidak berubah sama sekali.)
Trik terakhir yang saya gunakan adalah pola opsional. Pola tersebut l_ : 0berarti "cocok dengan ungkapan apa pun dan menjadikannya tersedia l, atau tidak cocok dengan apa pun dan menjadikannya 0tersedia l." Jadi, jika Anda menelepon f[i]dengan satu argumen (gambar untuk diuji) itu seperti Anda menelepon f[i, 0, 1].
Berikut ini adalah test harness yang saya gunakan:
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 *)