Решение на Втора задача - хешове, масиви и структура от Теодор Филипов

Обратно към всички решения

Към профила на Теодор Филипов

Резултати

  • 6 точки от тестове
  • 0 бонус точки
  • 6 точки общо
  • 15 успешни тест(а)
  • 0 неуспешни тест(а)

Код

class Hash
def fetch_deep(a_path)
return self if a_path.nil?
answer = self.keys
.select { |key| key_matches_wanted_key? key, (fetch_first_key a_path) }
.map { |key| self[key] }.select { |element| !element.nil? }
.map { |el| call_fetch_deep_safely(el, (fetch_rest_of_path a_path)) }
return nil if answer.nil?
answer.first
end
def reshape(shape)
result = {}
shape.keys
.map { |key| result[key] = reshape_mapper(shape[key], self) }
result
end
end
class Array
def fetch_deep(a_path)
return self if a_path.nil?
idx = (fetch_first_key a_path).to_i
return nil if self.length < idx
call_fetch_deep_safely self[idx], (fetch_rest_of_path a_path)
end
def reshape(shape)
self.map { |element| element.reshape(shape) }
end
end
def reshape_mapper(element, a_hash)
if element.is_a? String then a_hash.fetch_deep element
else a_hash.reshape(element)
end
end
def call_fetch_deep_safely(element, path)
return element if path.nil?
element.fetch_deep path
end
def key_matches_wanted_key?(key, wanted_key)
key == wanted_key || key == wanted_key.to_sym
end
def fetch_first_key(a_path)
return nil if a_path == nil
a_path.split(/[.]/, 2).first
end
def fetch_rest_of_path(a_path)
return nil if a_path == nil
a_path.split(/[.]/, 2)[1]
end

Лог от изпълнението

...............

Finished in 0.01028 seconds
15 examples, 0 failures

История (3 версии и 3 коментара)

Теодор обнови решението на 23.10.2016 12:04 (преди над 7 години)

+class Hash
+ def fetch_deep(a_path)
+ return self if a_path.nil?
+ key_to_search = fetch_first_key a_path
+ self.keys.select(& -> (key) { key_matches_wanted_key? key, key_to_search })
+ .map(& -> (key) { self[key] }).select(& -> (element) { !element.nil? })
+ .map(& -> (el) { call_fetch_deep_safely(el, (fetch_rest_of_path a_path)) })

Наложи се да си преименувам променливата в ламбдата от element на el, защото линията ставаше прекалено дълга и не успях да разбера как да си разбия ламбдата на няколко реда. След като пробвах няколко неща и никое не успя да добута задачата да мине проверката преди предаване, затова се опитах да ви пратя мейл с въпрос относно това, където нещата бяха обяснени по-подробно, но мейл-а беше блокиран като спам, затова може да започнете отговора на коментара с това къде мога да ви препсувам спокойно и след това по същество

Наложи се да си преименувам променливата в ламбдата от element на el, защото линията ставаше прекалено дълга 
и не успях да разбера как да си разбия ламбдата на няколко реда. След като пробвах няколко неща 
и никое не успя да добута задачата да мине проверката преди предаване, затова се опитах да ви пратя 
мейл с въпрос относно това, където нещата бяха обяснени по-подробно, но мейл-а беше блокиран като спам, 
затова може да започнете отговора на коментара с това къде мога да ви препсувам спокойно и след това по същество

Не знам какво се е случило с имейла ти. Частта с препсуването ще я игнорирам - оставям на теб да прецениш колко е подходящ подобен израз тук.

Може да погледнеш все пак материалите от последната лекция, където ще видиш, че тези ламбди тук са напълно излишни и искаш да използваш директно блокове.

Също, тези ограничения са тук, за да те подтикнат да помислиш за по-добро решение, не да те дразнят. Например, най-дългият ред в нашето решение съдържа 51 символа, без съкращения.

