epergo
9/20/2017 - 2:01 PM

TuentiChallenges

# frozen_string_literal: true
require 'pry'
require 'awesome_print'

module TuentiChallenge9
  INPUT_1 ||= 'sample_input'
  INPUT_2 ||= 'test_input'
  INPUT_3 ||= 'submit_input'

  class << self
    def exercise
      File.foreach(INPUT_2).with_index do |line, line_number|
        next if line_number == 0

        case_number = line.to_i
        @to_check = 1

        @found = false
        until @found
          aux = @to_check.to_s
          check_in = aux.dup
          (0..aux.size).each_with_index do |c, index|
            check_in[index] = '1' if check_in[index] == '0'

            break if check_if_solution(check_in, case_number, line_number)
          end
          @to_check *= 10
        end
      end
    end

    def check_if_solution(number, case_number, line_number)
      next_binary = number.to_i
      if next_binary % case_number == 0
        # It is multiple of case_number
        puts "Case ##{line_number}: #{count_ones_zeroes(next_binary)}"

        @found = true
      end
    end

    def count_ones_zeroes(number)
      ones = number.to_s.split('').count('1')
      zeroes = number.to_s.split('').count('0')

      "#{ones} #{zeroes}"
    end
  end
end

TuentiChallenge9.exercise
# frozen_string_literal: true
require 'pry'
require 'awesome_print'
require 'net-telnet'

