我不确定何时结束运行map语句的循环,时间只是作为循环应该在哪里以及应该包含哪些代码的示例。我想运行它,直到创建的多维数组的第一个值为0(因为它将一直是最大的值,直到它自己变为0并创建最后一个嵌套数组),但我完全不知道如何这样做。任何帮助将不胜感激!
dataset = data;
var stack = d3.layout.stack();
stack(dataset);
var x= d3.scale.ordinal()
.domain(d3.range(dataset[0].length))
.rangeRoundBands([0, w]);
var y= d3.scale.linear()
.domain([0, 1])
.range([0, h]);
var svg = d3.select("body")
.append("svg")
.attr("width", w)
.attr("height", h);
var groups = svg.selectAll("g")
.data(dataset)
.enter()
.append("g");
var rects = groups.selectAll("rect")
.data(function (d) {
return d;
})
.enter()
.append("rect")
.attr("x", function (d, i) {
return x(i);
})
.attr("y", function (d) {
return y(d.y0 + d.y);
})
.attr("height", function (d) {
return h - y(d.y0);
})
.attr("width", x.rangeBand())
.attr("fill", function (d, i) {
return color(i);
});
问题:
def wonky_coins(n)
coins = [n]
if n == 0
return 1
end
i = 1
n.times do
coins.map! do |x|
if x != 0
i+= 2
else
next
o = []
o << x/2
o << x/3
o << x/4
x = o
puts x
end
end
end
return i
end
wonky_coins(6)
答案 0 :(得分:1)
首先,你不应该有嵌套数组。你想在每次传球后弄平数组,所以你只需要硬币;更好的是,使用flat_map
一步完成。 0
只生成自己:[0]
;不要忘记它或你的代码将失去你所有的目标硬币!
接下来,我可以看到n
次这样做没有逻辑。没有固定数量的times
会这样做。你想要做until
所有硬币都是零。您可以在顶部设置一个标志(all_zero = true
),并在找到非零硬币时将其翻转,这应该告诉您的循环需要进一步的迭代。
此外,您不需要跟踪硬币数量,因为该数字将是数组的最终size
。
最后,与问题无关,确实养成使用正确缩进的习惯。首先,它使您自己更难调试和维护代码;另一方面,糟糕的缩进使很多SO人不想费心阅读你的问题。
答案 1 :(得分:0)
稍后再回来了解如何使用.flatten,我明白了!感谢@Amadan的有用提示。在我刚刚开始时,请随意留下关于我的语法的任何评论,并且可以使用我能得到的所有建设性反馈!
def wonky_coins(n)
coins = [n]
return 1 if n == 0
until coins[0] == 0
coins.map! { |x|
next if x == 0
x = [x/2, x/3, x/4]
}
coins.flatten!
end
return coins.length
end
wonky_coins(6)