├── .husky └── pre-commit ├── .gitignore ├── .prettierrc ├── .cargo └── config.toml ├── .eslintrc.cjs ├── test ├── Challenge04.spec.js ├── Challenge03.spec.js ├── challenge02.spec.js └── challenge01.spec.js ├── Challenge-04 ├── app.js ├── README.md └── main.rs ├── Cargo.toml ├── Challenge-05 ├── app.js ├── main.rs └── README.md ├── package.json ├── LICENSE ├── Challenge-03 ├── app.js ├── README.md └── main.rs ├── Challenge-02 ├── app.js ├── README.md └── main.rs ├── Challenge-01 ├── app.js ├── main.rs ├── README.md └── users.txt └── README.md /.husky/pre-commit: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | . "$(dirname "$0")/_/husky.sh" 3 | 4 | npx lint-staged 5 | cargo fmt -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /target 2 | /node_modules 3 | Cargo.lock 4 | package-lock.json 5 | .eslintcache 6 | .prettierignore -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "tabWidth": 2, 3 | "singleQuote": true, 4 | "useTabs": false, 5 | "semi": false, 6 | "trailingComma": "none" 7 | } 8 | -------------------------------------------------------------------------------- /.cargo/config.toml: -------------------------------------------------------------------------------- 1 | [alias] 2 | reto1 = ["run", "--bin", "reto1", "--", "./Challenge-01/users.txt"] 3 | reto2 = ["run", "--bin", "reto2"] 4 | reto3 = ["run", "--bin", "reto3"] 5 | reto4 = ["run", "--bin", "reto4"] 6 | reto5 = ["run", "--bin", "reto5"] -------------------------------------------------------------------------------- /.eslintrc.cjs: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | env: { 3 | es2021: true, 4 | node: true 5 | }, 6 | extends: 'standard', 7 | overrides: [ 8 | ], 9 | parserOptions: { 10 | ecmaVersion: 'latest', 11 | sourceType: 'module' 12 | }, 13 | rules: { 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /test/Challenge04.spec.js: -------------------------------------------------------------------------------- 1 | import { describe, it } from 'node:test' 2 | import assert from 'node:assert' 3 | import { haveTwoFive, isAscending } from '../Challenge-04/app.js' 4 | 5 | describe('Tests to solution of challenge04', () => { 6 | it('haveTwoFive only return true in a number with 2 fives', () => { 7 | assert.equal(haveTwoFive(12553), true) 8 | assert.equal(haveTwoFive(12345), false) 9 | }) 10 | 11 | it('isAscending only return true in a number with ascending numbers', () => { 12 | assert.equal(isAscending(12345), true) 13 | assert.equal(isAscending(12435), false) 14 | }) 15 | }) 16 | -------------------------------------------------------------------------------- /test/Challenge03.spec.js: -------------------------------------------------------------------------------- 1 | import { describe, it } from 'node:test' 2 | import assert from 'node:assert' 3 | import { filterColors } from '../Challenge-03/app.js' 4 | 5 | describe('Tests to challenge03 solution', () => { 6 | it('The function filterColor must return zebraLenght and lastColor', () => { 7 | const colorsList1 = ['blue', 'red', 'blue', 'green', 'red', 'green', 'red'] 8 | const expectedObj1 = { 9 | maxZebraColor: 'red', 10 | maxZebraCount: 4 11 | } 12 | 13 | assert.equal( 14 | filterColors(colorsList1).maxZebraCount, 15 | expectedObj1.maxZebraCount 16 | ) 17 | 18 | assert.equal( 19 | filterColors(colorsList1).maxZebraColor, 20 | expectedObj1.maxZebraColor 21 | ) 22 | }) 23 | }) 24 | -------------------------------------------------------------------------------- /Challenge-04/app.js: -------------------------------------------------------------------------------- 1 | const minRange = 11098 2 | const maxRange = 98123 3 | 4 | const main = () => { 5 | const numbers = [] 6 | for (let i = minRange; i <= maxRange; i++) { 7 | numbers.push(i) 8 | } 9 | 10 | const answers = numbers.filter(isAscending).filter(haveTwoFive) 11 | 12 | console.log(`Lenght ${answers.length}`) 13 | console.log(`password ${answers[55]}`) 14 | } 15 | 16 | // 12345 17 | export const isAscending = (numero) => { 18 | const convertToNumber = (num) => Number(num) 19 | const arr = Array.from(String(numero)).map(convertToNumber) 20 | return arr.every((n, i) => i === 0 || n >= arr[i - 1]) 21 | } 22 | 23 | // haveFive(465) -> false 24 | // haveFive(255) -> true 25 | export const haveTwoFive = (num) => `${num}`.includes('55') 26 | 27 | main() 28 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "codember" 3 | version = "0.1.0" 4 | edition = "2021" 5 | 6 | # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html 7 | 8 | [[bin]] 9 | name = "reto1" 10 | src = "Challenge-01/main.rs" 11 | path = "Challenge-01/main.rs" 12 | 13 | [[bin]] 14 | name = "reto2" 15 | src = "Challenge-02/main.rs" 16 | path = "Challenge-02/main.rs" 17 | 18 | [[bin]] 19 | name = "reto3" 20 | src = "Challenge-03/main.rs" 21 | path = "Challenge-03/main.rs" 22 | 23 | [[bin]] 24 | name = "reto4" 25 | src = "Challenge-04/main.rs" 26 | path = "Challenge-04/main.rs" 27 | 28 | [[bin]] 29 | name = "reto5" 30 | src = "Challenge-05/main.rs" 31 | path = "Challenge-05/main.rs" 32 | 33 | [dependencies] 34 | minreq = { version = "2.6.0", features = ["https"] } 35 | -------------------------------------------------------------------------------- /Challenge-05/app.js: -------------------------------------------------------------------------------- 1 | const resp = await fetch('https://codember.dev/mecenas.json') 2 | const mecenas = await resp.json() 3 | 4 | const players = mecenas.map((mecena, idx) => { 5 | return { name: mecena, idx, is_alive: true } 6 | }) 7 | 8 | const hungerGames = (players) => { 9 | const idxPlayers = [...players.keys()] 10 | 11 | while (players.length !== 1) { 12 | // si no es par automaticamente eliminado 13 | players.forEach((p, i) => { 14 | if (idxPlayers[i] % 2 !== 0) { 15 | players[i].is_alive = false 16 | } 17 | }) 18 | 19 | // si el ultimo esta vivo y el primero tambien 20 | // el primero se va a un lugar mejor 21 | if (players.at(-1).is_alive && players.at(0).is_alive) { 22 | players[0].is_alive = false 23 | } 24 | 25 | // se quitan del array los jugadores eliminados 26 | players = players.filter((p) => p.is_alive) 27 | } 28 | 29 | return players 30 | } 31 | 32 | console.log(hungerGames(players)) 33 | -------------------------------------------------------------------------------- /Challenge-05/main.rs: -------------------------------------------------------------------------------- 1 | use minreq; 2 | 3 | #[derive(Clone, Debug)] 4 | struct Player { 5 | idx: usize, 6 | name: String, 7 | is_alive: bool, 8 | } 9 | 10 | fn main() { 11 | let url = "https://codember.dev/mecenas.json"; 12 | let resp = match minreq::get(url).send() { 13 | Ok(data) => data, 14 | Err(e) => { 15 | println!("{}", e); 16 | return; 17 | } 18 | }; 19 | let arr_string = resp.as_str().expect("Error to read response"); 20 | let players_arr: Vec = arr_string 21 | .trim_matches(|c| c == '[' || c == ']') 22 | .split(",") 23 | .enumerate() 24 | .map(|(i, s)| Player { 25 | name: String::from(s), 26 | idx: i, 27 | is_alive: true, 28 | }) 29 | .collect(); 30 | 31 | println!("{:?}", hunger_games(players_arr)); 32 | } 33 | 34 | fn hunger_games(players: Vec) -> Vec { 35 | return (&players[0..1]).to_vec(); 36 | } 37 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "codember", 3 | "volta": { 4 | "node": "18.12.1" 5 | }, 6 | "description": "", 7 | "type": "module", 8 | "scripts": { 9 | "lint": "eslint . --fix", 10 | "reto1": "node Challenge-01/app.js Challenge-01/users.txt", 11 | "reto2": "node Challenge-02/app.js", 12 | "reto3": "node Challenge-03/app.js", 13 | "reto4": "node Challenge-04/app.js", 14 | "reto5": "node Challenge-05/app.js", 15 | "test": "node --test", 16 | "prepare": "husky install" 17 | }, 18 | "keywords": [], 19 | "author": "Jona", 20 | "license": "ISC", 21 | "devDependencies": { 22 | "eslint": "8.28.0", 23 | "eslint-config-standard": "17.0.0", 24 | "eslint-plugin-import": "2.26.0", 25 | "eslint-plugin-n": "15.5.1", 26 | "eslint-plugin-promise": "6.1.1", 27 | "husky": "^8.0.2", 28 | "lint-staged": "^13.0.3", 29 | "prettier": "2.7.1" 30 | }, 31 | "lint-staged": { 32 | "*.js": "eslint --cache --fix", 33 | "*.{js,css,md}": "prettier --write" 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 Jonathan Alcantar 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /Challenge-03/app.js: -------------------------------------------------------------------------------- 1 | const main = async () => { 2 | const resp = await fetch('https://codember.dev/colors.txt') 3 | let colors = await resp.text() 4 | 5 | colors = colors.replaceAll("'", '"') 6 | colors = JSON.parse(colors) 7 | 8 | filterColors(colors) 9 | } 10 | 11 | export const filterColors = (arrColors) => { 12 | console.log(arrColors) 13 | let maxZebraCount = 0 14 | let maxZebraColor = '' 15 | 16 | let lastColor = '' 17 | let nextColor = arrColors[0] 18 | let currentZebraCount = 1 19 | arrColors.forEach((color, idx) => { 20 | if (color !== nextColor || lastColor === color) { 21 | currentZebraCount = 1 // reset the counter 22 | } 23 | 24 | color === lastColor ? (currentZebraCount = 1) : currentZebraCount++ 25 | 26 | nextColor = lastColor 27 | lastColor = color 28 | 29 | if (currentZebraCount > maxZebraCount) { 30 | maxZebraCount = currentZebraCount 31 | maxZebraColor = lastColor 32 | } 33 | }) 34 | 35 | console.log({ 36 | maxZebraColor, 37 | maxZebraCount 38 | }) 39 | 40 | return { 41 | maxZebraColor, 42 | maxZebraCount 43 | } 44 | } 45 | 46 | main() 47 | -------------------------------------------------------------------------------- /Challenge-02/app.js: -------------------------------------------------------------------------------- 1 | const res = await fetch('https://codember.dev/encrypted.txt') 2 | const codedString = await res.text() 3 | export const asciiZ = 122 4 | export const asciiA = 50 5 | 6 | const main = () => { 7 | console.log(`Coded string -> ${codedString}`) 8 | const asciiCodes = buildArrCodes(codedString) 9 | console.log(asciiCodes) 10 | const message = decodeMessage(asciiCodes) 11 | console.log(`Decoded message -> ${message}`) 12 | } 13 | 14 | export const buildArrCodes = (codedMessage) => { 15 | const arrCodes = [] 16 | let asciiNumber = '' 17 | for (const l of codedMessage) { 18 | asciiNumber += l 19 | if (l === '') { 20 | asciiNumber.push(' ') 21 | continue 22 | } 23 | if (Number(asciiNumber) >= asciiA && Number(asciiNumber) <= asciiZ) { 24 | arrCodes.push(asciiNumber) 25 | asciiNumber = '' 26 | } 27 | } 28 | 29 | return arrCodes 30 | } 31 | 32 | export const decodeMessage = (arrCodes) => { 33 | let decodedMessage = '' 34 | arrCodes = arrCodes.map((c) => { 35 | if (c.includes(' ')) { 36 | decodedMessage += ' ' 37 | } 38 | return (decodedMessage += String.fromCharCode(c)) 39 | }) 40 | 41 | return decodedMessage 42 | } 43 | 44 | main() 45 | -------------------------------------------------------------------------------- /Challenge-04/README.md: -------------------------------------------------------------------------------- 1 | # Challenge 4: Encuentra la contraseña de tu amigo 2 | 3 | ## Problema 4 | 5 | Un amigo compró 5 BitCoins en 2008. El problema es que lo tenía en un monedero digital... ¡y no se acuerda de la contraseña! 6 | 7 | Nos ha pedido ayuda. Y nos ha dado algunas pistas: 8 | 9 | - Es una contraseña de 5 dígitos. 10 | - La contraseña tenía el número 5 repetido dos veces. 11 | - El número a la derecha siempre es mayor o igual que el que tiene a la izquierda. 12 | 13 | Nos ha puesto algunas ejemplos: 14 | 15 | ``` 16 | 55678 es correcto lo cumple todo 17 | 12555 es correcto, lo cumple todo 18 | 55555 es correcto, lo cumple todo 19 | 12345 es incorrecto, no tiene el 5 repetido. 20 | 57775 es incorrecto, los números no van de forma creciente 21 | ``` 22 | 23 | Dice que el password está entre los números 11098 y 98123. ¿Le podemos decir cuantos números cumplen esas reglas dentro de ese rango? 24 | 25 | ### Cómo enviar la solución 26 | 27 | Envía la solución con el comando submit, y el número de passwords que cumplen el criterio junto con el password que está en el índice 55 de la lista de passwords válidos, separado por un guión. 28 | 29 | Por ejemplo, para 87 resultados y el password 35522 en la posición 55 sería: 30 | 31 | ``` 32 | $ submit 87-35522 33 | ``` 34 | -------------------------------------------------------------------------------- /Challenge-01/app.js: -------------------------------------------------------------------------------- 1 | import fs from 'node:fs' 2 | 3 | const main = () => { 4 | fs.readFile('./Challenge-01/users.txt', 'utf-8', async (err, data) => { 5 | if (err) throw err 6 | getAnswer(data) 7 | }) 8 | } 9 | 10 | export const getAnswer = (value) => { 11 | const users = value.replaceAll('\n', ' ').split(' ') 12 | filterUsers(users) 13 | } 14 | 15 | export const filterUsers = (users) => { 16 | const realUsers = convertToObjectUsers(users) 17 | 18 | const [res, count] = usersWithFields(realUsers) 19 | 20 | console.log(count, res.at(-1)) 21 | 22 | return [count, res.at(-1)] 23 | } 24 | 25 | export const convertToObjectUsers = (users) => { 26 | const realUsers = [] 27 | let arr = [] 28 | 29 | users.forEach((u) => { 30 | const arrUser = u.split() 31 | 32 | if (arrUser.includes('') || arrUser.includes('\r')) { 33 | const newObject = Object.fromEntries(arr.map((u) => u.split(':'))) 34 | realUsers.push(newObject) 35 | arr = [] 36 | } else { 37 | arr.push(...arrUser) 38 | } 39 | }) 40 | 41 | return realUsers 42 | } 43 | 44 | export const usersWithFields = (users) => { 45 | let count = 0 46 | let res = users.map((user) => { 47 | if (user.usr && user.psw && user.eme && user.age && user.loc && user.fll) { 48 | count++ 49 | return user 50 | } 51 | return false 52 | }) 53 | 54 | res = res.filter(Boolean) 55 | 56 | return [res, count] 57 | } 58 | 59 | main() 60 | -------------------------------------------------------------------------------- /Challenge-03/README.md: -------------------------------------------------------------------------------- 1 | # Reto 3: La zebra de colores 2 | 3 | ## Problema 4 | 5 | TMChein ya se está preparando para las fiestas y quiere empezar a decorar la casa con las luces de navidad. 6 | 7 | Quiere comprar una pero sus favoritas son las que tienen dos colores que se van alternando. Como una zebra de dos colores. 8 | 9 | Ha hecho que las luces sean Arrays y cada posición un color. Y quiere saber qué luces tienen las zebras más largas y cuál es el último color de esa sucesión de colores. Por ejemplo: 10 | 11 | ``` 12 | ['red', 'blue', 'red', 'blue', 'green'] -> 4, blue 13 | ['green', 'red', 'blue', 'gray'] -> 2, gray 14 | ['blue', 'blue', 'blue', 'blue'] -> 1, blue 15 | ['red', 'green', 'red', 'green', 'red', 'green'] -> 6, green 16 | ['red', 'red', 'blue', 'red', 'red', 'red', 'green'] -> 3, red 17 | ``` 18 | 19 | Fíjate que sólo quiere saber la longitud de cuando dos colores se van alternando. Una vez que se rompe la alternancia de los dos colores, deja de contar. 20 | 21 | Ahora que ya sabes esto, https://codember.dev/colors.txt 22 | 23 | Recuerda que una zebra de colores es cuando dos colores se alternan una y otra vez. Si se repite un color en la posición siguiente o es un tercer color, entonces se deja de contar. 24 | Lo que queremos calcular es la tira de colores más larga en forma de zebra y el último color de esa tira de colores. 25 | Cómo enviar la solución 26 | Usa el comando "submit" para enviar tu solución. Por ejemplo: 27 | 28 | $ submit 62@red 29 | -------------------------------------------------------------------------------- /Challenge-04/main.rs: -------------------------------------------------------------------------------- 1 | const MIN_RANGE: u16 = 11098; 2 | const MAX_RANGE: u16 = 59999; 3 | 4 | fn main() { 5 | let mut numbers: Vec = vec![]; 6 | for i in MIN_RANGE..MAX_RANGE { 7 | numbers.push(i) 8 | } 9 | 10 | let posible_passwords: Vec = numbers 11 | .into_iter() 12 | .filter(|n| have_two_five(n)) 13 | .filter(|n| is_incremental(n)) 14 | .collect(); 15 | 16 | println!( 17 | "El numero de posibles contraseñas es {}", 18 | posible_passwords.len() 19 | ); 20 | println!("El indice 55 es: {}", posible_passwords[55]); 21 | println!( 22 | "La respuesta es: {}@{}!!", 23 | posible_passwords.len(), 24 | posible_passwords[55] 25 | ); 26 | println!("Si!!! eres rico! 💰🔑, Bueno tu amigo"); 27 | } 28 | 29 | fn have_two_five(numero: &u16) -> bool { 30 | return numero.to_string().contains("55"); 31 | } 32 | 33 | fn is_incremental(numero: &u16) -> bool { 34 | let string_number = &numero.to_string(); 35 | let mut arr_nums: Vec = vec![]; 36 | for n in string_number.chars() { 37 | let str_num = String::from(n); 38 | let num: u8 = str_num.parse().expect("Error to convert string to number"); 39 | arr_nums.push(num); 40 | } 41 | 42 | let (n1, n2, n3, n4, n5) = if let [n1, n2, n3, n4, n5] = arr_nums[..] { 43 | (n1, n2, n3, n4, n5) 44 | } else { 45 | todo!() 46 | }; 47 | 48 | return n1 <= n2 && n2 <= n3 && n3 <= n4 && n4 <= n5; 49 | } 50 | -------------------------------------------------------------------------------- /test/challenge02.spec.js: -------------------------------------------------------------------------------- 1 | import { describe, it } from 'node:test' 2 | import assert from 'node:assert' 3 | 4 | import { buildArrCodes, decodeMessage } from '../Challenge-02/app.js' 5 | 6 | const secretMessage = '072101108108111 087111114108100033' 7 | 8 | describe('Tests for challenge02 Ciber criminals 💻🕵️‍♀️', () => { 9 | it('The fn buildArrCodes be return an array of asciiCodes', () => { 10 | const ascii = buildArrCodes(secretMessage) 11 | const expectedAsciiCodes = [ 12 | '072', 13 | '101', 14 | '108', 15 | '108', 16 | '111', 17 | ' 087', 18 | '111', 19 | '114', 20 | '108', 21 | '100' 22 | ] 23 | 24 | assert.deepEqual(ascii, expectedAsciiCodes) 25 | }) 26 | 27 | it('The fn decodeMessage be return an string decoded', () => { 28 | const asciiCodes = buildArrCodes(secretMessage) 29 | const message = decodeMessage(asciiCodes) 30 | const realMessage = 'Hello World' 31 | 32 | assert.equal(message, realMessage) 33 | }) 34 | 35 | it('The decodeMessage will decode examples', () => { 36 | const firstWordCodes = ['109', '105', '100', '117'] 37 | const secondWordCodes = [ 38 | '99', 39 | '111', 40 | '100', 41 | '101', 42 | '109', 43 | '98', 44 | '101', 45 | '114' 46 | ] 47 | 48 | const firstWord = decodeMessage(firstWordCodes) 49 | const secondWord = decodeMessage(secondWordCodes) 50 | 51 | assert.equal(firstWord, 'midu') 52 | assert.equal(secondWord, 'codember') 53 | }) 54 | }) 55 | -------------------------------------------------------------------------------- /Challenge-02/README.md: -------------------------------------------------------------------------------- 1 | # Reto 2: ¡Atrapa a esos ciber criminales! 2 | 3 | ## Problema 4 | 5 | Un grupo de ciber criminales están usando mensajes encriptados para comunicarse. El FBI nos ha pedido ayuda para descifrarlos. 6 | 7 | Los mensajes son cadenas de texto que incluyen números enteros muy largos y espacios en blanco. Aunque los números no parecen tener sentido... una chica llamada Alice ha descubierto que podrían usar el código ASCII de las letras en minúscula. 8 | 9 | Con su método ha conseguido descifrar estos mensajes: 10 | 11 | ``` 12 | "109105100117" -> midu 13 | "9911110010110998101114" -> codember 14 | "9911110010110998101114 109105100117" -> codember midu 15 | "11210897121 116101116114105115" -> play tetris 16 | ``` 17 | 18 | Pero han interceptado un mensaje más largo que no han podido y nos han dicho que es muy importante que lo descifremos: 19 | 20 | ``` 21 | 11610497110107115 102111114 11210897121105110103 9911110010110998101114 11210810197115101 11510497114101 22 | ``` 23 | 24 | Ahora que ya sabes esto, https://codember.dev/encrypted.txt 25 | 26 | ### Pistas 27 | 28 | - Recuerda que los mensajes son cadenas de texto conformadas por números y espacios en blanco. 29 | - Parece que los números tienen algo que ver con el código ASCII. 30 | - Los espacios en blanco parece que son simplemente espacios... 31 | 32 | ## Cómo enviar la solución ? 33 | 34 | Usa el comando "submit" para enviar tu solución con la frase descifrada, en minúsculas y respetando los espacios en blanco. Por ejemplo: 35 | 36 | ``` 37 | $ submit this is fine 38 | ``` 39 | -------------------------------------------------------------------------------- /Challenge-03/main.rs: -------------------------------------------------------------------------------- 1 | use minreq; 2 | 3 | #[derive(Debug)] 4 | struct ZEBRA { 5 | length: u32, 6 | color: String, 7 | } 8 | 9 | fn main() { 10 | let url = "https://codember.dev/colors.txt"; 11 | let response = match minreq::get(url).send() { 12 | Ok(res) => res, 13 | Err(e) => { 14 | println!("Error: {}", e); 15 | return; 16 | } 17 | }; 18 | 19 | let arr_str = response.as_str().expect("Error in transform a to arr"); 20 | let parsed_arr: Vec<&str> = arr_str 21 | .trim_matches(|c| c == '[' || c == ']') 22 | .split(',') 23 | .collect(); 24 | 25 | let mut last_color: String = String::from(""); 26 | let mut next_color: String = String::from(parsed_arr[0]); 27 | let mut zebra_lenght: u32 = 0; 28 | 29 | let mut largest_zebra = ZEBRA { 30 | length: 0, 31 | color: String::from(""), 32 | }; 33 | 34 | for color in parsed_arr.into_iter() { 35 | if color != next_color.to_string() || color == last_color { 36 | zebra_lenght = 1; 37 | } 38 | 39 | zebra_lenght += 1; 40 | 41 | next_color = last_color; 42 | last_color = color.to_string(); 43 | 44 | if zebra_lenght > largest_zebra.length { 45 | largest_zebra = ZEBRA { 46 | length: zebra_lenght, 47 | color: last_color.clone(), 48 | }; 49 | } 50 | } 51 | 52 | println!( 53 | "La longitud de la zebra 🦓 mas larga es {} y el color es{}", 54 | largest_zebra.length, largest_zebra.color 55 | ); 56 | println!("Feliz Navidad 🎅 🎄") 57 | } 58 | -------------------------------------------------------------------------------- /Challenge-02/main.rs: -------------------------------------------------------------------------------- 1 | extern crate minreq; 2 | const ASCII_Z: u8 = 122; 3 | const ASCII_A: u8 = 97; 4 | 5 | fn main() { 6 | let url = "https://codember.dev/encrypted.txt"; 7 | let res = match minreq::get(url).send() { 8 | Ok(res) => res, 9 | Err(e) => { 10 | println!("Something bad happens: {e}"); 11 | return; 12 | } 13 | }; 14 | 15 | let code = res.as_str().expect("Something failed"); 16 | let coded_msg = String::from(code); 17 | println!("🔒 Coded message -> {}", coded_msg); 18 | 19 | let result: Vec = coded_msg 20 | .split(' ') 21 | .map(|word| decrypt_word(word)) 22 | .collect(); 23 | 24 | println!("🔓🔑 Decoded message -> {}", result.join(" ")); 25 | println!("Los criminales han sido detenidos! 🎉 "); 26 | } 27 | 28 | /// This function will return a decoded msg 29 | /// receive a str of numbers -> "11688123" 30 | fn decrypt_word(word: &str) -> String { 31 | let arr: Vec = word.as_bytes().to_vec(); 32 | let mut new_word = String::from(""); 33 | let mut decoded_word: String = String::from(""); 34 | for c in arr { 35 | new_word.push(c as char); 36 | let ascii_value: u8 = new_word.parse().expect("failed to convert String to u8"); 37 | if ascii_value <= ASCII_Z && ascii_value >= ASCII_A { 38 | decoded_word.push(ascii_value as char); 39 | new_word = String::from(""); 40 | } 41 | } 42 | return decoded_word; 43 | } 44 | 45 | // tests! 46 | #[cfg(test)] 47 | mod tests { 48 | #[test] 49 | fn check_words() { 50 | let first_word = super::decrypt_word("109105100117"); 51 | let second_word = super::decrypt_word("9911110010110998101114"); 52 | assert_eq!(first_word, "midu"); 53 | assert_eq!(second_word, "codember"); 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /Challenge-01/main.rs: -------------------------------------------------------------------------------- 1 | use std::env; 2 | use std::fs; 3 | use std::vec; 4 | 5 | const REQUIRED_FIELDS: [&str; 6] = ["usr", "age", "eme", "psw", "loc", "fll"]; 6 | 7 | fn main() { 8 | let args: Vec = env::args().collect(); 9 | let file_path = &args[1]; 10 | 11 | let users = fs::read_to_string(file_path).expect("failed to read file"); 12 | 13 | let mut users_data: Vec = vec![]; 14 | 15 | let mut user_str = String::from(""); 16 | for (_idx, user) in users.lines().enumerate() { 17 | let content = user; 18 | if content != "" { 19 | user_str.push_str(&content); 20 | } else { 21 | users_data.push(user_str); 22 | user_str = String::from("") 23 | } 24 | } 25 | 26 | let data: Vec = users_data.into_iter().filter(|u| have_fields(u)).collect(); 27 | 28 | println!("{:?}", data.len()); 29 | println!("{:?}", data[data.len() - 1]); 30 | } 31 | 32 | fn have_fields(data: &String) -> bool { 33 | data.contains(REQUIRED_FIELDS[0]) 34 | && data.contains(REQUIRED_FIELDS[1]) 35 | && data.contains(REQUIRED_FIELDS[2]) 36 | && data.contains(REQUIRED_FIELDS[3]) 37 | && data.contains(REQUIRED_FIELDS[4]) 38 | && data.contains(REQUIRED_FIELDS[5]) 39 | } 40 | 41 | // tests! 42 | #[cfg(test)] 43 | mod tests { 44 | #[test] 45 | fn check_invalid_data() { 46 | let invalid_user = String::from("usr:jona"); 47 | let invalid_fields = super::have_fields(&invalid_user); 48 | assert_eq!(invalid_fields, false); 49 | } 50 | 51 | #[test] 52 | fn check_valid_data() { 53 | let valid_user = 54 | String::from("usr:jona age:24 eme:example@gmail.com psw:123 loc:nowhere fll:7"); 55 | let valid_fields = super::have_fields(&valid_user); 56 | assert_eq!(valid_fields, true) 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /Challenge-05/README.md: -------------------------------------------------------------------------------- 1 | # Challenge 5: Battle Royale de frameworks y bibliotecas 2 | 3 | ## Problema 4 | 5 | Hay tanto framework y biblioteca que ya no sabemos qué usar. Así que un comité ha decidido hacer una especie de Los Juegos del Hambre para decidir qué tecnología se queda. 6 | 7 | Ha puesto todas las tecnologías en círculo de forma aleatoria. La tecnología en el índice 0 empieza matando a la que tiene justo a la derecha (índice + 1). 8 | 9 | El siguiente turno es para la tecnología que esté viva que queda a la derecha de la que se acaba de morir. Y así sucesivamente hasta que sólo quede una. Mira este ejemplo de un grupo de 10 tecnologías, paso a paso: 10 | 11 | ``` 12 | 5 13 | 6 4 14 | 7 3 15 | 8 2 16 | 9 1 17 | 0 18 | ``` 19 | 20 | 0 mata a 1 21 | 2 mata a 3 22 | 4 mata a 5 23 | 6 mata a 7 24 | 8 mata a 9 25 | 26 | ``` 27 | X 28 | 6 4 29 | X X 30 | 8 2 31 | X X 32 | 0 33 | ``` 34 | 35 | 0 mata a 2 36 | 4 mata a 6 37 | 8 mata a 0 38 | 39 | ``` 40 | X 41 | X 4 42 | X X 43 | 8 X 44 | X X 45 | X 46 | ``` 47 | 48 | 4 mata a 8 49 | 50 | ``` 51 | X 52 | X 4 53 | X X 54 | X X 55 | X X 56 | X 57 | ``` 58 | 59 | La tecnología en el índice 4 es la que ha sobrevivido. 60 | 61 | Ahora, para probar que somos capaces de crear un algoritmo que funcione, tenemos la lista de mecenas de la comunidad de midudev: https://codember.dev/mecenas.json 62 | 63 | Tienes que crear un algoritmo que nos diga qué usuario sobreviviría usando el mismo sistema. 64 | 65 | ### Cómo enviar la solución 66 | 67 | Envía la solución con el comando submit, y el índice de la persona que sobrevive y su nombre de usuario, separado de un guión. 68 | 69 | Por ejemplo, si el usuario que sobrevive es facundopacua y está en el índice 8 sería: 70 | 71 | ``` 72 | $ submit facundocapua-8 73 | ``` 74 | -------------------------------------------------------------------------------- /Challenge-01/README.md: -------------------------------------------------------------------------------- 1 | # Reto 1: ¡Arregla Twitter! 2 | 3 | ## Problema 4 | 5 | Twitter ha sido comprado y quieren eliminar los bots. Te han pedido ayuda para detectar el número de usuarios en su base de datos que tienen datos corruptos. 6 | 7 | La base de datos es muy antigua y está en un formato extraño. Los perfiles requieren tener los siguientes datos: 8 | 9 | usr: nombre de usuario 10 | eme: email 11 | psw: contraseña 12 | age: edad 13 | loc: ubicación 14 | fll: número de seguidores 15 | Todo está en un fichero donde los datos de usuario son una secuencia de pares `key:value`, que pueden estar en la misma línea o separado por líneas, y cada usuario está separado por un salto de línea. ¡Ojo porque puede estar todo desordenado! 16 | 17 | Ejemplo de input: 18 | 19 | ``` 20 | usr:@midudev eme:mi@gmail.com psw:123456 age:22 loc:bcn fll:82 21 | 22 | fll:111 eme:yrfa@gmail.com usr:@codember psw:123456 age:21 loc:World 23 | 24 | psw:11133 loc:Canary fll:333 usr:@pheralb eme:pheralb@gmail.com 25 | 26 | usr:@itziar age:19 loc:isle psw:aaa fll:222 eme:itzi@gmail.com 27 | ``` 28 | 29 | El primer usuario SÍ es válido. Tiene todos los campos. 30 | El segundo usuario SÍ es válido. Tiene todos los campos. 31 | El tercer usuario NO es válido. Le falta el campo `age`. 32 | El cuarto usuario SÍ es válido. Tiene todos los campos.. 33 | 34 | Ahora que ya sabes esto, usa este input para detectar los usuarios incorrectos: https://codember.dev/users.txt 35 | 36 | ### Pistas 37 | 38 | - Los datos pueden estar en cualquier orden. 39 | - Los datos pueden estar en la misma línea o separados por líneas. 40 | - Los usuarios se separan por un salto de línea en blanco. 41 | - Los usuarios pueden estar repetidos, pero no importa, siguen siendo válidos. 42 | - Pueden venir datos que no son necesarios para el usuario pero eso no lo hacen inválidos. 43 | 44 | ### Cómo enviar la solución 45 | 46 | Usa el comando "submit" para enviar tu solución con el número de usuarios correctos + el nombre del último usuario válido. Por ejemplo: 47 | 48 | ```sh 49 | $ submit 482@midudev 50 | ``` 51 | -------------------------------------------------------------------------------- /test/challenge01.spec.js: -------------------------------------------------------------------------------- 1 | import { it, describe } from 'node:test' 2 | import assert from 'node:assert' 3 | import { convertToObjectUsers, usersWithFields } from '../Challenge-01/app.js' 4 | 5 | describe('Tests to challenge01 Fix Twitter 💾🔥', () => { 6 | it('convertToObjectUsers must return array of objects', () => { 7 | const usuarios = [ 8 | 'fll:111', 9 | 'eme:yrfa@gmail.com', 10 | 'usr:@codember', 11 | 'age:21', 12 | 'loc:World', 13 | '', 14 | 'usr:@midudev', 15 | 'eme:mi@gmail.com', 16 | 'psw:123456', 17 | 'age:38', 18 | 'loc:bcn', 19 | 'fll:82' 20 | ] 21 | 22 | const arrUsers = convertToObjectUsers(usuarios) 23 | 24 | const validUser = [ 25 | { 26 | fll: '111', 27 | eme: 'yrfa@gmail.com', 28 | usr: '@codember', 29 | age: '21', 30 | loc: 'World' 31 | } 32 | ] 33 | 34 | assert.deepEqual(arrUsers, validUser) 35 | }) 36 | 37 | it('haveFields must return only the users with correct fields', () => { 38 | const users = [ 39 | 'fll:111', 40 | 'eme:yrfa@gmail.com', 41 | 'usr:@codember', 42 | 'age:21', 43 | 'loc:World', 44 | '', 45 | 'usr:@midudev', 46 | 'eme:mi@gmail.com', 47 | 'psw:123456', 48 | 'age:38', 49 | 'loc:bcn', 50 | 'fll:82', 51 | '', 52 | 'usr:@jona', 53 | 'eme:example@gmail.com', 54 | 'psw:123765', 55 | 'age:21', 56 | 'loc:arg', 57 | 'fll:7', 58 | '', 59 | 'usr:@fer', 60 | 'eme:fer@gmail.com', 61 | 'psw:1234', 62 | 'age:25', 63 | 'loc:usa', 64 | 'fll:200' 65 | ] 66 | 67 | const parsedUsers = convertToObjectUsers(users) 68 | 69 | const usersValidated = usersWithFields(parsedUsers) 70 | 71 | console.log(usersValidated) 72 | 73 | const correctUsers = [ 74 | [ 75 | { 76 | usr: '@midudev', 77 | eme: 'mi@gmail.com', 78 | psw: '123456', 79 | age: '38', 80 | loc: 'bcn', 81 | fll: '82' 82 | }, 83 | { 84 | usr: '@jona', 85 | eme: 'example@gmail.com', 86 | psw: '123765', 87 | age: '21', 88 | loc: 'arg', 89 | fll: '7' 90 | } 91 | ], 92 | 2 93 | ] 94 | 95 | assert.deepEqual(usersValidated[0], correctUsers[0]) 96 | }) 97 | }) 98 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Banner 2 | 3 | # Codember 4 | 5 | By [Midudev](https://github.com/midudev) :man_technologist: :space_invader: 6 | 7 | ## Implementaciones de los retos de [Codember](https://codember.dev/) en Javascript y Rust 8 | 9 | Al menos en Rust se hara el intento :sweat_smile: 10 | 11 | | Reto | Solucion | 12 | | :------------------------------------------------------: | :----------------: | 13 | | Arregla Twitter! :bird: :wrench: | :heavy_check_mark: | 14 | | ¡Atrapa a esos ciber criminales! :cop: :lock: | :heavy_check_mark: | 15 | | La zebra de colores :zebra: | :heavy_check_mark: | 16 | | Encuentra la contraseña de tu amigo :detective: | :heavy_check_mark: | 17 | | Battle Royale de frameworks y bibliotecas :wrench: :gun: | :pushpin: | 18 | 19 | ```sh 20 | . 21 | ├── Challenge-01 22 | │ ├── app.js 23 | │ └── users.txt 24 | ├── package.json 25 | └── README.md 26 | ``` 27 | 28 | ## Ejecutar los retos 29 | 30 | - Javascript 31 | 32 | ``` 33 | npm run reto1 34 | ``` 35 | 36 | - Rust 37 | 38 | ``` 39 | cargo reto1 40 | ``` 41 | 42 | ## Soluciones de otros usuarios 43 | 44 | - https://github.com/metabig/challenges-codember-python -> Antoni Bergas Galmés (Python) 45 | - https://github.com/camiloacostam/codember_js -> Camilo Acosta (Javascript) 46 | - https://github.com/CAMILOITT/codember -> CamiloITT (Javascript) 47 | - https://github.com/ikurotime/codember_rust -> David Huertas (Rust) 48 | - https://github.com/dcross23/codember -> David Cruz García (Python) 49 | - https://github.com/fredoist/codember -> Freddy González (Lua) 50 | - https://github.com/ivanlolivier/codember -> Ivan L'olivier (Javascript) 51 | - https://github.com/jesusmarzor/codember2022 -> Jesús Martín (Javascript) 52 | - https://github.com/jpaddeo/codember -> Juan Pablo Addeo (PHP, Javascript) 53 | - https://github.com/kyrex23/codember2022-midudev -> Kyrex (Java) 54 | - https://github.com/maadeval/codember-javascript -> Mateo Álvarez (Javascript) 55 | - https://github.com/RicardoxDev/codember -> Ricardo Martínez (Javascript) 56 | - https://github.com/d3vcloud/codember-2022 -> Xavimon (Javascript) 57 | 58 | Si gustan colaborar o quieren que agregue sus soluciones ala lista los pull requests estan abiertos! :man_technologist: :tada: 59 | -------------------------------------------------------------------------------- /Challenge-01/users.txt: -------------------------------------------------------------------------------- 1 | usr:@midudev eme:mi@gmail.com psw:123456 age:38 loc:bcn fll:82 2 | 3 | fll:111 eme:yrfa@gmail.com usr:@codember 4 | psw:123456 age:21 loc:World 5 | 6 | psw:11133 loc:Canary 7 | fll:333 usr:@pheralb 8 | eme:pheralb@gmail.com 9 | 10 | usr:@itziar age:19 11 | loc:isle psw:aaa fll:222 12 | eme:itzi@gmail.com 13 | 14 | usr:@midudev eme:mi@gmail.com psw:123456 age:38 loc:bcn fll:82 15 | 16 | fll:111 eme:yrfa@gmail.com usr:@codember 17 | psw:123456 age:21 loc:World 18 | 19 | psw:11133 loc:Canary 20 | fll:333 usr:@pheralb 21 | eme:pheralb@gmail.com 22 | 23 | usr:@itziar age:19 24 | loc:isle psw:aaa fll:222 25 | eme:itzi@gmail.com 26 | 27 | usr:@midudev eme:mi@gmail.com psw:123456 age:38 loc:bcn fll:82 28 | 29 | fll:111 eme:yrfa@gmail.com usr:@codember 30 | psw:123456 age:21 loc:World 31 | 32 | psw:11133 loc:Canary 33 | fll:333 usr:@pheralb 34 | eme:pheralb@gmail.com 35 | 36 | usr:@itziar age:19 37 | loc:isle psw:aaa fll:222 38 | eme:itzi@gmail.com 39 | 40 | usr:@midudev eme:mi@gmail.com psw:123456 age:38 loc:bcn fll:82 41 | 42 | fll:111 eme:yrfa@gmail.com usr:@codember 43 | psw:123456 age:21 loc:World 44 | 45 | psw:11133 loc:Canary 46 | fll:333 usr:@pheralb 47 | eme:pheralb@gmail.com 48 | 49 | usr:@itziar age:19 50 | loc:isle psw:aaa fll:222 51 | eme:itzi@gmail.com 52 | 53 | usr:@midudev eme:mi@gmail.com psw:123456 age:38 loc:bcn fll:82 54 | 55 | fll:111 eme:yrfa@gmail.com usr:@codember 56 | psw:123456 age:21 loc:World 57 | 58 | psw:11133 loc:Canary 59 | fll:333 usr:@pheralb 60 | eme:pheralb@gmail.com 61 | 62 | usr:@itziar age:19 63 | loc:isle psw:aaa fll:222 64 | eme:itzi@gmail.com 65 | 66 | usr:@midudev eme:mi@gmail.com psw:123456 age:38 loc:bcn fll:82 67 | 68 | fll:111 eme:yrfa@gmail.com usr:@codember 69 | psw:123456 age:21 loc:World 70 | 71 | psw:11133 loc:Canary 72 | fll:333 usr:@pheralb 73 | eme:pheralb@gmail.com 74 | 75 | usr:@itziar age:19 76 | loc:isle psw:aaa fll:222 77 | eme:itzi@gmail.com 78 | 79 | usr:@midudev eme:mi@gmail.com psw:123456 age:38 loc:bcn fll:82 80 | 81 | fll:111 eme:yrfa@gmail.com usr:@codember 82 | psw:123456 age:21 loc:World 83 | 84 | psw:11133 loc:Canary 85 | fll:333 usr:@pheralb 86 | eme:pheralb@gmail.com 87 | 88 | usr:@itziar age:19 89 | loc:isle psw:aaa fll:222 90 | eme:itzi@gmail.com 91 | 92 | usr:@midudev eme:mi@gmail.com psw:123456 age:38 loc:bcn fll:82 93 | 94 | fll:111 eme:yrfa@gmail.com usr:@codember 95 | psw:123456 age:21 loc:World 96 | 97 | psw:11133 loc:Canary 98 | fll:333 usr:@pheralb 99 | eme:pheralb@gmail.com 100 | 101 | usr:@itziar age:19 102 | loc:isle psw:aaa fll:222 103 | eme:itzi@gmail.com 104 | usr:@midudev eme:mi@gmail.com psw:123456 age:38 loc:bcn fll:82 105 | 106 | fll:111 eme:yrfa@gmail.com usr:@codember 107 | psw:123456 age:21 loc:World 108 | 109 | psw:11133 loc:Canary 110 | fll:333 usr:@pheralb 111 | eme:pheralb@gmail.com 112 | 113 | usr:@itziar age:19 114 | loc:isle psw:aaa fll:222 115 | eme:itzi@gmail.com 116 | 117 | usr:@midudev eme:mi@gmail.com psw:123456 age:38 loc:bcn fll:82 118 | 119 | fll:111 eme:yrfa@gmail.com usr:@codember 120 | psw:123456 age:21 loc:World 121 | 122 | psw:11133 loc:Canary 123 | fll:333 usr:@pheralb 124 | eme:pheralb@gmail.com 125 | 126 | usr:@itziar age:19 127 | loc:isle psw:aaa fll:222 128 | eme:itzi@gmail.com 129 | 130 | usr:@midudev eme:mi@gmail.com psw:123456 age:38 loc:bcn fll:82 131 | 132 | fll:111 eme:yrfa@gmail.com usr:@codember 133 | psw:123456 age:21 loc:World 134 | 135 | psw:11133 loc:Canary 136 | fll:333 usr:@pheralb 137 | eme:pheralb@gmail.com 138 | 139 | usr:@itziar age:19 140 | loc:isle psw:aaa fll:222 141 | eme:itzi@gmail.com 142 | 143 | usr:@midudev eme:mi@gmail.com psw:123456 age:38 loc:bcn fll:82 144 | 145 | fll:111 eme:yrfa@gmail.com usr:@codember 146 | psw:123456 age:21 loc:World 147 | 148 | psw:11133 loc:Canary 149 | fll:333 usr:@pheralb 150 | eme:pheralb@gmail.com 151 | 152 | usr:@itziar age:19 153 | loc:isle psw:aaa fll:222 154 | eme:itzi@gmail.com 155 | usr:@midudev eme:mi@gmail.com psw:123456 age:38 loc:bcn fll:82 156 | 157 | fll:111 eme:yrfa@gmail.com usr:@codember 158 | psw:123456 age:21 loc:World 159 | 160 | psw:11133 loc:Canary 161 | fll:333 usr:@pheralb 162 | eme:pheralb@gmail.com 163 | 164 | usr:@itziar age:19 165 | loc:isle psw:aaa fll:222 166 | eme:itzi@gmail.com 167 | 168 | usr:@midudev eme:mi@gmail.com psw:123456 age:38 loc:bcn fll:82 169 | 170 | fll:111 eme:yrfa@gmail.com usr:@codember 171 | psw:123456 age:21 loc:World 172 | 173 | psw:11133 loc:Canary 174 | fll:333 usr:@pheralb 175 | eme:pheralb@gmail.com 176 | 177 | usr:@itziar age:19 178 | loc:isle psw:aaa fll:222 179 | eme:itzi@gmail.com 180 | 181 | usr:@midudev eme:mi@gmail.com psw:123456 age:38 loc:bcn fll:82 182 | 183 | fll:111 eme:yrfa@gmail.com usr:@codember 184 | psw:123456 age:21 loc:World 185 | 186 | psw:11133 loc:Canary 187 | fll:333 usr:@pheralb 188 | eme:pheralb@gmail.com 189 | 190 | usr:@itziar age:19 191 | loc:isle psw:aaa fll:222 192 | eme:itzi@gmail.com 193 | 194 | usr:@midudev eme:mi@gmail.com psw:123456 age:38 loc:bcn fll:82 195 | 196 | fll:111 eme:yrfa@gmail.com usr:@codember 197 | psw:123456 age:21 loc:World 198 | 199 | psw:11133 loc:Canary 200 | fll:333 usr:@pheralb 201 | eme:pheralb@gmail.com 202 | 203 | usr:@itziar age:19 204 | loc:isle psw:aaa fll:222 205 | eme:itzi@gmail.com 206 | usr:@midudev eme:mi@gmail.com psw:123456 age:38 loc:bcn fll:82 207 | 208 | fll:111 eme:yrfa@gmail.com usr:@codember 209 | psw:123456 age:21 loc:World 210 | 211 | psw:11133 loc:Canary 212 | fll:333 usr:@pheralb 213 | eme:pheralb@gmail.com 214 | 215 | usr:@itziar age:19 216 | loc:isle psw:aaa fll:222 217 | eme:itzi@gmail.com 218 | 219 | usr:@midudev eme:mi@gmail.com psw:123456 age:38 loc:bcn fll:82 220 | 221 | fll:111 eme:yrfa@gmail.com usr:@codember 222 | psw:123456 age:21 loc:World 223 | 224 | psw:11133 loc:Canary 225 | fll:333 usr:@pheralb 226 | eme:pheralb@gmail.com 227 | 228 | usr:@itziar age:19 229 | loc:isle psw:aaa fll:222 230 | eme:itzi@gmail.com 231 | 232 | usr:@midudev eme:mi@gmail.com psw:123456 age:38 loc:bcn fll:82 233 | 234 | fll:111 eme:yrfa@gmail.com usr:@codember 235 | psw:123456 age:21 loc:World 236 | 237 | psw:11133 loc:Canary 238 | fll:333 usr:@pheralb 239 | eme:pheralb@gmail.com 240 | 241 | usr:@itziar age:19 242 | loc:isle psw:aaa fll:222 243 | eme:itzi@gmail.com 244 | 245 | usr:@midudev eme:mi@gmail.com psw:123456 age:38 loc:bcn fll:82 246 | 247 | fll:111 eme:yrfa@gmail.com usr:@codember 248 | psw:123456 age:21 loc:World 249 | 250 | psw:11133 loc:Canary 251 | fll:333 usr:@pheralb 252 | eme:pheralb@gmail.com 253 | 254 | usr:@itziar age:19 255 | loc:isle psw:aaa fll:222 256 | eme:itzi@gmail.com 257 | usr:@midudev eme:mi@gmail.com psw:123456 age:38 loc:bcn fll:82 258 | 259 | fll:111 eme:yrfa@gmail.com usr:@codember 260 | psw:123456 age:21 loc:World 261 | 262 | psw:11133 loc:Canary 263 | fll:333 usr:@pheralb 264 | eme:pheralb@gmail.com 265 | 266 | usr:@itziar age:19 267 | loc:isle psw:aaa fll:222 268 | eme:itzi@gmail.com 269 | 270 | usr:@midudev eme:mi@gmail.com psw:123456 age:38 loc:bcn fll:82 271 | 272 | fll:111 eme:yrfa@gmail.com usr:@codember 273 | psw:123456 age:21 loc:World 274 | 275 | psw:11133 loc:Canary 276 | fll:333 usr:@pheralb 277 | eme:pheralb@gmail.com 278 | 279 | usr:@itziar age:19 280 | loc:isle psw:aaa fll:222 281 | eme:itzi@gmail.com 282 | 283 | usr:@midudev eme:mi@gmail.com psw:123456 age:38 loc:bcn fll:82 284 | 285 | fll:111 eme:yrfa@gmail.com usr:@codember 286 | psw:123456 age:21 loc:World 287 | 288 | psw:11133 loc:Canary 289 | fll:333 usr:@pheralb 290 | eme:pheralb@gmail.com 291 | 292 | usr:@itziar age:19 293 | loc:isle psw:aaa fll:222 294 | eme:itzi@gmail.com 295 | 296 | usr:@midudev eme:mi@gmail.com psw:123456 age:38 loc:bcn fll:82 297 | 298 | fll:111 eme:yrfa@gmail.com usr:@codember 299 | psw:123456 age:21 loc:World 300 | 301 | psw:11133 loc:Canary 302 | fll:333 usr:@pheralb 303 | eme:pheralb@gmail.com 304 | 305 | usr:@itziar age:19 306 | loc:isle psw:aaa fll:222 307 | eme:itzi@gmail.com 308 | usr:@midudev eme:mi@gmail.com psw:123456 age:38 loc:bcn fll:82 309 | 310 | fll:111 eme:yrfa@gmail.com usr:@codember 311 | psw:123456 age:21 loc:World 312 | 313 | psw:11133 loc:Canary 314 | fll:333 usr:@pheralb 315 | eme:pheralb@gmail.com 316 | 317 | usr:@itziar age:19 318 | loc:isle psw:aaa fll:222 319 | eme:itzi@gmail.com 320 | 321 | usr:@midudev eme:mi@gmail.com psw:123456 age:38 loc:bcn fll:82 322 | 323 | fll:111 eme:yrfa@gmail.com usr:@codember 324 | psw:123456 age:21 loc:World 325 | 326 | psw:11133 loc:Canary 327 | fll:333 usr:@pheralb 328 | eme:pheralb@gmail.com 329 | 330 | usr:@itziar age:19 331 | loc:isle psw:aaa fll:222 332 | eme:itzi@gmail.com 333 | 334 | usr:@midudev eme:mi@gmail.com psw:123456 age:38 loc:bcn fll:82 335 | 336 | fll:111 eme:yrfa@gmail.com usr:@codember 337 | psw:123456 age:21 loc:World 338 | 339 | psw:11133 loc:Canary 340 | fll:333 usr:@pheralb 341 | eme:pheralb@gmail.com 342 | 343 | usr:@itziar age:19 344 | loc:isle psw:aaa fll:222 345 | eme:itzi@gmail.com 346 | 347 | usr:@midudev eme:mi@gmail.com psw:123456 age:38 loc:bcn fll:82 348 | 349 | fll:111 eme:yrfa@gmail.com usr:@codember 350 | psw:123456 age:21 loc:World 351 | 352 | psw:11133 loc:Canary 353 | fll:333 usr:@pheralb 354 | eme:pheralb@gmail.com 355 | 356 | usr:@itziar age:19 357 | loc:isle psw:aaa fll:222 358 | eme:itzi@gmail.com 359 | usr:@midudev eme:mi@gmail.com psw:123456 age:38 loc:bcn fll:82 360 | 361 | fll:111 eme:yrfa@gmail.com usr:@codember 362 | psw:123456 age:21 loc:World 363 | 364 | psw:11133 loc:Canary 365 | fll:333 usr:@pheralb 366 | eme:pheralb@gmail.com 367 | 368 | usr:@itziar age:19 369 | loc:isle psw:aaa fll:222 370 | eme:itzi@gmail.com 371 | 372 | usr:@midudev eme:mi@gmail.com psw:123456 age:38 loc:bcn fll:82 373 | 374 | fll:111 eme:yrfa@gmail.com usr:@codember 375 | psw:123456 age:21 loc:World 376 | 377 | psw:11133 loc:Canary 378 | fll:333 usr:@pheralb 379 | eme:pheralb@gmail.com 380 | 381 | usr:@itziar age:19 382 | loc:isle psw:aaa fll:222 383 | eme:itzi@gmail.com 384 | 385 | usr:@midudev eme:mi@gmail.com psw:123456 age:38 loc:bcn fll:82 386 | 387 | fll:111 eme:yrfa@gmail.com usr:@codember 388 | psw:123456 age:21 loc:World 389 | 390 | psw:11133 loc:Canary 391 | fll:333 usr:@pheralb 392 | eme:pheralb@gmail.com 393 | 394 | usr:@itziar age:19 395 | loc:isle psw:aaa fll:222 396 | eme:itzi@gmail.com 397 | 398 | usr:@midudev eme:mi@gmail.com psw:123456 age:38 loc:bcn fll:82 399 | 400 | fll:111 eme:yrfa@gmail.com usr:@codember 401 | psw:123456 age:21 loc:World 402 | 403 | psw:11133 loc:Canary 404 | fll:333 usr:@pheralb 405 | eme:pheralb@gmail.com 406 | 407 | usr:@itziar age:19 408 | loc:isle psw:aaa fll:222 409 | eme:itzi@gmail.com 410 | usr:@midudev eme:mi@gmail.com psw:123456 age:38 loc:bcn fll:82 411 | 412 | fll:111 eme:yrfa@gmail.com usr:@codember 413 | psw:123456 age:21 loc:World 414 | 415 | psw:11133 loc:Canary 416 | fll:333 usr:@pheralb 417 | eme:pheralb@gmail.com 418 | 419 | usr:@itziar age:19 420 | loc:isle psw:aaa fll:222 421 | eme:itzi@gmail.com 422 | 423 | usr:@midudev eme:mi@gmail.com psw:123456 age:38 loc:bcn fll:82 424 | 425 | fll:111 eme:yrfa@gmail.com usr:@codember 426 | psw:123456 age:21 loc:World 427 | 428 | psw:11133 loc:Canary 429 | fll:333 usr:@pheralb 430 | eme:pheralb@gmail.com 431 | 432 | usr:@itziar age:19 433 | loc:isle psw:aaa fll:222 434 | eme:itzi@gmail.com 435 | 436 | usr:@midudev eme:mi@gmail.com psw:123456 age:38 loc:bcn fll:82 437 | 438 | fll:111 eme:yrfa@gmail.com usr:@codember 439 | psw:123456 age:21 loc:World 440 | 441 | psw:11133 loc:Canary 442 | fll:333 usr:@pheralb 443 | eme:pheralb@gmail.com 444 | 445 | usr:@itziar age:19 446 | loc:isle psw:aaa fll:222 447 | eme:itzi@gmail.com 448 | 449 | usr:@midudev eme:mi@gmail.com psw:123456 age:38 loc:bcn fll:82 450 | 451 | fll:111 eme:yrfa@gmail.com usr:@codember 452 | psw:123456 age:21 loc:World 453 | 454 | psw:11133 loc:Canary 455 | fll:333 usr:@pheralb 456 | eme:pheralb@gmail.com 457 | 458 | usr:@itziar age:19 459 | loc:isle psw:aaa fll:222 460 | eme:itzi@gmail.com 461 | usr:@midudev eme:mi@gmail.com psw:123456 age:38 loc:bcn fll:82 462 | 463 | fll:111 eme:yrfa@gmail.com usr:@codember 464 | psw:123456 age:21 loc:World 465 | 466 | psw:11133 loc:Canary 467 | fll:333 usr:@pheralb 468 | eme:pheralb@gmail.com 469 | 470 | usr:@itziar age:19 471 | loc:isle psw:aaa fll:222 472 | eme:itzi@gmail.com 473 | 474 | usr:@midudev eme:mi@gmail.com psw:123456 age:38 loc:bcn fll:82 475 | 476 | fll:111 eme:yrfa@gmail.com usr:@codember 477 | psw:123456 age:21 loc:World 478 | 479 | psw:11133 loc:Canary 480 | fll:333 usr:@pheralb 481 | eme:pheralb@gmail.com 482 | 483 | usr:@itziar age:19 484 | loc:isle psw:aaa fll:222 485 | eme:itzi@gmail.com 486 | 487 | usr:@midudev eme:mi@gmail.com psw:123456 age:38 loc:bcn fll:82 488 | 489 | fll:111 eme:yrfa@gmail.com usr:@codember 490 | psw:123456 age:21 loc:World 491 | 492 | psw:11133 loc:Canary 493 | fll:333 usr:@pheralb 494 | eme:pheralb@gmail.com 495 | 496 | usr:@itziar age:19 497 | loc:isle psw:aaa fll:222 498 | eme:itzi@gmail.com 499 | 500 | usr:@midudev eme:mi@gmail.com psw:123456 age:38 loc:bcn fll:82 501 | 502 | fll:111 eme:yrfa@gmail.com usr:@codember 503 | psw:123456 age:21 loc:World 504 | 505 | psw:11133 loc:Canary 506 | fll:333 usr:@pheralb 507 | eme:pheralb@gmail.com 508 | 509 | usr:@itziar age:19 510 | loc:isle psw:aaa fll:222 511 | eme:itzi@gmail.com 512 | usr:@midudev eme:mi@gmail.com psw:123456 age:38 loc:bcn fll:82 513 | 514 | fll:111 eme:yrfa@gmail.com usr:@codember 515 | psw:123456 age:21 loc:World 516 | 517 | psw:11133 loc:Canary 518 | fll:333 usr:@pheralb 519 | eme:pheralb@gmail.com 520 | 521 | usr:@itziar age:19 522 | loc:isle psw:aaa fll:222 523 | eme:itzi@gmail.com 524 | 525 | usr:@midudev eme:mi@gmail.com psw:123456 age:38 loc:bcn fll:82 526 | 527 | fll:111 eme:yrfa@gmail.com usr:@codember 528 | psw:123456 age:21 loc:World 529 | 530 | psw:11133 loc:Canary 531 | fll:333 usr:@pheralb 532 | eme:pheralb@gmail.com 533 | 534 | usr:@itziar age:19 535 | loc:isle psw:aaa fll:222 536 | eme:itzi@gmail.com 537 | 538 | usr:@midudev eme:mi@gmail.com psw:123456 age:38 loc:bcn fll:82 539 | 540 | fll:111 eme:yrfa@gmail.com usr:@codember 541 | psw:123456 age:21 loc:World 542 | 543 | psw:11133 loc:Canary 544 | fll:333 usr:@pheralb 545 | eme:pheralb@gmail.com 546 | 547 | usr:@itziar age:19 548 | loc:isle psw:aaa fll:222 549 | eme:itzi@gmail.com 550 | 551 | usr:@midudev eme:mi@gmail.com psw:123456 age:38 loc:bcn fll:82 552 | 553 | fll:111 eme:yrfa@gmail.com usr:@codember 554 | psw:123456 age:21 loc:World 555 | 556 | psw:11133 loc:Canary 557 | fll:333 usr:@pheralb 558 | eme:pheralb@gmail.com 559 | 560 | usr:@itziar age:19 561 | loc:isle psw:aaa fll:222 562 | eme:itzi@gmail.com 563 | usr:@midudev eme:mi@gmail.com psw:123456 age:38 loc:bcn fll:82 564 | 565 | fll:111 eme:yrfa@gmail.com usr:@codember 566 | psw:123456 age:21 loc:World 567 | 568 | psw:11133 loc:Canary 569 | fll:333 usr:@pheralb 570 | eme:pheralb@gmail.com 571 | 572 | usr:@itziar age:19 573 | loc:isle psw:aaa fll:222 574 | eme:itzi@gmail.com 575 | 576 | usr:@midudev eme:mi@gmail.com psw:123456 age:38 loc:bcn fll:82 577 | 578 | fll:111 eme:yrfa@gmail.com usr:@codember 579 | psw:123456 age:21 loc:World 580 | 581 | psw:11133 loc:Canary 582 | fll:333 usr:@pheralb 583 | eme:pheralb@gmail.com 584 | 585 | usr:@itziar age:19 586 | loc:isle psw:aaa fll:222 587 | eme:itzi@gmail.com 588 | 589 | usr:@midudev eme:mi@gmail.com psw:123456 age:38 loc:bcn fll:82 590 | 591 | fll:111 eme:yrfa@gmail.com usr:@codember 592 | psw:123456 age:21 loc:World 593 | 594 | psw:11133 loc:Canary 595 | fll:333 usr:@pheralb 596 | eme:pheralb@gmail.com 597 | 598 | usr:@itziar age:19 599 | loc:isle psw:aaa fll:222 600 | eme:itzi@gmail.com 601 | 602 | usr:@midudev eme:mi@gmail.com psw:123456 age:38 loc:bcn fll:82 603 | 604 | fll:111 eme:yrfa@gmail.com usr:@codember 605 | psw:123456 age:21 loc:World 606 | 607 | psw:11133 loc:Canary 608 | fll:333 usr:@pheralb 609 | eme:pheralb@gmail.com 610 | 611 | usr:@itziar age:19 612 | loc:isle psw:aaa fll:222 613 | eme:itzi@gmail.com 614 | usr:@midudev eme:mi@gmail.com psw:123456 age:38 loc:bcn fll:82 615 | 616 | fll:111 eme:yrfa@gmail.com usr:@codember 617 | psw:123456 age:21 loc:World 618 | 619 | psw:11133 loc:Canary 620 | fll:333 usr:@pheralb 621 | eme:pheralb@gmail.com 622 | 623 | usr:@itziar age:19 624 | loc:isle psw:aaa fll:222 625 | eme:itzi@gmail.com 626 | 627 | usr:@midudev eme:mi@gmail.com psw:123456 age:38 loc:bcn fll:82 628 | 629 | fll:111 eme:yrfa@gmail.com usr:@codember 630 | psw:123456 age:21 loc:World 631 | 632 | psw:11133 loc:Canary 633 | fll:333 usr:@pheralb 634 | eme:pheralb@gmail.com 635 | 636 | usr:@itziar age:19 637 | loc:isle psw:aaa fll:222 638 | eme:itzi@gmail.com 639 | 640 | usr:@midudev eme:mi@gmail.com psw:123456 age:38 loc:bcn fll:82 641 | 642 | fll:111 eme:yrfa@gmail.com usr:@codember 643 | psw:123456 age:21 loc:World 644 | 645 | psw:11133 loc:Canary 646 | fll:333 usr:@pheralb 647 | eme:pheralb@gmail.com 648 | 649 | usr:@itziar age:19 650 | loc:isle psw:aaa fll:222 651 | eme:itzi@gmail.com 652 | 653 | usr:@midudev eme:mi@gmail.com psw:123456 age:38 loc:bcn fll:82 654 | 655 | fll:111 eme:yrfa@gmail.com usr:@codember 656 | psw:123456 age:21 loc:World 657 | 658 | psw:11133 loc:Canary 659 | fll:333 usr:@pheralb 660 | eme:pheralb@gmail.com 661 | 662 | usr:@itziar age:19 663 | loc:isle psw:aaa fll:222 664 | eme:itzi@gmail.com 665 | usr:@midudev eme:mi@gmail.com psw:123456 age:38 loc:bcn fll:82 666 | 667 | fll:111 eme:yrfa@gmail.com usr:@codember 668 | psw:123456 age:21 loc:World 669 | 670 | psw:11133 loc:Canary 671 | fll:333 usr:@pheralb 672 | eme:pheralb@gmail.com 673 | 674 | usr:@itziar age:19 675 | loc:isle psw:aaa fll:222 676 | eme:itzi@gmail.com 677 | 678 | usr:@midudev eme:mi@gmail.com psw:123456 age:38 loc:bcn fll:82 679 | 680 | fll:111 eme:yrfa@gmail.com usr:@codember 681 | psw:123456 age:21 loc:World 682 | 683 | psw:11133 loc:Canary 684 | fll:333 usr:@pheralb 685 | eme:pheralb@gmail.com 686 | 687 | usr:@itziar age:19 688 | loc:isle psw:aaa fll:222 689 | eme:itzi@gmail.com 690 | 691 | usr:@midudev eme:mi@gmail.com psw:123456 age:38 loc:bcn fll:82 692 | 693 | fll:111 eme:yrfa@gmail.com usr:@codember 694 | psw:123456 age:21 loc:World 695 | 696 | psw:11133 loc:Canary 697 | fll:333 usr:@pheralb 698 | eme:pheralb@gmail.com 699 | 700 | usr:@itziar age:19 701 | loc:isle psw:aaa fll:222 702 | eme:itzi@gmail.com 703 | 704 | usr:@midudev eme:mi@gmail.com psw:123456 age:38 loc:bcn fll:82 705 | 706 | fll:111 eme:yrfa@gmail.com usr:@codember 707 | psw:123456 age:21 loc:World 708 | 709 | usr:@giroz age:22 src:12 icon:avatar.png terminal:yes 710 | pages:server 711 | pages:blog 712 | blog:about 713 | loc:tierra psw:aaa fll:222 714 | eme:giroz@gmail.com 715 | 716 | psw:11133 loc:Canary 717 | fll:333 usr:@pheralb 718 | eme:pheralb@gmail.com --------------------------------------------------------------------------------