Never been to DZone Snippets before?

Snippets is a public source code repository. Easily build up your personal collection of code snippets, categorize them with tags / keywords, and share them with the world

« Newer Snippets
Older Snippets »
Showing 1-3 of 3 total  RSS 

Rubylike slice for strings and lists

(slice "hello" 2 4) => "ll"
Comparable to: "hello"[2...4]

(slice "hello" 2 -1) => "ll"
Comparable to: "hello"[2...-1]

(slice "hello" '(2 2)) => "ll"
Comparable to: "hello"[2,2]

(slice "hello" 1) => "ello"
Comparable to: "hello"[2..-1]

(def slice (str x (o y))
  (if (atom x)
    (if 
      ; (slice "hello" 1) => "ello"
      (no y) 
        (subseq str x)
      ; (slice "hello" 2 -1) => "ll"
      (< y 0) 
        (subseq str x (+ (len str) y))
      ; (slice "hello" 2 4) => "ll"
      (subseq str x y))
    ; (slice "hello" '(2 2)) => "ll"
    (subseq str (car x) (+ (car x) (cadr x)))))

Split String into roughly equal-sized chunks.

Split a string into an array of roughly equal sized chunks based on a string or regular expression delimiter.
Delimiter is preserved in output.

class String
  def chunk_string(average_segment_size = 40, sclice_on = /\s+/)
    out = []
    slices_estimate = self.size.divmod(average_segment_size)
    slice_count = (slices_estimate[1] > 0 ? slices_estimate[0] + 1 : slices_estimate[0])
    slice_guess = self.size / slice_count
    previous_slice_location = 0
    (1..slice_count - 1).each do
      |i|
      slice_location = self.nearest_split(slice_guess * i, sclice_on)
      out << self.slice(previous_slice_location..slice_location)
      previous_slice_location = slice_location + 1
    end
    out << self.slice(previous_slice_location..self.size)
    out
  end

  def nearest_split(slice_start, slice_on)
    left_scan_location  = (self.slice(0..slice_start).rindex(slice_on)).to_i
    right_scan_location = (self.slice((slice_start+1)..self.size).index(slice_on)).to_i + slice_start
    ((slice_start - left_scan_location) < (right_scan_location - slice_start) ? left_scan_location : right_scan_location)
  end
end

slice function

slice: func [series start len] [copy/part at series start len]
« Newer Snippets
Older Snippets »
Showing 1-3 of 3 total  RSS