ruby-bsearch-1.5/0040755014166500000130000000000007404724164013353 5ustar satoruSonyCSLruby-bsearch-1.5/ChangeLog0100644014166500000130000000340307404722503015115 0ustar satoruSonyCSL2001-12-10 Satoru Takabayashi * Ruby/Bsearch: Version 1.5 released. * bsearch.rb (Array::bsearch_range): Take &block and pass &block. (Array::bsearch_last): Likewise. (Array::bsearch_first): Likewise. (Array::bsearch_lower_boundary): Likewise. (Array::bsearch_upper_boundary): Likewise. 2001-11-16 Satoru Takabayashi * tests/test.rb (check_boundaries): New method. 2001-10-19 Satoru Takabayashi * Ruby/Bsearch: Version 1.4 released. * tests/test.rb (lookup): Add assertions. * bsearch.rb (Array::bsearch_lower_boundary): Use .to_i for working with mathn.rb (Rational). Thanks to Nenad Ocelic for reporting it. (Array::bsearch_upper_boundary): Likewise. 2001-09-12 Satoru Takabayashi * Ruby/Bsearch: Version 1.3 released. * bsearch.en.rd: Update documentation . * bsearch.ja.rd: Likewise. 2001-08-16 Satoru Takabayashi * bsearch.rb (bsearch_lower_bound): New method. * bsearch.rb (bsearch_upper_bound): New method. * bsearch.rb (bsearch_range): Return the range consisting of bsearch_lower_bound and bsearch_upper_bound. 2001-07-03 Satoru Takabayashi * Ruby/Bsearch: Version 1.2 released. * Rewrite documents with rdtools. 2001-05-29 Satoru Takabayashi * Ruby/Bsearch: Version 1.1 released. * tests/test.rb: Add tests for Array#bsearch_range method. 2001-05-23 Satoru Takabayashi * bsearch.rb (bsearch_range): New method. * bsearch.rb (bsearch_last): Add an ommitable parameter `range'. * bsearch.rb (bsearch_first): Add an ommitable parameter `range'. 2001-05-05 Satoru Takabayashi * Ruby/Bsearch: Version 1.0 released. ruby-bsearch-1.5/bsearch.rb0100644014166500000130000000622407404722524015306 0ustar satoruSonyCSL# # Ruby/Bsearch - a binary search library for Ruby. # # Copyright (C) 2001 Satoru Takabayashi # All rights reserved. # This is free software with ABSOLUTELY NO WARRANTY. # # You can redistribute it and/or modify it under the terms of # the Ruby's licence. # # Example: # # % irb -r ./bsearch.rb # >> %w(a b c c c d e f).bsearch_first {|x| x <=> "c"} # => 2 # >> %w(a b c c c d e f).bsearch_last {|x| x <=> "c"} # => 4 # >> %w(a b c e f).bsearch_first {|x| x <=> "c"} # => 2 # >> %w(a b e f).bsearch_first {|x| x <=> "c"} # => nil # >> %w(a b e f).bsearch_last {|x| x <=> "c"} # => nil # >> %w(a b e f).bsearch_lower_boundary {|x| x <=> "c"} # => 2 # >> %w(a b e f).bsearch_upper_boundary {|x| x <=> "c"} # => 2 # >> %w(a b c c c d e f).bsearch_range {|x| x <=> "c"} # => 2...5 # >> %w(a b c d e f).bsearch_range {|x| x <=> "c"} # => 2...3 # >> %w(a b d e f).bsearch_range {|x| x <=> "c"} # => 2...2 module Bsearch VERSION = '1.5' end class Array # # The binary search algorithm is extracted from Jon Bentley's # Programming Pearls 2nd ed. p.93 # # # Return the lower boundary. (inside) # def bsearch_lower_boundary (range = 0 ... self.length, &block) lower = range.first() -1 upper = if range.exclude_end? then range.last else range.last + 1 end while lower + 1 != upper mid = ((lower + upper) / 2).to_i # for working with mathn.rb (Rational) if yield(self[mid]) < 0 lower = mid else upper = mid end end return upper end # # This method searches the FIRST occurrence which satisfies a # condition given by a block in binary fashion and return the # index of the first occurrence. Return nil if not found. # def bsearch_first (range = 0 ... self.length, &block) boundary = bsearch_lower_boundary(range, &block) if boundary >= self.length || yield(self[boundary]) != 0 return nil else return boundary end end alias bsearch bsearch_first # # Return the upper boundary. (outside) # def bsearch_upper_boundary (range = 0 ... self.length, &block) lower = range.first() -1 upper = if range.exclude_end? then range.last else range.last + 1 end while lower + 1 != upper mid = ((lower + upper) / 2).to_i # for working with mathn.rb (Rational) if yield(self[mid]) <= 0 lower = mid else upper = mid end end return lower + 1 # outside of the matching range. end # # This method searches the LAST occurrence which satisfies a # condition given by a block in binary fashion and return the # index of the last occurrence. Return nil if not found. # def bsearch_last (range = 0 ... self.length, &block) # `- 1' for canceling `lower + 1' in bsearch_upper_boundary. boundary = bsearch_upper_boundary(range, &block) - 1 if (boundary <= -1 || yield(self[boundary]) != 0) return nil else return boundary end end # # Return the search result as a Range object. # def bsearch_range (range = 0 ... self.length, &block) lower = bsearch_lower_boundary(range, &block) upper = bsearch_upper_boundary(range, &block) return lower ... upper end end ruby-bsearch-1.5/bsearch.en.rd0100644014166500000130000000710307363701246015710 0ustar satoruSonyCSL=begin = Ruby/Bsearch: a binary search library for Ruby Ruby/Bsearch is a binary search library for Ruby. It can search the FIRST or LAST occurrence in an array with a condition given by a block. Tha latest version of Ruby/Bsearch is available at (()) . == Example % irb -r ./bsearch.rb >> %w(a b c c c d e f).bsearch_first {|x| x <=> "c"} => 2 >> %w(a b c c c d e f).bsearch_last {|x| x <=> "c"} => 5 >> %w(a b c e f).bsearch_first {|x| x <=> "c"} => 2 >> %w(a b e f).bsearch_first {|x| x <=> "c"} => nil >> %w(a b e f).bsearch_last {|x| x <=> "c"} => nil >> %w(a b e f).bsearch_lower_boundary {|x| x <=> "c"} => 2 >> %w(a b e f).bsearch_upper_boundary {|x| x <=> "c"} => 2 >> %w(a b c c c d e f).bsearch_range {|x| x <=> "c"} => 2...5 >> %w(a b c d e f).bsearch_range {|x| x <=> "c"} => 2...3 >> %w(a b d e f).bsearch_range {|x| x <=> "c"} => 2...2 == Illustration <<< figure == API --- Array#bsearch_first (range = 0 ... self.length) {|x| ...} Return the index of the FIRST occurrence in an array with a condition given by block. Return nil if not found. Optional parameter `range' specifies the range of searching. To search an ascending order array, let the block be like {|x| x <=> key}. To search an descending order array, let the block be like {|x| key <=> x}. Naturally, the array should be sorted in advance of searching. --- Array#bsearch_last (range = 0 ... self.length) {|x| ...} Return the index of the LAST occurrence in an array with a condition given by block. Return nil if not fount. Optional parameter `range' specifies the range of searching. To search an ascending order array, let the block be like {|x| x <=> key}. To search an descending order array, let the block be like {|x| key <=> x}. Naturally, the array should be sorted in advance of searching. --- Array#bsearch_lower_boundary (range = 0 ... self.length) {|x| ...} Return the LOWER boundary in an array with a condition given by block. Optional parameter `range' specifies the range of searching. To search an ascending order array, let the block be like {|x| x <=> key}. To search an descending order array, let the block be like {|x| key <=> x}. Naturally, the array should be sorted in advance of searching. --- Array#bsearch_upper_boundary (range = 0 ... self.length) {|x| ...} Return the UPPER boundary in an array with a condition given by block. Optional parameter `range' specifies the range of searching. To search an ascending order array, let the block be like {|x| x <=> key}. To search an descending order array, let the block be like {|x| key <=> x}. Naturally, the array should be sorted in advance of searching. --- Array#bsearch_range (range = 0 ... self.length) {|x| ...} Return both the LOWER and the UPPER boundaries in an array with a condition given by block as Range object. Optional parameter `range' specifies the range of searching. To search an ascending order array, let the block be like {|x| x <=> key}. To search an descending order array, let the block be like {|x| key <=> x}. Naturally, the array should be sorted in advance of searching. --- Array#bsearch (range = 0 ... self.length) {|x| ...} This is an alias to Array#bsearch_first. == Download Ruby/Bsearch is a free software with ABSOLUTELY NO WARRANTY under the terms of Ruby's licence. * (()) * (()) satoru@namazu.org =end ruby-bsearch-1.5/bsearch.ja.rd0100644014166500000130000000643707363702274015713 0ustar satoruSonyCSL=begin = Ruby/Bsearch: 配列を 2分探索する Ruby用のライブラリ Ruby/Bsearch は配列を 2分探索する Ruby用のライブラリです。ブ ロックで与えた条件にマッチする、最初の要素および最後の要素を 見つけます。 最新版は (()) から入手可能です == 使用例 % irb -r ./bsearch.rb >> %w(a b c c c d e f).bsearch_first {|x| x <=> "c"} => 2 >> %w(a b c c c d e f).bsearch_last {|x| x <=> "c"} => 5 >> %w(a b c e f).bsearch_first {|x| x <=> "c"} => 2 >> %w(a b e f).bsearch_first {|x| x <=> "c"} => nil >> %w(a b e f).bsearch_last {|x| x <=> "c"} => nil >> %w(a b e f).bsearch_lower_boundary {|x| x <=> "c"} => 2 >> %w(a b e f).bsearch_upper_boundary {|x| x <=> "c"} => 2 >> %w(a b c c c d e f).bsearch_range {|x| x <=> "c"} => 2...5 >> %w(a b c d e f).bsearch_range {|x| x <=> "c"} => 2...3 >> %w(a b d e f).bsearch_range {|x| x <=> "c"} => 2...2 == 説明図 <<< figure == API --- Array#bsearch_first (ange = 0 ... self.length) {|x| ...} ブロックで与えた条件にマッチする最初の要素の添字を返す。見つ からなかったら nil を返す。省略可能な引数 range は検索範囲を 指定する 昇順の配列を探索する場合はブロックを {|x| x <=> key} のように渡します。 降順の配列を探索する場合はブロックを {|x| key <=> x} のように渡します。 当然のことながら、配列は2分探索の前にソートしておく必要があります。 --- Array#bsearch_last (range = 0 ... self.length) {|x| ...} ブロックで与えた条件にマッチする最後の要素の添字を返す。 見つからなかったら nil を返す。省略可能な引数 range は検 索範囲を指定する 昇順の配列を探索する場合はブロックを {|x| x <=> key} のように渡します。 降順の配列を探索する場合はブロックを {|x| key <=> x} のように渡します。 当然のことながら、配列は2分探索の前にソートしておく必要があります。 --- Array#bsearch_lower_boundary (range = 0 ... self.length) {|x| ...} ブロックで与えた条件にマッチする下限の境界を返す。 省略可能な引数 range は検索範囲を指定する 昇順の配列を探索する場合はブロックを {|x| x <=> key} のように渡します。 降順の配列を探索する場合はブロックを {|x| key <=> x} のように渡します。 当然のことながら、配列は2分探索の前にソートしておく必要があります。 --- Array#bsearch_upper_boundary (range = 0 ... self.length) {|x| ...} ブロックで与えた条件にマッチする上限の境界を返す。 省略可能な引数 range は検索範囲を指定する 昇順の配列を探索する場合はブロックを {|x| x <=> key} のように渡します。 降順の配列を探索する場合はブロックを {|x| key <=> x} のように渡します。 当然のことながら、配列は2分探索の前にソートしておく必要があります。 --- Array#bsearch_range (range = 0 ... self.length) {|x| ...} ブロックで与えた条件にマッチする下限と上限の境界を Range オブジェクトとして返す。 省略可能な引数 range は検索範囲を指定する 昇順の配列を探索する場合はブロックを {|x| x <=> key} のように渡します。 降順の配列を探索する場合はブロックを {|x| key <=> x} のように渡します。 当然のことながら、配列は2分探索の前にソートしておく必要があります。 --- Array#bsearch (range = 0 ... self.length) {|x| ...} Array#bsearch_first の別名 == ダウンロード Ruby のライセンスに従ったフリーソフトウェアとして公開します。 完全に無保証です。 * (()) * (()) satoru@namazu.org =end ruby-bsearch-1.5/tests/0040755014166500000130000000000007404724164014515 5ustar satoruSonyCSLruby-bsearch-1.5/tests/0-dict0100644014166500000130000000000007347614452015507 0ustar satoruSonyCSLruby-bsearch-1.5/tests/1-dict0100644014166500000130000000001407347614452015515 0ustar satoruSonyCSLaccountancy ruby-bsearch-1.5/tests/2-dict0100644014166500000130000000000707347614452015520 0ustar satoruSonyCSLevokes ruby-bsearch-1.5/tests/tmp.dict.test0100644014166500000130000000000007404723362017122 0ustar satoruSonyCSLruby-bsearch-1.5/tests/Makefile0100644014166500000130000000055707347614441016163 0ustar satoruSonyCSLcheck: 0-dict 1-dict 2-dict 1000-dict @sh test.sh && echo ok 0-dict: touch 0-dict 1-dict: grep '^[a-zA-z]*$$' /usr/share/dict/words |\ ruby sample.rb -1 > 1-dict 2-dict: grep '^[a-zA-z]*$$' /usr/share/dict/words |\ ruby sample.rb -1 > 2-dict 1000-dict: grep '^[a-zA-z]*$$' /usr/share/dict/words |\ ruby sample.rb -1000 > 1000-dict clean: rm -f tmp.* ruby-bsearch-1.5/tests/sample.rb0100644014166500000130000000057307274661076016334 0ustar satoruSonyCSL# # sample - Pick random N lines from a file. # num = 10 if ARGV[0] != nil && ARGV[0] =~ /^-(\d+)/ then num = $1.to_i ARGV.shift; end selected = [] lineno = 1 while line = gets rand = rand lineno if rand < num then selected.push line if selected.length > num then selected.delete_at rand end end lineno += 1 end selected.each do |x| puts x end ruby-bsearch-1.5/tests/test.rb0100644014166500000130000000270307375132111016010 0ustar satoruSonyCSL# # Just for testing. # require 'bsearch' def prefix_imatch (key, pattern) len = pattern.length raise if key == nil raise if pattern == nil key[0, len].downcase <=> pattern[0, len].downcase end def lookup (dict, pattern) first = dict.bsearch_first {|x| prefix_imatch x, pattern } last = dict.bsearch_last {|x| prefix_imatch x, pattern } range = dict.bsearch_range {|x| prefix_imatch x, pattern } if first != nil then raise "#{range.first} != #{first}" unless range.first == first raise "#{range.last} != #{last}" unless range.last == last + 1 raise unless range == dict.bsearch_range(range) {|x| prefix_imatch x, pattern } raise unless range == dict.bsearch_range(first..last) {|x| prefix_imatch x, pattern } raise unless range == dict.bsearch_range(first...last + 1) {|x| prefix_imatch x, pattern } range.each {|i| print i + 1, ":", dict[i], "\n" } end end def check_boundaries (dict) return if dict.empty? l = 0 u = dict.length - 1 raise unless (l...(l+1)) == dict.bsearch_range(l..l) {|x| x <=> dict.first} raise unless (u...(u+1)) == dict.bsearch_range(u..u) {|x| x <=> dict.last} raise unless (l...l) == dict.bsearch_range(l...l) {|x| x <=> dict.last} raise unless (u...u) == dict.bsearch_range(u...u) {|x| x <=> dict.last} end pattern = ARGV.shift dict = Array.new while line = gets line.chomp! dict.push line end check_boundaries(dict) lookup(dict, pattern) ruby-bsearch-1.5/tests/test.sh0100644014166500000130000000170107347614137016030 0ustar satoruSonyCSL#! /bin/sh RUBYLIB="../" export RUBYLIB testcmd="ruby test.rb" # 1000-dict: usual dictionary with 1000 entries. # 1-dict: dictionary containing only one entry. # 0-dict: empty dictionary. for dict in 1000-dict 2-dict 1-dict 0-dict; do # prefix search. for pat in "" "a" "be" "st" "ta" "x" "Nonexistent"; do $testcmd "$pat" $dict > tmp.dict.test egrep -in "^$pat" $dict > tmp.dict.egrep cmp tmp.dict.test tmp.dict.egrep || exit 1 done # prefix search. iterate 50 times. for pat in `ruby sample.rb -50 $dict`; do $testcmd "$pat" $dict > tmp.dict.test egrep -in "^$pat" $dict > tmp.dict.egrep cmp tmp.dict.test tmp.dict.egrep || exit 1 done # prefix search. for boundary entries. first=`head -1 $dict` last=`tail -1 $dict` for pat in $first $last; do $testcmd "$pat" $dict > tmp.dict.test egrep -in "^$pat" $dict > tmp.dict.egrep cmp tmp.dict.test tmp.dict.egrep || exit 1 done done exit 0 ruby-bsearch-1.5/tests/tmp.dict.egrep0100644014166500000130000000000007404723362017245 0ustar satoruSonyCSLruby-bsearch-1.5/tests/1000-dict0100644014166500000130000002143407347614453015747 0ustar satoruSonyCSLabandoning ablaze abnormalities acceptable accompanist accretions accusing acquisitiveness acrobats addicting addressing adequacy Adirondacks administrate admirable admitter adverse advisability aerating aerospace affected aftershock agglutinating agitates agitation airlocks alarmingly alive allays also alterations alternator altitude ambler amoebae anachronisms Anderson aniseikonic Ann antagonistically antigen antiquate aphids apostle apothecary appendices apportion approximation aquatic archaic Archie Arden arenas Aries armistice arousal arpeggio arranges arrest arrogate ascertaining ascribable Ashley Asilomar asinine aspect aspiration assessor assurer astonishes astounding authenticate availabilities avenged awakening awareness awry axles Ayers babyish baccalaureate backups bakeries Balkan ballistic balustrades banners bantam Barnett basking basses bastes Batista Baudelaire Bauhaus beaked beds beetle before befouled beggars begin begins begrudged behaviorally belfry belie Belmont Berlitz beside bib bidden biddy bilingual bimonthly bind bistate bitingly blabbing blackouts blisters bloodless bluefish blundering blushes Bobbie bombed bondsmen Bonham boo boors bootlegger Borden bounden Bowen bracketed Bradley Bradshaw brainchild brassy braver braze breakfasts breasts breaths bridgehead brig brine broadened buns bunt burden Burtt but buttes buttoned CALCOMP calculating Calcutta campaign canary cancellations cancers candidness candles canine cannery capes Cappy caravan carbonated carnal carol cartilage casino Caspian casters cataclysmic categorization catnip caulk cedar censured Centralia centroid ceremonialness certifies chain Chalmers chambermaid charges cheapen checklist checksum chests chief chieftain chiseler choker choose chronological chronologies chubbiness Cinderella circulated city clad clamorous clamping classifying claws coarsen coastal coed Coffey collaborated collaborator collie Colosseum Columbia combine comestible communicator compensations componentwise compressing conclusively concretion conductance confidences confronters Congolese conspicuous consume continentally contours contraceptive contradicted contrives controlled contumacy converse conversion cork correct correctable correction correlative cosmetics country coziness crafted creates critic crowned crushed crux cuckoo cuddle cuddly cull curtsies customizations customizer cymbal dative daughter David daylight deallocating deallocations Deanna decathlon deceiving decimal decodes decreasingly defines degradation delimiters demolition demonstrative DeMorgan demote demultiplexing dependence depends descry detailing determinate detrimental developments devises devoured dibble diddle digression dimensioning dimming disablers discernibly discernment discomfort discourages disinterestedness dismount disorder dispensation displacing Dolan domestic dominates Donaldson doting drastic Drexel drizzly droops Dunham earth earthly eatings Ecole economically Edenizes edits efficiencies either electrocardiograph Elkhart embark employs emptiest endgame enemies energize engine enjoined ensure entertainers epics Episcopalianize equally erects eternities evacuate exchanges exclusively excusable exhume expecting expel experimental experts extraordinariness failure fairs faithfulness fangled fasting feast feathery Felice Fermat fetter fiat fights finesse Fiske fitter fixations fixed flakes flattened flipped flopping focus foggiest forearm forecasting forlorn formalities FORTH founding Frankie fraying friction fringed frosts furnaces gambling garb gardener Gardner gargled garlic garter gate gathered Geigy gerbil ghetto gifts gin goals going Goodwin gorgeous Gothicism grandstand granularity grater grating gravelly Graves Greta groaned grotesquely gubernatorial Guiana guilty gum gut hacks Hagen Hague Halloween hardcopy Harding hastened Haydn healthiness Hebrew hemlock Hendricks Hibbard historian historians hoariness Holcomb homes homing honesty honey honorableness hooded hookup hoot hornet horrifying Hubbell humanely humorousness hunk hyacinth Hyman iceberg iconoclast idiosyncrasy illogical imaginably immortally impeached imperious imposed impracticality inanimately inaugurate incessantly incomes incompatible inconceivable indiscriminately inductee Indus inflate inheres inheritrix injure injury inning inoperable input inquisitive insane insightful inspirations install instances institutionally instruction instrument insurgent interfere interlinks interpolates interrelate interrogates intersecting intersections intimacy intubated invisibility Iranizes ironies jabbed Jamestown jammed Janis janitors Jesuitizing jolly journalized judge judo Justine Kenilworth kennels Kernighan kilobits Kingwood Knox Kowalski Lamarck lament lathe launch Laurentian lawyer Layton leaping lechery letter leveling lexicographical liberalized licorice likeliest limit Linnaeus Linton locality locators lockout Lombardy looked lounge lounges lounging Lucia lusts Lyra maddest Mafia magicians maids mailings Majorca majoring Malawi Malayize mama managerial mandated Manila manometers Marlowe Martha Marx maternally Matsumoto matured Maxwellian McCracken McIntyre mechanized meeting Melanesia memorized Mexicans Michel microphones microscopy Mimi minuteman misfortune Mitch mitigates mix mixing modulations mollycoddle monotonous moorings Mouton mucilage muff mushrooms musicology napkin narcotics Nathaniel navigate necessities needy nemesis nerve neutral Nicholson Nixon Noah nocturnal nonintrusive nonogenarian notions nourished nurture observatory observe Oedipal offender oiling ones openness operative optimizing optometry orbiting ordeal organ Orpheus orthant otters outvote overestimate overhauling overlapped overprinting overworked oysters pacer paginates palates Palomar Pam panama pants pare parochial parser partisan patched Patricia patriotic pattered paves peddle pedestrian penalizing penetrations percentage percentiles perceptively peroxide personified petals petition pharmacopoeia Philistinize phonemes pincushion Piotr Pius plainest planer planter planters plants pleasantly pointedly policed porcelain postponing potting Potts pounds Powers practice precise precondition preconditions predications preferences premiers preparing preprocessors presentness presidents pressured primitiveness Principia privately professing Promethean promulgated proneness prosecutor proselytize pruners psychologically psychotherapy Purcell pushing pussy puzzled quadratically quarry quitter quoth racially radiate ramrod reactivity rearing recasts recognizer recombined recompiled recursions reeducation reemphasizes reflexively refuge regionally regulates rejoices rejoins relativism remembers remonstrate renditions repelled replenishes repleteness reposes reproaching reptilian requisitioning rescind resign restaurants restrict retaliate retch retract reverend reverified revised revolt rhesus Riggs rightward ring ringings roarer Rossi roundness rousing royalist rubbing run ruts Ryder sacker salutations Sandra sanitary Santiago saplings scarceness scheme schools Scorpio scoundrels scrapers scratches screams sculpts sculptured scurry Seaborg searingly secondhand seers selectman selects sensibility sensitive sequentializing serial sermons settings shadows shaker Shawnee sheriff Shiites shirt shivers shortish shovel shoveled shows showy shuttlecock sickle Sieglinda sights siting skyjack slate sleepers slide sloping Slovenia smash smirk smiths smithy smoothest sneering snorts snowily softwares sojourners solicit solidity somewhere song sophistry soundness sourer spades sparkling sparrows species specimens spectrograms spigot sponsoring spoolers spotter spruce squabbling squaring stallings steel steepness Stephan Steuben Steve Stevie stifling stocks stoles stomach storminess strainer streamlined strikers Strindberg Stromberg strychnine stuffing stupidity stupidly stylish subscribed subsiding subsidize substitutable sunken superimpose superposed supervisory sureties surpass surveyor sustains swabbing swooped syndicate takes talents Tannenbaum Tawney taxiing telephoner tendencies tenser Terra testimonies theorization Thomson thorns thrust thruster thumbing timings tinkers tinny tolerant tomato toss toying transcendent trapped trespasser tributary trick tricks trihedral triumphal triumphant trolley tropics trues Truman tumor tuples Turkish turn Tutankhamon Tutankhamun typical tyranny ugliness unassailable unattended unavailability unbelievable unconsciousness undecidable underling underwriting undesirable undoubtedly unfamiliar unpleasantness unprescribed untested unwisely Valhalla vastest ventilating Venus Vera Verna vicissitude viewpoint Vikram vindication violation visibility vocabulary volunteers vows walk wanderings warden ware warily warship ways wayside weaves webs wedging Weeks wench which whipper whirr white whoever wields windows wine Winfield Winograd woodman wooing workman workshop wormed wretches writable writers yellow Yokohama ruby-bsearch-1.5/bsearch.png0100644014166500000130000001273707336752405015502 0ustar satoruSonyCSLPNG  IHDR″gAMA a pHYs``zxEtIME nIDATx皿絛 0qn Airj?dJ;;暖#堪B)C(i\曁鐘@G餡x5j@-`P @)h`n0 州敍Q\u @)h`1M0 0L噪N.2鴫,KX'}lilH,zC)l鑿bCf{:w%T蠎廸t`#M%4M2^閙fT*Ea/EI艚$z2j)Hei&cq看8c鰾<遒 3」;?漏;映2v/晟n釉Z肢纖L墹J{)$a集犀zト{卩"閙SdZei-K畭nD>eI瞬 k&p&MN囂N罸*z拓L&aWQdnIRTRBPmx>z鰔eiJ可GglV>蹶擔^I]lv諍,鵬,xcw$0ay]Q爿msRepiYJYnx,&8]{kpaR7艱<碗M膝M]h躄 赴G]dyM損I wUqL 9_\,e6&6e璪 G拍Wh泅v侏9纎3Q7LQOdHa緝楪]e|cY'}T)Je浴1hei-K甬,a\N/Kd鐺ドvw靼3OTM %餉J殲',U梁]c>]K陝LDo+炙サ8K片鮎r慊a"f'z鮃))KL`&gΔ,ao憩^`o貲e4筍 {)/K結V@ 0%k疲mFqdc彭S~ q0G q[\槫 IL`< 4価.h 膜 8j*6檣Y<x舒]O>?& a/"@k 梳&0 o隙霎:WBVT P ! w=$RB 4_ <(UAHpk c義@n`h:h tnタ7 L穃07 m!4 : 峭%xp裴 a OK0p 覘In p 6荼 Wu疲`a當猖頬OxnR舟 1M+7 O `4<6xVv#x偃0a鞜仲 渣S 煕'C酸2;x閙顳1o9p]"s/0M?[Ta&楢!d0 番化@鍛`3!7偉柔@#qs@Vq#v飮w///_1fGjp-o雀Fv4M0憮?<R9h!5霪揀0?`瘡訥輓r旧栫 D!娉m-}#Z3%u&rP-輾eYi袢xb娉kP9m9 m舎eox 9UIZq33_wy<~鴈犁冽Ml藩)!VQ駑呂l⇔'Z`- 娚WjnGFf@[2El23Ne&QmL茸{7e% n.o/.陪IざD笊rGI掠衫1п!'皷+:-:l.褥F楯L慘;(l21s&栲筑; lZ-疉0L{%:\難 sRjKAI 廰@kB講珊隋G!0倚2\竣NzRwR^徼+Tzr胖R9TeeGZNEtA=o37w&4t!wpF戀QR"5c蟾2K, 巻PQo左f/劼@{lhmj[6G舌秒qVY4h%肭I窈3C0 =6PO =aь 掾+0J^VooモROL^5P忝癒;]#-$sh芸uー{章& 黐:y杉{~ /F R7梗v$弋AoR1xx]21願U9XU野evNS&7w=@@{QfoUZ2醜%3$Z '(J275慶+T]4粡慂foS敗U[艀:?`激zUEV;frP-蒟{宙C憇R~[T俣~蛆_5|躔|咆@走y歇棆,lrP!3体綋AViY屁)}x~ pQ&!R0GP*1Tr遉!# tS%rPU塁TA(  4R0J@(  4R0J@(  4R0J@(  4R0J@(  4R0J@(  4VVK喧5cJ<*T!G馭d,"4DAU9紵CJ_|?c醸W?z侭?*U |鬟*U縵VMtf M@V4R0J@(  4c眠,4 ie&}a-^eYqyngy%U鰍zf5UUaPU's,'遞鉅1 %睫%激椪{2,o2 熾hH;r楴R鰲b7射[Se*]EU4g)K+ZyQ絋6(偃j]~$x4u)t<u舵^z*D2掖溺3eTmc'麓敖hf.<浪$+TJc竅刹a U&qAesF艮/l品;okHhGFSU&@/ XRYgz`zd|灯R蜩7MBPUAUc0丼p3_|i秧齒0┣TS∬Q -[{b~鈩c+UTrJT1h0抵醸WzX雀oaPeAU9*DIP CJ@F貍獣[o)u H' 薩鼬}奮礒 !V綣 %_?F擅{BZv  譌X$V7*黯yj(0 J梹JZ 4e 呵>$估7+r 謌H*@瘧a彩tg;厽fY塗Uo:%6r+弱%z 惹:+觝A暁諡&FG瑟~.&L網K% Aヤh^ykt5a^i%}6驫BZ,khWaW} r*d3梛"#lChSBm輻┴J溪忿蘗?孕9[Yh4偸_除v}5z'胥蒋{=j0倬z%GvY6b;P=vP[ニ_^CfT.3H tHIG8尹V>tx駐r*-覩oZgE$y2eW[葵OaY/Yne)V46C>昵yU揚Y`isC%boG]dよ'養腑d}1z|4=*:(mK」yzzvZ-^E睦qCG:鈴9名h憊"VF,廓飮鵬tpyz;<5隘dw yD戰釟 9kl9z鞆纜憤^.:覧悉tsZEJr1従uΜ;,Mg丁%o4OPtl浬O;QT咽轆1iEИz8l=?eT;g 呵tlz?tL霹O癘]樽 呵蜑冽U%約l'dst\ふsUp諛M%7g|qe鑵瀬a a色G=ry%1Fe庫skYdX炒莎6 辰Dk(私OO\瑠D@hwe8幺1m/咨]NwR.茯:"2(Tw緇環$\kVo衫B{m&巳Z黴6{禎^.g溜G3z麥7綮<'I: G'SCQa3回}z裙Z!wv1 q[]g~[\'m窺@7bc X粒{拈6g6+ Uh昧\硝zo  4tCq滄M 論RP@E*`8IENDB`