🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.lang.ruby
Article #63

Zakresy w Pythonie i Ruby

#63
From: Jaroslaw Zabiello
Date: Wed, 26 Jul 2006 09:47
80 lines
2682 bytes
Na grupie Pythona padło pytanie:

>> Widzial ktos moze implementacje stricte matematycznego przedzialu
>> liczbowego? Uzycie widzialbym jako cos w rodzju:
>> 
>>>>> p1 = przedzial(1,5)
>>>>> 3.14 in p1
>>>>> True
>> 
>>>>> p2 = przedzial(3,7)
>>>>> p1 + p2
>>>>> (1,7)
>>>>> p1*p2
>>>>> (3,5)
>> itd...

Jako ciekawostkę porównałem sobie Pythona z Ruby. Pythonowa implementacja
mogłaby wyglądać:

class Range(object):
    def __init__(self, start, end):
        self.start, self.end = start, end
    def included(self,value):
        return self.start <= value <= self.end
    def __add__(self, obj):
        start, end = self.start, self.end
        if obj.start < self.start: start = obj.start
        if obj.end > self.end: end = obj.end
        return Range(start, end)
    def __mul__(self, obj):
        start, end = self.start, self.end
        if obj.start > self.start: start = obj.start
        if obj.end < self.end: end = obj.end
        return Range(start, end)
    def __str__(self):
        return "(%s,%s)" % (self.start, self.end)

>>>> p1 = Range(1,5)
>>>> p2 = Range(3,7)
>>>> print (p1+p2)
> (1,7)
>>>> print (p1*p2)
> (3,5)
>>>> print p1
>>>> print p1
> (1,5)
>>>> print p2
> (3,7)
>>>> print Range(10,20) * Range(12,30) * Range(15,18)
> (15,18)

Kod Rubiego jest krótszy bo zakresy są już wbudowane w język. Wystarczy
tylko rozszerzyć ją o dodatkowe możliwości:

class Range
  def +(obj)
    b, e = self.begin, self.end
    b = obj.begin if obj.begin < b
    e = obj.end if obj.end > e
    Range.new(b,e)
  end
  def *(obj)
    b, e = self.begin, self.end
    b = obj.begin if obj.begin > b
    e = obj.end if obj.end < e
    Range.new(b,e)
  end
end

p1 = 1..5
p2 = 3..7
p (1..5).include?(3.14) #=> true
p (1..5).include?(13.14) # => false
p p1 + p2 # => 1..7
p p1 * p2 # => 3..5
p p1 * p2 * (4..6) # => 4..5

-- 
Jarosław Zabiełło
http://blog.zabiello.com
Technical Details
Message-ID: <hnmwlvh87ny7$.1sx8hitfg70hj.dlg@40tude.net>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.gazeta.pl!not-for-mail

Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.gazeta.pl!not-for-mail
From: Jaroslaw Zabiello <hipertracker@gmail.com>
Newsgroups: pl.comp.lang.ruby
Subject: Zakresy w Pythonie i Ruby
Date: Wed, 26 Jul 2006 10:47:20 +0100
Organization: "Portal Gazeta.pl -> http://www.gazeta.pl"
Lines: 80
Message-ID: <hnmwlvh87ny7$.1sx8hitfg70hj.dlg@40tude.net>
NNTP-Posting-Host: 213.190.141.10
Mime-Version: 1.0
X-Trace: inews.gazeta.pl 1153907247 11050 213.190.141.10 (26 Jul 2006 09:47:27 GMT)
X-Complaints-To: usenet@agora.pl
NNTP-Posting-Date: Wed, 26 Jul 2006 09:47:27 +0000 (UTC)
X-User: newsgate2
User-Agent: 40tude_Dialog/2.0.15.1
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit