1

2つの文字列を入力するプログラムを作成しようとしています。それらが一致する場合、同じ長さ2の部分文字列を含む位置の数を返します。

例:string_match('xxcaazz'、'xxbaaz')→3 "xx" "aa" "az"私の質問は、検証に使用するメタ文字です。

これが私が思いついたものです

puts "enter word"
a = STDIN.gets
a.chomp!
puts"enter word"
b = STDIN.gets
b.chomp!
if a == /word/ or b == /word/ then 
  puts str.match(/{a} {b}/) + "equal"
end
4

2 に答える 2

1

更新された回答:

(まだ急上昇していますが、より良いです)

first_word = 'xxcaazz'.split('')
second_word ='xxbaaz'.split('')

first_word_length = first_word.length
second_word_length = second_word.length

if [first_word_length, second_word_length].min == first_word_length
  inner_word = second_word
  outter_word = first_word
else
  inner_word = first_word
  outter_word = second_word
end

outter_word_length = outter_word.length - 2

word_matches = 0

(0..outter_word_length).each do |character|
  if "#{outter_word[character]}#{outter_word[character + 1]}" == "#{inner_word[character]}#{inner_word[character + 1]}"
    puts "#{outter_word[character]}#{outter_word[character + 1]}"
    word_matches += 1
  end
end

puts "Found #{word_matches} matches"

オリジナルスパイク:

これはあなたを良いスタートに導くかもしれません(それは決して防弾ではありませんが、ただの速いスパイクです):

first_word = 'xxcaazz'.split('')
second_word ='xxbaaz'.split('')
first_word_length = first_word.length

(0..first_word_length).each do |character|
  if "#{second_word[character]}#{second_word[character + 1]}" == "#{first_word[character]}#{first_word[character + 1]}"
    puts "#{second_word[character]}#{second_word[character + 1]}"
  end
end
于 2012-04-29T23:36:11.967 に答える
1

'a2X'をアンパックするとは、2バイトを抽出してから、1バイトを巻き戻すことを意味します。

first_word = 'xxcaazz'
second_word ='xxbaaz'
tokens = first_word.unpack 'a2X' * (first_word.length - 1)
# => ["xx", "xc", "ca", "aa", "az", "zz"]
tokens.flat_map{|m| second_word.scan m}
# => ["xx", "aa", "az"]
于 2012-04-30T00:46:46.287 に答える