2013-05-13 18 views

Odpowiedz

5

można wykorzystywać skrót w bibliotece standardowej

require 'abbrev' 
s = Abbrev::abbrev(['string']).keys 
puts s.inspect 

Muszę dodać inny sposób na wykorzystanie tego po wymagające skrót biblioteka z dodaną metodą .abbrev do tablicy:

require 'abbrev' 
s = ['string'].abbrev.keys 
puts s.inspect 

Jeśli zamówienie jest ważne, aby dopasować swój zwrot w pytaniu, wystarczy zadzwonić pod numer .sort pod numerem keys.

+1

@ user21033168, przepraszam, ale interesujące, ponieważ warto wiedzieć o tej bibliotece (osobiście jej nie znałem, dzięki @vgoff) Nie widzę, aby zamiast tego wybrać rozwiązanie, które wymaga użycia "sortowania" i obiektów pośrednich któregokolwiek z innych, które wykonują prostą "mapę", na przykład Sergio. – tokland

+0

@tokland Właściwie to nie potrzebowałem .sort, więc po prostu podoba mi się krótkość tego rozwiązania z% w {string} .abbrev.keys :) – user21033168

+1

wystarczająco fair, choć będzie to trochę mylące dla przyszłych czytników SO szukających dokładnie to, o co prosiłeś, "inits" (jak nazywa to Haskell) ciągu w Ruby. – tokland

12

Co powiesz na to?

s = 'string' 
res = s.length.times.map {|len| s[0..len]} 
res # => ["s", "st", "str", "stri", "strin", "string"] 
+1

+1 za nie używając żadnych innych modułów dla tak prostego zadania. –

6

Im bardziej deklaratywny mogę wymyślić:

s = "string" 
1.upto(s.length).map { |len| s[0, len] } 
#=> ["s", "st", "str", "stri", "strin", "string"] 
+0

Też mam :) –

+0

@ Sergio. Tak, widziałem, najwyraźniej prosta "mapa" jest zabroniona do realizacji tego. Cokolwiek. – tokland

+0

To nie ja zawiodłem któregoś z was, są to dobre rozwiązania :) – user21033168

0

Inny wariant (będzie to obejmować pusty ciąg w wyniku):

s.each_char.inject([""]) {|a,ch| a << a[-1] + ch} 

This

  • rozpoczyna się tablicę zawierającą pusty łańcuch [""]
  • dla każdej ch char w string, dodaje do ostatniego wyniku a[-1] + ch
  • dodaje to do tablicy wyników
+0

Powoduje to utworzenie pustego łańcucha jako pierwszego wyniku. –

+0

Otrzymuję '[" "," s "," st "," str "," stri "," strin "," string "]' w Rubim 1.9. Nieco zawikłany w każdym przypadku. – tokland

5
s.chars.zip.inject{ |i,j| i << i.last + j.first } 
+0

To jest faktycznie moje ulubione rozwiązanie, ponieważ nie odnosi się do * s * w łańcuchu metod i jest sprytne. – user21033168

0
s = "string" 
s.each_char.with_object([""]){|i,ar| ar << ar[-1].dup.concat(i)}.drop(1) 
#=> ["s", "st", "str", "stri", "strin", "string"]