Skip to content

Instantly share code, notes, and snippets.

@knjname
Last active January 2, 2016 17:39
Show Gist options
  • Select an option

  • Save knjname/8338050 to your computer and use it in GitHub Desktop.

Select an option

Save knjname/8338050 to your computer and use it in GitHub Desktop.
$ ->
$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
// 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);
<!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