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 条评论
登录 后参与评论

相关文章

来自专栏大内老A

谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持

通过第一部分的介绍,我们可以体会到,WCF 的Data Contract在CLR Type和Neutral Contract之间搭建了一座桥梁,弥合了.NET世...

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

jboss上的soap web service开发示例

以下示例,由jboss quickstart示例代码得来: 一、创建一个常规的dynamic web项目,建议支持maven ,项目的关键属性参考下图: ? 二...

2545
来自专栏函数式编程语言及工具

Akka(17): Stream:数据流基础组件-Source,Flow,Sink简介

    在大数据程序流行的今天,许多程序都面临着共同的难题:程序输入数据趋于无限大,抵达时间又不确定。一般的解决方法是采用回调函数(callback-funct...

3186
来自专栏程序员宝库

Java 8 时间 API 快速入门

Java 8 出来很久了,各位也可能已经在用了,不过其中新的时间日期 API 可能很少人用,甚至不知道怎么上手。本文快速介绍一下其中的主要的类的概念和用法。 一...

3385
来自专栏小樱的经验随笔

Codeforces 725B Food on the Plane

B. Food on the Plane time limit per test:2 seconds memory limit per test:256 meg...

3718
来自专栏积累沉淀

研究MapReduce源码之实现自定义LineRecordReader完成多行读取文件内容

TextInputFormat是Hadoop默认的数据输入格式,但是它只能一行一行的读记录,如果要读取多行怎么办? 很简单 自己写一个输入格式,然后写一个对...

2139
来自专栏码匠的流水账

聊聊flink的RichParallelSourceFunction

flink-streaming-java_2.11-1.6.2-sources.jar!/org/apache/flink/streaming/api/func...

1702
来自专栏老马说编程

(33) Joda-Time / 计算机程序的思维逻辑

Joda-Time 上节介绍了JDK API中的日期和时间类,我们提到了JDK API的一些不足,并提到,实践中有一个广泛使用的日期和时间类库,Joda-Tim...

2048
来自专栏码匠的流水账

聊聊flink的RichParallelSourceFunction

flink-streaming-java_2.11-1.6.2-sources.jar!/org/apache/flink/streaming/api/func...

2981
来自专栏葡萄城控件技术团队

枚举的多语言显示

关于枚举类型的多语言显示,其实就是Globalization的问题。解决方案当然不止一种,这里介绍一种可用性和扩展性的比较好的通用方法。 显然这里自己去实现自定...

2925

扫码关注云+社区

领取腾讯云代金券