Last active
January 2, 2016 17:39
-
-
Save knjname/8338050 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| $ -> | |
| $pref = $('#preference') | |
| $prefList = $('#preference_list') | |
| $favs = $('#favorites') | |
| $rank = $('#ranking') | |
| $rankList = $('#ranking_list') | |
| answers = {} | |
| favorites = [] | |
| initFavs = -> | |
| favorites = $favs.val().match /\S+/g | |
| answers = {} | |
| $prefList.html '' | |
| $pref.show 300 | |
| $rankList.html '' | |
| $rank.hide() | |
| compare = (l, r) -> | |
| console.log "Do compare: #{l} and #{r}" | |
| result = $.Deferred() | |
| $li = $('<li>') | |
| $center = $('<button>') | |
| choose = (r, label) -> | |
| -> | |
| $li.find('button').attr disabled : 'disabled' | |
| $center.text label | |
| $(@).addClass 'choosen' | |
| result.resolve r | |
| $prefList.append [ | |
| $li.append [ | |
| $('<button>').text(l).click choose(1, ' > ') | |
| $center.text('as same as').click choose(0, " = ") | |
| $('<button>').text(r).click choose(-1, ' < ') | |
| ]... | |
| ]... | |
| if $('#automatedGuessing').is(':checked') | |
| bigger = if Math.random() > 0.5 then l else r | |
| $li.find('button').each -> | |
| $(@).click() if $(@).text() is bigger | |
| result | |
| smartCompare = (x, y) -> | |
| gtTransively = (start, stop) -> | |
| for t of answers[start] or {} | |
| if t is stop or gtTransively t, stop | |
| return true | |
| return false | |
| if gtTransively x, y | |
| $.Deferred().resolve -1 | |
| else if gtTransively y, x | |
| $.Deferred().resolve 1 | |
| else | |
| (compare x, y).done (r) -> | |
| if r >= 0 | |
| (answers[y] ?= {})[x] = true | |
| else | |
| (answers[x] ?= {})[y] = true | |
| considerWithQSort = ([x, xs...]) -> | |
| lower = [] | |
| upper = [] | |
| result = $.Deferred() | |
| scanAll = $.Deferred() | |
| scan = ([head, rest...]) -> | |
| if head? | |
| (compare x, head).done (r) -> | |
| (if r > 0 then upper else lower).push head | |
| scan rest | |
| else | |
| scanAll.resolve() | |
| if xs.length | |
| scan xs | |
| scanAll.done -> | |
| (considerWithQSort lower).done (lsorted) -> | |
| (considerWithQSort upper).done (rsorted) -> | |
| result.resolve [lsorted..., [x]..., rsorted...] | |
| else | |
| result.resolve if x? then [x] else [] | |
| result | |
| considerInBubbleWay = (lst) -> | |
| result = $.Deferred() | |
| swap = (x, y) -> | |
| [lst[y], lst[x]] = [lst[x], lst[y]] | |
| scan = (n) -> | |
| if n > 1 | |
| scanOnce = (m) -> | |
| if m > 1 | |
| [x, y] = [m - 1, m - 2] | |
| [xe, ye] = [lst[x], lst[y]] | |
| (smartCompare xe, ye).done (r) -> | |
| [k, v] = if r < 0 then [xe, ye] else [ye, xe] | |
| swap x, y if r > 0 | |
| scanOnce m - 1 | |
| else | |
| scan n - 1 | |
| scanOnce lst.length | |
| else | |
| result.resolve lst | |
| scan lst.length | |
| result | |
| considerRandomly = (lst) -> | |
| result = $.Deferred() | |
| done = -> | |
| lst.length - 1 is (k for k of answers).length | |
| anythingDifferent = -> | |
| [x, y] = [Math.floor(lst.length * Math.random()), Math.floor(lst.length * Math.random())] | |
| if x is y then anythingDifferent() else [x, y] | |
| pickUp = -> | |
| [x, y] = anythingDifferent() | |
| if done() | |
| considerInBubbleWay(lst).done (x) -> | |
| console.log "Random finished" | |
| result.resolve x | |
| else | |
| (smartCompare lst[x], lst[y]).done(pickUp) | |
| pickUp() | |
| result | |
| considerMergely = (lst) -> | |
| deep = (xs) -> | |
| mergeDone = $.Deferred() | |
| if xs.length is 1 | |
| mergeDone.resolve xs | |
| else | |
| center = Math.floor( xs.length / 2 ) | |
| (deep xs[0..(center - 1)]).done (lowerHalf) -> | |
| (deep xs[center..]).done (upperHalf) -> | |
| mergedList = [] | |
| merge = -> | |
| l = lowerHalf[0] | |
| u = upperHalf[0] | |
| if l? and u? | |
| (smartCompare l, u).done (r) -> | |
| mergedList.push (if r <= 0 then lowerHalf else upperHalf ).shift() | |
| merge() | |
| else | |
| result = mergedList.concat lowerHalf, upperHalf | |
| mergeDone.resolve result | |
| merge() | |
| mergeDone | |
| deep lst | |
| algorithm = | |
| bubbly : considerInBubbleWay | |
| quickly : considerWithQSort | |
| randomly : considerRandomly | |
| mergely : considerMergely | |
| $('#start_consider').click -> | |
| initFavs() | |
| algorithm[$('#considerConsider').val()](favorites).done (r) -> | |
| $prefList.append $('<span>').text("Thank you #{$prefList.find('li').length} answers!") | |
| $rankList.append ( $('<li>').text(x) for x in r )... | |
| console.log answers | |
| $rank.show 300 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| // Generated by CoffeeScript 1.6.3 | |
| (function() { | |
| var __slice = [].slice; | |
| $(function() { | |
| var $favs, $pref, $prefList, $rank, $rankList, algorithm, answers, compare, considerInBubbleWay, considerMergely, considerRandomly, considerWithQSort, favorites, initFavs, smartCompare; | |
| $pref = $('#preference'); | |
| $prefList = $('#preference_list'); | |
| $favs = $('#favorites'); | |
| $rank = $('#ranking'); | |
| $rankList = $('#ranking_list'); | |
| answers = {}; | |
| favorites = []; | |
| initFavs = function() { | |
| favorites = $favs.val().match(/\S+/g); | |
| answers = {}; | |
| $prefList.html(''); | |
| $pref.show(300); | |
| $rankList.html(''); | |
| return $rank.hide(); | |
| }; | |
| compare = function(l, r) { | |
| var $center, $li, bigger, choose, result; | |
| console.log("Do compare: " + l + " and " + r); | |
| result = $.Deferred(); | |
| $li = $('<li>'); | |
| $center = $('<button>'); | |
| choose = function(r, label) { | |
| return function() { | |
| $li.find('button').attr({ | |
| disabled: 'disabled' | |
| }); | |
| $center.text(label); | |
| $(this).addClass('choosen'); | |
| return result.resolve(r); | |
| }; | |
| }; | |
| $prefList.append.apply($prefList, [$li.append.apply($li, [$('<button>').text(l).click(choose(1, ' > ')), $center.text('as same as').click(choose(0, " = ")), $('<button>').text(r).click(choose(-1, ' < '))])]); | |
| if ($('#automatedGuessing').is(':checked')) { | |
| bigger = l > r ? l : r; | |
| $li.find('button').each(function() { | |
| if ($(this).text() === bigger) { | |
| return $(this).click(); | |
| } | |
| }); | |
| } | |
| return result; | |
| }; | |
| smartCompare = function(x, y) { | |
| var gtTransively; | |
| gtTransively = function(start, stop) { | |
| var t; | |
| for (t in answers[start] || {}) { | |
| if (t === stop || gtTransively(t, stop)) { | |
| return true; | |
| } | |
| } | |
| return false; | |
| }; | |
| if (gtTransively(x, y)) { | |
| return $.Deferred().resolve(-1); | |
| } else if (gtTransively(y, x)) { | |
| return $.Deferred().resolve(1); | |
| } else { | |
| return (compare(x, y)).done(function(r) { | |
| if (r >= 0) { | |
| return (answers[y] != null ? answers[y] : answers[y] = {})[x] = true; | |
| } else { | |
| return (answers[x] != null ? answers[x] : answers[x] = {})[y] = true; | |
| } | |
| }); | |
| } | |
| }; | |
| considerWithQSort = function(_arg) { | |
| var lower, result, scan, scanAll, upper, x, xs; | |
| x = _arg[0], xs = 2 <= _arg.length ? __slice.call(_arg, 1) : []; | |
| lower = []; | |
| upper = []; | |
| result = $.Deferred(); | |
| scanAll = $.Deferred(); | |
| scan = function(_arg1) { | |
| var head, rest; | |
| head = _arg1[0], rest = 2 <= _arg1.length ? __slice.call(_arg1, 1) : []; | |
| if (head != null) { | |
| return (compare(x, head)).done(function(r) { | |
| (r > 0 ? upper : lower).push(head); | |
| return scan(rest); | |
| }); | |
| } else { | |
| return scanAll.resolve(); | |
| } | |
| }; | |
| if (xs.length) { | |
| scan(xs); | |
| scanAll.done(function() { | |
| return (considerWithQSort(lower)).done(function(lsorted) { | |
| return (considerWithQSort(upper)).done(function(rsorted) { | |
| return result.resolve(__slice.call(lsorted).concat(__slice.call([x]), __slice.call(rsorted))); | |
| }); | |
| }); | |
| }); | |
| } else { | |
| result.resolve(x != null ? [x] : []); | |
| } | |
| return result; | |
| }; | |
| considerInBubbleWay = function(lst) { | |
| var result, scan, swap; | |
| result = $.Deferred(); | |
| swap = function(x, y) { | |
| var _ref; | |
| return _ref = [lst[x], lst[y]], lst[y] = _ref[0], lst[x] = _ref[1], _ref; | |
| }; | |
| scan = function(n) { | |
| var scanOnce; | |
| if (n > 1) { | |
| scanOnce = function(m) { | |
| var x, xe, y, ye, _ref, _ref1; | |
| if (m > 1) { | |
| _ref = [m - 1, m - 2], x = _ref[0], y = _ref[1]; | |
| _ref1 = [lst[x], lst[y]], xe = _ref1[0], ye = _ref1[1]; | |
| return (smartCompare(xe, ye)).done(function(r) { | |
| var k, v, _ref2; | |
| _ref2 = r < 0 ? [xe, ye] : [ye, xe], k = _ref2[0], v = _ref2[1]; | |
| if (r > 0) { | |
| swap(x, y); | |
| } | |
| return scanOnce(m - 1); | |
| }); | |
| } else { | |
| return scan(n - 1); | |
| } | |
| }; | |
| return scanOnce(lst.length); | |
| } else { | |
| return result.resolve(lst); | |
| } | |
| }; | |
| scan(lst.length); | |
| return result; | |
| }; | |
| considerRandomly = function(lst) { | |
| var anythingDifferent, done, pickUp, result; | |
| result = $.Deferred(); | |
| done = function() { | |
| var k; | |
| return lst.length - 1 === ((function() { | |
| var _results; | |
| _results = []; | |
| for (k in answers) { | |
| _results.push(k); | |
| } | |
| return _results; | |
| })()).length; | |
| }; | |
| anythingDifferent = function() { | |
| var x, y, _ref; | |
| _ref = [Math.floor(lst.length * Math.random()), Math.floor(lst.length * Math.random())], x = _ref[0], y = _ref[1]; | |
| if (x === y) { | |
| return anythingDifferent(); | |
| } else { | |
| return [x, y]; | |
| } | |
| }; | |
| pickUp = function() { | |
| var x, y, _ref; | |
| _ref = anythingDifferent(), x = _ref[0], y = _ref[1]; | |
| if (done()) { | |
| return considerInBubbleWay(lst).done(function(x) { | |
| console.log("Random finished"); | |
| return result.resolve(x); | |
| }); | |
| } else { | |
| return (smartCompare(lst[x], lst[y])).done(pickUp); | |
| } | |
| }; | |
| pickUp(); | |
| return result; | |
| }; | |
| considerMergely = function(lst) { | |
| var deep; | |
| deep = function(xs) { | |
| var center, mergeDone; | |
| mergeDone = $.Deferred(); | |
| if (xs.length === 1) { | |
| return mergeDone.resolve(xs); | |
| } else { | |
| center = Math.floor(xs.length / 2); | |
| (deep(xs.slice(0, +(center - 1) + 1 || 9e9))).done(function(lowerHalf) { | |
| return (deep(xs.slice(center))).done(function(upperHalf) { | |
| var merge, mergedList; | |
| mergedList = []; | |
| merge = function() { | |
| var l, result, u; | |
| l = lowerHalf[0]; | |
| u = upperHalf[0]; | |
| if ((l != null) && (u != null)) { | |
| return (smartCompare(l, u)).done(function(r) { | |
| mergedList.push((r <= 0 ? lowerHalf : upperHalf).shift()); | |
| return merge(); | |
| }); | |
| } else { | |
| result = mergedList.concat(lowerHalf, upperHalf); | |
| return mergeDone.resolve(result); | |
| } | |
| }; | |
| return merge(); | |
| }); | |
| }); | |
| return mergeDone; | |
| } | |
| }; | |
| return deep(lst); | |
| }; | |
| algorithm = { | |
| bubbly: considerInBubbleWay, | |
| quickly: considerWithQSort, | |
| randomly: considerRandomly, | |
| mergely: considerMergely | |
| }; | |
| return $('#start_consider').click(function() { | |
| initFavs(); | |
| return algorithm[$('#considerConsider').val()](favorites).done(function(r) { | |
| var x; | |
| $prefList.append($('<span>').text("Thank you " + ($prefList.find('li').length) + " answers!")); | |
| $rankList.append.apply($rankList, (function() { | |
| var _i, _len, _results; | |
| _results = []; | |
| for (_i = 0, _len = r.length; _i < _len; _i++) { | |
| x = r[_i]; | |
| _results.push($('<li>').text(x)); | |
| } | |
| return _results; | |
| })()); | |
| console.log(answers); | |
| return $rank.show(300); | |
| }); | |
| }); | |
| }); | |
| }).call(this); |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| <!DOCTYPE html> | |
| <html> | |
| <head> | |
| <meta charset="UTF-8" > | |
| <title>Favorite sort</title> | |
| <style> | |
| .choosen { font-weight: bold; text-decoration: underline; } | |
| </style> | |
| </head> | |
| <body> | |
| <h1>Favorite sort</h1> | |
| <section> | |
| <h2>Input your favorites.</h2> | |
| <textarea id="favorites" style="width:100%; height : 10em ;"> | |
| 2011年:スイートプリキュア♪ | |
| 2004年:ふたりはプリキュア | |
| 2012年:スマイルプリキュア! | |
| 2013年:ドキドキ!プリキュア | |
| 2014年:ハピネスチャージプリキュア! | |
| 2005年:ふたりはプリキュアMaxHeart | |
| 2010年:ハートキャッチプリキュア! | |
| 2006年:ふたりはプリキュアSplash☆Star | |
| 2007年:Yes!プリキュア5 | |
| 2008年:Yes!プリキュア5GoGo! | |
| 2009年:フレッシュプリキュア! | |
| </textarea> | |
| <button id="start_consider">Guess</button> | |
| <select id="considerConsider"> | |
| <option value="bubbly">Bubbly (recommended)</option> | |
| <option value="randomly">Randomly</option> | |
| <option value="quickly">Quickly</option> | |
| <option value="mergely">Mergely</option> | |
| </select> | |
| <label><input type="checkbox" id="automatedGuessing" /> automatically</label> | |
| </section> | |
| <section style='display:none' id="preference"> | |
| <h2>Which do you prefer?</h2> | |
| <ul id="preference_list"></ul> | |
| </section> | |
| <section style='display:none' id="ranking"> | |
| <h2>Your preference ranking</h2> | |
| <ol id="ranking_list"></ol> | |
| </section> | |
| <script src="http://code.jquery.com/jquery-1.10.1.min.js"></script> | |
| <script src="fav.js"></script> | |
| </body> | |
| </html> | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment