Ruby练习四

Q1: Palindromes

Adapt your solution from the “palindromes” question so that instead of writing palindrome?("foo")you can write "foo".palindrome?

My Example Code

# add new method to String class
class String
    def palindrome?()
        s = self.downcase.gsub(/\W*/,"")
        s == s.reverse
    end
end

# or we can use method_missing
class String
    def method_missing(m,*args,&block)
        # m is method name(a symbol), use id2name or to_s
        # self is foo in this case
        if m.id2name == "palindrome?"
            s = self.downcase.gsub(/\W/,"")
            s == s.reverse 
        else
            # if no match here, retrun to ancestor
            super
        end
    end
end

puts "foo".palindrome? # => false
word = "foof"
puts word.palindrome? # =>true

Q2: Enumerable Palindrome

Adapt your palindrome solution so that it works on Enumerables. That is: [1,2,3,2,1].palindrome? # => true

(It is not necessary for the collection's elements to be palindromes themselves - only that the top-level collection be a palindrome.) Although hashes are considered Enumerables, your solution does not need to make sense for hashes (though it should not produce an error).

My Example Code

module Enumerable
    def palindrome?
        if self.kind_of?(Array)
            self == self.reverse
        else
            temp = self.to_a
            temp == temp.reverse
        end
    end
end

a = [1,2,[1,2],2,1]
b = [["a"],"b","b",["a"]]
puts a.palindrome?
puts b.palindrome?

Q3: Cartesian Product (use yield)

Given two collections (of possibly different lengths), we want to get the Cartesian product of the sequence - in other words, every possible pair of N elements where one element is drawn from each collection. For example, the Cartesian product of the sequences a=[:a,:b,:c] and b=[4,5] is: a×b = [[:a,4],[:a,5],[:b,4],[:b,5],[:c,4],[:c,5]]

Create a method that accepts two sequences and returns an iterator that will yield the elements of the Cartesian product, one at a time, as a two-element array.

  1. It doesn't matter what order the elements are returned in. So for the above example, the ordering [[:a,4], [:b,4], [:c,4], [:a,5], [:b,5], [:c,5]] would be correct, as would any other ordering.
  2. It does matter that within each pair, the order of the elements matches the order in which the original sequences were provided. That is, [:a,4] is a member of the Cartesian product a×b, but [4,:a] is not. (Although [4,:a] is a member of the Cartesian product b×a.)

To start you off, here is a pastebin link to skeleton code (http://pastebin.com/cgSuhtPf) showing possible correct results. For your convenience the code is also shown below

class CartesianProduct
    include Enumerable
        # your code here
    end
#Examples of use
c = CartesianProduct.new([:a,:b], [4,5])
c.each { |elt| puts elt.inspect }
# [:a, 4]
# [:a, 5]
# [:b, 4]
# [:b, 5]
c = CartesianProduct.new([:a,:b], [])
c.each { |elt| puts elt.inspect }
# (nothing printed since Cartesian product
# of anything with an empty collection is empty)

My Example Code

class CartesianProduct
    include Enumerable
    def initialize(arr_1,arr_2)
        @arr_1 = arr_1
        @arr_2 = arr_2
    end
        
    def each()
        if block_given?
            len1, len2 = @arr_1.size, @arr_2.size
            (0...len1).each do |i|
                (0...len2).each do |j|
                    element = [@arr_1[i],@arr_2[j]]
                    yield element
                end
            end
        else
            return "Blcok missing!"
        end
    end 
end

c = CartesianProduct.new([:a,:b,:c], [4,5])
c.each {|elt| puts elt.inspect}
puts c.each 

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏IMWeb前端团队

ke.qq.com url重构总结

一、重构的目的 1.url简化 过长的url不利于传播,比如输入框的字数限制导致分享的url被截断或分享内容无法提交。复制url文本时,短的url也可能使鼠标...

2265
来自专栏IMWeb前端团队

在retina屏中实现1px border效果

街景wap官网中有在视网膜屏幕中实现1px border的需求. 首先,来看下面视觉给的输出图中的border: ? 从上面的视觉图可以看到,border是一...

2647
来自专栏菩提树下的杨过

Blend生成的TransformGroup如何引用?

很多时候,blend在制作动画时,会自动为对象生成如下代码: <Rectangle Fill="White" Stroke="Black" Horizontal...

1739
来自专栏Android干货园

Android中你可能忽略的知识点(1)-分辨率那些事

版权声明:本文为博主原创文章,转载请标明出处。 https://blog.csdn.net/lyhhj/article/details/80...

501
来自专栏知晓程序

什么?微信也可以听文章!看公众号再也不怕伤眼睛

春节假期刚刚结束,很多人(被迫)回到自己的工作岗位。双眼长时间盯着电脑屏幕,你是否也感觉到,眼睛越来越干涩,越来越酸?

764
来自专栏developerHaoz 的安卓之旅

Android 刘海屏适配总结

随着 Apple 发布 iPhone X 之后,各大手机厂商也开始模仿这种刘海屏的设计,而且刘海屏手机的用户也是越来越大,前段时间将项目进行了所有主流厂商的刘海...

1933
来自专栏大数据

纳米白与Pandas

温井很久没有来更新,感谢小伙伴幕黑君积极推送文章,希望大家喜欢。 温井消失的理由,说来很不好意思。 一是后来意识到上一篇中提到的后台留言的粉丝,其实是给幕黑君留...

16510
来自专栏木东居士的专栏

程序员该如何管理后宫:皇后造更多小人(抽象工厂模式)

1965
来自专栏儿童编程

儿童编程Scratch之“画笔”基础功能学习总结

Scratch中“画笔”功能能够让使用者模拟画笔在舞台上创作,合理运用能够给作品带来极大的趣味性。

1162
来自专栏令仔很忙

面向对象

在面向对象编程出现之前,几乎所有的程序都是以面向过程为中心的,程序的运行从某个地方开始运行达到一定的目的就结束了。而且程序的代码修改和重复使用率比较低。面向...

842

扫码关注云+社区