Skip to content

Instantly share code, notes, and snippets.

@matheusazzi
Last active May 12, 2016 19:12
Show Gist options
  • Save matheusazzi/dbd541747b66829f8546 to your computer and use it in GitHub Desktop.
Save matheusazzi/dbd541747b66829f8546 to your computer and use it in GitHub Desktop.

Vendo virado

Em uma caluladora de bolso os dígitos são representados por pequenas barras no visor de cristal líquido:

Quando olhamos com o visor de cabeça para baixo alguns números ainda podem ser lidos (só que com outros valores). Por exemplo, 1995 vira 5661. O quinto número que pode ser lido de cabeça para baixo é 8, e o décimo-quinto é 21, que passa a valer 12 quando é visto de cabeça para baixo.

Você deve responder a pergunta:

Qual o milionésimo número que pode ser reconheido como outro número, quando é visto de cabeça para baixo?

Tente montar seu algoritmo para rodar no menor tempo possível.

require 'benchmark'

class MirrorNumbers
  def initialize(number)
    puts Benchmark.measure { puts calc(number) }
  end

  def calc(number)
    ...
  end
end

MirrorNumbers.new(1000000)

MirrorNumbers.new(5) # 8
MirrorNumbers.new(100) # 202
@matheusazzi
Copy link
Author

require 'benchmark'

class MirrorNumbers
  def initialize(number)
    puts Benchmark.measure { puts calc(number) }
  end

  def calc(number)
    base = 7
    result = []

    while number >= base
      result << number % base
      number = number / base
    end

    to_decimal(result.push(number).join)
  end

  def to_decimal(convertable)
    convertable
      .gsub('6', '9')
      .gsub('5', '8')
      .gsub('4', '6')
      .gsub('3', '5')
  end
end

MirrorNumbers.new(1000000)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment