模拟俄罗斯轮盘赌游戏,参赛者围成一圈。 - 每个第7名选手都输了,直到2名活着。
contestants = list(range(1, 51))
dead_men = []
dead_man = 6
while len(contestants) > 2:
if dead_man > len(contestants):
dead_man = dead_man - len(contestants)
loser = contestants.pop(dead_man)
dead_men.append(loser)
dead_man += 6
当我的列表长度为8
时,这给我一个索引错误,索引为9答案 0 :(得分:0)
我认为您的意思是contestants
而不是soldiers
?
如果是这样,那么我认为你只需要:
while dead_man >= len(contestants):
(while
而不是if
以防您需要多次减去,而>=
而不只是>
,因为索引始终需要小于dead_man %= len(contestants)
的长度列表)
您也可以使用contestants = list(range(1, 51))
dead_men = []
dead_man = 6 % len(contestants)
while len(contestants) > 2:
loser = contestants.pop(dead_man)
dead_men.append(loser)
dead_man = (dead_man + 6) % len(contestants)
。这使用模块算法。
我喜欢用模数技巧做这种事情的方法:
export class LineGraphDirective {
private host;
private svg;
private margin;
private width;
private height;
private xScale; // D3 scale in X
private yScale; // D3 scale in Y
private zScale; // D3 color scale
private xAxis;
private yAxis;
private line;
private htmlElement:HTMLElement;
private parseDate;
private ds;
constructor(private element:ElementRef) {
this.htmlElement = this.element.nativeElement;
this.host = d3.select(this.element.nativeElement);
this.parseDate = d3.timeParse('%Y-%m-%d');
let data = [];
this.ngOnChanges(data);
}
/**
* Every time the @Input is updated, rebuild the chart
**/
ngOnChanges(data):void {
this.setup(data);
this.initData(data);
this.buildSVG();
this.scaleAxis(data);
this.populate();
this.drawXAxis();
this.drawYAxis();
this.zoomEventHandler();
this.addVerticalLineTooltip();
}
private setup(data):void {}
private initData(data) {}
/**
* build SVG element using the configurations
**/
private buildSVG():void {}
private scaleAxis(data) {}
/**
* Create x axis
**/
private drawXAxis():void {}
/**
*create y axis
**/
private drawYAxis():void {}
/**
* Populate the graphs
**/
private populate():void {}
private addVerticalLineTooltip() {
// append a g for all the mouse over nonsense
let mouseG = this.svg.append("g")
.attr("class", "mouse-over-effects");
// this is the vertical line
mouseG.append("path")
.attr("class", "mouse-line")
.style("stroke", "black")
.style("stroke-width", "1px")
.style("opacity", "0");
// keep a reference to all our lines
let lines = document.getElementsByClassName('line');
// here's a g for each circle and text on the line
let mousePerLine = mouseG.selectAll('.mouse-per-line')
.data(this.ds)
.enter()
.append("g")
.attr("class", "mouse-per-line");
// the circle
mousePerLine.append("circle")
.attr("r", 7)
.style("stroke", (d) => {
return this.zScale(d.name);
})
.style("fill", "none")
.style("stroke-width", "1px")
.style("opacity", "0");
// the text
mousePerLine.append("text")
.attr("transform", "translate(10,3)");
// rect to capture mouse movements
mouseG.append('svg:rect')
.attr('width', this.width)
.attr('height', this.height)
.attr('fill', 'none')
.attr('pointer-events', 'all')
.on('mouseout', () => { // on mouse out hide line, circles and text
d3.select(".mouse-line")
.style("opacity", "0");
d3.selectAll(".mouse-per-line circle")
.style("opacity", "0");
d3.selectAll(".mouse-per-line text")
.style("opacity", "0");
})
.on('mouseover', () => { // on mouse in show line, circles and text
d3.select(".mouse-line")
.style("opacity", "1");
d3.selectAll(".mouse-per-line circle")
.style("opacity", "1");
d3.selectAll(".mouse-per-line text")
.style("opacity", "1");
})
.on('mousemove', () => { // mouse moving over canvas
let mouse = d3.mouse(d3.event.currentTarget);
console.log(lines);
// move the vertical line
d3.select(".mouse-line")
.attr("d", () => {
let d = "M" + mouse[0] + "," + this.height;
d += " " + mouse[0] + "," + 0;
return d;
});
// position the circle and text
d3.selectAll(".mouse-per-line")
.attr("transform", (d, i) => {
console.log(i);
let beginning = 0,
end = d3.select(lines[i]).node().getTotalLength(),
target,
pos;
while (true) {
target = Math.floor((beginning + end) / 2);
pos = d3.select(lines[i]).node().getPointAtLength(target);
if ((target === end || target === beginning) && pos.x !== mouse[0]) {
break;
}
if (pos.x > mouse[0]) end = target;
else if (pos.x < mouse[0]) beginning = target;
else break; //position found
}
console.log(this.yScale.invert(pos.y).toFixed(2));
// update the text with y value
d3.select(this).select('text') // **Error this.querySelector is not a function
.text(this.yScale.invert(pos.y).toFixed(2));
// return position
return "translate(" + mouse[0] + "," + pos.y + ")";
});
});
}
}