Toán học, 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"&
Vâng, điều này cảm thấy nhiều hơn một chút giống như gian lận. Nó cũng cực kỳ chậm cũng như rất ngớ ngẩn. Hàm fnhìn thấy mức độ cao mà bạn có thể đặt ngưỡng Nhận dạng trong một trong các nội dung thị giác máy tính của Mathicala và vẫn nhận ra hình ảnh là một động vật Caprine.
Sau đó chúng tôi xem liệu hình ảnh hoặc hình ảnh lật là goaty hơn. Chỉ hoạt động trên hình ảnh hồ sơ của bạn vì cà vạt bị hỏng theo hướng hạ cấp. Có thể có rất nhiều cách để cải thiện điều này bao gồm hỏi nó nếu hình ảnh đại diện cho Bovids hoặc các khái quát khác của loại thực thể động vật Caprine.
Trả lời bằng văn bản điểm 100% cho bộ thử nghiệm đầu tiên và 94% cho bộ thử nghiệm thứ hai, vì thuật toán mang lại kết quả không thuyết phục cho dê 1. Điều này có thể được nâng lên tới 100% với chi phí thời gian tính toán lâu hơn thử nghiệm nhiều giá trị của RecognitionThreshold. Tăng từ 100đến hiệu quả 1000; vì lý do nào đó Mathicala nghĩ rằng đó là một hình ảnh rất vô duyên! Việc thay đổi thực thể nhận dạng từ động vật Caprine thành Hoofed Mammal dường như cũng có hiệu quả.
Ung dung:
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"
]
]
Giải pháp thay thế, 100% + tiền thưởng
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"
]
]
Chiến lược này sử dụng chiến lược giống như trước đây, nhưng với tìm kiếm nhị phân vượt ngưỡng. Có hai chức năng liên quan ở đây:
g[t]trả về việc có hay không đối số của nó là một hình ảnh con dê có ngưỡng t.
fcó ba tham số: một hình ảnh, và giới hạn trên và dưới trên ngưỡng. Đó là đệ quy; nó hoạt động bằng cách kiểm tra ngưỡng mgiữa ngưỡng trên và ngưỡng dưới (thiên về phía dưới). Nếu hình ảnh và hình ảnh phản chiếu là cả goaty hoặc non-goaty, nó sẽ loại bỏ phần dưới hoặc phần trên của phạm vi là phù hợp và tự gọi lại. Mặt khác, nếu một hình ảnh là goaty và hình ảnh kia không phải là goaty, nó sẽ trả về Upgoatnếu hình ảnh đầu tiên là goaty và Downgoatnếu không (nếu hình ảnh thứ hai, hình ảnh phản chiếu là goaty).
Các định nghĩa hàm xứng đáng một lời giải thích nhỏ. Đầu tiên, ứng dụng chức năng là liên kết trái. Điều này có nghĩa là một cái gì đó giống như g[x][y]được giải thích là (g[x])[y]; "kết quả của việc g[x]áp dụng cho y."
Thứ hai, phép gán trong Mathicala gần tương đương với việc xác định quy tắc thay thế. Nghĩa là, f[x_] := x^2không không có nghĩa là "khai báo một hàm có tên fvới tham số xtrả về x^2;" ý nghĩa của nó gần hơn, "bất cứ khi nào bạn thấy một cái gì đó như thế f[ ... ], hãy gọi thứ bên trong xvà thay thế toàn bộ x^2."
Đặt hai cái này lại với nhau, chúng ta có thể thấy rằng định nghĩa của việc gnói với Mathicala thay thế bất kỳ biểu thức nào của biểu mẫu (g[ ... ])[ ... ]bằng phía bên phải của bài tập.
Khi Mathicala bắt gặp biểu thức g[m](trong dòng thứ hai f), nó thấy rằng biểu thức không khớp với bất kỳ quy tắc nào mà nó biết và giữ nguyên. Sau đó, nó phù hợp với Maptoán tử /@, có đối số g[m]và danh sách {i, ImageReflect@i}. ( /@là ký hiệu infix; biểu thức này hoàn toàn tương đương với Map[g[m], { ... }].) MapĐược thay thế bằng cách áp dụng đối số đầu tiên của nó cho từng thành phần của đối số thứ hai, vì vậy chúng tôi nhận được {(g[m])[i], (g[m])[ ... ]}. Bây giờ Mathematica thấy rằng mỗi phần tử phù hợp với định nghĩa gvà thay thế.
Theo cách này, chúng ta gphải hành động như một hàm trả về một hàm khác; đó là, nó hoạt động gần giống như chúng ta đã viết:
g[t_] := Function[{i}, ImageInstanceQ[i, "caprine animal", RecognitionThreshold -> t]]
(Ngoại trừ trong trường hợp này, g[t]bản thân nó tự đánh giá là a Function, trong khi trước đó, g[t]bản thân nó không bị biến đổi.)
Thủ thuật cuối cùng tôi sử dụng là một mẫu tùy chọn. Mẫu l_ : 0có nghĩa là "khớp bất kỳ biểu thức nào và làm cho nó có sẵn dưới dạng l, hoặc khớp với không có gì và làm cho 0có sẵn dưới dạng l." Vì vậy, nếu bạn gọi f[i]với một đối số (hình ảnh để kiểm tra) thì như thể bạn đã gọi f[i, 0, 1].
Đây là khai thác thử nghiệm tôi đã sử dụng:
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 *)