मदद कर सकते हैं रूबी में regex का उपयोग करना है 1.8.7+:
p s.scan(/((\d)\2*)/).map(&:first)
#=> ["111", "22", "1"]
यह काम करता है क्योंकि (\d)
किसी भी अंकों कैप्चर करता है, और उसके बाद \2*
उस समूह (दूसरे उद्घाटन कोष्ठक) से मेल खाने वाले शून्य-या-अधिक को कैप्चर करता है। scan
में परिणामस्वरूप पूरे मैच को कैप्चर करने के लिए बाहरी (…)
की आवश्यकता है। अंत में, scan
अकेले रिटर्न:
[["111", "1"], ["22", "2"], ["1", "1"]]
... इसलिए हम के माध्यम से चलाने के लिए और प्रत्येक सरणी में सिर्फ पहला आइटम रखने की जरूरत है। रूबी में 1.8.6+ (जो सुविधा के लिए Symbol#to_proc
नहीं है):
p s.chars.chunk{|c|c}.map{ |n,a| a.join }
#=> ["111", "22", "1"]
:
p s.scan(/((\d)\2*)/).map{ |x| x.first }
#=> ["111", "22", "1"]
कोई Regex के साथ
, यहाँ एक मजेदार एक (किसी भी चार मिलान) कि रूबी 1.9.2 में काम करता है
यहाँ एक और संस्करण है कि रूबी 1.8.6 में भी काम करना चाहिए है:
p s.scan(/./).inject([]){|a,c| (a.last && a.last[0]==c[0] ? a.last : a)<<c; a }
# => ["111", "22", "1"]
जब इनपुट गैर अंकों वर्ण, जैसे है क्या होना चाहिए '111aaa222" 'और' "111aaa111" '? – Phrogz