もっとスマートなのもあるだろうが今はこれが精一杯
エンジニアが死滅した世界「高層タワー」
問題文
単語を組み合わせて新単語を作ります。
新単語は N 個の文字列を、前から順に結合して作ります。
この時、冗長さをなくすため、 前から結合した単語の末尾 と 後ろの単語の先端 が一番長く一致するように結合します。
例えば、 入力例 1 の "paiza", "apple", "letter" の場合、
先頭から "paiza", "apple" を条件どおり重ねると "paizapple" となります。
この単語を更に次の単語と重ねると "paizappletter" となります。
高層タワー_spec.rb
require 'spec_helper'
RSpec.describe High_rise_tower do
it '入力例1' do
# やりやすいように引数の文字列を「/」で区切りました
result = High_rise_tower.new.combine(word: 'paiza/apple/letter')
expect(result).to eq 'paizappletter'
end
it '入力例2' do
result = High_rise_tower.new.combine(word: 'poh/p/oh')
expect(result).to eq 'pohpoh'
end
end
高層タワー.rb
class High_rise_tower
def initialize
# その都度新単語がこの変数に入っていく
@new_word = ''
end
def combine(word:)
word.split('/').each do |w|
w.to_s
if @new_word == '' # 1回目は必ず、ただの単語が入るように条件分岐
@new_word = w
else
num = w.length # 比較する単語が、前の単語と重なる部分があるかを調べるために、比較する単語の長さを調べてその長さ分、後ろから確かめる
cut_word = w
while num >= 1
break if @new_word.index(cut_word, -num) != nil
# 一回ずつ文字列の末尾を削って、合致するかをみる
cut_word = cut_word.chop
num -= 1
end
# つまりは、chopしていった結果合致するものがなく、からの文字列が帰ってきたのではなければ、切った文字列の長さ分を、比較された単語から削って新しい単語にくっつける
if cut_word == ''
@new_word += w
else
int = cut_word.length
if int == 1
w.slice!(0)
@new_word += w
else
w.slice!(0..int -1)
@new_word += w
end
end
end
end
# 最後にブロック引数として新しい単語を返す
@new_word
end
end
thank youにゃー
また更新したいけど、需要のなさそうなこれらの、どこをどう直しましょうか?