module TuentiChallenge5
  WORDS ||= 'words'

  class << self
    def words
      @words ||= File.open(WORDS).read.split("\n")
    end

    def connection
      @connection ||= Net::Telnet::new("Host" => "52.49.91.111",
        "Port" => '9988',
        "Telnetmode" => false,
        "Prompt" => /[$%#>] \z/n, 
        "Output_log" => "output_log",
        "Timeout" => 2)
    end

    def exercise
      @already_checked = []
      @next_letter = 'enter'

      while true
        raw_response = connection.cmd(@next_letter) { |c| print c }
        puts raw_response

        response = raw_response.split("\n")
        status = clean_response(response[response.size - 3])

        filtered_words(status.size, status)
        most_common_letters

        puts "Choose next letter: \n>"
        # @next_letter = $stdin.gets.chomp
        @next_letter = most_common_letters.first.first
        @already_checked << @next_letter
      end

    rescue Exception => e
      binding.pry
      exercise
    end

    def clean_response(response)
      response.tr(' ', '')
    end

    def filtered_words(length, status)
      @filtered_words = words.select { |w| w.length == length }

      return @filtered_words unless status

      not_to_check = if @already_checked.empty?
                       '.'
                     else
                       "[^#{@already_checked.join}]"
                     end
      puts status
      regex = status.gsub('_', not_to_check)

      @filtered_words.select! do |f|
        /#{regex}/.match(f) != nil
      end
    end

    # Array con las letras que mas se repiten
    def most_common_letters
      res = {}

      @filtered_words.each do |w|
        w.split('').each do |letter|
          (res[letter] = res[letter].to_i + 1) unless @already_checked.include? letter
        end
      end

      res.sort_by { |_letter, quantity| -quantity }
    end
  end
end

TuentiChallenge5.exercise
# frozen_string_literal: true

module TuentiChallenge4
  INPUT_1 ||= 'sample_input'
  INPUT_2 ||= 'test_input'
  INPUT_3 ||= 'submit_input'

  def self.exercise
    File.foreach(INPUT_3).with_index do |line, line_number|
      next if line_number == 0

      regex = '(?=((^|[^\w])D-LD-L(-[^K]\w*|\n)))|(?=((^|[^\w])D-RD-R(-[^P]\w*|\n)))|(?=((^|[^\w])R-D-RD(-[^P]\w*|\n)))'
      puts "Case ##{line_number}: #{line.scan(/#{regex}/).size}"
    end
  end
end

TuentiChallenge4.exercise
# frozen_string_literal: true
require 'yaml'

module TuentiChallenge3
  INPUT_1 ||= 'sample_input'
  INPUT_2 ||= 'test_input'
  INPUT_3 ||= 'submit_input'

  S_STATE = 'start'
  E_STATE = 'end'

  def self.initialize_scenario
    @code  ||= input_yaml['code']
    @tapes ||= input_yaml['tapes']

    @state = S_STATE
    @result = []
    @pointer = 0
    @tape_n = 0
  end

  def self.input_yaml
    @input_yaml ||= YAML.load(File.open(INPUT_3))
  end

  def self.exercise
    initialize_scenario

    @tapes.each do |_tape, input|
      @state = S_STATE
      @result = input.split('')
      @pointer = 0
      do_break = false
      @tape_n = _tape
      while true do
        char = @result[@pointer] ? @result[@pointer] : " "

        @code[@state][char].each do |action|
          if send(action[0].to_sym, action[1])
            do_break = true
            break
          end
        end
        break if do_break
      end
    end
  rescue Exception => e
    binding.pry
  end

  def self.move(direction)
    if direction == 'right'
      @pointer += 1
    else
      @pointer += @pointer > 0 ? -1 : 0
    end

    false
  end

  def self.state(destiny)
    if destiny == E_STATE
      puts "Tape ##{@tape_n}: #{@result.join('').tr(' ', '')}"
      
      true
    else
      @state = destiny

      false
    end
  end

  def self.write(value)
    @result[@pointer] = value

    false
  end
end

TuentiChallenge3.exercise
# frozen_string_literal: true
require 'yaml'

module TuentiChallenge3
  INPUT_1 ||= 'sample_input'
  INPUT_2 ||= 'test_input'
  INPUT_3 ||= 'submit_input'

  S_STATE = 'start'
  E_STATE = 'end'

  def self.initialize_scenario
    @code  ||= input_yaml['code']
    @tapes ||= input_yaml['tapes']

    @state = S_STATE
    @result = []
    @pointer = 0
    @tape_n = 0
  end

  def self.input_yaml
    @input_yaml ||= YAML.load(File.open(INPUT_3))
  end

  def self.exercise
    initialize_scenario

    @tapes.each do |_tape, input|
      @state = S_STATE
      @result = input.split('')
      @pointer = 0
      do_break = false
      @tape_n = _tape
      while true do
        char = @result[@pointer] ? @result[@pointer] : " "

        @code[@state][char].each do |action|
          if send(action[0].to_sym, action[1])
            do_break = true
            break
          end
        end
        break if do_break
      end
    end
  rescue Exception => e
    binding.pry
  end

  def self.move(direction)
    if direction == 'right'
      @pointer += 1
    else
      @pointer += @pointer > 0 ? -1 : 0
    end

    false
  end

  def self.state(destiny)
    if destiny == E_STATE
      puts "Tape ##{@tape_n}: #{@result.join('').tr(' ', '')}"
      
      true
    else
      @state = destiny

      false
    end
  end

  def self.write(value)
    @result[@pointer] = value

    false
  end
end

TuentiChallenge3.exercise
# frozen_string_literal: true
require 'pry'
require 'benchmark'

module TuentiChallenge2
  INPUT_1 ||= 'sample_input'
  INPUT_2 ||= 'test_input'
  INPUT_3 ||= 'submit_input'

  CORPUS_1 ||= 'corpus'
  CORPUS_2 ||= 'base_corpus'

  def self.read_corpus
    file = File.open(CORPUS_1, 'rb')
    content = file.read
    content.split(' ')
  end

  def self.exercise
    words = read_corpus
    File.foreach(INPUT_3).with_index do |line, line_number|
      next if line_number == 0

      variables = line.split(' ')
      starts = variables[0].to_i - 1
      ends = variables[1].to_i - 1

      result = count_words(words[starts..ends])

      print_result(result, line_number)
    end
  end

  def self.count_words(words)
    result = {}
    words.each do |w|
      result[w] = result[w].to_i + 1
    end

    result.sort_by { |word, count| -count }.first 3
  end

  def self.print_result(results, line)
    puts "Case ##{line}: #{results[0][0]} #{results[0][1]},#{results[1][0]} #{results[1][1]},#{results[2][0]} #{results[2][1]}"
  end
end

# puts Benchmark.measure { TuentiChallenge2.exercise }
TuentiChallenge2.exercise
def tables_necessary(diners)
  if diners <= 4 && diners > 0
    return 1
  elsif diners <= 0
    return 0
  end

  ((diners / 2.to_f) - 1).ceil
end


File.foreach('submitInput').with_index do |line, line_number|
  next if line_number == 0

  puts "Case ##{line_number}: #{tables_necessary(line.to_i)}"
end