2010-01-07 3 views
0

Étant donné une chaîne de caractères en entrée, sans utiliser d'expression régulière ou de correspondance de modèle, comment obtenir la sortie, si les caractères correspondent à aaa devrait sortir 1 et si les caractères correspondent à aBa devrait sortir 2. (Note: ne devrait pas les caractères retraiter de manière à sortir à la fois « 1 » et « 2 » lors du traitement de la même entrée)Ruby Program/Problème

Ainsi, par exemple:

donné « aaBaBaaaBaaa », il doit envoyer 211

donné ' aaaBaBaaaaBBaBaBa 'il devrait afficher 1212

Merci d'avance.

+0

Impossible de comprendre comment comment vos cartes de sortie à votre entrée, ont besoin d'une meilleure description de la problème. Que rapporte aaaaaaaa, un seul "1"? – meagar

+0

@meagar: Comme je l'ai lu, les motifs ne peuvent pas se chevaucher. Donc "aaaaaaaa" serait analysé comme "[aaa] [aaa] aa", cédant "11" –

+0

@Shmoopty: C'est correct. – Dharam

Répondre

4

sans utiliser l'expression régulière ou un motif correspondant à

#input = 'aaBaBaaaBaaa' 
input = 'aaaBaBaaaaBBaBaBa' 
codes = {'aaa' => 1, 'aBa' => 2} 
patterns = codes.keys 
output = [] 

current = 0 
length = input.length 

while current <= length - 1 
    is_find = false 
    patterns.each do|pattern| 
     len = pattern.length 
     if input[current, len] == pattern 
      output << codes[pattern] 
      current += len 
      is_find = true 
      break 
     end 
    end 

    current += 1 if !is_find 
end 

p output 
+0

p output.join - il voulait une chaîne;) Bien fait cependant, résolu le problème et ensuite ajouté la flexibilité d'ajouter de nouveaux "codes" de toute longueur. – Beanish

+0

Excellent. Qu'en est-il de même en JAVA? – Dharam

+0

L'algorithme est assez solide, donc la solution Java est à peu près la même. Les plus gros changements sont l'accès à chaque itérateur de Ruby, et les hachages ne font pas partie des types par défaut. Il y a plusieurs façons de contourner cela. Pour commencer, vous pouvez importer java.util.HashMap, ou vous pouvez redéfinir les hachages de codes en tant que tableau d'objets de code. – EmFi

6

On dirait que vous voulez une machine d'état:

require 'statemachine' 

state_machine = Statemachine.build do 
    trans :_, :a, :a 
    trans :_, :B, :_ 
    trans :a, :a, :aa 
    trans :a, :B, :aB 
    trans :aa, :a, :_, 'print 1' 
    trans :aa, :B, :aB 
    trans :aB, :a, :_, 'print 2' 
    trans :aB, :B, :_ 
end 

"aaBaBaaaBaaa".each_char do |i| 
    state_machine.process_event(i) 
end 

state_machine.reset 
puts 

"aaaBaBaaaaBBaBaBa".each_char do |i| 
    state_machine.process_event(i) 
end 
+0

Solution géniale, vous auriez dû mériter l'acceptation! – akuhn

+0

+1 Bien fait! – z5h