+ .first
+ end
+
+ def reshape(shape)
+ result = {}
+ shape.keys
+ .map(& -> (key) { result[key] = reshape_mapper(shape[key], self) })
+ result
+ end
+end
+
+class Array
+ def fetch_deep(a_path)
+ return self if a_path.nil?
+ idx = (fetch_first_key a_path).to_i
+ return nil if self.length < idx
+ call_fetch_deep_safely self[idx], (fetch_rest_of_path a_path)
+ end
+
+ def reshape(shape)
+ self.map(& -> (element) { element.reshape(shape) })
+ end
+end
+
+def reshape_mapper(element, a_hash)
+ if element.is_a? String then a_hash.fetch_deep element
+ else a_hash.reshape(element)
+ end
+end
+
+def call_fetch_deep_safely(element, path)
+ return element if path.nil?
+ element.fetch_deep path
+end
+
+def key_matches_wanted_key?(key, wanted_key)
+ key == wanted_key || key == wanted_key.to_sym
+end
+
+def fetch_first_key(a_path)
+ return nil if a_path == nil
+ a_path.split(/[.]/, 2).first
+end
+
+def fetch_rest_of_path(a_path)
+ return nil if a_path == nil
+ a_path.split(/[.]/, 2)[1]
+end

Теодор обнови решението на 23.10.2016 13:21 (преди над 7 години)

class Hash
def fetch_deep(a_path)
return self if a_path.nil?
key_to_search = fetch_first_key a_path
- self.keys.select(& -> (key) { key_matches_wanted_key? key, key_to_search })
- .map(& -> (key) { self[key] }).select(& -> (element) { !element.nil? })
- .map(& -> (el) { call_fetch_deep_safely(el, (fetch_rest_of_path a_path)) })
+ self.keys.select { |key| key_matches_wanted_key? key, key_to_search }
+ .map { |key| self[key] }.select { |element| !element.nil? }
+ .map { |el| call_fetch_deep_safely(el, (fetch_rest_of_path a_path)) }
.first
end
def reshape(shape)
result = {}
shape.keys
- .map(& -> (key) { result[key] = reshape_mapper(shape[key], self) })
+ .map { |key| result[key] = reshape_mapper(shape[key], self) }
result
end
end
class Array
def fetch_deep(a_path)
return self if a_path.nil?
idx = (fetch_first_key a_path).to_i
return nil if self.length < idx
call_fetch_deep_safely self[idx], (fetch_rest_of_path a_path)
end
def reshape(shape)
- self.map(& -> (element) { element.reshape(shape) })
+ self.map { |element| element.reshape(shape) }
end
end
def reshape_mapper(element, a_hash)
if element.is_a? String then a_hash.fetch_deep element
else a_hash.reshape(element)
end
end
def call_fetch_deep_safely(element, path)
return element if path.nil?
element.fetch_deep path
end
def key_matches_wanted_key?(key, wanted_key)
key == wanted_key || key == wanted_key.to_sym
end
def fetch_first_key(a_path)
return nil if a_path == nil
a_path.split(/[.]/, 2).first
end
def fetch_rest_of_path(a_path)
return nil if a_path == nil
a_path.split(/[.]/, 2)[1]
end

Теодор обнови решението на 23.10.2016 13:47 (преди над 7 години)

class Hash
def fetch_deep(a_path)
return self if a_path.nil?
- key_to_search = fetch_first_key a_path
- self.keys.select { |key| key_matches_wanted_key? key, key_to_search }
+ answer = self.keys
+ .select { |key| key_matches_wanted_key? key, (fetch_first_key a_path) }
.map { |key| self[key] }.select { |element| !element.nil? }
.map { |el| call_fetch_deep_safely(el, (fetch_rest_of_path a_path)) }
- .first
+ return nil if answer.nil?
+ answer.first
end
def reshape(shape)
result = {}
shape.keys
.map { |key| result[key] = reshape_mapper(shape[key], self) }
result
end
end
class Array
def fetch_deep(a_path)
return self if a_path.nil?
idx = (fetch_first_key a_path).to_i
return nil if self.length < idx
call_fetch_deep_safely self[idx], (fetch_rest_of_path a_path)
end
def reshape(shape)
self.map { |element| element.reshape(shape) }
end
end
def reshape_mapper(element, a_hash)
if element.is_a? String then a_hash.fetch_deep element
else a_hash.reshape(element)
end
end
def call_fetch_deep_safely(element, path)
return element if path.nil?
element.fetch_deep path
end
def key_matches_wanted_key?(key, wanted_key)
key == wanted_key || key == wanted_key.to_sym
end
def fetch_first_key(a_path)
return nil if a_path == nil
a_path.split(/[.]/, 2).first
end
def fetch_rest_of_path(a_path)
return nil if a_path == nil
a_path.split(/[.]/, 2)[1]
-end
+end