- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
以下内容来自 Ruby 2.3.1 文档,该文档根据应用于原始集合中每对元素的特定标准将集合划分为一组子集。基本上,如果集合中的两个数字彼此相差在 1 个单位以内,则它们属于原始集合的子集集合中的同一子集。
require 'set'
numbers = Set[1, 3, 4, 6, 9, 10, 11]
set = numbers.divide { |i,j| (i - j).abs == 1 }
p set # => #<Set: {#<Set: {1}>,
# #<Set: {11, 9, 10}>,
# #<Set: {3, 4}>,
我认为我正在处理的问题可以使用此功能。这就是问题。有一个包含 n 个事物的集合 S 以及 S 中事物对的邻近函数,该集合中的某些事物对具有正值。对于未指定邻近函数值的对,可以假定这些值为 0。还有一个阈值参数。该程序的目标是在集合 S 上引入一个分区(一组成对不相交且相互穷举的集合子集),使得如果两个事物的接近函数值超过阈值参数(相反不一定是真的)。
这个程序的输入是这样的形式
t<-阈值参数(大于0的 float )
n<- 后面的行数(整数)
Thing_i_1 Thing_j_1 proximity_ij_1(Thing_i_1 和 Thing_j_1 是整数,proximity_ij_1 是 float 且大于 0)
........Thing_i_n Thing_j_n proximity_ij_n
输出是前面提到的原始集合的成对不相交且相互穷举的子集集,使得接近函数值至少等于阈值参数的两个事物落入同一子集。
我编写了下面的程序来完成此操作,但它未能形成相关集合的子集。我的输入是这样的
0.2
3
1 2 0.3
3 4 0.1
2 5 0.25
输出应该是 {{1,2,5},{3},{4}} 因为 1,2 应该属于同一个子集,2,5 也应该属于同一个子集,因为每种情况下的邻近函数值都超过了阈值参数(所以 1 和 5 实际上属于同一个子集),而 3 和 4 形成了它们自己的子集。
require 'set'
t=gets.chomp.to_f
n=gets.chomp.to_i
edge=Struct.new(:n1,:n2)
se=Array.new
af=Array.new
sv=Set.new
for i in (0..n-1)
s=gets.chomp.split(" ")
se.insert(-1,edge.new(s[0],s[1]))
af.insert(-1,s[2].to_f)
if (sv.member? s[0])==false
sv.add(s[0])
end
if (sv.member? s[1])==false
sv.add(s[1])
end
end
c=sv.divide { |i,j| (k=se.index(edge.new(i,j)))!=nil && af[k]>=t }
p c
输出:
#<Set: {#<Set: {"5"}>, #<Set: {"2"}>, #<Set: {"1"}>, #<Set: {"3"}>, #<Set: {"4"}
>}>
divide 函数似乎不起作用。我做错了什么吗?为什么我得到五个不相交的子集而不是预期的三个?我在除法 block 中打印出条件值,并准确地得到了 1,2 和 2,5,但 1、2 和 5 最终出现在不同的子集中。有人可以帮忙吗?谢谢。
最佳答案
divide
只会划分block.call(a, b)
&& block.call(b, a)
.让你的se
自反(即也插入边 2-1、4-3 和 5-2),它将起作用。或者,让你的 block 返回 true
如果edge.new(i,j)
或 edge.new(j, i)
在se
.还有一个关于类型的错误:您正在从字符串 ( edge.new(s[0],s[1])
) 创建边缘,但是针对来自整数 ( edge.new(i,j)
) 的边缘进行测试,因此成员资格测试将失败。
也就是说,这是非常不符合 Rubyish 的代码。如果我要重写它,它会是这样的:
require 'set'
Edge = Struct.new(:v1, :v2, :p)
edges = {}
vertices = Set.new
t = gets.chomp.to_f
n = gets.chomp.to_i
n.times do
v1, v2, p = *gets.chomp.split
v1 = v1.to_i
v2 = v2.to_i
p = p.to_f
edge = Edge.new(v1, v2, p)
edges[[v1, v2]] = edge
vertices << v1 << v2
end
c = vertices.divide { |v1, v2|
(edge = edges[[v1, v2]] || edges[[v2, v1]]) && edge.p >= t
}
p c
# => #<Set: {#<Set: {1, 2, 5}>, #<Set: {3}>, #<Set: {4}>}>
基本上 - 使用散列以便您始终可以通过其索引快速找到边缘,使用 <<
对于将事物放入其他事物,请记住集合的全部意义在于它不会两次插入相同的事物,对象是真实的,因此您不必显式测试 != nil
, 从未使用过 for
:)
关于ruby - Ruby 2.3.1 中 set 的除法函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39736038/
以下是一个非常简单的ruby服务器。 require 'socket' local_socket = Socket.new(:INET, :STREAM) local_addr = Socket.
我正在使用 OS X(使用 bash),并且是 unix 的新手。我想知道是否可以修改一些文件以便运行 ruby 程序,我不需要“ruby file.rb”,而是可以运行“ruby.rb”。 有理
我在用 Ruby 替换字符串时遇到一些问题。 我的原文:人之所为不如兽之所为。 我想替换为:==What== human does is not like ==what== animal does.
我想在一个循环中从 Ruby 脚本做这样的事情: 写一个文件a.rb(每次迭代都会改变) 执行系统(ruby 'a.rb') a.rb 将带有结果的字符串写入文件“results” a.rb 完成并且
我的问题是尝试创建一个本地服务器,以便我可以理解由我的新团队开发的应用程序。我的问题是我使用的是 Ruby 2.3.3,而 Gemfile 需要 2.3.1。我无法编辑 Gemfile,因为我被告知很
我有一个使用 GLI 框架用 Ruby 编写的命令行实用程序。我想在我的主目录中配置我的命令行实用程序,使用 Ruby 本身作为 DSL 来处理它(类似于 Gemfile 或 Rakefile)。 我
我的 Rails 应用 Controller 中有这段代码: def delete object = model.datamapper_class.first(:sourced_id =>
我正在寻找的解析器应该: 对 Ruby 解析友好, 规则设计优雅, 产生用户友好的解析错误, 用户文档的数量应该比计算器示例多, UPD:允许在编写语法时省略可选的空格。 快速解析不是一个重要的特性。
我刚开始使用 Ruby,听说有一种“Ruby 方式”编码。除了 Ruby on Rails 之外,还有哪些项目适合学习并被认可且设计良好? 最佳答案 Prawn被明确地创建为不仅是一个该死的好 PDF
我知道之前有人问过类似的问题,但是我该如何构建一个无需在前面输入“ruby”就可以在终端中运行的 Ruby 文件呢? 这里的最终目标是创建一个命令行工具包类型的东西。现在,为了执行我希望用户能够执行的
例如哈希a是{:name=>'mike',:age=>27,:gender=>'male'}哈希 b 是 {:name=>'mike'} 我想知道是否有更好的方法来判断 b 哈希是否在 a 哈希内,而
我是一名决定学习 Ruby 和 Ruby on Rails 的 ASP.NET MVC 开发人员。我已经有所了解并在 RoR 上创建了一个网站。在 ASP.NET MVC 上开发,我一直使用三层架构:
最近我看到 Gary Bernhardt 展示了他用来在 vim 中执行 Ruby 代码的 vim 快捷方式。捷径是 :map ,t :w\|:!ruby %. 似乎这个方法总是执行系统 Rub
在为 this question about Blue Ruby 选择的答案中,查克说: All of the current Ruby implementations are compiled to
我有一个 Ruby 数组 > list = Request.find_all_by_artist("Metallica").map(&:song) => ["Nothing else Matters"
我在四舍五入时遇到问题。我有一个 float ,我想将其四舍五入到小数点后的百分之一。但是,我只能使用 .round ,它基本上将它变成一个 int,意思是 2.34.round # => 2. 有没
我使用 ruby on rails 编写了一个小型 Web 应用程序,它的主要目的是上传、存储和显示来自 xml(文件最多几 MB)文件的结果。运行大约 2 个月后,我注意到 mongrel 进程
我们如何用 Ruby 转换像这样的字符串: 𝑙𝑎𝑡𝑜𝑟𝑟𝑒 收件人: Latorre 最佳答案 s = "𝑙𝑎𝑡𝑜𝑟𝑟𝑒" => "𝑙𝑎𝑡𝑜𝑟𝑟𝑒" s.u
通过 ruby monk 时,他们偶尔会从左侧字段中抛出一段语法不熟悉的代码: def compute(xyz) return nil unless xyz xyz.map {|a,
不确定我做错了什么,但我似乎弄错了。 问题是,给你一串空格分隔的数字,你必须返回最大和最小的数字。 注意:所有数字都是有效的 Int32,不需要验证它们。输入字符串中始终至少有一个数字。输出字符串必须
我是一名优秀的程序员,十分优秀!