IMDb Standard Deviation

Adds standard deviation to IMDb ratings breakdown pages.

이 스크립트를 설치하려면 Tampermonkey, Greasemonkey 또는 Violentmonkey와 같은 확장 프로그램이 필요합니다.

You will need to install an extension such as Tampermonkey to install this script.

이 스크립트를 설치하려면 Tampermonkey 또는 Violentmonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey 또는 Userscripts와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 유저 스크립트 관리자 확장 프로그램이 필요합니다.

(이미 유저 스크립트 관리자가 설치되어 있습니다. 설치를 진행합니다!)

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

(이미 유저 스타일 관리자가 설치되어 있습니다. 설치를 진행합니다!)

// ==UserScript==
// @name         IMDb Standard Deviation
// @namespace    http://userscripts.org/users/7063
// @include      https://www.imdb.com/title/tt*/ratings
// @include      https://www.imdb.com/title/tt*/ratings/
// @include      https://www.imdb.com/title/tt*/ratings-*
// @include      https://www.imdb.com/title/tt*/ratings?*
// @version      2025.1.13.4.31
// @grant        none
// @description  Adds standard deviation to IMDb ratings breakdown pages.
// @noframes
// ==/UserScript==

(function () {
    "use strict";
	function go(main) {
		const votes = [...main.querySelectorAll(".VictoryContainer path ~ text")].map(k => {
			const text = k.textContent.match(/\((.*)\)/)[1];
			const km = text.match(/[KM]/);
			if (km) {
				return +text.match(/[^KM]+/) * 10 ** {"K": 3, "M": 6}[km];
			}
			return +text;
		});
		const [product, votecount] = votes.reduce(
			([p, v], c, i) => [p + c * (10 - i), v + c],
			[0, 0]
		);
		const sumOfSquares = votes.reduce(
			(p, c, i) => p + Math.pow(10 - i - product / votecount, 2) * c,
			0
		);
        const p = document.createElement("p");
		p.textContent = `${Math.sqrt(sumOfSquares / (votecount - 1)).toFixed(2)} Standard deviation`;
		p.classList.add("cSLvSW");
		main.append(p);
	}
	const obParams = [document.body, { childList: true, subtree: true }];
	const observer = new MutationObserver(() => {
		observer.disconnect();
		const histo = document.querySelector(`[data-testid="histogram-container"]`);
		if (histo) {
			go(histo);
		} else {
			observer.observe(...obParams);
		}
	});
	observer.observe(...obParams);

}());