Skip to content

Instantly share code, notes, and snippets.

@jgomo3
Created October 23, 2022 19:31
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jgomo3/48697f856a3300e2089ad8bc1c8d6a79 to your computer and use it in GitHub Desktop.
Save jgomo3/48697f856a3300e2089ad8bc1c8d6a79 to your computer and use it in GitHub Desktop.
Solución al ejercicio 14 de Infinita Recursión
# 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