izmjena algoritma

This commit is contained in:
GotPPay
2017-10-25 00:28:31 +02:00
parent 4c4b1fe135
commit 4f9caa4dc6
5 changed files with 188 additions and 53 deletions

View File

@@ -1,2 +1,3 @@
PEOPLE_DB=https://docs.google.com/spreadsheets/d/1s4Ytz7mf-YpszVTMTTrYd5iG_dsTGjrCpDQbpIx7zkU/edit#gid=0
PAIRS_LIST=https://docs.google.com/spreadsheets/d/1gPuRhTry3YoJ_ibI2BfL1ue2_YLlhtW56OP39ADJY_4/edit#gid=0
PEOPLE_DB=https://docs.google.com/spreadsheets/d/1s4Ytz7mf-YpszVTMTTrYd5iG_dsTGjrCpDQbpIx7zkU/edit#gid=1116948122
PAIRS_LIST=https://docs.google.com/spreadsheets/d/1JXtDjajJLZb_iXvDYfBEVYdCfehF_URHeeO7_hBXLrI/edit#gid=0

View File

@@ -113,7 +113,11 @@ function getPairs(callback){
} else {
const pairs = [];
lastRow = result.valueRanges[0].values.length;
try{
lastRow = result.valueRanges[0].values.length;
}catch(err){
lastRow = 0;
}
for (let i=0;i<lastRow;i++){
let name1 = result.valueRanges[0].values[i][0];
@@ -144,69 +148,185 @@ function getAvailableNames(callback){
const names = [];
for (let i=0;i<result.valueRanges[0].values.length;i++){
let name = result.valueRanges[0].values[i][0];
let available = result.valueRanges[1].values[i][0];
if (name && (available=='x')){
names.push(name);
}
try{
let name = result.valueRanges[0].values[i][0];
let available = result.valueRanges[1].values[i][0];
if (name && (available=='x')){
names.push(name);
}
}catch(err){
}
}
callback(names);
}
});
}
function getRandomInt(min, max) {
return Math.floor(Math.random() * (max - min + 1)) + min;
}
function MakePairs(callback){
executeAPI(getAvailableNames,function(names){
executeAPI(getPairs, function(pairs){
let next_i=false;
const numOfPairs = Math.floor(names.length / 2);
const left_side = [];
const right_side = [];
const newPairs = [];
const usedNames = [];
for (let i=0;i<names.length;i++){
next_i=false;
for (let j=0;j<names.length;j++){
if (i!=j){
let found=false;
pairs.filter((pair)=>{
if ((pair.name1==names[i] && pair.name2==names[j])||(pair.name1==names[j] && pair.name2==names[i])){
found=true;
return;
}
});
if (!found){
usedNames.filter((name)=>{
if (names[i] === name || names[j] === name){
found=true;
return;
}
});
}
for (let i=0;i<numOfPairs;i++){
if (!found){
next_i=true;
newPairs.push({name1:names[i], name2:names[j]});
usedNames.push(names[i]);
usedNames.push(names[j]);
break;
let id1 = getRandomInt(0,names.length-1);
left_side.push(names[id1]);
names.splice(id1,1);
let id2 = getRandomInt(0,names.length-1);
right_side.push(names[id2]);
names.splice(id2,1);
}
//make pairs using both sides
for (let i=0;i<left_side.length;i++){
if (i==left_side.length) break;
for (let j=0;j<right_side.length;j++){
let tmpName1 = left_side[i];
let tmpName2 = right_side[j];
let exist=false;
pairs.filter((pair)=>{
if (((pair.name1 == tmpName1)&&(pair.name2==tmpName2))||((pair.name1==tmpName2)&&(pair.name2==tmpName1))){
exist = true;
return;
}
});
if (!exist){
newPairs.push({name1:tmpName1, name2:tmpName2});
left_side.splice(i,1);
right_side.splice(j,1);
i=-1;
break;
}
}
if (next_i) continue;
}
pairsForSave=newPairs;
callback.send(newPairs);
//make pairs from names on left side
for (let i=0;i<left_side.length;i++){
for (let j=0;j<left_side.length;j++){
if (i==j) continue;
let tmpName1 = left_side[i];
let tmpName2 = left_side[j];
let exist=false;
pairs.filter((pair)=>{
if (((pair.name1 == tmpName1)&&(pair.name2==tmpName2))||((pair.name1==tmpName2)&&(pair.name2==tmpName1))){
exist = true;
return;
}
});
if (!exist){
newPairs.push({name1:tmpName1, name2:tmpName2});
left_side.splice(i,1);
if (i>j)
left_side.splice(j,1);
else
left_side.splice(j-1,1);
i=-1;
break;
}
}
}
//make pairs from names on right side
for (let i=0;i<right_side.length;i++){
for (let j=0;j<right_side.length;j++){
if (i==j) continue;
let tmpName1 = right_side[i];
let tmpName2 = right_side[j];
let exist=false;
pairs.filter((pair)=>{
if (((pair.name1 == tmpName1)&&(pair.name2==tmpName2))||((pair.name1==tmpName2)&&(pair.name2==tmpName1))){
exist = true;
return;
}
});
if (!exist){
newPairs.push({name1:tmpName1, name2:tmpName2});
right_side.splice(i,1);
if (i>j)
right_side.splice(j,1);
else
right_side.splice(j-1,1);
i=-1;
break;
}
}
}
//try to make pair using unused name from list of names and names on left side
if (names.length>0){
let tmpName1 = names[0];
for (let i=0;i<left_side.length;i++){
let tmpName2 = left_side[i];
let exist=false;
pairs.filter((pair)=>{
if (((pair.name1 == tmpName1)&&(pair.name2==tmpName2))||((pair.name1==tmpName2)&&(pair.name2==tmpName1))){
exist = true;
return;
}
});
if (!exist){
newPairs.push({name1:tmpName1, name2:tmpName2});
names=[];
left_side.splice(i,1);
break;
}
}
}
//try to make pair using unused name from list of names and names on right side
if (names.length>0){
let tmpName1 = names[0];
for (let i=0;i<right_side.length;i++){
let tmpName2 = right_side[i];
let exist=false;
pairs.filter((pair)=>{
if (((pair.name1 == tmpName1)&&(pair.name2==tmpName2))||((pair.name1==tmpName2)&&(pair.name2==tmpName1))){
exist = true;
return;
}
});
if (!exist){
newPairs.push({name1:tmpName1, name2:tmpName2});
names=[];
right_side.splice(i,1);
break;
}
}
}
pairsForSave = newPairs;
let withoutPair = [];
for (let i=0;i<left_side.length;i++)
withoutPair.push(left_side[i]);
for (let i=0;i<right_side.length;i++)
withoutPair.push(right_side[i]);
if (names.length>0)
withoutPair.push(names[0]);
if (withoutPair.length==0) withoutPair=null;
callback.send({pairs: newPairs, left: withoutPair });
});
});
//Napravi par -> Provjeri da li postoji -> Snimi ili ponovi postupak
}
function SavePairs(callback){
if (lastRow== null) return;
if (lastRow== null) {
callback.send({result:true});
return;
}
auth=oauth2Client;
@@ -220,6 +340,7 @@ function SavePairs(callback){
const data = [];
if (lastRow == 0) lastRow=-1;
let range1= '2017!A'+(lastRow+2)+':A'+(lastRow+2+pairsForSave.length);
let range2= '2017!B'+(lastRow+2)+':B'+(lastRow+2+pairsForSave.length);
@@ -279,5 +400,5 @@ app.get('/savePairs', (req,resp)=>{
app.listen(3005, function () {
console.log('server na portu 3005');
console.log('Server running - port 3005');
})

View File

@@ -18,10 +18,10 @@ class App extends Component {
getPairsEventHandler = (event) =>{
let url = `http://${BASE_URL}:3005/getPairs`;
this.setState({waitingPairs:true});
this.setState({waitingPairs:true, renderFinish:false, waitingSave:true});
fetch(url, {}).then(function(response) { return response.json(); }).then(function(data) {
this.setState({pairs : data, renderPairsList:true, waitingPairs:false});
this.setState({pairs : data.pairs, left:data.left, renderPairsList:true, waitingPairs:false, waitingSave:false});
}.bind(this));
@@ -46,13 +46,26 @@ class App extends Component {
<div className = "horizontalDiv">
<button disabled={this.state.waitingPairs} onClick = {this.getPairsEventHandler}>Get pairs</button>
</div>
<div>
<h2> List of pairs : </h2>
</div>
{
this.state.renderPairsList &&
<div>
<h2> List of pairs : </h2>
</div>
}
{
this.state.renderPairsList &&
<PairsListComponent pairs = {this.state.pairs}/>
}
{
this.state.renderPairsList && this.state.left &&
<div>
<h2> Without pair : </h2>
{
this.state.left.map((name, index) =>
(<div key={name}>{index+1}. {name}</div>))
}
</div>
}
{
this.state.renderPairsList &&
<button disabled={this.state.waitingSave} onClick = {this.savePairsEventHandler}> Save pairs </button>

View File

@@ -3,14 +3,14 @@ import React, { Component } from 'react';
export default class PairComponent extends Component{
constructor(props) {
super(props);
this.state = {pairName: this.props.pair};
this.state = {pairName: this.props.pair, index: this.props.index};
}
render(){
return (
<div>
<div className = "horizontalDiv">
<div>{this.state.pairName.name1} - {this.state.pairName.name2}</div>
<div>{this.state.index+1}. {this.state.pairName.name1} - {this.state.pairName.name2}</div>
</div>
</div>
)

View File

@@ -7,7 +7,7 @@ export default class PairsListComponent extends Component{
<div id = "outerDiv">
{
this.props.pairs.map((pair, index) =>
(<PairComponent key = {index} index = {index} pair = {pair}/>))
(<PairComponent key = {pair.name1+pair.name2} index = {index} pair = {pair}/>))
}
</div>
)