Size: a a a

2020 February 01

E

Eugene in RubyRush
рекурсию нельзя просто взять и выкинуть - можно заменить на цикл - скорее всего, на цикл while
источник

E

Eugene in RubyRush
def filename(name, index)
 unless index[name]
   index[name] = true
   return name
 end

 i = 1
 loop do
   new_name = "#{name}(#{i})"
   unless index[new_name]
     index[new_name] = true
     return new_name
   end
   i += 1
 end
end

def filenames(names)
 index = {}

 names.map do |name|
   filename(name, index)
 end
end

names = ["photo", "photo(1)", "photo", "photo(1)", "photo"] # photo, photo(1), photo(2), photo(1)(1), photo(3)
p filenames(names)
источник

RM

R M in RubyRush
Eugene
рекурсию нельзя просто взять и выкинуть - можно заменить на цикл - скорее всего, на цикл while
Не, работает верно. Рекурсии там нет, цикл один. У вас цикл и рекурсия в моем случае 1 цикл. Хотя инклуд проверка это тоже скрытый цикл
источник

RM

R M in RubyRush
Вероятнее всего
источник

RM

R M in RubyRush
Так что без двух циклов да, не выйдет.
источник

RM

R M in RubyRush
class NamingUtility

 def self.filenames(names)
   hsh = Hash.new(0)
   new_names = []
   names.each do |name|
     hsh[name] += 1
     if hsh[name] == 1
       if new_names.include? name
         new_names << name + "(#{hsh[name]})"
       else
         new_names << name
       end
     else
       new_names << name + "(#{hsh[name] - 1})"
     end
   end
   new_names
 end
end


name = ["name", "photo", "photo", "doc", "photo(1)", "ivan",  "photo"]


p NamingUtility.filenames(name)

вот еще раз скину работающее решение, то же что и выше
источник

RM

R M in RubyRush
селф потому что класс объявлен был, но не скопировал его
источник

RM

R M in RubyRush
с рекурсией, честно. выглядит КУДА лучше. но я очень хотел разобраться для начала с хешем, рекурсию пойму, но уже не сегодня
источник

E

Eugene in RubyRush
R M
с рекурсией, честно. выглядит КУДА лучше. но я очень хотел разобраться для начала с хешем, рекурсию пойму, но уже не сегодня
Я выше без рекурсии скинул решение. В том решении с рекурсией еще ошибка есть.
источник

E

Eugene in RubyRush
R M
class NamingUtility

 def self.filenames(names)
   hsh = Hash.new(0)
   new_names = []
   names.each do |name|
     hsh[name] += 1
     if hsh[name] == 1
       if new_names.include? name
         new_names << name + "(#{hsh[name]})"
       else
         new_names << name
       end
     else
       new_names << name + "(#{hsh[name] - 1})"
     end
   end
   new_names
 end
end


name = ["name", "photo", "photo", "doc", "photo(1)", "ivan",  "photo"]


p NamingUtility.filenames(name)

вот еще раз скину работающее решение, то же что и выше
См. выше, это решение неверно
источник

RM

R M in RubyRush
Eugene
См. выше, это решение неверно
вижу, спасибо
источник

RM

R M in RubyRush
Eugene
def filename(name, index)
 unless index[name]
   index[name] = true
   return name
 end

 i = 1
 loop do
   new_name = "#{name}(#{i})"
   unless index[new_name]
     index[new_name] = true
     return new_name
   end
   i += 1
 end
end

def filenames(names)
 index = {}

 names.map do |name|
   filename(name, index)
 end
end

names = ["photo", "photo(1)", "photo", "photo(1)", "photo"] # photo, photo(1), photo(2), photo(1)(1), photo(3)
p filenames(names)
ну формально это не рекурсия да))
источник

RM

R M in RubyRush
мне вот это нравится решение
class NamingUtility

 def self.filenames(names)
   arr = []

   names.each do |elem|
     n = 1
     names.each  do |e|
       if elem == e
         if arr.include? e
           arr << e + "(#{n})"
           n += 1
         else
           arr << e
         end
       end
     end
   end
   arr.uniq
 end
end

name = ["name", "photo", "photo", "doc", "photo(1)", "photo(1)", "ivan",  "photo"]

p NamingUtility.filenames(name)
источник

RM

R M in RubyRush
хотя я забыл про метод уник в конце) теперь уже не так сильно
источник

RM

R M in RubyRush
Eugene
def filename(name, index)
 unless index[name]
   index[name] = true
   return name
 end

 i = 1
 loop do
   new_name = "#{name}(#{i})"
   unless index[new_name]
     index[new_name] = true
     return new_name
   end
   i += 1
 end
end

def filenames(names)
 index = {}

 names.map do |name|
   filename(name, index)
 end
end

names = ["photo", "photo(1)", "photo", "photo(1)", "photo"] # photo, photo(1), photo(2), photo(1)(1), photo(3)
p filenames(names)
у вас цикл без условия выхода из него, это работать не должно по идее
источник

RM

R M in RubyRush
:с неа, реплит умер
источник

RM

R M in RubyRush
R M
да, можно без рекурсии )
def self.filenames(names)
 hsh = Hash.new(0)
 new_names = []
 names.each do |name|
   hsh[name] += 1
   if hsh[name] == 1
     if new_names.include? name
       new_names << name + "(#{hsh[name]-1})"
     else
       new_names << name
     end
   else
     new_names << name + "(#{hsh[name]-1})"
   end
 end
 new_names
end
name = ["photo", "photo", "doc", "photo(1)", "photo"]

p filenames(name)

#["photo", "photo(1)", "doc", "photo(1)(1)", "photo(2)"]

я просто не понял решение, решил попробовать сам, потому что рекурсию не смог понять. ну вышло, громоздко, но с одним циклом без рекурсий
ну поправил чуть, выдает  не то что в условии, вместо photo(1)(1) photo(1)(0) итп но работало бы
источник

RM

R M in RubyRush
R M
:с неа, реплит умер
додумался поправить, в 14 строчке break if i == name.size дописать )
источник

E

Eugene in RubyRush
R M
ну формально это не рекурсия да))
Ну это во всех смыслах цикл, а не рекурсия :)
источник

RM

R M in RubyRush
Eugene
Ну это во всех смыслах цикл, а не рекурсия :)
Да но...)))
источник