(追記:2013-1-16) tyama@cTouch(うつにーと)さんのコメントを受けてコードを修正したところ無事100でパスしました。next if substr.match(/^ +$/)を追加.
バグ入りで80点^ ^;
入出力情報少なすぎてバグ特定できない..まあいっか。str.gsub(substr).to_aという技を閃いた。
文字列中に繰り返し現れる最長の部分文字列。
#!/usr/bin/env ruby def find_longest_substr(str) max_size = str.size/2 max_size.downto(1) do |len| loop.with_index do |_, pos| substr = str[pos, len] break if substr.size < len return substr if str.gsub(substr).to_a.size > 1 end end :NONE end ARGF.lines do |line| puts find_longest_substr(line.chomp) end
もっと賢いやり方があると思う。座標系を回転させるとか。でもまあ一応パスということで..
EnumeratorでSpiralSequenceを作って。
2次元配列の要素をスパイラルな順序で出力。
#!/usr/bin/env ruby class SpiralSequencer def initialize(row, col) @row, @col = row, col @enum = build_sequencer end def next @enum.next end private def build_sequencer Enumerator.new do |yielder| x = y = xmin = ymin = 0 xmax, ymax = @col-1, @row-1 dir = :right loop { yielder << [x, y] case dir when :right; x += 1 when :left; x -= 1 when :down; y += 1 when :up; y -= 1 end if x > xmax dir = :down; ymin += 1; x -= 1; y += 1 end if y > ymax dir = :left; xmax -= 1; y -= 1; x -= 1 end if x < xmin dir = :up; ymax -= 1; x += 1; y -= 1 end if y < ymin dir = :right; xmin += 1; x += 1; y += 1 end raise StopIteration if xmin > xmax or ymin > ymax } end end end def build_2d_array(items, col) items.each_slice(col).to_a end ARGF.lines do |line| n, m, items = line.split(';') .instance_eval { [*first(2).map(&:to_i), last.scan(/\w+/)] } arr = build_2d_array(items, m) sps = SpiralSequencer.new(n, m) loop { col, row = sps.next print arr[row][col], " " } print "\n" end
100円〜で好評発売中!M'ELBORNE BOOKS