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

相关文章

来自专栏Clive的技术分享

代码重构的方法

1794
来自专栏码匠的流水账

聊聊storm的LoggingMetricsConsumer

storm-2.0.0/storm-client/src/jvm/org/apache/storm/metric/LoggingMetricsConsumer....

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

jboss上的soap web service开发示例

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

2155
来自专栏积累沉淀

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

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

1979
来自专栏码匠的流水账

聊聊storm worker的executor与task

storm-2.0.0/storm-client/src/jvm/org/apache/storm/daemon/worker/Worker.java

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

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

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

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

PICE(2):JDBCStreaming - gRPC-JDBC Service

   在一个akka-cluster环境里,从数据调用的角度上,JDBC数据库与集群中其它节点是脱离的。这是因为JDBC数据库不是分布式的,不具备节点位置透明化...

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

Codeforces 725B Food on the Plane

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

3648
来自专栏张善友的专栏

如何结合IbatisNet的LIST遍历实现模糊查询

我仿照Java的Spring+Ibatis+Struct用Castle+IBatisNet+Asp.net的开发框架的DAO的基类:BaseSqlMapDao内...

2029
来自专栏码匠的流水账

聊聊flink的RichParallelSourceFunction

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

1252

扫码关注云+社区