- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我想编写一个 ruby 代码片段,它接受一个字符串并输出所有可能的大写排列。基本上,我有一个我记得的密码,但我不记得它是如何大写的。
到目前为止,我有以下内容:
def permute(str)
perms = Array.new
(2 ** str.size).times { perms << str }
perms.each_index do |i|
binary = i.to_s(2)
str_arr = perms[i].split(//)
bin_arr = binary.split(//)
while ( bin_arr.size < str_arr.size )
bin_arr.unshift('0')
end
bin_arr.each_index do |b|
str_arr[b].upcase! if bin_arr[b] == '1'
end
puts str_arr.to_s
end
end
这工作得很好,但我想知道是否有任何 rubyists 可以帮助我改进它,这样它就不必在带有数字的字符串上不必要地工作。
例如,字符串“tst1”生成:
tst1
tst1
tsT1
tsT1
tSt1
tSt1
tST1
tST1
Tst1
Tst1
TsT1
TsT1
TSt1
TSt1
TST1
TST1
我正在寻找的输出是:
tst1
tsT1
tSt1
tST1
Tst1
TsT1
TSt1
TST1
有什么想法吗?
最佳答案
这是一个很好的机会,可以在这里实践我大学时代的“算法推导”类(class)和 Dijkstra 方法。这是“干净”版本
require 'set'
def generate_perms(str)
if str.length == 1
return Set.new([str.downcase, str.upcase])
else
head = str[0..0]
tail = str[1..-1]
perms_sub = generate_perms(tail)
d = Set.new(perms_sub.collect{|p| head.downcase + p})
u = Set.new(perms_sub.collect{|p| head.upcase + p})
return d | u
end
end
编辑:Dijkstra 教导我们不要过早优化,所以我认为 Array-version 最好单独添加 :-) :
def perms(str)
if str.length == 1
return Array.new([str.downcase, str.upcase])
else
head = str[0..0]
tail = str[1..-1]
perms_sub = perms(tail)
d = perms_sub.collect{|p| head.downcase + p}
u = perms_sub.collect{|p| head.upcase + p}
return (d + u).uniq
end
end
为了让它变得非常快,在一个额外的方法参数的帮助下,将其转换为尾递归:
# tail recursion version, no stack-overflows :-)
def perms_tail(str, perms)
if str.length == 1
return perms.collect{|p| [p + str.upcase, p+ str.downcase]}.flatten.uniq
else
tail = perms.collect{|p| [p + str[0..0].upcase, p+ str[0..0].downcase]}.flatten
perms_tail(str[1..-1], tail)
end
end
begin
perms_tail("tst1",[""]).each{|p| puts p}
end
现在这实际上非常慢,但是尾递归允许简单地重写(自己看)到优化版本:
def perms_fast_tail(str)
perms = [""]
tail = str.downcase
while tail.length > 0 do
head, tail, psize = tail[0..0], tail[1..-1], perms.size
hu = head.upcase
for i in (0...psize)
tp = perms[i]
perms[i] = tp + hu
if hu != head
perms.push(tp + head)
end
end
end
perms
end
这有多重要?好吧,为了好玩,让我们运行一些定时测试:
begin
str = "Thequickbrownfox"
start = Time.now
perms_tail(str,[""])
puts "tail: #{Time.now - start}"
start2 = Time.now
perms(str)
puts "normal: #{Time.now - start2}"
start3 = Time.now
perms_fast_tail(str)
puts "superfast: #{Time.now - start3}"
end
在我的机器上,这显示了不同之处:
tail: 0.982241
normal: 0.285104
superfast: 0.168895
从非平凡的字符串中可以看出速度的提高和性能优势; “tst1”将在干净版本中快速运行。因此,Dijkstra 是对的:不需要优化。尽管这样做很有趣。
关于ruby - 大写排列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1390147/
请帮助我..我被困在这里.. 我真正想要的是检查密码是否重复单个字符或数字。 重复要求 aaaa = 假, abbb = 假 abag = 假 a33f = 假 abcd1234 = 真 一个字符在密
在 Ant 中,我有一个名为 ' some_property 的属性。 ',假设它的值为“hello”。 我正在尝试 替换文本文件中的占位符 将此属性的值(“ hello ”)作为 大写 . 所以,我
var temp=["dy34","fd","FD","av","AV","12esu",1,"DY34",1011,123,101]; 当我对数组进行排序时,我得到的结果是: result = [1
var font_name = $(".font").val(); 我的 JavaScript 代码中有这个。在我的 html 中,我有一个带有 .font 类的输入表单。 我想将 .font 中每个
有人可以解释一下我如何实现文本转换:大写; sIFR 3 的功能? 在文档上,它解释了如何使用它,但我真的不知道如何实现它。有人可以举个例子吗? Specifes text transformatio
这个问题已经有答案了: String contains - ignore case [duplicate] (5 个回答) 已关闭 3 年前。 我需要定义我的查询是 DDL 还是 DML。为此,我需要
所以我一直在用 Java 编写一小段代码,它从用户那里获取输入,计算大写字母、小写字母和其他部分(例如空格、数字,甚至括号),然后返回每个部分的数量用户。 我遇到的问题是,如果我输入“Hello Th
在土耳其语中,有两个 i 无点:ı,I 虚线:i,© 问题:每次我将 i 大写时,我得到的是 I。 当我将 i 大写时,我想得到一个 İ(仅限土耳其语),以及一个I 当我将 ı 大写时。 我有一个函数
使用点符号向数组添加属性是否会将其更改为对象? var arr = []; arr.something = "test"; 是数组吗? 我不这么认为,但 underscore.js 说是 consol
我希望 TextBlock、Label、MenuItem.Header 中的所有文本都以大写显示。字符串取自 ResourceDictionary 例如: 等等。 (也适用于 Label 和其他控
我正在尝试计算包含用户定义范围内所有大写字符的单元格实例的数量,我已经有一些代码可以循环并正确突出显示这些大写单元格,但我正在努力应用该逻辑到VBA 的 Countif 函数。这是我得到的代码,但它给
我正在使用 dplyr 进行数据清理。 我想做的一件事是将某些列中的值大写。 data$surname john Mary John mary ...
为什么低于一个不起作用?我需要转换 IsValue转换成大写值,然后需要用 NO 检查它值(value)。我该怎么做? {{item.IsValue}} 最佳答案 确保 uppercase在比较
我需要将相同的变量转换为大写|小写|大写。 /** * @package ${1 default="Hello"} * @subpackage ${com}_${1 capitalize
显然,拉丁字母表也是如此。但我是在概念上提出这个问题,跨越语言和 Unicode 规范。 实际上,这是为了比较两个字符串。如果你已经知道它们的字节数不同——在所有语言中——你能认为这足以保证它们不是同
今天我更新了我的 Octopress 博客,当我运行时: rake new_post["This is a test of title"] 它在 source/_post/2013-02-18-thi
除了大写部分之外,我的程序正在运行:以下是将英语单词 englishWord 翻译为 Pig 拉丁语单词 pigLatinWord 的方法:A。如果英语单词中没有元音,那么pigLatinWord就是
通过使用一个输入文本框,输入类型只允许字母。输入的值为'a',它应该在文本框外显示为'A'? 如果我们在输入文本中输入小写字母“a”,那么它会希望在框外显示大写字母“A”...以下是我的html代码:
我正在开发一个特殊的脚本来修复文本区域内的字母。我在堆叠时发现了一个问题。在 Stackoverflow 上,我找不到解决方案,需要帮助。 我的脚本有一个系统,用于识别每个以大写首字母开头的单词,以及
我在 bash 中有以下行: echo "Manufacturer: $(echo ${family:-$name}|cut -d' ' -f1)" 我想使用 ${var^} 语法将回显字符串大写,但
我是一名优秀的程序员,十分优秀!