Вывод Рубиновых индексов - PullRequest
       3

Вывод Рубиновых индексов

0 голосов
/ 16 февраля 2019

У меня быстрый и, вероятно, простой вопрос, на который я не смог найти ответ.Вероятно, это потому, что я не совсем уверен, как правильно задать вопрос, но вот что:

def test(num)
  num_s = num.to_s
  num_s.each_char do |number|
    p num_s.index(number)
  end
end

test(232435)

вывод: 0 1 0 3 1 5

вывод, который я ожидал: 0 1 23 4 5

Почему выходные индексы не являются последовательными?

Ответы [ 4 ]

0 голосов
/ 16 февраля 2019

Для вывода, который вы хотите, не имеет значения, каково содержимое строки. Каждая строка (одинаковой длины) будет иметь точно такой же вывод.Весь ваш метод зависит только от длины строки и не имеет никакого отношения к индексам символов вообще.Это буквально просто:

0...num_s.size

Вот так:

def test(num)
  num_s = num.to_s
  (0...num_s.size).map(&method(:puts))
end

test(232435)
# 0
# 1
# 2
# 3
# 4
# 5

Но длина десятичного представления числа - это всего лишь 10-значный логарифм числа:

def test(num)
  length = (Math.log(num, 10) + 1).floor
  (0...length).map(&method(:puts))
end

test(232435)
# 0
# 1
# 2
# 3
# 4
# 5

Таким образом, это не только не имеет ничего общего с содержимым строки, оно даже не имеет никакого отношения к тому, что является действительным числом, выход всегда будет одинаковым для любого числас тем же количеством знаков после запятой, т. е. любое число от 100000..999999 даст тот же результат.

0 голосов
/ 16 февраля 2019

Чтобы ответить на следующий вопрос:

def test(num)
  num_s = num.to_s
  num_s.each_char.with_index do |number, index| # notice the difference here
    p index
  end
end

test(232435)

# => 0 
# => 1 
# => 2 
# => ...etc

Здесь вы также можете перейти к использованию этого параметра number, например, если вы хотите вывести что-то более информативное, вы можете попробовать:

def test(num)
  num_s = num.to_s
  num_s.each_char.with_index do |number, index|
    p "Number #{number} is at index #{index}"
  end
end

test(232435)

# => "Number 2 is at index 0"
# => "Number 3 is at index 1"
# => ...etc

Если вы хотите сделать то же самое, но у вас есть массив вместо строки, используйте .each_with_index вместо .each_char.with_index.

0 голосов
/ 16 февраля 2019

Вы можете сделать это следующим образом.Для упрощения я сделал аргумент метода строкой, а не целым числом, которое немедленно преобразуется в строку.

def test(num)
  start_index = Hash.new(0)
  num.each_char do |digit|           
    i = num.index(digit, start_index[digit])
    puts "index for #{digit} is #{i}"
    start_index[digit] = i + 1
  end 
end

test("232435")
index for 2 is 0
index for 3 is 1
index for 2 is 2
index for 4 is 3
index for 3 is 4
index for 5 is 5

Это работает, поскольку второй аргумент String # index указываетиндекс смещение , с которого начинается поиск.

Проблема в том, что этот метод бесполезен.Было бы проще написать следующее.

def test(num)
  num.each_char.with_index { |digit,i| puts "index for #{digit} is #{i}" }
end

test("232435")
index for 2 is 0
index for 3 is 1
index for 2 is 2
index for 4 is 3
index for 3 is 4
index for 5 is 5

Можно добавить в метод аргументы, которые являются цифрами, индексы которых в первом аргументе должны быть определены.

def test(num, *args)
  start_index = Hash.new(0)
  args.each do |digit|
    i = num.index(digit, start_index[digit])
    puts "index for #{digit} is #{i}"
    start_index[digit] = i + 1
  end
end

test("232435", "3", "4", "2", "3", "2")
index for 3 is 1
index for 4 is 3
index for 2 is 0
index for 3 is 4
index for 2 is 2

Если яесли добавить к этому методу последнюю строку start_index, возвращаемое значение будет

{"3"=>5, "4"=>4, "2"=>3}

, означающее, что поиск следующего "3" должен начинаться со смещения 5 и т. д.

Естественно, потребуется дополнительный код для проверки того, что аргумент является цифрой и цифрой строки, что число аргументов, которые являются одной и той же цифрой, не превышает номера этой цифры в строке, ии так далее.

0 голосов
/ 16 февраля 2019

Это потому, что Sring#index возвращает индекс первого вхождения данной подстроки.

Вы можете прочитать его здесь .

test(232435)

"2" впервые появляется в индексе 0

"3" впервые появляется в индексе 1

"2" впервые появляется в индексе 0

"4" впервые появляется в индексе 3

"3" впервые появляется в индексе 1

"5" впервые появляется в индексе 5

вывод, который я ожидал: 0 1 2 3 4 5

Вы можете получить его по вашему методу, только если у вас есть разные цифры в num.

Например 123456или 809163.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...