From f66ca90441ed76a7efdd46a78de299dbc30fd981 Mon Sep 17 00:00:00 2001 From: Gordon Chan Date: Wed, 19 Oct 2016 20:56:12 +1300 Subject: [PATCH] Add transpose --- config.json | 9 +- exercises/transpose/.version | 1 + exercises/transpose/example.rb | 14 ++ exercises/transpose/example.tt | 22 ++ exercises/transpose/transpose_test.rb | 303 ++++++++++++++++++++++++++ lib/transpose_cases.rb | 45 ++++ 6 files changed, 393 insertions(+), 1 deletion(-) create mode 100644 exercises/transpose/.version create mode 100644 exercises/transpose/example.rb create mode 100644 exercises/transpose/example.tt create mode 100755 exercises/transpose/transpose_test.rb create mode 100644 lib/transpose_cases.rb diff --git a/config.json b/config.json index a1561efd76..7de5d7a796 100644 --- a/config.json +++ b/config.json @@ -85,7 +85,8 @@ "list-ops", "diamond", "all-your-base", - "isogram" + "isogram", + "transpose" ], "exercises": [ { @@ -573,6 +574,12 @@ "difficulty": 1, "topics": [ ] + }, + { + "slug": "transpose", + "difficulty": 1, + "topics": [ + ] } ], "deprecated": [ diff --git a/exercises/transpose/.version b/exercises/transpose/.version new file mode 100644 index 0000000000..56a6051ca2 --- /dev/null +++ b/exercises/transpose/.version @@ -0,0 +1 @@ +1 \ No newline at end of file diff --git a/exercises/transpose/example.rb b/exercises/transpose/example.rb new file mode 100644 index 0000000000..2d206e3107 --- /dev/null +++ b/exercises/transpose/example.rb @@ -0,0 +1,14 @@ +module BookKeeping + VERSION = 1 +end + +class Transpose + def self.transpose(input) + lines = input.split("\n") + max_line_length = lines.map(&:length).max + + lines + .map { |line| line.ljust(max_line_length).chars } + .transpose.map(&:join).join("\n").strip + end +end diff --git a/exercises/transpose/example.tt b/exercises/transpose/example.tt new file mode 100644 index 0000000000..bd4b23e3c3 --- /dev/null +++ b/exercises/transpose/example.tt @@ -0,0 +1,22 @@ +#!/usr/bin/env ruby +gem 'minitest', '>= 5.0.0' +require 'minitest/autorun' +require_relative 'transpose' + +# Test data version: +# <%= sha1 %> +class TransposeTest < Minitest::Test<% test_cases.each do |test_case| %> + def <%= test_case.test_name %> + <%= test_case.skipped %> + input = <%= test_case.input_text %> + actual = <%= test_case.workload %> + expected = <%= test_case.expect %> + assert_equal expected.strip, actual + end +<% end %> +<%= IO.read(XRUBY_LIB + '/bookkeeping.md') %> + def test_bookkeeping + skip + assert_equal <%= version.next %>, BookKeeping::VERSION + end +end diff --git a/exercises/transpose/transpose_test.rb b/exercises/transpose/transpose_test.rb new file mode 100755 index 0000000000..31a14563f0 --- /dev/null +++ b/exercises/transpose/transpose_test.rb @@ -0,0 +1,303 @@ +#!/usr/bin/env ruby +gem 'minitest', '>= 5.0.0' +require 'minitest/autorun' +require_relative 'transpose' + +# Test data version: +# 0a51cfc +class TransposeTest < Minitest::Test + def test_empty_string + # skip + input = <<-INPUT.gsub(/^ {6}/, '') + + INPUT + actual = Transpose.transpose(input) + expected = <<-EXPECTED.gsub(/^ {6}/, '') + + EXPECTED + assert_equal expected.strip, actual + end + + def test_two_characters_in_a_row + skip + input = <<-INPUT.gsub(/^ {6}/, '') + A1 + INPUT + actual = Transpose.transpose(input) + expected = <<-EXPECTED.gsub(/^ {6}/, '') + A + 1 + EXPECTED + assert_equal expected.strip, actual + end + + def test_two_characters_in_a_column + skip + input = <<-INPUT.gsub(/^ {6}/, '') + A + 1 + INPUT + actual = Transpose.transpose(input) + expected = <<-EXPECTED.gsub(/^ {6}/, '') + A1 + EXPECTED + assert_equal expected.strip, actual + end + + def test_simple + skip + input = <<-INPUT.gsub(/^ {6}/, '') + ABC + 123 + INPUT + actual = Transpose.transpose(input) + expected = <<-EXPECTED.gsub(/^ {6}/, '') + A1 + B2 + C3 + EXPECTED + assert_equal expected.strip, actual + end + + def test_single_line + skip + input = <<-INPUT.gsub(/^ {6}/, '') + Single line. + INPUT + actual = Transpose.transpose(input) + expected = <<-EXPECTED.gsub(/^ {6}/, '') + S + i + n + g + l + e + + l + i + n + e + . + EXPECTED + assert_equal expected.strip, actual + end + + def test_first_line_longer_than_second_line + skip + input = <<-INPUT.gsub(/^ {6}/, '') + The fourth line. + The fifth line. + INPUT + actual = Transpose.transpose(input) + expected = <<-EXPECTED.gsub(/^ {6}/, '') + TT + hh + ee + + ff + oi + uf + rt + th + h + l + li + in + ne + e. + . + EXPECTED + assert_equal expected.strip, actual + end + + def test_second_line_longer_than_first_line + skip + input = <<-INPUT.gsub(/^ {6}/, '') + The first line. + The second line. + INPUT + actual = Transpose.transpose(input) + expected = <<-EXPECTED.gsub(/^ {6}/, '') + TT + hh + ee + + fs + ie + rc + so + tn + d + l + il + ni + en + .e + . + EXPECTED + assert_equal expected.strip, actual + end + + def test_square + skip + input = <<-INPUT.gsub(/^ {6}/, '') + HEART + EMBER + ABUSE + RESIN + TREND + INPUT + actual = Transpose.transpose(input) + expected = <<-EXPECTED.gsub(/^ {6}/, '') + HEART + EMBER + ABUSE + RESIN + TREND + EXPECTED + assert_equal expected.strip, actual + end + + def test_rectangle + skip + input = <<-INPUT.gsub(/^ {6}/, '') + FRACTURE + OUTLINED + BLOOMING + SEPTETTE + INPUT + actual = Transpose.transpose(input) + expected = <<-EXPECTED.gsub(/^ {6}/, '') + FOBS + RULE + ATOP + CLOT + TIME + UNIT + RENT + EDGE + EXPECTED + assert_equal expected.strip, actual + end + + def test_triangle + skip + input = <<-INPUT.gsub(/^ {6}/, '') + T + EE + AAA + SSSS + EEEEE + RRRRRR + INPUT + actual = Transpose.transpose(input) + expected = <<-EXPECTED.gsub(/^ {6}/, '') + TEASER + EASER + ASER + SER + ER + R + EXPECTED + assert_equal expected.strip, actual + end + + def test_many_lines + skip + input = <<-INPUT.gsub(/^ {6}/, '') + Chor. Two households, both alike in dignity, + In fair Verona, where we lay our scene, + From ancient grudge break to new mutiny, + Where civil blood makes civil hands unclean. + From forth the fatal loins of these two foes + A pair of star-cross'd lovers take their life; + Whose misadventur'd piteous overthrows + Doth with their death bury their parents' strife. + The fearful passage of their death-mark'd love, + And the continuance of their parents' rage, + Which, but their children's end, naught could remove, + Is now the two hours' traffic of our stage; + The which if you with patient ears attend, + What here shall miss, our toil shall strive to mend. + INPUT + actual = Transpose.transpose(input) + expected = <<-EXPECTED.gsub(/^ {6}/, '') + CIFWFAWDTAWITW + hnrhr hohnhshh + o oeopotedi ea + rfmrmash cn t + .a e ie fthow + ia fr weh,whh + Trnco miae ie + w ciroitr btcr + oVivtfshfcuhhe + eeih a uote + hrnl sdtln is + oot ttvh tttfh + un bhaeepihw a + saglernianeoyl + e,ro -trsui ol + h uofcu sarhu + owddarrdan o m + lhg to'egccuwi + deemasdaeehris + sr als t ists + ,ebk 'phool'h, + reldi ffd + bweso tb rtpo + oea ileutterau + t kcnoorhhnatr + hl isvuyee'fi + atv es iisfet + ayoior trr ino + l lfsoh ecti + ion vedpn l + kuehtteieadoe + erwaharrar,fas + nekt te rh + ismdsehphnnosa + ncuse ra-tau l + et tormsural + dniuthwea'g t + iennwesnr hsts + g,ycoi tkrttet + n ,l r s'a anr + i ef 'dgcgdi + t aol eoe,v + y nei sl,u; e + , .sf to l + e rv d t + ; ie o + f, r + e e m + . m e + o n + v d + e . + , + EXPECTED + assert_equal expected.strip, actual + end + + # Problems in exercism evolve over time, as we find better ways to ask + # questions. + # The version number refers to the version of the problem you solved, + # not your solution. + # + # Define a constant named VERSION inside of the top level BookKeeping + # module, which may be placed near the end of your file. + # + # In your file, it will look like this: + # + # module BookKeeping + # VERSION = 1 # Where the version number matches the one in the test. + # end + # + # If you are curious, read more about constants on RubyDoc: + # http://ruby-doc.org/docs/ruby-doc-bundle/UsersGuide/rg/constants.html + + def test_bookkeeping + skip + assert_equal 1, BookKeeping::VERSION + end +end diff --git a/lib/transpose_cases.rb b/lib/transpose_cases.rb new file mode 100644 index 0000000000..ddbf131dd4 --- /dev/null +++ b/lib/transpose_cases.rb @@ -0,0 +1,45 @@ +class TransposeCase < OpenStruct + def test_name + "test_#{description.tr(' ', '_')}" + end + + def skipped + index.zero? ? '# skip' : 'skip' + end + + def workload + 'Transpose.transpose(input)' + end + + def expect + indented_heredoc(expected, 'EXPECTED') + end + + def input_text + indented_heredoc(input, 'INPUT') + end + + private + + def indented_heredoc(string, delimiter) + [ + "<<-#{delimiter}.gsub(/^ {6}/, '')", + indent_lines(string), + indent_line(delimiter) + ].join("\n") + end + + def indent_lines(lines, indent = 3) + lines.map { |line| indent_line(line, indent) }.join("\n") + end + + def indent_line(line, indent = 2) + ' ' * indent * 2 + line + end +end + +TransposeCases = proc do |data| + JSON.parse(data)['cases'].map.with_index do |row, i| + TransposeCase.new(row.merge('index' => i)) + end +end