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 f
nhì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
.
f
có 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 m
giữ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ề Upgoat
nếu hình ảnh đầu tiên là goaty và Downgoat
nế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^2
không không có nghĩa là "khai báo một hàm có tên f
với tham số x
trả 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 x
và 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 g
nó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 Map
toá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 g
và thay thế.
Theo cách này, chúng ta g
phả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_ : 0
có 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 0
có 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 *)