수학, 100 %, 141 바이트
f@x_:=Count[1>0]@Table[ImageInstanceQ[x,"caprine animal",RecognitionThreshold->i/100],{i,0,50}];If[f@#>f@ImageReflect@#,"Up","Down"]<>"goat"&
글쎄, 이것은 속임수처럼 조금 느낀다. 또한 매우 어리 석고 속도도 느립니다. 기능 f
은 Mathematica의 컴퓨터 비전 내장 중 하나에서 인식 임계 값을 설정할 수있는 대략적인 높이를보고 여전히 이미지를 염소 동물로 인식합니다.
그런 다음 이미지 또는 뒤집힌 이미지가 더 염소인지 확인합니다. 다운 타임을 선호하여 넥타이가 부러 졌기 때문에 프로필 이미지에서만 작동합니다. 이미지가 Bovids 또는 Caprine 동물 개체 유형의 다른 일반화를 나타내는 지 묻는 등 여러 가지 방법으로 개선 될 수 있습니다.
알고리즘이 염소 1에 대해 결정적이지 않은 결과를 생성하기 때문에 첫 번째 테스트 세트의 경우 100 %, 두 번째 테스트 세트의 경우 94 %로 답하십시오. 계산 시간이 길어질수록 100 %까지 증가 할 수 있습니다. 의 더 많은 값을 테스트합니다 RecognitionThreshold
. 에서 올리기 100
로 1000
sufficies; 어떤 이유로 Mathematica는 그것이 매우 부당한 이미지라고 생각합니다! 인식 개체를 염소 동물에서 발굽이 포유 동물로 변경해도 효과가있는 것 같습니다.
언 골프 드 :
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"
]
]
대체 솔루션, 100 % + 보너스
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"
]
]
이 전략은 이전과 동일한 전략을 사용하지만 임계 값 이상의 이진 검색을 사용합니다. 여기에는 두 가지 기능이 있습니다.
g[t]
인수가 임계 값을 갖는 염소 이미지인지 여부를 반환합니다 t
.
f
이미지와 임계 값의 상한 및 하한의 세 가지 매개 변수를 사용합니다. 재귀 적입니다. m
상한과 하한 사이의 임계 값을 테스트하여 작동 합니다 (하한쪽으로 바이어스 됨). 이미지와 반사 된 이미지가 염소가 많거나 비고 유한 경우, 범위의 아래쪽 또는 위쪽을 적절하게 제거하고 다시 호출합니다. 그렇지 않으면, 하나의 이미지가 염소이고 다른 이미지가 비고 유성 인 Upgoat
경우, 첫 번째 이미지가 염소 성이고 Downgoat
그렇지 않으면 (두 번째 이미지 인 경우 반사 된 이미지가 염소 성)을 반환합니다.
함수 정의에는 약간의 설명이 필요합니다. 첫째, 함수 적용은 왼쪽 연관입니다. 이것은 다음과 같이 g[x][y]
해석 된다는 것을 의미합니다 (g[x])[y]
. "에 g[x]
적용한 결과 y
."
둘째, Mathematica에서의 과제는 대체 규칙을 정의하는 것과 거의 같습니다. 즉 , "; 를 리턴 하는 매개 변수로 이름 지정된 함수를 선언 함"을 의미 f[x_] := x^2
하지는 않습니다 . 그 의미는 "와 같은 것을 볼 때마다 내부에있는 것을 불러서 전체를에 바꿉니다 ."f
x
x^2
f[ ... ]
x
x^2
이 두 가지를 종합하면, g
Mathematica 의 정의가 양식의 표현을 (g[ ... ])[ ... ]
과제의 오른쪽 으로 대체 하도록 지시하는 것을 알 수 있습니다.
Mathematica가 g[m]
(의 두 번째 줄에서 f
) 식을 만나면식이 알고있는 규칙과 일치하지 않으며 식을 그대로 유지합니다. 그런 다음 인수 와 목록 이 있는 Map
연산자 와 일치합니다 . ( 접두사 표기법입니다.이 표현식은와 정확히 동일합니다 .) 첫 번째 인수를 두 번째 인수의 각 요소에 적용하여 대체합니다 . 이제 Mathematica는 각 요소가 정의와 일치 하고 대체를 수행함을 확인합니다./@
g[m]
{i, ImageReflect@i}
/@
Map[g[m], { ... }]
Map
{(g[m])[i], (g[m])[ ... ]}
g
이런 식으로 우리는 g
다른 함수를 반환하는 함수처럼 행동해야합니다. 즉, 우리가 쓴 것과 비슷하게 작동합니다.
g[t_] := Function[{i}, ImageInstanceQ[i, "caprine animal", RecognitionThreshold -> t]]
(이 경우 g[t]
를 제외하고 는 자체적으로는으로 평가 Function
되지만 이전 g[t]
에는 자체적으로 전혀 변환되지 않았습니다.)
내가 사용하는 마지막 트릭은 선택적 패턴입니다. 패턴 l_ : 0
은 "모든 표현식을 l
일치시키고로 사용 0
가능 하게하거나 아무것도 일치하지 않고 로 사용 가능하게 함"을 의미 l
합니다. 따라서 f[i]
하나의 인수 (테스트 할 이미지)로 호출하면 마치 호출 한 것과 같습니다 f[i, 0, 1]
.
내가 사용한 테스트 장치는 다음과 같습니다.
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 *)