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 f
melihat 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 100
ke 1000
sufficies; 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
.
f
mengambil tiga parameter: gambar, dan batas atas dan bawah pada ambang batas. Itu rekursif; ini bekerja dengan menguji ambang batas m
antara 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 Upgoat
jika gambar pertama adalah kambing dan Downgoat
sebaliknya (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^2
tidak tidak berarti "mendeklarasikan fungsi bernama f
dengan parameter x
yang mengembalikan x^2
;" artinya lebih dekat dengan, "setiap kali Anda melihat sesuatu seperti f[ ... ]
, panggil benda itu di dalam x
dan ganti semuanya dengan x^2
."
Menyatukan keduanya, kita dapat melihat bahwa definisi g
memberi 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 Map
operator /@
, yang argumennya g[m]
dan daftar {i, ImageReflect@i}
. ( /@
adalah notasi infiks; ungkapan ini persis sama dengan Map[g[m], { ... }]
.) Map
Digantikan 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 g
dan melakukan penggantian.
Dengan cara ini kita harus g
bertindak 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_ : 0
berarti "cocok dengan ungkapan apa pun dan menjadikannya tersedia l
, atau tidak cocok dengan apa pun dan menjadikannya 0
tersedia 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 *)