Created
October 23, 2022 19:31
-
-
Save jgomo3/48697f856a3300e2089ad8bc1c8d6a79 to your computer and use it in GitHub Desktop.
Solución al ejercicio 14 de Infinita Recursión
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Genera una nueva lista como `lista`, pero los valores asociados a | |
# `:id` de cada elemento valen lo miso que su posición en la lista. | |
# | |
# Ejemplo: | |
# | |
# reindexar([{id: nil, val: :x}, {id: nil, val: :y}]) | |
# # genera | |
# [{id: 0, val: :x}, {id: 1, val: :y}] | |
# | |
# @param lista [[Object]] | |
# @return [[Object]] | |
def reindexar(lista) | |
lista.map.with_index(1) {|e, idx| e.merge({ id: idx }) } | |
end | |
# Elimina el elemento en el `índice` indicado. | |
# Similar a `delete_at`, pero no modifica la `lista` | |
# | |
# @param lista [[Object]] | |
# @param índice [Integer] la posición del elemento de la `lista` a eliminar | |
# @return [[Object]] | |
def eliminar(lista, índice) | |
raise IndexError unless (0...lista.length).include?(índice) | |
lista[...índice] + lista[(índice + 1)...] | |
end | |
# "Mueve" el elemento en la posición `índice` de la `lista` a ocupar la | |
# posición `destino` en la misma. | |
# | |
# No modifica la lista original | |
# | |
# Los elementos de tanto la lista producto como la de insumo, son | |
# "mapas" (Hash) con una tupla cuya clave es `:id`, y dichas listas | |
# están ordenadas por dicha clave. | |
# | |
# @param lista [[Hash]] la lista ordenada por clave `:id` de "mapas" | |
# @param índice [Integer] la posición del elemento de `lista` que ha de "moverse" | |
# @param destino [Integer] la posición que el elemento seleccionado debe ocupar en la nueva lista producida | |
# @return [[Hash]] la nueva lista ordenada por clave `:id` de "mapas" con el elemento seleccionado ocupando la posición `destino` | |
def mover_elemento(lista, índice, destino) | |
raise IndexError unless [índice, destino].all? { (0...lista.length).include?(_1) } | |
lista | |
.then{ eliminar(_1, índice) } | |
.insert(destino, lista[índice]) | |
.then{ reindexar(_1) } | |
end | |
require 'test/unit' | |
class InfReq14Test < Test::Unit::TestCase | |
def setup | |
@reto = [ | |
{id: 1, idioma: "Ingles"}, | |
{id: 2, idioma: "Frances"}, | |
{id: 3, idioma: "Aleman"}, | |
{id: 4, idioma: "Italiano"}, | |
{id: 5, idioma: "Portugues"}, | |
{id: 6, idioma: "Ruso"}, | |
] | |
@movimientos = { [1, 5] => [{id: 1, idioma: "Ingles"}, | |
{id: 2, idioma: "Aleman"}, | |
{id: 3, idioma: "Italiano"}, | |
{id: 4, idioma: "Portugues"}, | |
{id: 5, idioma: "Ruso"}, | |
{id: 6, idioma: "Frances"}], | |
[2, 3] => [{id: 1, idioma: "Ingles"}, | |
{id: 2, idioma: "Frances"}, | |
{id: 3, idioma: "Italiano"}, | |
{id: 4, idioma: "Aleman"}, | |
{id: 5, idioma: "Portugues"}, | |
{id: 6, idioma: "Ruso"}]} | |
end | |
def test_eliminar | |
assert_equal [2, 3, 4], eliminar([1, 2, 3, 4], 0) | |
assert_equal [1, 2, 4], eliminar([1, 2, 3, 4], 2) | |
assert_raise(IndexError) do | |
eliminar([], 0) | |
end | |
end | |
def test_mover_elemento | |
assert_equal @movimientos[[1, 5]], mover_elemento(@reto, 1, 5) | |
assert_equal @movimientos[[2, 3]], mover_elemento(@reto, 2, 3) | |
assert_raise(IndexError) do | |
mover_elemento([], 0, 0) | |
end | |
end | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment