├── .editorconfig ├── .gitignore ├── .vscode ├── css_custom_data.json ├── extensions.json └── settings.json ├── LICENSE.md ├── README.md ├── package-lock.json ├── package.json ├── playwright.config.js ├── server ├── .env.example ├── database │ └── quizzes │ │ ├── cpp.json │ │ ├── csharp.json │ │ ├── css.json │ │ ├── html.json │ │ ├── java.json │ │ ├── javascript.json │ │ ├── kotlin.json │ │ ├── php.json │ │ ├── python.json │ │ ├── sql.json │ │ ├── swift.json │ │ └── typescript.json ├── index.js ├── package.json ├── repository │ └── index.js ├── routes │ ├── categories.js │ └── index.js └── test │ └── api.test.js └── web ├── .env.example ├── index.html ├── jsconfig.json ├── package.json ├── postcss.config.cjs ├── public └── vite.svg ├── src ├── App.jsx ├── components │ ├── Doc.jsx │ ├── Footer.jsx │ ├── Home.jsx │ ├── Link.jsx │ ├── Navigation.jsx │ ├── PreCode.jsx │ ├── StartQuiz.jsx │ └── icons │ │ ├── IconCopy.jsx │ │ ├── IconGithub.jsx │ │ ├── IconHamburguer.jsx │ │ └── IconInfo.jsx ├── index.css ├── main.jsx └── services │ └── quizzes │ └── index.js ├── tailwind.config.cjs ├── tests ├── quiz-flow.spec.js └── utils │ └── constans.js └── vite.config.js /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | [*] 3 | end_of_line = lf 4 | insert_final_newline = true 5 | charset = utf-8 6 | indent_style = space 7 | indent_size = 2 -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Created by https://www.toptal.com/developers/gitignore/api/windows,macos,linux,node,visualstudiocode,react 2 | # Edit at https://www.toptal.com/developers/gitignore?templates=windows,macos,linux,node,visualstudiocode,react 3 | 4 | ### Linux ### 5 | *~ 6 | 7 | # temporary files which can be created if a process still has a handle open of a deleted file 8 | .fuse_hidden* 9 | 10 | # KDE directory preferences 11 | .directory 12 | 13 | # Linux trash folder which might appear on any partition or disk 14 | .Trash-* 15 | 16 | # .nfs files are created when an open file is removed but is still being accessed 17 | .nfs* 18 | 19 | ### macOS ### 20 | # General 21 | .DS_Store 22 | .AppleDouble 23 | .LSOverride 24 | 25 | # Icon must end with two \r 26 | Icon 27 | 28 | # Thumbnails 29 | ._* 30 | 31 | # Files that might appear in the root of a volume 32 | .DocumentRevisions-V100 33 | .fseventsd 34 | .Spotlight-V100 35 | .TemporaryItems 36 | .Trashes 37 | .VolumeIcon.icns 38 | .com.apple.timemachine.donotpresent 39 | 40 | # Directories potentially created on remote AFP share 41 | .AppleDB 42 | .AppleDesktop 43 | Network Trash Folder 44 | Temporary Items 45 | .apdisk 46 | 47 | ### macOS Patch ### 48 | # iCloud generated files 49 | *.icloud 50 | 51 | ### Node ### 52 | # Logs 53 | logs 54 | *.log 55 | npm-debug.log* 56 | yarn-debug.log* 57 | yarn-error.log* 58 | .pnpm-debug.log* 59 | lerna-debug.log* 60 | 61 | # Diagnostic reports (https://nodejs.org/api/report.html) 62 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 63 | 64 | # Runtime data 65 | pids 66 | *.pid 67 | *.seed 68 | *.pid.lock 69 | 70 | # Directory for instrumented libs generated by jscoverage/JSCover 71 | lib-cov 72 | 73 | # Coverage directory used by tools like istanbul 74 | coverage 75 | *.lcov 76 | 77 | # nyc test coverage 78 | .nyc_output 79 | 80 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 81 | .grunt 82 | 83 | # Bower dependency directory (https://bower.io/) 84 | bower_components 85 | 86 | # node-waf configuration 87 | .lock-wscript 88 | 89 | # Compiled binary addons (https://nodejs.org/api/addons.html) 90 | build/Release 91 | 92 | # Dependency directories 93 | node_modules/ 94 | jspm_packages/ 95 | 96 | # Snowpack dependency directory (https://snowpack.dev/) 97 | web_modules/ 98 | 99 | # TypeScript cache 100 | *.tsbuildinfo 101 | 102 | # Optional npm cache directory 103 | .npm 104 | 105 | # Optional eslint cache 106 | .eslintcache 107 | 108 | # Optional stylelint cache 109 | .stylelintcache 110 | 111 | # Microbundle cache 112 | .rpt2_cache/ 113 | .rts2_cache_cjs/ 114 | .rts2_cache_es/ 115 | .rts2_cache_umd/ 116 | 117 | # Optional REPL history 118 | .node_repl_history 119 | 120 | # Output of 'npm pack' 121 | *.tgz 122 | 123 | # Yarn Integrity file 124 | .yarn-integrity 125 | 126 | # dotenv environment variable files 127 | .env 128 | .env.development.local 129 | .env.test.local 130 | .env.production.local 131 | .env.local 132 | 133 | # Stores VSCode versions used for testing VSCode extensions 134 | .vscode-test 135 | 136 | # yarn v2 137 | .yarn/cache 138 | .yarn/unplugged 139 | .yarn/build-state.yml 140 | .yarn/install-state.gz 141 | .pnp.* 142 | 143 | # Testing 144 | test-results/ 145 | playwright-report/ 146 | playwright/.cache/ 147 | 148 | ### Node Patch ### 149 | # Serverless Webpack directories 150 | .webpack/ 151 | 152 | ### react ### 153 | .DS_* 154 | **/*.backup.* 155 | **/*.back.* 156 | 157 | node_modules 158 | 159 | *.sublime* 160 | 161 | psd 162 | thumb 163 | sketch 164 | 165 | ### VisualStudioCode ### 166 | .vscode/* 167 | !.vscode/settings.json 168 | !.vscode/tasks.json 169 | !.vscode/launch.json 170 | !.vscode/extensions.json 171 | !.vscode/*.code-snippets 172 | !.vscode/css_custom_data.json 173 | 174 | # Local History for Visual Studio Code 175 | .history/ 176 | 177 | # Built Visual Studio Code Extensions 178 | *.vsix 179 | 180 | ### VisualStudioCode Patch ### 181 | # Ignore all local history of files 182 | .history 183 | .ionide 184 | 185 | # Support for Project snippet scope 186 | .vscode/*.code-snippets 187 | 188 | # Ignore code-workspaces 189 | *.code-workspace 190 | 191 | # IntelliJ 192 | .idea 193 | out/ 194 | 195 | #Build 196 | dist 197 | dist-ssr 198 | 199 | ### Windows ### 200 | # Windows thumbnail cache files 201 | Thumbs.db 202 | Thumbs.db:encryptable 203 | ehthumbs.db 204 | ehthumbs_vista.db 205 | 206 | # Dump file 207 | *.stackdump 208 | 209 | # Folder config file 210 | [Dd]esktop.ini 211 | 212 | # Recycle Bin used on file shares 213 | $RECYCLE.BIN/ 214 | 215 | # Windows Installer files 216 | *.cab 217 | *.msi 218 | *.msix 219 | *.msm 220 | *.msp 221 | 222 | # Windows shortcuts 223 | *.lnk 224 | 225 | # End of https://www.toptal.com/developers/gitignore/api/windows,macos,linux,node,visualstudiocode,react -------------------------------------------------------------------------------- /.vscode/css_custom_data.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": 1.0, 3 | "atDirectives": [ 4 | { 5 | "name": "@tailwind", 6 | "description": "Use the `@tailwind` directive to insert Tailwind's `base`, `components`, `utilities` and `screens` styles into your CSS.", 7 | "references": [ 8 | { 9 | "name": "Tailwind Documentation — Functions and directives", 10 | "url": "https://tailwindcss.com/docs/functions-and-directives#tailwind" 11 | } 12 | ] 13 | }, 14 | { 15 | "name": "@layer", 16 | "description": "Use the @layer directive to tell Tailwind which “bucket” a set of custom styles belong to. Valid layers are base, components, and utilities.", 17 | "references": [ 18 | { 19 | "name": "Tailwind Documentation — Functions and directives", 20 | "url": "https://tailwindcss.com/docs/functions-and-directives#layer" 21 | } 22 | ] 23 | } 24 | ] 25 | } -------------------------------------------------------------------------------- /.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": ["dbaeumer.vscode-eslint", "ms-playwright.playwright", "bradlc.vscode-tailwindcss"] 3 | } 4 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "css.customData": [".vscode/css_custom_data.json"] 3 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # [preguntAPI](https://www.preguntapi.dev) 2 | 3 | ## API de preguntas de programación 🚀 4 | 5 | ## Enlace 🌱 6 | 7 | **[https://www.preguntapi.dev](https://www.preguntapi.dev)** 8 | 9 | ## Documentación 📋 10 | 11 | **Puedes ver la documentación para el uso de la API [aquí](https://www.preguntapi.dev/documentation).** 12 | 13 | ## Contribuciones 🤝 14 | 15 | Todas las contribuciones son bienvenidas. Puedes ver las principales características a mejorar en las [issues](https://github.com/gerardmorte/preguntapi/issues). 16 | 17 | - Mejor PR's pequeñas y concretas. 18 | - Puedes dejar una *issue* para comentar algún cambio que se te ocurra. 19 | - Antes de empezar a implementar una nueva característica o solucionar algún error, puede que alguien ya esté trabajando en ello. Mantengámonos comunicados. 20 | 21 | ## Ejecutar proyecto 🔧 22 | 23 | **Como mínimo, debes tener instalado Node.js versión `16.17` y NPM versión `7`.** 24 | 25 | **Desde una terminal seguir los siguientes pasos:** 26 | 27 | > `npm install` 28 | > `npm run dev` 29 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "preguntapi", 3 | "version": "0.0.0", 4 | "type": "module", 5 | "private": true, 6 | "workspaces": [ 7 | "server", 8 | "web" 9 | ], 10 | "engines": { 11 | "node": ">16.3.0", 12 | "npm": ">7.15.1" 13 | }, 14 | "scripts": { 15 | "dev": "run-p server:dev web:dev", 16 | "start": "run-p server:start web:start", 17 | "lint": "run-s server:lint web:lint", 18 | "server": "npm --workspace=server run", 19 | "server:dev": "npm run dev --workspace=server", 20 | "server:start": "npm run start --workspace=server", 21 | "server:lint": "npm run lint --workspace=server", 22 | "web": "npm --workspace=web run", 23 | "web:dev": "npm run dev --workspace=web", 24 | "web:start": "run-s web:build web:preview", 25 | "web:build": "npm run build --workspace=web", 26 | "web:preview": "npm run preview --workspace=web", 27 | "web:lint": "npm run lint --workspace=web" 28 | }, 29 | "devDependencies": { 30 | "eslint": "8.25.0", 31 | "npm-run-all": "4.1.5", 32 | "standard": "17.0.0" 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /playwright.config.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Read environment variables from file. 3 | * https://github.com/motdotla/dotenv 4 | */ 5 | // require('dotenv').config(); 6 | 7 | /** 8 | * @see https://playwright.dev/docs/test-configuration 9 | * @type {import('@playwright/test').PlaywrightTestConfig} 10 | */ 11 | const config = { 12 | use: { 13 | browserName: 'chromium', 14 | viewport: { width: 1280, height: 720 }, 15 | 16 | /* Maximum time each action such as `click()` can take. Defaults to 0 (no limit). */ 17 | actionTimeout: 0, 18 | /* Base URL to use in actions like `await page.goto('/')`. */ 19 | baseURL: 'http://127.0.0.1:4173', 20 | 21 | /* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */ 22 | trace: 'on-first-retry' 23 | }, 24 | testDir: './web/tests', 25 | /* Maximum time one test can run for. */ 26 | timeout: 30 * 1000, 27 | expect: { 28 | /** 29 | * Maximum time expect() should wait for the condition to be met. 30 | * For example in `await expect(locator).toHaveText();` 31 | */ 32 | timeout: 5000 33 | }, 34 | /* Run tests in files in parallel */ 35 | fullyParallel: true, 36 | /* Fail the build on CI if you accidentally left test.only in the source code. */ 37 | forbidOnly: !!process.env.CI, 38 | /* Retry on CI only */ 39 | retries: process.env.CI ? 2 : 0, 40 | /* Opt out of parallel tests on CI. */ 41 | workers: process.env.CI ? 1 : undefined, 42 | /* Reporter to use. See https://playwright.dev/docs/test-reporters */ 43 | reporter: 'html', 44 | 45 | /* Configure projects for major browsers */ 46 | // projects: [ 47 | // /* Test against desktop viewports. */ 48 | // { 49 | // name: 'chromium', 50 | // use: { 51 | // browserName: 'chromium', 52 | // viewport: { width: 1280, height: 720 } 53 | // } 54 | // }, 55 | 56 | // { 57 | // name: 'firefox', 58 | // use: { 59 | // browserName: 'firefox', 60 | // viewport: { width: 1280, height: 720 } 61 | // } 62 | // }, 63 | 64 | // { 65 | // name: 'webkit', 66 | // use: { 67 | // browserName: 'webkit', 68 | // viewport: { width: 1280, height: 720 } 69 | // } 70 | // }, 71 | 72 | // /* Test against mobile viewports. */ 73 | // { 74 | // name: 'Mobile Chrome', 75 | // use: { 76 | // ...devices['Pixel 5'] 77 | // } 78 | // }, 79 | // { 80 | // name: 'Mobile Safari', 81 | // use: { 82 | // ...devices['iPhone 12'] 83 | // } 84 | // }, 85 | 86 | // /* Test against branded browsers. */ 87 | // { 88 | // name: 'Microsoft Edge', 89 | // use: { 90 | // channel: 'msedge' 91 | // } 92 | // }, 93 | // { 94 | // name: 'Google Chrome', 95 | // use: { 96 | // channel: 'chrome' 97 | // } 98 | // } 99 | // ], 100 | 101 | /* Folder for test artifacts such as screenshots, videos, traces, etc. */ 102 | // outputDir: 'test-results/', 103 | 104 | /* Run your local dev server before starting the tests */ 105 | webServer: { 106 | command: 'npm run start', 107 | port: 4173 108 | } 109 | } 110 | 111 | export default config 112 | -------------------------------------------------------------------------------- /server/.env.example: -------------------------------------------------------------------------------- 1 | PORT=3001 2 | -------------------------------------------------------------------------------- /server/database/quizzes/cpp.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": "231", 4 | "category": "cpp", 5 | "level": "facil", 6 | "question": "¿Cuál es la sintaxis correcta para imprimir por consola \"Hola mundo\" en C++?", 7 | "answers": { 8 | "answer_a": "Console.WriteLine(\"Hola mundo\");", 9 | "answer_b": "cout << \"Hola mundo\" << \"\n\";", 10 | "answer_c": "std::cout << \"Hola mundo\" << \"\n\";", 11 | "answer_d": "System.out.println(\"Hola mundo\");" 12 | }, 13 | "correct_answer": "answer_c" 14 | }, 15 | { 16 | "id": "232", 17 | "category": "cpp", 18 | "level": "facil", 19 | "question": "¿Cuál es la prefijo correcto para invocar al namespace standard de C++?", 20 | "answers": { 21 | "answer_a": "std::", 22 | "answer_b": "standard::", 23 | "answer_d": "stdio::" 24 | }, 25 | "correct_answer": "answer_a" 26 | }, 27 | { 28 | "id": "233", 29 | "category": "cpp", 30 | "level": "facil", 31 | "question": "¿Qué debe de retornar la función principal cuando el programa termina sin ningún problema?", 32 | "answers": { 33 | "answer_a": "200", 34 | "answer_b": "success", 35 | "answer_c": "OK", 36 | "answer_d": "0" 37 | }, 38 | "correct_answer": "answer_d" 39 | }, 40 | { 41 | "id": "234", 42 | "category": "cpp", 43 | "level": "facil", 44 | "question": "¿Cómo introduces una variable de entrada por consola en C++?", 45 | "answers": { 46 | "answer_a": "int x = scanf(\"%19s\", str);", 47 | "answer_b": "int x = std::cin >> str;", 48 | "answer_c": "int x = input();", 49 | "answer_d": "int x = scanner.nextLine();" 50 | }, 51 | "correct_answer": "answer_b" 52 | }, 53 | { 54 | "id": "235", 55 | "category": "cpp", 56 | "level": "facil", 57 | "question": "¿Qué tipo de dato es útil para representar el número 3.1416?", 58 | "answers": { 59 | "answer_a": "float", 60 | "answer_b": "double", 61 | "answer_c": "long double", 62 | "answer_d": "Todas las mencionadas" 63 | }, 64 | "correct_answer": "answer_d" 65 | }, 66 | { 67 | "id": "236", 68 | "category": "cpp", 69 | "level": "dificil", 70 | "question": "¿Cuáles de estas constantes están definidas en la clase WindowEvent?", 71 | "answers": { 72 | "answer_a": "Todas las mencionadas", 73 | "answer_b": "WINDOW_CLOSED", 74 | "answer_c": "WINDOW_DEICONIFIED", 75 | "answer_d": "WINDOW_ACTIVATED" 76 | }, 77 | "correct_answer": "answer_a" 78 | }, 79 | { 80 | "id": "237", 81 | "category": "cpp", 82 | "level": "facil", 83 | "question": "¿Qué tipo de dato expresa que una función no va a retornar?", 84 | "answers": { 85 | "answer_a": "int*", 86 | "answer_b": "string", 87 | "answer_c": "void", 88 | "answer_d": "int" 89 | }, 90 | "correct_answer": "answer_c" 91 | }, 92 | { 93 | "id": "238", 94 | "category": "cpp", 95 | "level": "normal", 96 | "question": "¿Cuál de estos ejemplos representa una asignación de valor?", 97 | "answers": { 98 | "answer_a": "int x = 1;", 99 | "answer_b": "x = 1;", 100 | "answer_c": "x { 1 };", 101 | "answer_d": "Ninguno de los dos" 102 | }, 103 | "correct_answer": "answer_b" 104 | }, 105 | { 106 | "id": "239", 107 | "category": "cpp", 108 | "level": "normal", 109 | "question": "¿Cuál de estos ejemplos representa una definición de variable?", 110 | "answers": { 111 | "answer_a": "int x;", 112 | "answer_b": "int x = 1;", 113 | "answer_c": "int { x }", 114 | "answer_d": "Ninguna es correcta" 115 | }, 116 | "correct_answer": "answer_a" 117 | }, 118 | { 119 | "id": "240", 120 | "category": "cpp", 121 | "level": "normal", 122 | "question": "¿Cuál de estos ejemplos inicializa de variable?", 123 | "answers": { 124 | "answer_a": "int x = 1;", 125 | "answer_b": "int x( 1 );", 126 | "answer_c": "int x{ 1 };", 127 | "answer_d": "Todas son correctas" 128 | }, 129 | "correct_answer": "answer_d" 130 | }, 131 | { 132 | "id": "241", 133 | "category": "cpp", 134 | "level": "dificil", 135 | "question": "¿Cuál es la manera moderna y recomendada de inicializar una variable?", 136 | "answers": { 137 | "answer_a": "Inicialización por copia int x = 1;", 138 | "answer_b": "Inicialización directa int x ( 1 ) ", 139 | "answer_c": "Inicialización en llaves int x { 1 }", 140 | "answer_d": "Todas las anteriores son correctas" 141 | }, 142 | "correct_answer": "answer_c" 143 | }, 144 | { 145 | "id": "243", 146 | "category": "cpp", 147 | "level": "facil", 148 | "question": "¿Cuál es el paradigma de programación de C++?", 149 | "answers": { 150 | "answer_a": "Funcional", 151 | "answer_b": "Logico funcional", 152 | "answer_c": "Orientado a objetos", 153 | "answer_d": "Orientado a componentes" 154 | }, 155 | "correct_answer": "answer_c" 156 | }, 157 | { 158 | "id": "244", 159 | "category": "cpp", 160 | "level": "facil", 161 | "question": "¿Podemos usar librerías de C en C++?", 162 | "answers": { 163 | "answer_a": "No", 164 | "answer_b": "Sí", 165 | "answer_c": "Sí, solo las standard", 166 | "answer_d": "No, no se puede usar librerías de lenguajes diferentes" 167 | }, 168 | "correct_answer": "answer_b" 169 | }, 170 | { 171 | "id": "245", 172 | "category": "cpp", 173 | "level": "facil", 174 | "question": "¿Cuál es un ejemplo de macro en C++?", 175 | "answers": { 176 | "answer_a": "#define MY_LIB", 177 | "answer_b": "const pi { 3.1416 }", 178 | "answer_c": "#if GTEST ... #endif", 179 | "answer_d": "Opción a y c" 180 | }, 181 | "correct_answer": "answer_d" 182 | }, 183 | { 184 | "id": "246", 185 | "category": "cpp", 186 | "level": "normal", 187 | "question": "¿Para qué se usan las macros?", 188 | "answers": { 189 | "answer_a": "Trabajar constantes durante la ejecución", 190 | "answer_b": "Trabajar constantes durante la compilación", 191 | "answer_c": "Comentar el código", 192 | "answer_d": "Trabajar con el linker" 193 | }, 194 | "correct_answer": "answer_b" 195 | }, 196 | { 197 | "id": "247", 198 | "category": "cpp", 199 | "level": "normal", 200 | "question": "¿Qué proyectos usan C++ actualmente?", 201 | "answers": { 202 | "answer_a": "El kernel de Linux", 203 | "answer_b": "Minecraft", 204 | "answer_c": "La mayoría de proyectos de Videojuegos", 205 | "answer_d": "Todos los anteriores" 206 | }, 207 | "correct_answer": "answer_c" 208 | }, 209 | { 210 | "id": "248", 211 | "category": "cpp", 212 | "level": "normal", 213 | "question": "¿Cuál de estos métodos puedo saber el valor del tamaño de un tipo de dato?", 214 | "answers": { 215 | "answer_a": "SifeOf()", 216 | "answer_b": "size_of()", 217 | "answer_c": "size()", 218 | "answer_d": "size_t()" 219 | }, 220 | "correct_answer": "answer_b" 221 | }, 222 | { 223 | "id": "249", 224 | "category": "cpp", 225 | "level": "normal", 226 | "question": "¿Cuál es la manera mas eficiente de usar banderas en C++ en caso de tener un hardware limitado?", 227 | "answers": { 228 | "answer_a": "Con el tipo de dato booleano", 229 | "answer_b": "Con el tipo de dato entero y valores 1 y 0", 230 | "answer_c": "Con manipuladores de bits", 231 | "answer_d": "No es necesario el compilador de C++ hace eficiente el software sin importar el hardware" 232 | }, 233 | "correct_answer": "answer_c" 234 | }, 235 | { 236 | "id": "250", 237 | "category": "cpp", 238 | "level": "normal", 239 | "question": "¿Cuál es la diferencia entre un signed integer y un unsigned integer?", 240 | "answers": { 241 | "answer_a": "El rango de bits que pueden tener las variables en memoria", 242 | "answer_b": "Los valores unsigned no pueden ser negativos", 243 | "answer_c": "Las dos anteriores", 244 | "answer_d": "No tiene diferencia alguna" 245 | }, 246 | "correct_answer": "answer_c" 247 | }, 248 | { 249 | "id": "251", 250 | "category": "cpp", 251 | "level": "normal", 252 | "question": "¿Se pueden hacer pruebas unitarias en C++?", 253 | "answers": { 254 | "answer_a": "No", 255 | "answer_b": "Sí, solo en algunos compiladores", 256 | "answer_c": "Sí", 257 | "answer_d": "No, en todos los estándares" 258 | }, 259 | "correct_answer": "answer_c" 260 | }, 261 | { 262 | "id": "252", 263 | "category": "cpp", 264 | "level": "normal", 265 | "question": "¿Qué es un puntero?", 266 | "answers": { 267 | "answer_a": "Un tipo de dato que puede apuntar a una dirección en memoria", 268 | "answer_b": "Un objeto", 269 | "answer_c": "Una estructura de dato", 270 | "answer_d": "Una función" 271 | }, 272 | "correct_answer": "answer_a" 273 | }, 274 | { 275 | "id": "253", 276 | "category": "cpp", 277 | "level": "normal", 278 | "question": "¿Qué es un desborde de datos?", 279 | "answers": { 280 | "answer_a": "No existe ese término", 281 | "answer_b": "Los datos se convierten en 0 en caso de que el máximo tamaño de tipo de dato sea alcanzado", 282 | "answer_c": "Los datos se convierten en el primer valor de bit en caso de que el máximo tamaño de tipo de dato se alcanzado", 283 | "answer_d": "Ninguna de las anteriores" 284 | }, 285 | "correct_answer": "answer_c" 286 | }, 287 | { 288 | "id": "254", 289 | "category": "cpp", 290 | "level": "normal", 291 | "question": "¿Qué suite de pruebas unitarias están disponibles en C++?", 292 | "answers": { 293 | "answer_a": "Google test", 294 | "answer_b": "Jest", 295 | "answer_c": "Jasmine", 296 | "answer_d": "Test.cpp" 297 | }, 298 | "correct_answer": "answer_a" 299 | }, 300 | { 301 | "id": "255", 302 | "category": "cpp", 303 | "level": "normal", 304 | "question": "¿Cuál es la forma correcta de crear un objeto llamado myObj de MyClass?", 305 | "answers": { 306 | "answer_a": "int myObj = MyClass()", 307 | "answer_b": "MyClass myObj = MyClass()", 308 | "answer_c": "MyClass* myObj = new MyClass()", 309 | "answer_d": "Las dos anteriores" 310 | }, 311 | "correct_answer": "answer_d" 312 | }, 313 | { 314 | "id": "256", 315 | "category": "cpp", 316 | "level": "normal", 317 | "question": "Con el manejo de memoria de C++ ¿Es posible provocar un error en todo el equipo donde se esta programando?", 318 | "answers": { 319 | "answer_a": "No", 320 | "answer_b": "Sí, si es que usas un equipo Windows", 321 | "answer_c": "Sí, en todos los equipos" 322 | }, 323 | "correct_answer": "answer_b" 324 | }, 325 | { 326 | "id": "257", 327 | "category": "cpp", 328 | "level": "normal", 329 | "question": "¿Un software construido en C++ en equipo Linux puede ser ejecutado en Windows?", 330 | "answers": { 331 | "answer_a": "No, las arquitecturas son diferentes", 332 | "answer_b": "Sí, con una correcta configuración", 333 | "answer_c": "Solo con un transpilador" 334 | }, 335 | "correct_answer": "answer_b" 336 | }, 337 | { 338 | "id": "258", 339 | "category": "cpp", 340 | "level": "normal", 341 | "question": "¿Cuál es la ventaja de C++ contra Java, Kotlin, JavaScript, Python?", 342 | "answers": { 343 | "answer_a": "El manejo de punteros", 344 | "answer_b": "El nivel que puedes manipular el hardware", 345 | "answer_c": "El manejo de memoria", 346 | "answer_d": "Todas las anteriores" 347 | }, 348 | "correct_answer": "answer_d" 349 | }, 350 | { 351 | "id": "259", 352 | "category": "cpp", 353 | "level": "normal", 354 | "question": "Para que las subclases de cualquier paquete tengan acceso a los miembros de una superclase. ¿Cuál es el acceso más restrictivo que cumple este objetivo?", 355 | "answers": { 356 | "answer_a": "public", 357 | "answer_b": "private", 358 | "answer_c": "protected" 359 | }, 360 | "correct_answer": "answer_c" 361 | }, 362 | { 363 | "id": "260", 364 | "category": "cpp", 365 | "level": "normal", 366 | "question": "¿Cuál es sistema de versionado en el lenguaje C++?", 367 | "answers": { 368 | "answer_a": "Versionado tradicional", 369 | "answer_b": "Estándar ISO", 370 | "answer_c": "Estándar propio", 371 | "answer_d": "Es rolling release" 372 | }, 373 | "correct_answer": "answer_b" 374 | } 375 | ] 376 | -------------------------------------------------------------------------------- /server/database/quizzes/csharp.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": "282", 4 | "category": "csharp", 5 | "level": "facil", 6 | "question": "¿Cuál es la sintaxis correcta para mostrar por consola \"Hello World\" en C#?", 7 | "answers": { 8 | "answer_a": "Console.WriteLine(\"Hello World\");", 9 | "answer_b": "print (\"Hello World\");", 10 | "answer_c": "System.out.println(\"Hello World\");", 11 | "answer_d": "cout << \"Hello World\";" 12 | }, 13 | "correct_answer": "answer_a" 14 | }, 15 | { 16 | "id": "283", 17 | "category": "csharp", 18 | "level": "facil", 19 | "question": "C# es un alias de C++.", 20 | "answers": { 21 | "answer_a": "Falso", 22 | "answer_b": "Verdadero" 23 | }, 24 | "correct_answer": "answer_a" 25 | }, 26 | { 27 | "id": "284", 28 | "category": "csharp", 29 | "level": "facil", 30 | "question": "¿Cómo se insertan COMENTARIOS en el código en C#?", 31 | "answers": { 32 | "answer_a": "// Esto es un comentario", 33 | "answer_b": "# Esto es un comentario", 34 | "answer_c": "/* Esto es un comentario" 35 | }, 36 | "correct_answer": "answer_a" 37 | }, 38 | { 39 | "id": "285", 40 | "category": "csharp", 41 | "level": "facil", 42 | "question": "¿Qué tipo de datos se utiliza para crear una variable que debe almacenar texto?", 43 | "answers": { 44 | "answer_a": "myString", 45 | "answer_b": "Txt", 46 | "answer_c": "str", 47 | "answer_d": "string" 48 | }, 49 | "correct_answer": "answer_d" 50 | }, 51 | { 52 | "id": "286", 53 | "category": "csharp", 54 | "level": "facil", 55 | "question": "¿Cómo se crea una variable con el valor numérico 5?", 56 | "answers": { 57 | "answer_a": "int x = 5;", 58 | "answer_b": "x = 5;", 59 | "answer_c": "double x = 5;", 60 | "answer_d": "num x = 5" 61 | }, 62 | "correct_answer": "answer_a" 63 | }, 64 | { 65 | "id": "287", 66 | "category": "csharp", 67 | "level": "facil", 68 | "question": "¿Cómo se crea una variable con el número flotante 2,8?", 69 | "answers": { 70 | "answer_a": "double x = 2.8D;", 71 | "answer_b": "byte x = 2.8", 72 | "answer_c": "int x = 2.8D;", 73 | "answer_d": "int x = 2.8;" 74 | }, 75 | "correct_answer": "answer_a" 76 | }, 77 | { 78 | "id": "288", 79 | "category": "csharp", 80 | "level": "facil", 81 | "question": "¿Qué propiedad se puede utilizar para encontrar la longitud de una cadena?", 82 | "answers": { 83 | "answer_a": "getLength()", 84 | "answer_b": "Length", 85 | "answer_c": "length()", 86 | "answer_d": "length" 87 | }, 88 | "correct_answer": "answer_b" 89 | }, 90 | { 91 | "id": "289", 92 | "category": "csharp", 93 | "level": "facil", 94 | "question": "¿Qué operador se utiliza para sumar dos valores?", 95 | "answers": { 96 | "answer_a": "El signo +", 97 | "answer_b": "El signo &", 98 | "answer_c": "El signo *" 99 | }, 100 | "correct_answer": "answer_a" 101 | }, 102 | { 103 | "id": "290", 104 | "category": "csharp", 105 | "level": "facil", 106 | "question": "El valor de una variable de cadena puede estar encerrado entre comillas simples.", 107 | "answers": { 108 | "answer_a": "Verdadero", 109 | "answer_b": "Falso" 110 | }, 111 | "correct_answer": "answer_b" 112 | }, 113 | { 114 | "id": "291", 115 | "category": "csharp", 116 | "level": "normal", 117 | "question": "El casting de tipos es cuando se asigna un valor de un tipo de datos a otro tipo.", 118 | "answers": { 119 | "answer_a": "Verdadero", 120 | "answer_b": "Falso" 121 | }, 122 | "correct_answer": "answer_a" 123 | }, 124 | { 125 | "id": "292", 126 | "category": "csharp", 127 | "level": "facil", 128 | "question": "¿Qué operador se puede utilizar para comparar dos valores?", 129 | "answers": { 130 | "answer_a": "==", 131 | "answer_b": "=", 132 | "answer_c": "<>", 133 | "answer_d": "><" 134 | }, 135 | "correct_answer": "answer_a" 136 | }, 137 | { 138 | "id": "293", 139 | "category": "csharp", 140 | "level": "normal", 141 | "question": "Para declarar un array en C#, hay que definir el tipo de variable con:", 142 | "answers": { 143 | "answer_a": "()", 144 | "answer_b": "[]", 145 | "answer_c": "{}", 146 | "answer_d": "\"\"" 147 | }, 148 | "correct_answer": "answer_b" 149 | }, 150 | { 151 | "id": "294", 152 | "category": "csharp", 153 | "level": "facil", 154 | "question": "Los índices de los arrays empiezan por:", 155 | "answers": { 156 | "answer_a": "0", 157 | "answer_b": "1", 158 | "answer_c": "2", 159 | "answer_d": "3" 160 | }, 161 | "correct_answer": "answer_a" 162 | }, 163 | { 164 | "id": "295", 165 | "category": "csharp", 166 | "level": "normal", 167 | "question": "¿Cómo se crea un método en C#?", 168 | "answers": { 169 | "answer_a": "myMethod[]", 170 | "answer_b": "MyMethod", 171 | "answer_c": "(MyMethod)", 172 | "answer_d": "MyMethod()" 173 | }, 174 | "correct_answer": "answer_d" 175 | }, 176 | { 177 | "id": "296", 178 | "category": "csharp", 179 | "level": "normal", 180 | "question": "¿Cómo se llama a un método en C#?", 181 | "answers": { 182 | "answer_a": "MyMethod();", 183 | "answer_b": "MyMethod;", 184 | "answer_c": "myMethod[];", 185 | "answer_d": "(MyMethod);" 186 | }, 187 | "correct_answer": "answer_a" 188 | }, 189 | { 190 | "id": "297", 191 | "category": "csharp", 192 | "level": "normal", 193 | "question": "¿Qué palabra clave se utiliza para crear una clase en C#?", 194 | "answers": { 195 | "answer_a": "MyClass", 196 | "answer_b": "class", 197 | "answer_c": "class()", 198 | "answer_d": "className" 199 | }, 200 | "correct_answer": "answer_b" 201 | }, 202 | { 203 | "id": "298", 204 | "category": "csharp", 205 | "level": "normal", 206 | "question": "¿Cuál es la forma correcta de crear un objeto llamado myObj de MyClass?", 207 | "answers": { 208 | "answer_a": "new myObj = MyClass();", 209 | "answer_b": "class myObj = new MyClass();", 210 | "answer_c": "MyClass myObj = new MyClass();", 211 | "answer_d": "class MyClass = new myObj();" 212 | }, 213 | "correct_answer": "answer_c" 214 | }, 215 | { 216 | "id": "299", 217 | "category": "csharp", 218 | "level": "normal", 219 | "question": "En C#, es posible heredar campos y métodos de una clase a otra.", 220 | "answers": { 221 | "answer_a": "Verdadero", 222 | "answer_b": "Falso" 223 | }, 224 | "correct_answer": "answer_a" 225 | }, 226 | { 227 | "id": "300", 228 | "category": "csharp", 229 | "level": "normal", 230 | "question": "¿Cómo se llama la clase 'especial' que representa un grupo de constantes?", 231 | "answers": { 232 | "answer_a": "const", 233 | "answer_b": "special", 234 | "answer_c": "void", 235 | "answer_d": "enum" 236 | }, 237 | "correct_answer": "answer_d" 238 | }, 239 | { 240 | "id": "301", 241 | "category": "csharp", 242 | "level": "facil", 243 | "question": "¿Qué operador se utiliza para multiplicar números?", 244 | "answers": { 245 | "answer_a": "x", 246 | "answer_b": "*", 247 | "answer_c": "#", 248 | "answer_d": "%" 249 | }, 250 | "correct_answer": "answer_b" 251 | }, 252 | { 253 | "id": "302", 254 | "category": "csharp", 255 | "level": "normal", 256 | "question": "¿Qué modificador de acceso hace que el código sólo sea accesible dentro de la misma clase?", 257 | "answers": { 258 | "answer_a": "private", 259 | "answer_b": "final", 260 | "answer_c": "public", 261 | "answer_d": "abstract" 262 | }, 263 | "correct_answer": "answer_a" 264 | }, 265 | { 266 | "id": "303", 267 | "category": "csharp", 268 | "level": "facil", 269 | "question": "¿Cómo se empieza a escribir una sentencia if en C#?", 270 | "answers": { 271 | "answer_a": "if (x > y)", 272 | "answer_b": "if x > y:", 273 | "answer_c": "if x > y then:" 274 | }, 275 | "correct_answer": "answer_a" 276 | }, 277 | { 278 | "id": "304", 279 | "category": "csharp", 280 | "level": "facil", 281 | "question": "¿Cómo se empieza a escribir un ciclo while en C#?", 282 | "answers": { 283 | "answer_a": "while (x > y)", 284 | "answer_b": "while x > y:", 285 | "answer_c": "x > y while {", 286 | "answer_d": "while x > y {" 287 | }, 288 | "correct_answer": "answer_a" 289 | }, 290 | { 291 | "id": "305", 292 | "category": "csharp", 293 | "level": "facil", 294 | "question": "¿Qué palabra clave se utiliza para devolver un valor dentro de un método?", 295 | "answers": { 296 | "answer_a": "get", 297 | "answer_b": "void", 298 | "answer_c": "break", 299 | "answer_d": "return" 300 | }, 301 | "correct_answer": "answer_d" 302 | }, 303 | { 304 | "id": "306", 305 | "category": "csharp", 306 | "level": "facil", 307 | "question": "¿Qué sentencia se utiliza para detener un ciclo?", 308 | "answers": { 309 | "answer_a": "exit", 310 | "answer_b": "stop", 311 | "answer_c": "break", 312 | "answer_d": "return" 313 | }, 314 | "correct_answer": "answer_c" 315 | }, 316 | { 317 | "id": "366", 318 | "category": "csharp", 319 | "level": "dificil", 320 | "question": "¿Cuál de las siguientes afirmaciones no es válida para crear un nuevo objeto en C#?", 321 | "answers": { 322 | "answer_a": "var a = new Int32();", 323 | "answer_b": "var a = new String();", 324 | "answer_c": "var a = new IComparable();", 325 | "answer_d": "var a = new []{0};" 326 | }, 327 | "correct_answer": "answer_c" 328 | }, 329 | { 330 | "id": "367", 331 | "category": "csharp", 332 | "level": "dificil", 333 | "question": "Si ejecuta el archivo ejecutable de C# varias veces, se crean varios procesos. Si desea tener un solo proceso de solicitud, incluso si lo inicia varias veces, ¿qué puede usar?", 334 | "answers": { 335 | "answer_a": "Semaphore", 336 | "answer_b": "Mutex", 337 | "answer_c": "Critical Section", 338 | "answer_d": "C# lock" 339 | }, 340 | "correct_answer": "answer_b" 341 | }, 342 | { 343 | "id": "368", 344 | "category": "csharp", 345 | "level": "dificil", 346 | "question": "¿Cuál de los siguientes operadores no puede utilizar la sobrecarga de operadores?", 347 | "answers": { 348 | "answer_a": "++", 349 | "answer_b": "&", 350 | "answer_c": "||", 351 | "answer_d": "true" 352 | }, 353 | "correct_answer": "answer_b" 354 | }, 355 | { 356 | "id": "369", 357 | "category": "csharp", 358 | "level": "dificil", 359 | "question": "En la programación multihilo, ¿cuál de los siguientes no utiliza Thread Pool?", 360 | "answers": { 361 | "answer_a": "BackgroundWorker class", 362 | "answer_b": "Asynchronous delegate", 363 | "answer_c": "Thread class", 364 | "answer_d": "Task class" 365 | }, 366 | "correct_answer": "answer_c" 367 | }, 368 | { 369 | "id": "370", 370 | "category": "csharp", 371 | "level": "dificil", 372 | "question": "La clase A tiene el atributo [Serializable()]. ¿Cuándo se comprueba [Serializable]?", 373 | "answers": { 374 | "answer_a": "En tiempo de compilación de C#", 375 | "answer_b": "En tiempo de ejecución de CLR", 376 | "answer_c": "En tiempo de compilación JIT", 377 | "answer_d": "En la vinculación" 378 | }, 379 | "correct_answer": "answer_b" 380 | }, 381 | { 382 | "id": "371", 383 | "category": "csharp", 384 | "level": "dificil", 385 | "question": "Los siguientes son algunos ejemplos de arrays de enteros. ¿Qué expresión no es válida en C#?", 386 | "answers": { 387 | "answer_a": "int[] a = new int[10];", 388 | "answer_b": "int[][] c = new int[10][];", 389 | "answer_c": "int[][][] cc = new int[10][2][];", 390 | "answer_d": "int[,] b = new int[10, 2];", 391 | "answer_e": "int[, , ,] d = new int[10,2,2,2]" 392 | }, 393 | "correct_answer": "answer_c" 394 | }, 395 | { 396 | "id": "372", 397 | "category": "csharp", 398 | "level": "dificil", 399 | "question": "¿Cuál de las siguientes afirmaciones es verdadera sobre el tipo anónimo de C#?", 400 | "answers": { 401 | "answer_a": "El tipo anónimo puede agregar una nueva propiedad una vez que se crea", 402 | "answer_b": "El tipo anónimo puede agregar un evento", 403 | "answer_c": "Puede usar un delegado para un método en tipo anónimo", 404 | "answer_d": "El tipo anónimo es un tipo inmutable." 405 | }, 406 | "correct_answer": "answer_c" 407 | }, 408 | { 409 | "id": "373", 410 | "category": "csharp", 411 | "level": "dificil", 412 | "question": "¿Cuál es el resultado de las variables a y b? var a = 5L == 5.0F; var b = 24L / 5 == 24 / 5d;", 413 | "answers": { 414 | "answer_a": "a=true, b=true", 415 | "answer_b": "a=true, b=false", 416 | "answer_c": "a=false, b=true", 417 | "answer_d": "a=false, b=false" 418 | }, 419 | "correct_answer": "answer_b" 420 | }, 421 | { 422 | "id": "374", 423 | "category": "csharp", 424 | "level": "dificil", 425 | "question": "Al definir una clase con C# Generics, ¿Cuál de las siguientes no es válida?", 426 | "answers": { 427 | "answer_a": "class MyClass where T : struct", 428 | "answer_b": "class MyClass where T : class", 429 | "answer_c": "class MyClass where T : IComparable", 430 | "answer_d": "Todas" 431 | }, 432 | "correct_answer": "answer_d" 433 | }, 434 | { 435 | "id": "375", 436 | "category": "csharp", 437 | "level": "dificil", 438 | "question": "¿Cuál de las siguientes afirmaciones es incorrecta sobre el delegado de C#?", 439 | "answers": { 440 | "answer_a": "Admite multicast", 441 | "answer_b": "Se considera una base técnica del evento de C#", 442 | "answer_c": "Se puede usar al pasar unaEl delegado de C # no referencia a un método", 443 | "answer_d": "No puede usar operadores + =, - =" 444 | }, 445 | "correct_answer": "answer_d" 446 | } 447 | ] 448 | -------------------------------------------------------------------------------- /server/database/quizzes/css.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": "31", 4 | "category": "css", 5 | "level": "normal", 6 | "question": "¿Qué se puede seleccionar con un asterisco (*)?", 7 | "answers": { 8 | "answer_a": "Una \"clase\"", 9 | "answer_b": "Un \"id\"", 10 | "answer_c": "Todos los elementos" 11 | }, 12 | "correct_answer": "answer_c" 13 | }, 14 | { 15 | "id": "32", 16 | "category": "css", 17 | "level": "normal", 18 | "question": "¿Cuál es la secuencia correcta del modelo de caja de adentro hacia afuera?", 19 | "answers": { 20 | "answer_a": "Content -> padding -> border -> margin", 21 | "answer_b": "Content -> border -> padding -> margin", 22 | "answer_c": "Content -> margin -> border -> padding" 23 | }, 24 | "correct_answer": "answer_a" 25 | }, 26 | { 27 | "id": "33", 28 | "category": "css", 29 | "level": "dificil", 30 | "question": "¿Qué hace box-sizing: border-box?", 31 | "answers": { 32 | "answer_a": "Crear un \"margin\" adicional igual al tamaño del \"padding\" y el \"border\"", 33 | "answer_b": "Incluir el \"padding\" y el \"border\" en el ancho y alto total de un elemento" 34 | }, 35 | "correct_answer": "answer_b" 36 | }, 37 | { 38 | "id": "34", 39 | "category": "css", 40 | "level": "facil", 41 | "question": "¿Qué selector se utiliza para acceder a las clases?", 42 | "answers": { 43 | "answer_a": "*", 44 | "answer_b": "#", 45 | "answer_c": "." 46 | }, 47 | "correct_answer": "answer_c" 48 | }, 49 | { 50 | "id": "35", 51 | "category": "css", 52 | "level": "dificil", 53 | "question": "¿Cuál de estos no es un nombre de color predefinido?", 54 | "answers": { 55 | "answer_a": "DodgerBlue", 56 | "answer_b": "MediumSeaGreen", 57 | "answer_c": "VioletBlue", 58 | "answer_d": "Tomato" 59 | }, 60 | "correct_answer": "answer_c" 61 | }, 62 | { 63 | "id": "36", 64 | "category": "css", 65 | "level": "dificil", 66 | "question": "¿Cuál de estos no es un sistema de color válido?", 67 | "answers": { 68 | "answer_a": "HEX", 69 | "answer_b": "DOTA", 70 | "answer_c": "RGB", 71 | "answer_d": "HSL" 72 | }, 73 | "correct_answer": "answer_b" 74 | }, 75 | { 76 | "id": "37", 77 | "category": "css", 78 | "level": "dificil", 79 | "question": "¿Qué selector de combinación no se usa en CSS?", 80 | "answers": { 81 | "answer_a": ">", 82 | "answer_b": "+", 83 | "answer_c": "/", 84 | "answer_d": "~" 85 | }, 86 | "correct_answer": "answer_c" 87 | }, 88 | { 89 | "id": "38", 90 | "category": "css", 91 | "level": "facil", 92 | "question": "¿Cuál es la sintaxis correcta para los comentarios CSS?", 93 | "answers": { 94 | "answer_a": "", 95 | "answer_b": "/* Comentario */", 96 | "answer_c": "// Comentario" 97 | }, 98 | "correct_answer": "answer_b" 99 | }, 100 | { 101 | "id": "39", 102 | "category": "css", 103 | "level": "normal", 104 | "question": "¿Cuál es la propiedad de posición predeterminada para los elementos html?", 105 | "answers": { 106 | "answer_a": "Fixed", 107 | "answer_b": "Relative", 108 | "answer_c": "Absolute", 109 | "answer_d": "Static" 110 | }, 111 | "correct_answer": "answer_d" 112 | }, 113 | { 114 | "id": "40", 115 | "category": "css", 116 | "level": "dificil", 117 | "question": "Un elemento con \"position: fixed\" se coloca en relación al \"viewport\".", 118 | "answers": { 119 | "answer_a": "Verdadero", 120 | "answer_b": "Falso" 121 | }, 122 | "correct_answer": "answer_a" 123 | }, 124 | { 125 | "id": "41", 126 | "category": "css", 127 | "level": "normal", 128 | "question": "¿Qué hace el selector :focus?", 129 | "answers": { 130 | "answer_a": "Establece el elemento para que se enfoque de forma predeterminada", 131 | "answer_b": "Selecciona el elemento cuando tiene foco" 132 | }, 133 | "correct_answer": "answer_b" 134 | }, 135 | { 136 | "id": "42", 137 | "category": "css", 138 | "level": "facil", 139 | "question": "¿Cuál es la forma correcta de establecer el color de una fuente?", 140 | "answers": { 141 | "answer_a": "font-color: red", 142 | "answer_b": "text-color: red", 143 | "answer_c": "color: red" 144 | }, 145 | "correct_answer": "answer_c" 146 | }, 147 | { 148 | "id": "43", 149 | "category": "css", 150 | "level": "facil", 151 | "question": "¿Qué selector se usa para acceder al ID?", 152 | "answers": { 153 | "answer_a": "#", 154 | "answer_b": ".", 155 | "answer_c": "*" 156 | }, 157 | "correct_answer": "answer_a" 158 | }, 159 | { 160 | "id": "44", 161 | "category": "css", 162 | "level": "normal", 163 | "question": "La regla '!important' se usa para dar más importancia a una propiedad/valor.", 164 | "answers": { 165 | "answer_a": "Verdadero", 166 | "answer_b": "Falso" 167 | }, 168 | "correct_answer": "answer_a" 169 | }, 170 | { 171 | "id": "45", 172 | "category": "css", 173 | "level": "normal", 174 | "question": "¿Qué es cierto sobre display:inline-block?", 175 | "answers": { 176 | "answer_a": "Agrega un salto de línea después del elemento", 177 | "answer_b": "Permite establecer un ancho y alto en el elemento" 178 | }, 179 | "correct_answer": "answer_b" 180 | }, 181 | { 182 | "id": "46", 183 | "category": "css", 184 | "level": "normal", 185 | "question": "¿Cuál de estas propiedades se utiliza para controlar la secuencia de capas CSS?", 186 | "answers": { 187 | "answer_a": "Z-index", 188 | "answer_b": "X-index", 189 | "answer_c": "Y-index" 190 | }, 191 | "correct_answer": "answer_a" 192 | }, 193 | { 194 | "id": "47", 195 | "category": "css", 196 | "level": "facil", 197 | "question": "¿Qué propiedad se puede usar para eliminar los marcadores de una lista?", 198 | "answers": { 199 | "answer_a": "text-decoration: none", 200 | "answer_b": "list-style-type: none" 201 | }, 202 | "correct_answer": "answer_b" 203 | }, 204 | { 205 | "id": "48", 206 | "category": "css", 207 | "level": "normal", 208 | "question": "¿Qué se puede comprobar con las media queries?", 209 | "answers": { 210 | "answer_a": "Orientación", 211 | "answer_b": "Resolución", 212 | "answer_c": "Ancho y alto de la ventana del navegador", 213 | "answer_d": "Todo lo anterior" 214 | }, 215 | "correct_answer": "answer_d" 216 | }, 217 | { 218 | "id": "49", 219 | "category": "css", 220 | "level": "facil", 221 | "question": "¿Qué significa CSS?", 222 | "answers": { 223 | "answer_a": "Cascading Style Sheets", 224 | "answer_b": "Cascading Style System", 225 | "answer_c": "Color Style Sheets" 226 | }, 227 | "correct_answer": "answer_a" 228 | }, 229 | { 230 | "id": "50", 231 | "category": "css", 232 | "level": "normal", 233 | "question": "¿Cuál de estas declaraciones da más transparencia al elemento?", 234 | "answers": { 235 | "answer_a": "opacity:.1", 236 | "answer_b": "opacity:.5", 237 | "answer_c": "opacity:0.9" 238 | }, 239 | "correct_answer": "answer_a" 240 | }, 241 | { 242 | "id": "51", 243 | "category": "css", 244 | "level": "dificil", 245 | "question": "El valor por defecto de 'overflow' es 'visible'.", 246 | "answers": { 247 | "answer_a": "Verdadero", 248 | "answer_b": "Falso" 249 | }, 250 | "correct_answer": "answer_a" 251 | }, 252 | { 253 | "id": "52", 254 | "category": "css", 255 | "level": "normal", 256 | "question": "Los elementos con 'position:absolute' se eliminan del flujo normal y pueden superponerse a los elementos.", 257 | "answers": { 258 | "answer_a": "Verdadero", 259 | "answer_b": "Falso" 260 | }, 261 | "correct_answer": "answer_a" 262 | }, 263 | { 264 | "id": "53", 265 | "category": "css", 266 | "level": "normal", 267 | "question": "¿Cuál de estas es una pseudo-clase?", 268 | "answers": { 269 | "answer_a": ".wrapper > a", 270 | "answer_b": "div + p", 271 | "answer_c": "p:first-child" 272 | }, 273 | "correct_answer": "answer_c" 274 | }, 275 | { 276 | "id": "54", 277 | "category": "css", 278 | "level": "dificil", 279 | "question": "¿Cuál de estos no es un selector de pseudo-elemento válido?", 280 | "answers": { 281 | "answer_a": "::first-line", 282 | "answer_b": "::before", 283 | "answer_c": "::paragraph" 284 | }, 285 | "correct_answer": "answer_c" 286 | }, 287 | { 288 | "id": "55", 289 | "category": "css", 290 | "level": "facil", 291 | "question": "¿Cuál es el propósito de CSS?", 292 | "answers": { 293 | "answer_a": "Agregar funcionalidad a elementos html", 294 | "answer_b": "Describir cómo se mostrarán los elementos html", 295 | "answer_c": "Crear el marcado de un sitio web" 296 | }, 297 | "correct_answer": "answer_b" 298 | }, 299 | { 300 | "id": "56", 301 | "category": "css", 302 | "level": "normal", 303 | "question": "¿Qué separador se usa para declaraciones múltiples en el mismo bloque de reglas?", 304 | "answers": { 305 | "answer_a": ";", 306 | "answer_b": ",", 307 | "answer_c": "/" 308 | }, 309 | "correct_answer": "answer_a" 310 | }, 311 | { 312 | "id": "57", 313 | "category": "css", 314 | "level": "facil", 315 | "question": "'position:sticky' establece que el elemento permanezca siempre en el mismo lugar si se desplaza la página.", 316 | "answers": { 317 | "answer_a": "True", 318 | "answer_b": "False" 319 | }, 320 | "correct_answer": "answer_b" 321 | }, 322 | { 323 | "id": "58", 324 | "category": "css", 325 | "level": "dificil", 326 | "question": "¿En qué consiste el bloque de reglas CSS?", 327 | "answers": { 328 | "answer_a": "Etiqueta y valor", 329 | "answer_b": "Selector y declaración", 330 | "answer_c": "Clase y propiedad" 331 | }, 332 | "correct_answer": "answer_b" 333 | }, 334 | { 335 | "id": "59", 336 | "category": "css", 337 | "level": "dificil", 338 | "question": "¿Qué selector se usa para crear una variable CSS con un alcance global?", 339 | "answers": { 340 | "answer_a": ":global", 341 | "answer_b": ":all", 342 | "answer_c": ":root" 343 | }, 344 | "correct_answer": "answer_c" 345 | }, 346 | { 347 | "id": "60", 348 | "category": "css", 349 | "level": "dificil", 350 | "question": "¿Cuál es la diferencia entre 'display:none' y 'visibility:hidden'?", 351 | "answers": { 352 | "answer_a": "'visibility:hidden' ocupará el mismo espacio que antes", 353 | "answer_b": "display:none ocupará el mismo espacio que antes", 354 | "answer_c": "No hay diferencia entre los dos" 355 | }, 356 | "correct_answer": "answer_a" 357 | }, 358 | { 359 | "id": "312", 360 | "category": "css", 361 | "level": "facil", 362 | "question": "¿Cuál es la ventaja de utilizar CSS en línea?", 363 | "answers": { 364 | "answer_a": "Es más fácil de manejar", 365 | "answer_b": "Es más fácil añadir múltiples estilos a través de él", 366 | "answer_c": "Se puede utilizar para probar rápidamente las anulaciones locales de CSS", 367 | "answer_d": "Reduce los conflictos con otros métodos de definición de CSS" 368 | }, 369 | "correct_answer": "answer_b" 370 | }, 371 | { 372 | "id": "313", 373 | "category": "css", 374 | "level": "facil", 375 | "question": "Para insertar un archivo de hoja de estilo externo en otro archivo de hoja de estilo, ¿qué regla debe utilizar?", 376 | "answers": { 377 | "answer_a": "@import", 378 | "answer_b": "@link", 379 | "answer_c": "@insert", 380 | "answer_d": "@style" 381 | }, 382 | "correct_answer": "answer_a" 383 | }, 384 | { 385 | "id": "314", 386 | "category": "css", 387 | "level": "facil", 388 | "question": "¿Qué opción no es válida para declarar un valor de relleno de 10 píxeles en la parte superior e inferior, y de 0 píxeles en la izquierda y la derecha?", 389 | "answers": { 390 | "answer_a": "padding: 10px 0px;", 391 | "answer_b": "padding: 10px 10px 0px 0px;", 392 | "answer_c": "padding: 10px 0;", 393 | "answer_d": "padding: 10px 0px 10px 0px;" 394 | }, 395 | "correct_answer": "answer_b" 396 | }, 397 | { 398 | "id": "315", 399 | "category": "css", 400 | "level": "normal", 401 | "question": "¿Qué opción utiliza la sintaxis correcta para añadir una pseudo-clase hover a un elemento?", 402 | "answers": { 403 | "answer_a": "a:hover {...}", 404 | "answer_b": "a :hover {...}", 405 | "answer_c": "a.hover {...}", 406 | "answer_d": "a hover {...}" 407 | }, 408 | "correct_answer": "answer_a" 409 | }, 410 | { 411 | "id": "316", 412 | "category": "css", 413 | "level": "facil", 414 | "question": "¿Cual de los siguientes es un valor NO válido para la propiedad font-size?", 415 | "answers": { 416 | "answer_a": "font-size: xsmall", 417 | "answer_b": "font-size: 50%", 418 | "answer_c": "font-size: 1em", 419 | "answer_d": "font-size: 20px" 420 | }, 421 | "correct_answer": "answer_a" 422 | }, 423 | { 424 | "id": "353", 425 | "category": "css", 426 | "level": "facil", 427 | "question": "¿Cómo posicionamos un elemento dentro de otro de forma precisa?", 428 | "answers": { 429 | "answer_a": "Padre - position:relative / Hijo - position:absolute", 430 | "answer_b": "Padre - position:absolute / Hijo - position:relative", 431 | "answer_c": "Padre - position:fixed / Hijo - position:absolute" 432 | }, 433 | "correct_answer": "answer_a" 434 | }, 435 | { 436 | "id": "354", 437 | "category": "css", 438 | "level": "normal", 439 | "question": "¿Con que pseudo-selector se puede seleccionar el primer hijo, sin tener class name o id?", 440 | "answers": { 441 | "answer_a": "nth-child(0)", 442 | "answer_b": "nth-child(1)", 443 | "answer_c": "nth-first-child" 444 | }, 445 | "correct_answer": "answer_b" 446 | }, 447 | { 448 | "id": "355", 449 | "category": "css", 450 | "level": "dificil", 451 | "question": "¿Qué selector utilizarías para seleccionar un elemento que en el atributo título contenga la palabra \"container\"?", 452 | "answers": { 453 | "answer_a": "[title~=container]", 454 | "answer_b": "[title^=container]", 455 | "answer_c": "[title$=container]" 456 | }, 457 | "correct_answer": "answer_a" 458 | } 459 | ] 460 | -------------------------------------------------------------------------------- /server/database/quizzes/html.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": "1", 4 | "category": "html", 5 | "level": "normal", 6 | "question": "¿Cuál de estos es un elemento de bloque?", 7 | "answers": { 8 | "answer_a": "", 9 | "answer_b": "", 10 | "answer_c": "", 11 | "answer_d": "" 12 | }, 13 | "correct_answer": "answer_b" 14 | }, 15 | { 16 | "id": "2", 17 | "category": "html", 18 | "level": "normal", 19 | "question": "¿Cuál es la sintaxis correcta para añadir un \"checkbox\"?", 20 | "answers": { 21 | "answer_a": "", 22 | "answer_b": "", 23 | "answer_c": "" 24 | }, 25 | "correct_answer": "answer_c", 26 | "feedback": "Los checkbox se consiguen con la etiqueta ." 27 | }, 28 | { 29 | "id": "3", 30 | "category": "html", 31 | "level": "dificil", 32 | "question": "¿Qué define el atributo \"action\" en el elemento
?", 33 | "answers": { 34 | "answer_a": "El método http para enviar los datos del formulario", 35 | "answer_b": "Dónde enviar los datos del formulario cuando se envían", 36 | "answer_c": "El tipo mime utilizado para codificar el contenido" 37 | }, 38 | "correct_answer": "answer_b", 39 | "feedback": "El atributo action indica la página a la que se envían los datos del formulario. Si este atributo está vacío, es la página que contiene el formulario la que se recargará con los datos como parámetros." 40 | }, 41 | { 42 | "id": "4", 43 | "category": "html", 44 | "level": "facil", 45 | "question": "¿Cuál es la sintaxis válida de los comentarios en HTML?", 46 | "answers": { 47 | "answer_a": "", 48 | "answer_b": "/* Comentario */", 49 | "answer_c": "// Comentario" 50 | }, 51 | "correct_answer": "answer_a" 52 | }, 53 | { 54 | "id": "5", 55 | "category": "html", 56 | "level": "normal", 57 | "question": "¿Qué significa HTML?", 58 | "answers": { 59 | "answer_a": "Hypertext Markdown Language", 60 | "answer_b": "Hypertext Machine Language", 61 | "answer_c": "Hypertext Markup Language" 62 | }, 63 | "correct_answer": "answer_c", 64 | "feedback": "HTML (Lenguaje de Marcas de Hipertexto, del inglés HyperText Markup Language) es el componente más básico de la Web. Define el significado y la estructura del contenido web." 65 | }, 66 | { 67 | "id": "6", 68 | "category": "html", 69 | "level": "facil", 70 | "question": "¿Cuál de estos \"meta-tags\" está \"deprecated\"", 71 | "answers": { 72 | "answer_a": "description", 73 | "answer_b": "keywords", 74 | "answer_c": "author", 75 | "answer_d": "copyright" 76 | }, 77 | "correct_answer": "answer_b" 78 | }, 79 | { 80 | "id": "7", 81 | "category": "html", 82 | "level": "facil", 83 | "question": "¿Cuál es la forma correcta de declarar un documento HTML5?", 84 | "answers": { 85 | "answer_a": "", 86 | "answer_b": "" 87 | }, 88 | "correct_answer": "answer_b", 89 | "feedback": " La etiqueta doctype declara el tipo de documento, por lo que esta está señalando que este es un documento HTML." 90 | }, 91 | { 92 | "id": "8", 93 | "category": "html", 94 | "level": "normal", 95 | "question": "¿Cuál es la forma correcta de crear un enlace de correo electrónico?", 96 | "answers": { 97 | "answer_a": "Email", 98 | "answer_b": "Email", 99 | "answer_c": "Email" 100 | }, 101 | "correct_answer": "answer_a" 102 | }, 103 | { 104 | "id": "9", 105 | "category": "html", 106 | "level": "facil", 107 | "question": "¿Tanto '.html' como '.htm' son extensiones HTML válidas?", 108 | "answers": { 109 | "answer_a": "Verdadero", 110 | "answer_b": "Falso" 111 | }, 112 | "correct_answer": "answer_a" 113 | }, 114 | { 115 | "id": "10", 116 | "category": "html", 117 | "level": "dificil", 118 | "question": "Qué fuente de imagen está un nivel por encima de la carpeta actual", 119 | "answers": { 120 | "answer_a": "", 121 | "answer_b": "", 122 | "answer_c": "" 123 | }, 124 | "correct_answer": "answer_b", 125 | "feedback": "Usando dos puntos y una barra oblicua (../) podemos subir un nivel en la jerarquía de carpetas." 126 | }, 127 | { 128 | "id": "11", 129 | "category": "html", 130 | "level": "normal", 131 | "question": "¿Cuál de los siguientes elementos no corresponde a la sección ?", 132 | "answers": { 133 | "answer_a": "", 134 | "answer_b": "<header>", 135 | "answer_c": "<meta>", 136 | "answer_d": "<link>" 137 | }, 138 | "correct_answer": "answer_b" 139 | }, 140 | { 141 | "id": "12", 142 | "category": "html", 143 | "level": "normal", 144 | "question": "¿Cuántas etiquetas <heading> hay en HTML?", 145 | "answers": { 146 | "answer_a": "2", 147 | "answer_b": "4", 148 | "answer_c": "6" 149 | }, 150 | "correct_answer": "answer_c", 151 | "feedback": "Los elementos de encabezado implementan seis niveles de encabezado del documento, <h1> es el más importante, y <h6>, el menos importante. Un elemento de encabezado describe brevemente el tema de la sección que presenta. La información de encabezado puede ser usada por los agentes usuarios, por ejemplo, para construir una tabla de contenidos para un documento automáticamente." 152 | }, 153 | { 154 | "id": "13", 155 | "category": "html", 156 | "level": "normal", 157 | "question": "¿Para qué se utiliza la etiqueta <iframe>?", 158 | "answers": { 159 | "answer_a": "Para incrustar contenido", 160 | "answer_b": "Para dibujar gráficos", 161 | "answer_c": "Para enmarcar un grupo de elementos" 162 | }, 163 | "correct_answer": "answer_a", 164 | "feedback": "El elemento HTML <iframe> (de inline frame) representa un contexto de navegación anidado, el cual permite incrustar otra página HTML en la página actual." 165 | }, 166 | { 167 | "id": "14", 168 | "category": "html", 169 | "level": "facil", 170 | "question": "¿Qué define el atributo 'alt' dentro de la etiqueta <img/>", 171 | "answers": { 172 | "answer_a": "La descripción de una imagen para cuando esta no se pueda mostrar", 173 | "answer_b": "Una imagen alternativa a la imagen principal" 174 | }, 175 | "correct_answer": "answer_a", 176 | "feedback": "Este atributo define el texto alternativo que describe la imagen, texto que los usuarios verán si la URL de la imagen es errónea o la imagen tiene un formato no soportado o si la imagen aún no se ha descargado." 177 | }, 178 | { 179 | "id": "15", 180 | "category": "html", 181 | "level": "facil", 182 | "question": "¿Qué etiqueta HTML se usa para definir texto importante?", 183 | "answers": { 184 | "answer_a": "<i>", 185 | "answer_b": "<b>", 186 | "answer_c": "<strong>", 187 | "answer_d": "<important>" 188 | }, 189 | "correct_answer": "answer_c" 190 | }, 191 | { 192 | "id": "16", 193 | "category": "html", 194 | "level": "normal", 195 | "question": "¿Cuál de estos es un elemento en línea?", 196 | "answers": { 197 | "answer_a": "<form>", 198 | "answer_b": "<hr>", 199 | "answer_c": "<a>", 200 | "answer_d": "<canvas>" 201 | }, 202 | "correct_answer": "answer_d" 203 | }, 204 | { 205 | "id": "17", 206 | "category": "html", 207 | "level": "facil", 208 | "question": "¿Cuál es la sintaxis correcta para los estilos en línea?", 209 | "answers": { 210 | "answer_a": "<p color=\"red\">Text</p>", 211 | "answer_b": "<p color:\"red\">Text</p>", 212 | "answer_c": "<p style=\"color:red\">Text</p>" 213 | }, 214 | "correct_answer": "answer_c" 215 | }, 216 | { 217 | "id": "18", 218 | "category": "html", 219 | "level": "normal", 220 | "question": "¿Cuál de estos elementos no es un 'input type'?", 221 | "answers": { 222 | "answer_a": "file", 223 | "answer_b": "radio", 224 | "answer_c": "list", 225 | "answer_d": "submit" 226 | }, 227 | "correct_answer": "answer_c" 228 | }, 229 | { 230 | "id": "19", 231 | "category": "html", 232 | "level": "facil", 233 | "question": "¿Cuál es la forma correcta de definir un enlace?", 234 | "answers": { 235 | "answer_a": "<a url=\"path/to/file\">Link</a>", 236 | "answer_b": "<a link=\"path/to/file\">Link</a>", 237 | "answer_c": "<a href=\"path/to/file\">Link</a>" 238 | }, 239 | "correct_answer": "answer_c" 240 | }, 241 | { 242 | "id": "20", 243 | "category": "html", 244 | "level": "facil", 245 | "question": "¿Qué atributo se usa para especificar que un 'input' debe completarse?", 246 | "answers": { 247 | "answer_a": "placeholder", 248 | "answer_b": "mandatory", 249 | "answer_c": "validate", 250 | "answer_d": "required" 251 | }, 252 | "correct_answer": "answer_d" 253 | }, 254 | { 255 | "id": "21", 256 | "category": "html", 257 | "level": "facil", 258 | "question": "¿Qué etiqueta se utiliza para producir un salto de línea?", 259 | "answers": { 260 | "answer_a": "<break>", 261 | "answer_b": "<br>", 262 | "answer_c": "<b>", 263 | "answer_d": "<new>" 264 | }, 265 | "correct_answer": "answer_b" 266 | }, 267 | { 268 | "id": "22", 269 | "category": "html", 270 | "level": "facil", 271 | "question": "¿Cómo puedes hacer una lista numerada?", 272 | "answers": { 273 | "answer_a": "<list>", 274 | "answer_b": "<ol>", 275 | "answer_c": "<ul>" 276 | }, 277 | "correct_answer": "answer_b" 278 | }, 279 | { 280 | "id": "23", 281 | "category": "html", 282 | "level": "normal", 283 | "question": "¿Cuál de estos es un campo de contraseña válido?", 284 | "answers": { 285 | "answer_a": "<text type=\"password\">", 286 | "answer_b": "<password>", 287 | "answer_c": "<input type=\"password\">" 288 | }, 289 | "correct_answer": "answer_c" 290 | }, 291 | { 292 | "id": "24", 293 | "category": "html", 294 | "level": "dificil", 295 | "question": "¿Qué hace la etiqueta <pre>?", 296 | "answers": { 297 | "answer_a": "Resalta el texto", 298 | "answer_b": "Define texto preformateado", 299 | "answer_c": "Muestra el texto como una cita" 300 | }, 301 | "correct_answer": "answer_b", 302 | "feedback": "El elemento HTML <pre> representa texto preformateado. El texto en este elemento típicamente se muestra en una fuente fija, no proporcional, exactamente como es mostrado en el archivo." 303 | }, 304 | { 305 | "id": "25", 306 | "category": "html", 307 | "level": "dificil", 308 | "question": "¿Cuál no se considera una etiqueta de cita?", 309 | "answers": { 310 | "answer_a": "<cite>", 311 | "answer_b": "<q>", 312 | "answer_c": "<blockquote>", 313 | "answer_d": "<em>" 314 | }, 315 | "correct_answer": "answer_d", 316 | "feedback": "La etiqueta <em>, se utiliza para resaltar texto en el documento dando “énfasis” al texto sobre el que se aplica la etiqueta. NO representa una cita." 317 | }, 318 | { 319 | "id": "26", 320 | "category": "html", 321 | "level": "facil", 322 | "question": "¿Cuál es el elemento raíz de HTML?", 323 | "answers": { 324 | "answer_a": "<body>", 325 | "answer_b": "<html>", 326 | "answer_c": "<head>", 327 | "answer_d": "<doctype>" 328 | }, 329 | "correct_answer": "answer_b" 330 | }, 331 | { 332 | "id": "27", 333 | "category": "html", 334 | "level": "facil", 335 | "question": "¿Cuál de estas es una etiqueta de cierre automático?", 336 | "answers": { 337 | "answer_a": "<h1>", 338 | "answer_b": "<nav>", 339 | "answer_c": "<input>", 340 | "answer_d": "<code>" 341 | }, 342 | "correct_answer": "answer_c" 343 | }, 344 | { 345 | "id": "28", 346 | "category": "html", 347 | "level": "normal", 348 | "question": "¿Cuál es la forma correcta de abrir un enlace en una nueva pestaña/ventana del navegador?", 349 | "answers": { 350 | "answer_a": "<a href=\"url\" target=\"_new\">", 351 | "answer_b": "<a href=\"url\" target=\"_blank\">", 352 | "answer_c": "<a href=\"url\" target=\"_window\">" 353 | }, 354 | "correct_answer": "answer_b" 355 | }, 356 | { 357 | "id": "29", 358 | "category": "html", 359 | "level": "normal", 360 | "question": "¿Cuál es la sintaxis correcta para 'textarea'?", 361 | "answers": { 362 | "answer_a": "<textarea>", 363 | "answer_b": "<input type=\"textarea\">", 364 | "answer_c": "<input type=\"textbox\">" 365 | }, 366 | "correct_answer": "answer_a" 367 | }, 368 | { 369 | "id": "30", 370 | "category": "html", 371 | "level": "facil", 372 | "question": "Qué etiqueta se utiliza para definir el título del documento", 373 | "answers": { 374 | "answer_a": "<head>", 375 | "answer_b": "<meta>", 376 | "answer_c": "<title>" 377 | }, 378 | "correct_answer": "answer_c" 379 | }, 380 | { 381 | "id": "307", 382 | "category": "html", 383 | "level": "normal", 384 | "question": "¿Cuáles son los mejores ejemplos de elementos vacíos?", 385 | "answers": { 386 | "answer_a": "<link><meta><title>", 387 | "answer_b": "<br><base><source>", 388 | "answer_c": "<input><br><p>", 389 | "answer_d": "<area><embed><strong>" 390 | }, 391 | "correct_answer": "answer_b" 392 | }, 393 | { 394 | "id": "308", 395 | "category": "html", 396 | "level": "dificil", 397 | "question": "¿Cuál es el propósito principal de la etiqueta <canvas>?", 398 | "answers": { 399 | "answer_a": "Permite representar imágenes rasterizadas en la página web", 400 | "answer_b": "Muestra imágenes con anotaciones", 401 | "answer_c": "Permite dibujar sobre un mapa de bits a través de JavaScript", 402 | "answer_d": "Permite representar imágenes vectoriales en la página web" 403 | }, 404 | "correct_answer": "answer_c" 405 | }, 406 | { 407 | "id": "309", 408 | "category": "html", 409 | "level": "normal", 410 | "question": "¿Cómo se escribiría una entrada que permita al usuario seleccionar entre un rango de valores enteros entre 0 y 100 (inclusive) en incrementos de 5?", 411 | "answers": { 412 | "answer_a": "<input type=\"range\" min=\"0\" max=\"100\" by=\"5\" />", 413 | "answer_b": "<input type=\"range\" min=\"0\" max=\"100\" step=\"5\" />", 414 | "answer_c": "<input type=\"number\" min=\"0\" max=\"100\" step=\"5\" />", 415 | "answer_d": "<input type=\"number\" min=\"0\" max=\"100\" by=\"5\" />" 416 | }, 417 | "correct_answer": "answer_b" 418 | }, 419 | { 420 | "id": "310", 421 | "category": "html", 422 | "level": "normal", 423 | "question": "¿Cuál es la diferencia entre <svg> y <canvas>?", 424 | "answers": { 425 | "answer_a": "<svg> produce gráficos vectoriales, mientras que <canvas> produce gráficos rasterizados", 426 | "answer_b": "<svg> se integra con JavaScript, mientras que <canvas> no", 427 | "answer_c": "<svg> produce gráficos de trama, mientras que <canvas> produce gráficos vectoriales", 428 | "answer_d": "<svg> no se puede usar como imagen de fondo, mientras que <canvas> se puede usar como fondo" 429 | }, 430 | "correct_answer": "answer_a" 431 | }, 432 | { 433 | "id": "311", 434 | "category": "html", 435 | "level": "normal", 436 | "question": "¿Para qué sirve el atributo class?", 437 | "answers": { 438 | "answer_a": "Las clases permiten a CSS seleccionar elementos específicos en la página. En el atributo class se pueden incluir tantos nombres de clase como se desee, separados por espacios", 439 | "answer_b": "Las clases permiten a CSS y JavaScript seleccionar elementos específicos en la página. Solo puede enumerar un nombre de clase por atributo de clase", 440 | "answer_c": "Las clases permiten a CSS seleccionar elementos específicos en la página. Solo puede enumerar un nombre de clase por atributo de clase", 441 | "answer_d": "Las clases permiten que CSS y JavaScript seleccionen elementos específicos en la página. Puede enumerar tantos nombres de clase dentro del atributo class como desee, separados por espacios" 442 | }, 443 | "correct_answer": "answer_d" 444 | } 445 | ] 446 | -------------------------------------------------------------------------------- /server/database/quizzes/java.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": "91", 4 | "category": "java", 5 | "level": "facil", 6 | "question": "¿Cuál es la sintaxis correcta para imprimir por consola \"Hola mundo\" en Java?", 7 | "answers": { 8 | "answer_a": "Console.WriteLine(\"Hola mundo\")", 9 | "answer_b": "print(\"Hola mundo\")", 10 | "answer_c": "echo(\"Hola mundo\")", 11 | "answer_d": "System.out.println(\"Hola mundo\")" 12 | }, 13 | "correct_answer": "answer_d" 14 | }, 15 | { 16 | "id": "92", 17 | "category": "java", 18 | "level": "facil", 19 | "question": "¿Cómo puedes insertar comentarios en Java?", 20 | "answers": { 21 | "answer_a": "# Esto es un comentario", 22 | "answer_b": "/* Esto es un comentario", 23 | "answer_d": "// Esto es un comentario" 24 | }, 25 | "correct_answer": "answer_d" 26 | }, 27 | { 28 | "id": "93", 29 | "category": "java", 30 | "level": "facil", 31 | "question": "¿Qué tipo de datos se utiliza para crear una variable que debe almacenar texto?", 32 | "answers": { 33 | "answer_a": "String", 34 | "answer_b": "string", 35 | "answer_c": "myString", 36 | "answer_d": "txt" 37 | }, 38 | "correct_answer": "answer_a" 39 | }, 40 | { 41 | "id": "94", 42 | "category": "java", 43 | "level": "facil", 44 | "question": "¿Cómo se crea una variable con el valor numérico 5?", 45 | "answers": { 46 | "answer_a": "num x = 5", 47 | "answer_b": "float x = 5", 48 | "answer_c": "int x = 5", 49 | "answer_d": "x = 5" 50 | }, 51 | "correct_answer": "answer_c" 52 | }, 53 | { 54 | "id": "95", 55 | "category": "java", 56 | "level": "dificil", 57 | "question": "¿Cuál de estos métodos se puede usar para convertir todos los caracteres de una cadena en una matriz de caracteres?", 58 | "answers": { 59 | "answer_a": "charAt()", 60 | "answer_b": "toCharArray()", 61 | "answer_c": "Todos los mencionados", 62 | "answer_d": "getChars()" 63 | }, 64 | "correct_answer": "answer_c" 65 | }, 66 | { 67 | "id": "96", 68 | "category": "java", 69 | "level": "dificil", 70 | "question": "¿Cuáles de estas constantes están definidas en la clase WindowEvent?", 71 | "answers": { 72 | "answer_a": "Todas las mencionadas", 73 | "answer_b": "WINDOW_CLOSED", 74 | "answer_c": "WINDOW_DEICONIFIED", 75 | "answer_d": "WINDOW_ACTIVATED" 76 | }, 77 | "correct_answer": "answer_a" 78 | }, 79 | { 80 | "id": "97", 81 | "category": "java", 82 | "level": "normal", 83 | "question": "¿Qué pasará si escribimos static public void en lugar de public static void?", 84 | "answers": { 85 | "answer_a": "El programa no compilará", 86 | "answer_b": "El programa compila pero no se ejecuta", 87 | "answer_c": "El programa lanzará una excepción en tiempo de ejecución", 88 | "answer_d": "El programa compila y se ejecuta correctamente" 89 | }, 90 | "correct_answer": "answer_d" 91 | }, 92 | { 93 | "id": "98", 94 | "category": "java", 95 | "level": "dificil", 96 | "question": "¿Cuál de los siguientes componentes se puede usar para crear una aplicación que admita tareas múltiples?", 97 | "answers": { 98 | "answer_a": "Ambos", 99 | "answer_b": "Thread", 100 | "answer_c": "Process", 101 | "answer_d": "Ninguno de los dos" 102 | }, 103 | "correct_answer": "answer_a" 104 | }, 105 | { 106 | "id": "99", 107 | "category": "java", 108 | "level": "normal", 109 | "question": "El constructor se utiliza para:", 110 | "answers": { 111 | "answer_a": "Inicializar el estado de una clase", 112 | "answer_b": "Inicializar el estado de todas las variables miembro", 113 | "answer_c": "Inicializar el estado de un objeto", 114 | "answer_d": "Ninguna es correcta" 115 | }, 116 | "correct_answer": "answer_c" 117 | }, 118 | { 119 | "id": "100", 120 | "category": "java", 121 | "level": "dificil", 122 | "question": "¿Cuál de las siguientes es una palabra clave?", 123 | "answers": { 124 | "answer_a": "next", 125 | "answer_b": "exit", 126 | "answer_c": "native", 127 | "answer_d": "delete" 128 | }, 129 | "correct_answer": "answer_c" 130 | }, 131 | { 132 | "id": "101", 133 | "category": "java", 134 | "level": "dificil", 135 | "question": "¿Podemos anular un método sobrecargado?", 136 | "answers": { 137 | "answer_a": "Sí, solo en la clase heredada", 138 | "answer_b": "Sí", 139 | "answer_c": "No", 140 | "answer_d": "Sí, solo en la clase \"super\"" 141 | }, 142 | "correct_answer": "answer_b" 143 | }, 144 | { 145 | "id": "102", 146 | "category": "java", 147 | "level": "dificil", 148 | "question": "¿Cuál de estas clases es padre de todas las otras clases?", 149 | "answers": { 150 | "answer_a": "java.Lang.Object", 151 | "answer_b": "java.util.Object", 152 | "answer_c": "java.util.Class", 153 | "answer_d": "java.lang.Class" 154 | }, 155 | "correct_answer": "answer_a" 156 | }, 157 | { 158 | "id": "103", 159 | "category": "java", 160 | "level": "normal", 161 | "question": "¿Qué es la clonación de objetos?", 162 | "answers": { 163 | "answer_a": "La clonación de objetos se utiliza para crear una nueva copia de un objeto con diferentes valores", 164 | "answer_b": "La clonación de objetos se utiliza para crear una copia exacta de una clase", 165 | "answer_c": "Todas las anteriores", 166 | "answer_d": "La clonación de objetos se utiliza para crear la copia exacta de un objeto" 167 | }, 168 | "correct_answer": "answer_d" 169 | }, 170 | { 171 | "id": "104", 172 | "category": "java", 173 | "level": "dificil", 174 | "question": "¿Podemos tener funciones virtuales en Java?", 175 | "answers": { 176 | "answer_a": "No", 177 | "answer_b": "Sí, solo en la función Main()", 178 | "answer_c": "Sí, todas las funciones no estáticas en Java son virtuales por defecto", 179 | "answer_d": "Sí, solo en la clase super" 180 | }, 181 | "correct_answer": "answer_c" 182 | }, 183 | { 184 | "id": "105", 185 | "category": "java", 186 | "level": "dificil", 187 | "question": "¿Cuál es el valor predeterminado para una variable de instancia?", 188 | "answers": { 189 | "answer_a": "Las referencias a objetos no se inicializan con ningún valor predeterminado", 190 | "answer_b": "Ninguna es correcta", 191 | "answer_c": "Depende del tipo de variable", 192 | "answer_d": "null" 193 | }, 194 | "correct_answer": "answer_d" 195 | }, 196 | { 197 | "id": "106", 198 | "category": "java", 199 | "level": "dificil", 200 | "question": "¿Cuál de estas interfaces define cuatro métodos?", 201 | "answers": { 202 | "answer_a": "ActionListener", 203 | "answer_b": "ContainerListener", 204 | "answer_c": "ComponentListener", 205 | "answer_d": "InputListener" 206 | }, 207 | "correct_answer": "answer_c" 208 | }, 209 | { 210 | "id": "107", 211 | "category": "java", 212 | "level": "dificil", 213 | "question": "¿Qué es cierto sobre el bloque estático?", 214 | "answers": { 215 | "answer_a": "Se puede ejecutar en cualquier momento", 216 | "answer_b": "Tiene que ser ejecutado manualmente", 217 | "answer_c": "Se ejecuta antes del método principal en el momento de la carga de la clase", 218 | "answer_d": "Se ejecuta después del método principal en el momento de la carga de la clase" 219 | }, 220 | "correct_answer": "answer_c" 221 | }, 222 | { 223 | "id": "108", 224 | "category": "java", 225 | "level": "normal", 226 | "question": "¿Cuál de estos métodos de la clase String se usa para obtener la longitud del objeto String?", 227 | "answers": { 228 | "answer_a": "SifeOf()", 229 | "answer_b": "get()", 230 | "answer_c": "lengthof()", 231 | "answer_d": "length()" 232 | }, 233 | "correct_answer": "answer_d" 234 | }, 235 | { 236 | "id": "109", 237 | "category": "java", 238 | "level": "normal", 239 | "question": "¿Puedes hacer un constructor \"final\"?", 240 | "answers": { 241 | "answer_a": "Sí", 242 | "answer_b": "Lo podemos hacer \"final\" para la clase heredada solamente", 243 | "answer_c": "No, el constructor no puede ser \"final\"", 244 | "answer_d": "Siempre es \"final\"" 245 | }, 246 | "correct_answer": "answer_c" 247 | }, 248 | { 249 | "id": "110", 250 | "category": "java", 251 | "level": "normal", 252 | "question": "¿Qué sucederá si se elimina el modificador estático de la firma del método principal?", 253 | "answers": { 254 | "answer_a": "La JVM la agregará de nuevo automáticamente", 255 | "answer_b": "El programa no compilará compilaciones y arrojará un error \"NoSuchMethodError\"", 256 | "answer_c": "El programa compilará y se ejecutará sin errores", 257 | "answer_d": "El programa compilará. Pero en tiempo de ejecución arroja un error \"NoSuchMethodError\"" 258 | }, 259 | "correct_answer": "answer_d" 260 | }, 261 | { 262 | "id": "111", 263 | "category": "java", 264 | "level": "facil", 265 | "question": "¿Se hereda un constructor?", 266 | "answers": { 267 | "answer_a": "Se hereda de un método", 268 | "answer_b": "Se hereda de un objeto", 269 | "answer_c": "Sí, el constructor se hereda de otra clase", 270 | "answer_d": "No, el constructor no se hereda" 271 | }, 272 | "correct_answer": "answer_d" 273 | }, 274 | { 275 | "id": "112", 276 | "category": "java", 277 | "level": "normal", 278 | "question": "¿Cuál de estos métodos utilizará para obtener los caracteres ASCII a medida que los escribe un usuario en un campo de texto?", 279 | "answers": { 280 | "answer_a": "keyTyped()", 281 | "answer_b": "keyReleased()", 282 | "answer_c": "keyPressed()", 283 | "answer_d": "keyEntered()" 284 | }, 285 | "correct_answer": "answer_a" 286 | }, 287 | { 288 | "id": "113", 289 | "category": "java", 290 | "level": "facil", 291 | "question": "¿Cuál es el valor predeterminado para una variable local?", 292 | "answers": { 293 | "answer_a": "Depende del tipo de variable", 294 | "answer_b": "null", 295 | "answer_c": "Las variables locales no se inicializan a ningún valor predeterminado", 296 | "answer_d": "Ninguna de las anteriores" 297 | }, 298 | "correct_answer": "answer_c" 299 | }, 300 | { 301 | "id": "114", 302 | "category": "java", 303 | "level": "facil", 304 | "question": "¿Qué método se puede usar para devolver una cadena en letras mayúsculas?", 305 | "answers": { 306 | "answer_a": "toUpperCase()", 307 | "answer_b": "touppercase()", 308 | "answer_c": "upperCase()", 309 | "answer_d": "tuc()" 310 | }, 311 | "correct_answer": "answer_a" 312 | }, 313 | { 314 | "id": "115", 315 | "category": "java", 316 | "level": "normal", 317 | "question": "¿Cuál es la forma correcta de crear un objeto llamado myObj de MyClass?", 318 | "answers": { 319 | "answer_a": "class myObj = new MyClass()", 320 | "answer_b": "MyClass myObj = new MyClass()", 321 | "answer_c": "class MyClass = new myObj()", 322 | "answer_d": "new myObj = MyClass()" 323 | }, 324 | "correct_answer": "answer_b" 325 | }, 326 | { 327 | "id": "116", 328 | "category": "java", 329 | "level": "normal", 330 | "question": "¿Cuál causará un error del compilador?", 331 | "answers": { 332 | "answer_a": "int[ ] scores = {3, 5, 7}", 333 | "answer_b": "int [ ][ ] scores = {2,7,6}, {9,3,45}", 334 | "answer_c": "String cats[ ] = {\"Fluffy\", \"Spot\", \"Zeus\"}", 335 | "answer_d": "boolean results[ ] = new boolean [] {true, false, true}", 336 | "answer_e": "Integer results[ ] = {new Integer(3), new Integer(5), new Integer(8)" 337 | }, 338 | "correct_answer": "answer_b" 339 | }, 340 | { 341 | "id": "117", 342 | "category": "java", 343 | "level": "dificil", 344 | "question": "¿Qué clase de colección le permite acceder a sus elementos asociando una clave con el valor de un elemento y proporciona sincronización?", 345 | "answers": { 346 | "answer_a": "java.util.SortedMap", 347 | "answer_b": "java.util.TreeMap", 348 | "answer_c": "java.util.TreeSet", 349 | "answer_d": "java.util.Hashtable" 350 | }, 351 | "correct_answer": "answer_d" 352 | }, 353 | { 354 | "id": "118", 355 | "category": "java", 356 | "level": "normal", 357 | "question": "¿Cuál de las siguientes producirá una respuesta con el valor más cercano a un double, d, sin ser mayor que d?", 358 | "answers": { 359 | "answer_a": "(int)Math.min(d)", 360 | "answer_b": "(int)Math.max(d)", 361 | "answer_c": "(int)Math.abs(d)", 362 | "answer_d": "(int)Math.floor(d)" 363 | }, 364 | "correct_answer": "answer_d" 365 | }, 366 | { 367 | "id": "119", 368 | "category": "java", 369 | "level": "normal", 370 | "question": "Para que las subclases de cualquier paquete tengan acceso a los miembros de una superclase, ¿cuál es el acceso más restrictivo que cumple este objetivo?", 371 | "answers": { 372 | "answer_a": "public", 373 | "answer_b": "private", 374 | "answer_c": "protected", 375 | "answer_d": "transient" 376 | }, 377 | "correct_answer": "answer_c" 378 | }, 379 | { 380 | "id": "120", 381 | "category": "java", 382 | "level": "dificil", 383 | "question": "¿Cuál contendrá el cuerpo del \"thread\"", 384 | "answers": { 385 | "answer_a": "run()", 386 | "answer_b": "start()", 387 | "answer_c": "stop()", 388 | "answer_d": "main()" 389 | }, 390 | "correct_answer": "answer_a" 391 | }, 392 | { 393 | "id": "317", 394 | "category": "java", 395 | "level": "facil", 396 | "question": "Al implementar la encapsulación, no se puede acceder directamente a las propiedades ___ de la clase a menos que esté escribiendo código dentro de la propia clase.", 397 | "answers": { 398 | "answer_a": "private", 399 | "answer_b": "protected", 400 | "answer_c": "public", 401 | "answer_d": "sin modificador de acceso" 402 | }, 403 | "correct_answer": "answer_a" 404 | }, 405 | { 406 | "id": "318", 407 | "category": "java", 408 | "level": "normal", 409 | "question": "¿Cuál de las siguientes expresiones es la mas fiable para comprobar si dos variables de tipo String son iguales?", 410 | "answers": { 411 | "answer_a": "string1 == string2", 412 | "answer_b": "string1 = string2", 413 | "answer_c": "string1.matches(string2)", 414 | "answer_d": "string1.equals(string2)" 415 | }, 416 | "correct_answer": "answer_d" 417 | }, 418 | { 419 | "id": "319", 420 | "category": "java", 421 | "level": "facil", 422 | "question": "¿Qué tipo de variable mantiene un valor constante una vez asignado?", 423 | "answers": { 424 | "answer_a": "static", 425 | "answer_b": "final", 426 | "answer_c": "private", 427 | "answer_d": "non-static" 428 | }, 429 | "correct_answer": "answer_b" 430 | }, 431 | { 432 | "id": "320", 433 | "category": "java", 434 | "level": "facil", 435 | "question": "¿Qué palabra clave permite llamar al constructor de una clase padre?", 436 | "answers": { 437 | "answer_a": "parent", 438 | "answer_b": "this", 439 | "answer_c": "super", 440 | "answer_d": "new" 441 | }, 442 | "correct_answer": "answer_c" 443 | }, 444 | { 445 | "id": "321", 446 | "category": "java", 447 | "level": "facil", 448 | "question": "¿Qué palabra clave permite utilizar una interfaz?", 449 | "answers": { 450 | "answer_a": "implements", 451 | "answer_b": "extends", 452 | "answer_c": "inherits", 453 | "answer_d": "import" 454 | }, 455 | "correct_answer": "answer_a" 456 | } 457 | ] 458 | -------------------------------------------------------------------------------- /server/database/quizzes/javascript.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": "61", 4 | "category": "javascript", 5 | "level": "facil", 6 | "question": "¿JavasScript distingue entre mayúsculas y minúsculas?", 7 | "answers": { 8 | "answer_a": "Verdadero", 9 | "answer_b": "Falso" 10 | }, 11 | "correct_answer": "answer_a", 12 | "feedback": "JavaScript distingue entre mayúsculas y minúsculas (es case-sensitive) y utiliza el conjunto de caracteres Unicode. Por ejemplo, la palabra «Früh» (que significa 'temprano' en Alemán) se podría usar como el nombre de una variable." 13 | }, 14 | { 15 | "id": "62", 16 | "category": "javascript", 17 | "level": "dificil", 18 | "question": "¿Qué palabra está relacionada con la herencia de clase?", 19 | "answers": { 20 | "answer_a": "expands", 21 | "answer_b": "exports", 22 | "answer_c": "extends" 23 | }, 24 | "correct_answer": "answer_c", 25 | "feedback": "Para heredar de otra clase se utiliza 'extends' como palabra clave. La herencia de clase es el modo para que una clase extienda a otra. De esta manera podemos añadir nueva funcionalidad a la clase ya existente." 26 | }, 27 | { 28 | "id": "63", 29 | "category": "javascript", 30 | "level": "normal", 31 | "question": "¿Qué controlador de eventos se utiliza para procesar el evento de clic?", 32 | "answers": { 33 | "answer_a": "onmouseclick", 34 | "answer_b": "onclick", 35 | "answer_c": "onkeydown" 36 | }, 37 | "correct_answer": "answer_b", 38 | "feedback": "El evento onclick en JavaScript te permite ejecutar una función cuando se hace clic en un elemento." 39 | }, 40 | { 41 | "id": "64", 42 | "category": "javascript", 43 | "level": "dificil", 44 | "question": "¿Cuál de estos métodos combina dos cadenas?", 45 | "answers": { 46 | "answer_a": "attach()", 47 | "answer_b": "append()", 48 | "answer_c": "concat()" 49 | }, 50 | "correct_answer": "answer_c", 51 | "feedback": "El método concat() combina dos o más cadenas de texto y devuelve una cadena de texto nueva." 52 | }, 53 | { 54 | "id": "65", 55 | "category": "javascript", 56 | "level": "normal", 57 | "question": "¿Cuál es el método para agregar elementos al comienzo de un array?", 58 | "answers": { 59 | "answer_a": "push()", 60 | "answer_b": "unshift()", 61 | "answer_c": "pop()" 62 | }, 63 | "correct_answer": "answer_b", 64 | "feedback": "El método unshift() agrega uno o más elementos al inicio del array, y devuelve la nueva longitud del array." 65 | }, 66 | { 67 | "id": "66", 68 | "category": "javascript", 69 | "level": "facil", 70 | "question": "¿Cómo insertar un comentario que tiene más de una línea?", 71 | "answers": { 72 | "answer_a": "/*Este comentario tiene más de una línea.*/", 73 | "answer_b": "<!--Este comentario tiene más de una línea.-->", 74 | "answer_c": "//Este comentario tiene más de una línea.//" 75 | }, 76 | "correct_answer": "answer_a", 77 | "feedback": " Los comentarios comienzan con /* y terminan con */ . Cualquier texto entre /* y */ serán ignorados por JavaScript." 78 | }, 79 | { 80 | "id": "67", 81 | "category": "javascript", 82 | "level": "dificil", 83 | "question": "¿Quién creó el lenguaje de programación JavaScript?", 84 | "answers": { 85 | "answer_a": "Tim Berners-Lee", 86 | "answer_b": "Brendan Eich", 87 | "answer_c": "James Gosling" 88 | }, 89 | "correct_answer": "answer_b", 90 | "feedback": "JavaScript fue desarrollado originalmente por Brendan Eich de Netscape con el nombre de Mocha, el cual fue renombrado posteriormente a LiveScript, para finalmente quedar como JavaScript." 91 | }, 92 | { 93 | "id": "68", 94 | "category": "javascript", 95 | "level": "dificil", 96 | "question": "Si proporciona solo un parámetro como un valor entero para el objeto Date, ¿se tratará como milisegundos?", 97 | "answers": { 98 | "answer_a": "Verdadero", 99 | "answer_b": "Falso" 100 | }, 101 | "correct_answer": "answer_a", 102 | "feedback": "Los objetos Date representan en JavaScript un momento fijo en el tiempo en un formato independiente. El objeto Date contiene un Number que representa los milisegundos transcurridos desde el 1 de Enero de 1970 UTC." 103 | }, 104 | { 105 | "id": "69", 106 | "category": "javascript", 107 | "level": "dificil", 108 | "question": "¿Cuál es el equivalente para el operador **?", 109 | "answers": { 110 | "answer_a": "Math.sqrt", 111 | "answer_b": "Math.pow", 112 | "answer_c": "Math.trunc" 113 | }, 114 | "correct_answer": "answer_b", 115 | "feedback": "La función Math.pow() devuelve la base elevada al exponente." 116 | }, 117 | { 118 | "id": "70", 119 | "category": "javascript", 120 | "level": "normal", 121 | "question": "console.log(3 > 2 > 1 === false) ... ¿Cuál es la salida de la consola?", 122 | "answers": { 123 | "answer_a": "true", 124 | "answer_b": "false" 125 | }, 126 | "correct_answer": "answer_a", 127 | "feedback": "Arroja true porque 3 > 2 es igual a true, entonces true > 1 es igual a false porque true no es mayor que 1. Por consiguiente false es igual a false, esta condición es true." 128 | }, 129 | { 130 | "id": "71", 131 | "category": "javascript", 132 | "level": "facil", 133 | "question": "¿Cuáles de estos pares de declaraciones se usan comúnmente para el manejo de errores?", 134 | "answers": { 135 | "answer_a": "err/res", 136 | "answer_b": "try/catch", 137 | "answer_c": "check/return" 138 | }, 139 | "correct_answer": "answer_b", 140 | "feedback": "La declaración try...catch señala un bloque de instrucciones a intentar (try), y especifica una respuesta si se produce una excepción (catch)." 141 | }, 142 | { 143 | "id": "72", 144 | "category": "javascript", 145 | "level": "dificil", 146 | "question": "¿Cuál de estos métodos modificadores de eventos se proporciona de forma predeterminada?", 147 | "answers": { 148 | "answer_a": "event.preventDefault()", 149 | "answer_b": "event.stopPropagation()", 150 | "answer_c": "Los dos" 151 | }, 152 | "correct_answer": "answer_c", 153 | "feedback": "Ambos métodos son accesibles sin instalar paquetes adicionales." 154 | }, 155 | { 156 | "id": "73", 157 | "category": "javascript", 158 | "level": "dificil", 159 | "question": "¿Qué método se usa para devolver la posición de la primera aparición de un texto específico en un 'string'?", 160 | "answers": { 161 | "answer_a": "pos()", 162 | "answer_b": "position()", 163 | "answer_c": "indexOf()" 164 | }, 165 | "correct_answer": "answer_c", 166 | "feedback": "Los otros métodos no existen en JavaScript. pos() pertenece al lenguaje PHP." 167 | }, 168 | { 169 | "id": "74", 170 | "category": "javascript", 171 | "level": "dificil", 172 | "question": "console.log(0.2 + 0.1); ... ¿Cuál es la salida de la consola?", 173 | "answers": { 174 | "answer_a": "0.3", 175 | "answer_b": "0.31", 176 | "answer_c": "0.30000000000000004" 177 | }, 178 | "correct_answer": "answer_c", 179 | "feedback": "Los ordenadores almacenan los números en binario, por lo que al volver a pasar a decimal se producen inexactitudes como esta." 180 | }, 181 | { 182 | "id": "75", 183 | "category": "javascript", 184 | "level": "facil", 185 | "question": "¿Cómo llamas a una función ya creada llamada 'ejemplo'?", 186 | "answers": { 187 | "answer_a": "ejemplo()", 188 | "answer_b": "function ejemplo()", 189 | "answer_c": "execute function ejemplo()" 190 | }, 191 | "correct_answer": "answer_a", 192 | "feedback": "La palabra 'function' es exclusiva de la definición de la función, no se usa en la llamada. Execute no existe en JavaScript." 193 | }, 194 | { 195 | "id": "76", 196 | "category": "javascript", 197 | "level": "dificil", 198 | "question": "El método getMonth() en el objeto Date devuelve el mes como...?", 199 | "answers": { 200 | "answer_a": "Un string", 201 | "answer_b": "Un integer", 202 | "answer_c": "Un objeto" 203 | }, 204 | "correct_answer": "answer_b", 205 | "feedback": "Devuelve un entero entre 0 y 11 correspondiente con la hora local." 206 | }, 207 | { 208 | "id": "77", 209 | "category": "javascript", 210 | "level": "normal", 211 | "question": "¿Que es el 'hoisting'?", 212 | "answers": { 213 | "answer_a": "Comportamiento predeterminado de mover declaraciones a la parte superior", 214 | "answer_b": "Eliminación automática de variables no utilizadas en todo el código" 215 | }, 216 | "correct_answer": "answer_a", 217 | "feedback": "Esto permite a JavaScript acceder a variables aunque estén creadas líneas más abajo." 218 | }, 219 | { 220 | "id": "78", 221 | "category": "javascript", 222 | "level": "facil", 223 | "question": "¿Cuál es la forma correcta de incluir un archivo JavaScript externo en HTML?", 224 | "answers": { 225 | "answer_a": "<script src=\"main.js\">", 226 | "answer_b": "<script href=\"main.js\">", 227 | "answer_c": "<script name=\"main.js\">" 228 | }, 229 | "correct_answer": "answer_a", 230 | "feedback": "La etiqueta HTML <script></script> solo puede utilizar el atributo 'src', 'href' es usado en enlaces con etiqueta <a></a>." 231 | }, 232 | { 233 | "id": "79", 234 | "category": "javascript", 235 | "level": "facil", 236 | "question": "<p id=\"demo\">My awesome text</p> ... ¿Cuál es la sintaxis JavaScript correcta para cambiar el contenido?", 237 | "answers": { 238 | "answer_a": "#demo.innerHTML = \"Edited!\"", 239 | "answer_b": "document.getElementById(\"demo\").innerHTML = \"Edited!\"", 240 | "answer_c": "document.getElementByName(\"p\").innerHTML = \"Edited!\"" 241 | }, 242 | "correct_answer": "answer_b", 243 | "feedback": "Al definir un id en el elemento podemos seleccionarlo fácilmente con 'getElementById'. # es un selector por id de CSS y 'getElementByName' no existe." 244 | }, 245 | { 246 | "id": "80", 247 | "category": "javascript", 248 | "level": "normal", 249 | "question": "¿Cuál de las siguientes opciones no es un tipo de bucle?", 250 | "answers": { 251 | "answer_a": "do/while", 252 | "answer_b": "for/in", 253 | "answer_c": "if/then" 254 | }, 255 | "correct_answer": "answer_c", 256 | "feedback": "La expresión if/then solo se lee una vez, sin embargo do/while se ejecutará mientras la condición del while se cumpla. Por su parte for/in se ejecuta por tantas propiedades tenga el objeto o por tantos elementos tenga el array, dependiendo de lo que le pasemos." 257 | }, 258 | { 259 | "id": "81", 260 | "category": "javascript", 261 | "level": "facil", 262 | "question": "¿Cuál es el método correcto para transformar un texto a minúsculas?", 263 | "answers": { 264 | "answer_a": "lowerCase()", 265 | "answer_b": "toLowerCase()", 266 | "answer_c": "toLocaleLowerCase()" 267 | }, 268 | "correct_answer": "answer_b", 269 | "feedback": "Los demás métodos nombrados no existen en JavaScript." 270 | }, 271 | { 272 | "id": "82", 273 | "category": "javascript", 274 | "level": "dificil", 275 | "question": "¿Cuál es el método correcto para obtener el valor mínimo de los valores?", 276 | "answers": { 277 | "answer_a": "Math.min(xy)", 278 | "answer_b": "Math.min(x, y)", 279 | "answer_c": "Math(min(xy))", 280 | "answer_d": "Math(min(x, y))" 281 | }, 282 | "correct_answer": "answer_b", 283 | "feedback": "Ya que min() es un método estático de Math, siempre debe usarse como Math.min(), en lugar de como un método de un objeto Math instanciado (Math no es un constructor)." 284 | }, 285 | { 286 | "id": "83", 287 | "category": "javascript", 288 | "level": "facil", 289 | "question": "¿Cuál es un carácter no válido para iniciar un nombre de variable?", 290 | "answers": { 291 | "answer_a": "$", 292 | "answer_b": "_", 293 | "answer_c": "Cualquier número" 294 | }, 295 | "correct_answer": "answer_c", 296 | "feedback": "El nombre de la variable no puede empezar por un número o carácter especial, debe empezar por una letra (Aa-Zz), un subrayado (_) o el signo de dólar ($)." 297 | }, 298 | { 299 | "id": "84", 300 | "category": "javascript", 301 | "level": "facil", 302 | "question": "¿Cuál es una forma válida de crear un 'array'?", 303 | "answers": { 304 | "answer_a": "let arr = {a,b,c}", 305 | "answer_b": "let arr = a,b,c", 306 | "answer_c": "let arr = [a,b,c]" 307 | }, 308 | "correct_answer": "answer_c", 309 | "feedback": "Los arrays deben ir entre corchetes [ ]." 310 | }, 311 | { 312 | "id": "85", 313 | "category": "javascript", 314 | "level": "facil", 315 | "question": "¿Cuál es una forma válida de crear un objeto?", 316 | "answers": { 317 | "answer_a": "let obj = {a:1, b:2, c:3}", 318 | "answer_b": "let obj = a:1, b:2, c:3", 319 | "answer_c": "let obj = [a:1, b:2, c:3]" 320 | }, 321 | "correct_answer": "answer_a", 322 | "feedback": "Los objetos deben ir entre llaves { }." 323 | }, 324 | { 325 | "id": "86", 326 | "category": "javascript", 327 | "level": "normal", 328 | "question": "¿Cuál es el valor de una variable declarada sin valor?", 329 | "answers": { 330 | "answer_a": "null", 331 | "answer_b": "undefined", 332 | "answer_c": "NaN" 333 | }, 334 | "correct_answer": "answer_b", 335 | "feedback": "Una variable declarada sin asignarle un valor inicial tiene el valor 'undefined'." 336 | }, 337 | { 338 | "id": "87", 339 | "category": "javascript", 340 | "level": "normal", 341 | "question": "¿Cuál es la sintaxis correcta para 'no es igual'?", 342 | "answers": { 343 | "answer_a": "!==", 344 | "answer_b": "==!" 345 | }, 346 | "correct_answer": "answer_a", 347 | "feedback": "Una exclamación seguida por dos iguales es la forma correcta de expresar 'no es igual'." 348 | }, 349 | { 350 | "id": "88", 351 | "category": "javascript", 352 | "level": "normal", 353 | "question": "console.log(10 + \"5\") ... ¿Cuál es la salida de la consola?", 354 | "answers": { 355 | "answer_a": "105", 356 | "answer_b": "'15'", 357 | "answer_c": "SyntaxError" 358 | }, 359 | "correct_answer": "answer_a", 360 | "feedback": "Al ser de tipo String uno de los operandos se produce una concatenación." 361 | }, 362 | { 363 | "id": "89", 364 | "category": "javascript", 365 | "level": "facil", 366 | "question": "const person = {name:\"John\", age:31, city:\"New York\"};... ¿cuál es la forma correcta de acceder a los valores?", 367 | "answers": { 368 | "answer_a": "person.name", 369 | "answer_b": "person[\"name\"]", 370 | "answer_c": "Ambas son correctas" 371 | }, 372 | "correct_answer": "answer_c", 373 | "feedback": "Se puede utilizar cualquiera de las dos maneras." 374 | }, 375 | { 376 | "id": "90", 377 | "category": "javascript", 378 | "level": "normal", 379 | "question": "Los scripts se pueden colocar en la sección <body>, o en la <head> de una página HTML, o en ambas.", 380 | "answers": { 381 | "answer_a": "Verdadero", 382 | "answer_b": "Falso" 383 | }, 384 | "correct_answer": "answer_a", 385 | "feedback": "Aunque lo recomendable es ponerlo al final del body para que JavaScript sea lo último que cargue, haciendo más eficiente la web." 386 | }, 387 | { 388 | "id": "322", 389 | "category": "javascript", 390 | "level": "normal", 391 | "question": "Cuál es el resultado de ejecutar: console.log(typeof 42);", 392 | "answers": { 393 | "answer_a": "float", 394 | "answer_b": "object", 395 | "answer_c": "number", 396 | "answer_d": "integer" 397 | }, 398 | "correct_answer": "answer_c" 399 | }, 400 | { 401 | "id": "323", 402 | "category": "javascript", 403 | "level": "normal", 404 | "question": "¿Qué método convierte los datos JSON en un objeto JavaScript?", 405 | "answers": { 406 | "answer_a": "JSON.fromString();", 407 | "answer_b": "JSON.parse()", 408 | "answer_c": "JSON.toObject()", 409 | "answer_d": "JSON.stringify()" 410 | }, 411 | "correct_answer": "answer_b" 412 | }, 413 | { 414 | "id": "324", 415 | "category": "javascript", 416 | "level": "facil", 417 | "question": "¿Cómo se añade un comentario en JavaScript?", 418 | "answers": { 419 | "answer_a": "! Esto es un comentario", 420 | "answer_b": "# Esto es un comentario", 421 | "answer_c": "< Esto es un comentario >", 422 | "answer_d": "// Esto es un comentario" 423 | }, 424 | "correct_answer": "answer_d" 425 | }, 426 | { 427 | "id": "325", 428 | "category": "javascript", 429 | "level": "facil", 430 | "question": "¿Qué sentencia puede tomar una sola expresión como entrada y luego buscar a través de un número de opciones hasta que se encuentre una que coincida con ese valor?", 431 | "answers": { 432 | "answer_a": "else", 433 | "answer_b": "when", 434 | "answer_c": "switch", 435 | "answer_d": "if" 436 | }, 437 | "correct_answer": "answer_c" 438 | }, 439 | { 440 | "id": "326", 441 | "category": "javascript", 442 | "level": "facil", 443 | "question": "¿Qué opción no es un método de arrays?", 444 | "answers": { 445 | "answer_a": ".slice()", 446 | "answer_b": ".shift()", 447 | "answer_c": ".push()", 448 | "answer_d": ".replace()" 449 | }, 450 | "correct_answer": "answer_d" 451 | }, 452 | { 453 | "id": "356", 454 | "category": "javascript", 455 | "level": "dificil", 456 | "question": "¿Qué función tiene el event loop?", 457 | "answers": { 458 | "answer_a": "Es responsable de compilar el código, recopilar y procesar eventos y ejecutar subtareas en cola", 459 | "answer_b": "Es responsable de revisar el código, recopilar y procesar eventos y ejecutar tareas en cola", 460 | "answer_c": "Es responsable de ejecutar el código, recopilar y procesar eventos y ejecutar subtareas en cola" 461 | }, 462 | "correct_answer": "answer_c" 463 | }, 464 | { 465 | "id": "357", 466 | "category": "javascript", 467 | "level": "dificil", 468 | "question": "¿Cuál es la definición de Clousure?", 469 | "answers": { 470 | "answer_a": "Es la combinación de una función agrupada (encerrada) con referencias a su estado circundante (el entorno disléxico)", 471 | "answer_b": "Es la combinación de una función desagrupada (encerrada) con referencias a su estado circundante (el entorno léxico)", 472 | "answer_c": "Es la combinación de una función agrupada (encerrada) con referencias a su estado circundante (el entorno léxico)" 473 | }, 474 | "correct_answer": "answer_c" 475 | }, 476 | { 477 | "id": "358", 478 | "category": "javascript", 479 | "level": "facil", 480 | "question": "¿Qué método de la API del navegador se utiliza para hacer una petición HTTP de forma nativa?", 481 | "answers": { 482 | "answer_a": "fetch(\"https://some-url-here.com\")", 483 | "answer_b": "axios.get(\"https://some-url-here.com\")", 484 | "answer_c": "makeRequest(\"https://some-url-here.com\")" 485 | }, 486 | "correct_answer": "answer_a" 487 | }, 488 | { 489 | "id": "360", 490 | "category": "javascript", 491 | "level": "normal", 492 | "question": "¿Qué método de array devuelve un nuevo objeto iterable iterador?", 493 | "answers": { 494 | "answer_a": "sort()", 495 | "answer_b": "values()", 496 | "answer_c": "entries()", 497 | "answer_d": "concat()" 498 | }, 499 | "correct_answer": "answer_b", 500 | "feedback": "El método values() devuelve un nuevo objeto Array Iterator que contiene los valores para cada índice del array." 501 | }, 502 | { 503 | "id": "361", 504 | "category": "javascript", 505 | "level": "dificil", 506 | "question": "¿Qué métodos aceptan un iterable de promesas y devuelven un único array de resultados?", 507 | "answers": { 508 | "answer_a": "Promise.reject() y Promise.resolve()", 509 | "answer_b": "Promise.reject() and Promise.all()", 510 | "answer_c": "Promise.all() and Promise.allSettled()", 511 | "answer_d": "Promise.any() and Promise.all()" 512 | }, 513 | "correct_answer": "answer_c" 514 | } 515 | ] 516 | -------------------------------------------------------------------------------- /server/database/quizzes/kotlin.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": "171", 4 | "category": "kotlin", 5 | "level": "facil", 6 | "question": "¿Qué palabra clave se usa para definir una función?", 7 | "answers": { 8 | "answer_a": "main", 9 | "answer_b": "fun", 10 | "answer_c": "function", 11 | "answer_d": "new" 12 | }, 13 | "correct_answer": "answer_b" 14 | }, 15 | { 16 | "id": "172", 17 | "category": "kotlin", 18 | "level": "facil", 19 | "question": "En Kotlin, se debe definir al menos una función main().", 20 | "answers": { 21 | "answer_a": "Verdadero", 22 | "answer_b": "Falso" 23 | }, 24 | "correct_answer": "answer_a" 25 | }, 26 | { 27 | "id": "173", 28 | "category": "kotlin", 29 | "level": "facil", 30 | "question": "En Kotlin, println y la función print hacen lo mismo.", 31 | "answers": { 32 | "answer_a": "Verdadero", 33 | "answer_b": "Falso" 34 | }, 35 | "correct_answer": "answer_b" 36 | }, 37 | { 38 | "id": "174", 39 | "category": "kotlin", 40 | "level": "facil", 41 | "question": "No se puede restablecer el valor de una variable \"val\".", 42 | "answers": { 43 | "answer_a": "Verdadero", 44 | "answer_b": "Falso" 45 | }, 46 | "correct_answer": "answer_a" 47 | }, 48 | { 49 | "id": "175", 50 | "category": "kotlin", 51 | "level": "facil", 52 | "question": "Kotlin es desarrollado por:", 53 | "answers": { 54 | "answer_a": "Google", 55 | "answer_b": "IBM", 56 | "answer_c": "Sun Systems", 57 | "answer_d": "JetBrains" 58 | }, 59 | "correct_answer": "answer_d" 60 | }, 61 | { 62 | "id": "176", 63 | "category": "kotlin", 64 | "level": "facil", 65 | "question": "¿Cuál de las siguientes extensiones se usa para crear un archivo Kotlin?", 66 | "answers": { 67 | "answer_a": ".ko", 68 | "answer_b": ".kt", 69 | "answer_c": ".jv", 70 | "answer_d": ".app" 71 | }, 72 | "correct_answer": "answer_b" 73 | }, 74 | { 75 | "id": "177", 76 | "category": "kotlin", 77 | "level": "facil", 78 | "question": "¿Cómo se hacen los comentarios en Kotlin?", 79 | "answers": { 80 | "answer_a": "// Esto es un comentario", 81 | "answer_b": "*/ Esto es un comentario", 82 | "answer_c": "# Esto es un comentario", 83 | "answer_d": "<!-- Esto es un comentario -->" 84 | }, 85 | "correct_answer": "answer_a" 86 | }, 87 | { 88 | "id": "178", 89 | "category": "kotlin", 90 | "level": "facil", 91 | "question": "¿Podemos usar Kotlin en el lenguaje de programación Java?", 92 | "answers": { 93 | "answer_a": "Sí", 94 | "answer_b": "No" 95 | }, 96 | "correct_answer": "answer_a" 97 | }, 98 | { 99 | "id": "179", 100 | "category": "kotlin", 101 | "level": "facil", 102 | "question": "¿Cuántos tipos de constructores hay disponibles en Kotlin?", 103 | "answers": { 104 | "answer_a": "1", 105 | "answer_b": "2", 106 | "answer_c": "3", 107 | "answer_d": "4" 108 | }, 109 | "correct_answer": "answer_b" 110 | }, 111 | { 112 | "id": "180", 113 | "category": "kotlin", 114 | "level": "facil", 115 | "question": "¿Cómo se crea una instancia de clase?", 116 | "answers": { 117 | "answer_a": "val person = new Person()", 118 | "answer_b": "val person = obj Person()", 119 | "answer_c": "val person = Person()", 120 | "answer_d": "val person = instace of Person()" 121 | }, 122 | "correct_answer": "answer_c" 123 | }, 124 | { 125 | "id": "181", 126 | "category": "kotlin", 127 | "level": "facil", 128 | "question": "La visibilidad predeterminada de una clase en Kotlin es:", 129 | "answers": { 130 | "answer_a": "public", 131 | "answer_b": "private", 132 | "answer_c": "protected", 133 | "answer_d": "internal" 134 | }, 135 | "correct_answer": "answer_a" 136 | }, 137 | { 138 | "id": "182", 139 | "category": "kotlin", 140 | "level": "facil", 141 | "question": "¿Puedes ejecutar código Kotlin sin JVM?", 142 | "answers": { 143 | "answer_a": "Verdadero", 144 | "answer_b": "Falso" 145 | }, 146 | "correct_answer": "answer_a" 147 | }, 148 | { 149 | "id": "183", 150 | "category": "kotlin", 151 | "level": "normal", 152 | "question": "¿Cuál de las siguientes se usa para manejar excepciones nulas?", 153 | "answers": { 154 | "answer_a": "Lambda Function", 155 | "answer_b": "Range", 156 | "answer_c": "Sealed Class", 157 | "answer_d": "Elvis operator" 158 | }, 159 | "correct_answer": "answer_d" 160 | }, 161 | { 162 | "id": "184", 163 | "category": "kotlin", 164 | "level": "facil", 165 | "question": "¿Cuál de los siguientes no es un tipo de datos básico en Kotlin?", 166 | "answers": { 167 | "answer_a": "Array", 168 | "answer_b": "List", 169 | "answer_c": "String", 170 | "answer_d": "Character" 171 | }, 172 | "correct_answer": "answer_b" 173 | }, 174 | { 175 | "id": "185", 176 | "category": "kotlin", 177 | "level": "facil", 178 | "question": "El lenguaje Kotlin es:", 179 | "answers": { 180 | "answer_a": "OOP", 181 | "answer_b": "Procedural Programming", 182 | "answer_c": "Las dos anteriores", 183 | "answer_d": "Ninguna de las anteriores" 184 | }, 185 | "correct_answer": "answer_c" 186 | }, 187 | { 188 | "id": "186", 189 | "category": "kotlin", 190 | "level": "facil", 191 | "question": "Kotlin se puede utilizar en desarrollo web.", 192 | "answers": { 193 | "answer_a": "Verdadero", 194 | "answer_b": "Falso" 195 | }, 196 | "correct_answer": "answer_a" 197 | }, 198 | { 199 | "id": "187", 200 | "category": "kotlin", 201 | "level": "normal", 202 | "question": "¿Cuál de las siguientes no es una palabra clave reservada en Kotlin?", 203 | "answers": { 204 | "answer_a": "super", 205 | "answer_b": "package", 206 | "answer_c": "static", 207 | "answer_d": "dynamic" 208 | }, 209 | "correct_answer": "answer_c" 210 | }, 211 | { 212 | "id": "188", 213 | "category": "kotlin", 214 | "level": "facil", 215 | "question": "En Kotlin, la especificación del paquete debe realizarse:", 216 | "answers": { 217 | "answer_a": "Al inicio del archivo", 218 | "answer_b": "Al final del archivo", 219 | "answer_c": "En cualquier sitio del archivo" 220 | }, 221 | "correct_answer": "answer_a" 222 | }, 223 | { 224 | "id": "189", 225 | "category": "kotlin", 226 | "level": "facil", 227 | "question": "En Kotlin un programa comienza a ejecutarse desde:", 228 | "answers": { 229 | "answer_a": "Parte superior del archivo", 230 | "answer_b": "Primera clase del archivo", 231 | "answer_c": "Desde el método main", 232 | "answer_d": "Ninguna de las anteriores" 233 | }, 234 | "correct_answer": "answer_c" 235 | }, 236 | { 237 | "id": "190", 238 | "category": "kotlin", 239 | "level": "normal", 240 | "question": "En Kotlin, la herencia entre clases se declara mediante un símbolo:", 241 | "answers": { 242 | "answer_a": "?", 243 | "answer_b": ":", 244 | "answer_c": "\"\"", 245 | "answer_d": "()" 246 | }, 247 | "correct_answer": "answer_b" 248 | }, 249 | { 250 | "id": "362", 251 | "category": "kotlin", 252 | "level": "normal", 253 | "question": "Puede mostrar u ocultar una vista en su aplicación configurando su visibilidad. ¿Cuáles de los siguientes son valores de visibilidad válidos?", 254 | "answers": { 255 | "answer_a": "Visible", 256 | "answer_b": "Clear", 257 | "answer_c": "None" 258 | }, 259 | "correct_answer": "answer_a" 260 | }, 261 | { 262 | "id": "363", 263 | "category": "kotlin", 264 | "level": "normal", 265 | "question": "¿Qué parámetro especifica el nivel de la API de Android que debe usar Gradle para compilar su aplicación?", 266 | "answers": { 267 | "answer_a": "minSdkVersion", 268 | "answer_b": "compileSdkVersion", 269 | "answer_c": "targetSdkVersion", 270 | "answer_d": "testSdkVersion" 271 | }, 272 | "correct_answer": "answer_b" 273 | }, 274 | { 275 | "id": "364", 276 | "category": "kotlin", 277 | "level": "normal", 278 | "question": "_______ es una forma de restringir el acceso directo a algunos de los campos de un objeto.", 279 | "answers": { 280 | "answer_a": "LiveData", 281 | "answer_b": "Encapsulation", 282 | "answer_c": "Target" 283 | }, 284 | "correct_answer": "answer_b" 285 | }, 286 | { 287 | "id": "365", 288 | "category": "kotlin", 289 | "level": "normal", 290 | "question": "¿Cuáles de los siguientes es un método de los ciclos de vida de activity y fragment?", 291 | "answers": { 292 | "answer_a": "onDraw()", 293 | "answer_b": "onCreate()", 294 | "answer_c": "onClick()" 295 | }, 296 | "correct_answer": "answer_b" 297 | }, 298 | { 299 | "id": "242", 300 | "category": "kotlin", 301 | "level": "dificil", 302 | "question": "¿Cuál es la forma correcta de crear un arraylist en Kotlin?", 303 | "answers": { 304 | "answer_a": "val map = hashMapOf(1 to 'one', 2 to 'two', 3 to 'three')", 305 | "answer_b": "enum class Color {RED, GREEN, BLUE}", 306 | "answer_c": "val list = arrayListOf(1, 2, 3)", 307 | "answer_d": "val set = hashSetOf(1, 2, 3)" 308 | }, 309 | "correct_answer": "answer_c" 310 | } 311 | ] 312 | -------------------------------------------------------------------------------- /server/database/quizzes/php.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": "327", 4 | "category": "php", 5 | "level": "facil", 6 | "question": "¿Cómo NO se insertan comentarios de una línea en el código en PHP?", 7 | "answers": { 8 | "answer_a": "// Esto es un comentario", 9 | "answer_b": "# Esto es un comentario", 10 | "answer_c": "<!-- Esto es un comentario -->" 11 | }, 12 | "correct_answer": "answer_c" 13 | }, 14 | { 15 | "id": "328", 16 | "category": "php", 17 | "level": "facil", 18 | "question": "¿Cómo se insertan comentarios multilínea en el código en PHP?", 19 | "answers": { 20 | "answer_a": "// Esto es un comentario", 21 | "answer_b": "/* Esto es un comentario */", 22 | "answer_c": "# Esto es un comentario" 23 | }, 24 | "correct_answer": "answer_b" 25 | }, 26 | { 27 | "id": "329", 28 | "category": "php", 29 | "level": "facil", 30 | "question": "¿Cómo llamar a la función `listarProductos` en PHP?", 31 | "answers": { 32 | "answer_a": "listarProductos()", 33 | "answer_b": "function listarProductos()", 34 | "answer_c": "$this->listarProductos()" 35 | }, 36 | "correct_answer": "answer_a" 37 | }, 38 | { 39 | "id": "330", 40 | "category": "php", 41 | "level": "facil", 42 | "question": "¿Cómo se declara un `for` de productos en PHP?", 43 | "answers": { 44 | "answer_a": "for(producto in productos)", 45 | "answer_b": "for($i = 1; $i <= 0; $i++)", 46 | "answer_c": "for producto in productos:" 47 | }, 48 | "correct_answer": "answer_b" 49 | }, 50 | { 51 | "id": "331", 52 | "category": "php", 53 | "level": "facil", 54 | "question": "¿Cómo se declara una variable en PHP?", 55 | "answers": { 56 | "answer_a": "let variable = 1", 57 | "answer_b": "variable = 1", 58 | "answer_c": "$variable = 1" 59 | }, 60 | "correct_answer": "answer_c" 61 | }, 62 | { 63 | "id": "332", 64 | "category": "php", 65 | "level": "facil", 66 | "question": "¿Cómo se concatenan strings en PHP?", 67 | "answers": { 68 | "answer_a": "$string1 . $string2", 69 | "answer_b": "$string1 + $string2", 70 | "answer_c": "concat($string1, $string2)" 71 | }, 72 | "correct_answer": "answer_a" 73 | }, 74 | { 75 | "id": "333", 76 | "category": "php", 77 | "level": "facil", 78 | "question": "¿Cómo se declara un if en PHP?", 79 | "answers": { 80 | "answer_a": "if x > y then:", 81 | "answer_b": "if (x > y)", 82 | "answer_c": "if x > y:" 83 | }, 84 | "correct_answer": "answer_b" 85 | }, 86 | { 87 | "id": "334", 88 | "category": "php", 89 | "level": "facil", 90 | "question": "¿Cómo se declara un while en PHP?", 91 | "answers": { 92 | "answer_a": "x > y while {", 93 | "answer_b": "while x > y:", 94 | "answer_c": "while (x > y)" 95 | }, 96 | "correct_answer": "answer_c" 97 | }, 98 | { 99 | "id": "335", 100 | "category": "php", 101 | "level": "facil", 102 | "question": "¿Qué método se puede usar para transformar todo un string en mayúsculas en PHP?", 103 | "answers": { 104 | "answer_a": "strtoupper($string)", 105 | "answer_b": "strtolower($string)", 106 | "answer_c": "ucwords($string)" 107 | }, 108 | "correct_answer": "answer_a" 109 | }, 110 | { 111 | "id": "336", 112 | "category": "php", 113 | "level": "facil", 114 | "question": "¿Cómo declarar una función en PHP?", 115 | "answers": { 116 | "answer_a": "function myFunction = () => {}", 117 | "answer_b": "function myFunction(){}", 118 | "answer_c": "const myFunction(){}" 119 | }, 120 | "correct_answer": "answer_b" 121 | }, 122 | { 123 | "id": "337", 124 | "category": "php", 125 | "level": "normal", 126 | "question": "¿Cómo reemplazar los espacios en blanco en PHP?", 127 | "answers": { 128 | "answer_a": "split(\"texto a sacar espacios\")", 129 | "answer_b": "trim(\"texto a sacar espacios\")", 130 | "answer_c": "str_replace(\" \", \"\", \"texto a sacar espacios\")" 131 | }, 132 | "correct_answer": "answer_c" 133 | }, 134 | { 135 | "id": "338", 136 | "category": "php", 137 | "level": "normal", 138 | "question": "¿Con qué framework se puede trabaja en PHP?", 139 | "answers": { 140 | "answer_a": "Spring", 141 | "answer_b": "Codeigniter", 142 | "answer_c": "Express" 143 | }, 144 | "correct_answer": "answer_b" 145 | }, 146 | { 147 | "id": "339", 148 | "category": "php", 149 | "level": "normal", 150 | "question": "¿Cómo obtener la cantidad de elementos en un array en PHP?", 151 | "answers": { 152 | "answer_a": "count($array)", 153 | "answer_b": "$array.length()", 154 | "answer_c": "$array.count()" 155 | }, 156 | "correct_answer": "answer_a" 157 | }, 158 | { 159 | "id": "340", 160 | "category": "php", 161 | "level": "normal", 162 | "question": "¿Cuál de estas variables está declarada de forma incorrecta en PHP?", 163 | "answers": { 164 | "answer_a": "$_4variable", 165 | "answer_b": "$4variable", 166 | "answer_c": "$ABC" 167 | }, 168 | "correct_answer": "answer_b" 169 | }, 170 | { 171 | "id": "341", 172 | "category": "php", 173 | "level": "normal", 174 | "question": "¿Qué valor tiene una variable declarada sin valor en PHP?", 175 | "answers": { 176 | "answer_a": "undefined", 177 | "answer_b": "NaN", 178 | "answer_c": "NULL" 179 | }, 180 | "correct_answer": "answer_c" 181 | }, 182 | { 183 | "id": "342", 184 | "category": "php", 185 | "level": "normal", 186 | "question": "¿Cómo se agregan elementos en un array en PHP?", 187 | "answers": { 188 | "answer_a": "$array[] = $element", 189 | "answer_b": "$array.push($element)", 190 | "answer_c": "$array[$element]" 191 | }, 192 | "correct_answer": "answer_a" 193 | }, 194 | { 195 | "id": "343", 196 | "category": "php", 197 | "level": "normal", 198 | "question": "¿Cómo obtener la longitud de un string en PHP?", 199 | "answers": { 200 | "answer_a": "$string.length()", 201 | "answer_b": "strlen($string)", 202 | "answer_c": "length($string)" 203 | }, 204 | "correct_answer": "answer_b" 205 | }, 206 | { 207 | "id": "344", 208 | "category": "php", 209 | "level": "dificil", 210 | "question": "¿Cuál es el método correcto para obtener el valor mínimo de un array de números en PHP?", 211 | "answers": { 212 | "answer_a": "Math.min(1, 2, 3, 4)", 213 | "answer_b": "min([1,2,3,4])", 214 | "answer_c": "minimum([1,2,3,4])" 215 | }, 216 | "correct_answer": "answer_b" 217 | }, 218 | { 219 | "id": "345", 220 | "category": "php", 221 | "level": "dificil", 222 | "question": "¿Cuál de estos Métodos NO existen en PHP?", 223 | "answers": { 224 | "answer_a": "strchr", 225 | "answer_b": "strcspn", 226 | "answer_c": "strlength" 227 | }, 228 | "correct_answer": "answer_c" 229 | }, 230 | { 231 | "id": "346", 232 | "category": "php", 233 | "level": "dificil", 234 | "question": "¿Qué método se utiliza para dividir un string en un array de strings en PHP?", 235 | "answers": { 236 | "answer_a": "implode(\",\", $array)", 237 | "answer_b": "explode(\",\", $array)", 238 | "answer_c": "split(\",\", $array)" 239 | }, 240 | "correct_answer": "answer_b" 241 | }, 242 | { 243 | "id": "347", 244 | "category": "php", 245 | "level": "dificil", 246 | "question": "¿Qué método se utiliza para dividir un array en un strings en PHP?", 247 | "answers": { 248 | "answer_a": "implode(\",\", $array)", 249 | "answer_b": "explode(\",\", $array)", 250 | "answer_c": "split(\",\", $array)" 251 | }, 252 | "correct_answer": "answer_a" 253 | }, 254 | { 255 | "id": "359", 256 | "category": "php", 257 | "level": "facil", 258 | "question": "¿Qué función utilizarías para imprimir por consola?", 259 | "answers": { 260 | "answer_a": "echo('Hello World')", 261 | "answer_b": "console.log('Hello World')", 262 | "answer_c": "System.out.println('Hello World')" 263 | }, 264 | "correct_answer": "answer_a" 265 | }, 266 | { 267 | "id": "348", 268 | "category": "php", 269 | "level": "normal", 270 | "question": "¿Cómo obtener el tipo de objecto en PHP?", 271 | "answers": { 272 | "answer_a": "typeof $object", 273 | "answer_b": "get_class($object)", 274 | "answer_c": "$object instanceof" 275 | }, 276 | "correct_answer": "answer_b" 277 | }, 278 | { 279 | "id": "349", 280 | "category": "php", 281 | "level": "dificil", 282 | "question": "¿Qué función utilizarías de PHP para trabajar con expresiones regulares?", 283 | "answers": { 284 | "answer_a": "reg_match()", 285 | "answer_b": "regexp()", 286 | "answer_c": "preg_match()" 287 | }, 288 | "correct_answer": "answer_c" 289 | } 290 | ] 291 | -------------------------------------------------------------------------------- /server/database/quizzes/python.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": "261", 4 | "category": "python", 5 | "level": "facil", 6 | "question": "¿Cuál de estos no es un tipo de datos básico?", 7 | "answers": { 8 | "answer_a": "Lists", 9 | "answer_b": "Dictionary", 10 | "answer_c": "Tuples", 11 | "answer_d": "Class" 12 | }, 13 | "correct_answer": "answer_d" 14 | }, 15 | { 16 | "id": "262", 17 | "category": "python", 18 | "level": "facil", 19 | "question": "¿Qué tipo de dato es el siguiente? L = [1, 23, ‘hello’, 1]", 20 | "answers": { 21 | "answer_a": "List", 22 | "answer_b": "Dictionary", 23 | "answer_c": "Tuple", 24 | "answer_d": "Array" 25 | }, 26 | "correct_answer": "answer_a" 27 | }, 28 | { 29 | "id": "263", 30 | "category": "python", 31 | "level": "normal", 32 | "question": "¿Cuál de las siguientes funciones convierte una cadena en un flotante en python?", 33 | "answers": { 34 | "answer_a": "int(x [,base])", 35 | "answer_b": "long(x [,base] )", 36 | "answer_c": "float(x)", 37 | "answer_d": "str(x)" 38 | }, 39 | "correct_answer": "answer_c" 40 | }, 41 | { 42 | "id": "264", 43 | "category": "python", 44 | "level": "normal", 45 | "question": "Cuál es la salida del siguiente programa: print \"Hello World\"[::-1]", 46 | "answers": { 47 | "answer_a": "dlroW olleH", 48 | "answer_b": "Hello World", 49 | "answer_c": "-1", 50 | "answer_d": "Error" 51 | }, 52 | "correct_answer": "answer_a" 53 | }, 54 | { 55 | "id": "265", 56 | "category": "python", 57 | "level": "facil", 58 | "question": "Dada una función que no devuelve ningún valor, ¿qué valor se muestra cuando se ejecuta en consola?", 59 | "answers": { 60 | "answer_a": "int", 61 | "answer_b": "bool", 62 | "answer_c": "void", 63 | "answer_d": "None" 64 | }, 65 | "correct_answer": "answer_d" 66 | }, 67 | { 68 | "id": "266", 69 | "category": "python", 70 | "level": "normal", 71 | "question": "¿Qué módulo de Python soporta expresiones regulares?", 72 | "answers": { 73 | "answer_a": "re", 74 | "answer_b": "regex", 75 | "answer_c": "pyregex", 76 | "answer_d": "Ninguna de las anteriores" 77 | }, 78 | "correct_answer": "answer_a" 79 | }, 80 | { 81 | "id": "267", 82 | "category": "python", 83 | "level": "facil", 84 | "question": "Cuál es la salida del siguiente programa: print 0.1 + 0.2 == 0.3", 85 | "answers": { 86 | "answer_a": "True", 87 | "answer_b": "False", 88 | "answer_c": "Depende de la máquina", 89 | "answer_d": "Error" 90 | }, 91 | "correct_answer": "answer_b" 92 | }, 93 | { 94 | "id": "268", 95 | "category": "python", 96 | "level": "dificil", 97 | "question": "¿Cuál de los siguientes no es un número complejo?", 98 | "answers": { 99 | "answer_a": "k = 2 + 3j", 100 | "answer_b": "k = complex(2, 3)", 101 | "answer_c": "k = 2 + 3l", 102 | "answer_d": "k = 2 + 3J" 103 | }, 104 | "correct_answer": "answer_c" 105 | }, 106 | { 107 | "id": "269", 108 | "category": "python", 109 | "level": "normal", 110 | "question": "Para iniciar Python desde el símbolo del sistema, se utiliza el comando:", 111 | "answers": { 112 | "answer_a": "execute python", 113 | "answer_b": "go python", 114 | "answer_c": "python", 115 | "answer_d": "run python" 116 | }, 117 | "correct_answer": "answer_c" 118 | }, 119 | { 120 | "id": "270", 121 | "category": "python", 122 | "level": "dificil", 123 | "question": "¿Cuál de las siguientes afirmaciones es correcta sobre Python?", 124 | "answers": { 125 | "answer_a": "Soporta la recolección automática de basura", 126 | "answer_b": "Se puede integrar fácilmente con C, C++, COM, ActiveX, CORBA y Java", 127 | "answer_c": "Todas las anteriores son correctas", 128 | "answer_d": "Ninguna de las anteriores" 129 | }, 130 | "correct_answer": "answer_c" 131 | }, 132 | { 133 | "id": "271", 134 | "category": "python", 135 | "level": "facil", 136 | "question": "Cuál es la salida de la expresión: 3*1**3", 137 | "answers": { 138 | "answer_a": "27", 139 | "answer_b": "9", 140 | "answer_c": "3", 141 | "answer_d": "1" 142 | }, 143 | "correct_answer": "answer_c" 144 | }, 145 | { 146 | "id": "272", 147 | "category": "python", 148 | "level": "dificil", 149 | "question": "Cuál es la salida del siguiente programa: print '{0:.2}'.format(1.0 / 3)", 150 | "answers": { 151 | "answer_a": "0.333333", 152 | "answer_b": "0.33", 153 | "answer_c": "0.333333:-2", 154 | "answer_d": "Error" 155 | }, 156 | "correct_answer": "answer_b" 157 | }, 158 | { 159 | "id": "273", 160 | "category": "python", 161 | "level": "normal", 162 | "question": "Cuál es la salida del siguiente programa: print '{0:-2%}'.format(1.0 / 3)", 163 | "answers": { 164 | "answer_a": "0.33", 165 | "answer_b": "0.33%", 166 | "answer_c": "33%", 167 | "answer_d": "33.33%" 168 | }, 169 | "correct_answer": "answer_d" 170 | }, 171 | { 172 | "id": "274", 173 | "category": "python", 174 | "level": "normal", 175 | "question": "Cuál es la salida del siguiente programa: print 'cd'.partition('cd')", 176 | "answers": { 177 | "answer_a": "(‘cd’)", 178 | "answer_b": "(”)", 179 | "answer_c": "(‘cd’, ”, ”)", 180 | "answer_d": "(”, ‘cd’, ”)" 181 | }, 182 | "correct_answer": "answer_d" 183 | }, 184 | { 185 | "id": "275", 186 | "category": "python", 187 | "level": "normal", 188 | "question": "Cuál es la salida del siguiente código: print 9//2", 189 | "answers": { 190 | "answer_a": "4.5", 191 | "answer_b": "4.0", 192 | "answer_c": "4", 193 | "answer_d": "Error" 194 | }, 195 | "correct_answer": "answer_c" 196 | }, 197 | { 198 | "id": "276", 199 | "category": "python", 200 | "level": "normal", 201 | "question": "¿Qué función sobrecarga el operador >>?", 202 | "answers": { 203 | "answer_a": "more()", 204 | "answer_b": "gt()", 205 | "answer_c": "ge()", 206 | "answer_d": "Ninguna de las anteriores" 207 | }, 208 | "correct_answer": "answer_d" 209 | }, 210 | { 211 | "id": "277", 212 | "category": "python", 213 | "level": "facil", 214 | "question": "¿Qué operador está sobrecargado por la función or()?", 215 | "answers": { 216 | "answer_a": "||", 217 | "answer_b": "|", 218 | "answer_c": "//", 219 | "answer_d": "/" 220 | }, 221 | "correct_answer": "answer_b" 222 | }, 223 | { 224 | "id": "278", 225 | "category": "python", 226 | "level": "dificil", 227 | "question": "time.time() devuelve:", 228 | "answers": { 229 | "answer_a": "La hora actual", 230 | "answer_b": "La hora actual en milisegundos", 231 | "answer_c": "La hora actual en milisegundos desde la medianoche", 232 | "answer_d": "La hora actual en milisegundos desde la medianoche del 1 de enero de 1970 GMT (la hora de Unix)" 233 | }, 234 | "correct_answer": "answer_d" 235 | }, 236 | { 237 | "id": "279", 238 | "category": "python", 239 | "level": "normal", 240 | "question": "Supongamos que list1 es [3, 4, 5, 20, 5, 25, 1, 3], ¿cómo será list1 después de ejecutar list1.pop(1)?", 241 | "answers": { 242 | "answer_a": "[3, 4, 5, 20, 5, 25, 1, 3]", 243 | "answer_b": "[1, 3, 3, 4, 5, 5, 20, 25]", 244 | "answer_c": "[3, 5, 20, 5, 25, 1, 3]", 245 | "answer_d": "[1, 3, 4, 5, 20, 5, 25]" 246 | }, 247 | "correct_answer": "answer_c" 248 | }, 249 | { 250 | "id": "280", 251 | "category": "python", 252 | "level": "facil", 253 | "question": "¿Cómo se llama una función definida dentro de una clase?", 254 | "answers": { 255 | "answer_a": "Módulo", 256 | "answer_b": "Clase", 257 | "answer_c": "Otra función", 258 | "answer_d": "Método" 259 | }, 260 | "correct_answer": "answer_d" 261 | }, 262 | { 263 | "id": "281", 264 | "category": "python", 265 | "level": "normal", 266 | "question": "Cuál será la salida del siguiente código: print type(type(int))", 267 | "answers": { 268 | "answer_a": "type 'int'", 269 | "answer_b": "type 'type'", 270 | "answer_c": "Error", 271 | "answer_d": "0" 272 | }, 273 | "correct_answer": "answer_b" 274 | } 275 | ] 276 | -------------------------------------------------------------------------------- /server/database/quizzes/sql.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": "121", 4 | "category": "sql", 5 | "level": "normal", 6 | "question": "¿Qué son las restricciones (constraints)?", 7 | "answers": { 8 | "answer_a": "Valores predefinidos que no se pueden cambiar", 9 | "answer_b": "Reglas aplicadas en las columnas de datos de una tabla" 10 | }, 11 | "correct_answer": "answer_b" 12 | }, 13 | { 14 | "id": "122", 15 | "category": "sql", 16 | "level": "facil", 17 | "question": "¿Para qué sirve el comando \"FROM\"?", 18 | "answers": { 19 | "answer_a": "Especificar el rango de condición de búsqueda", 20 | "answer_b": "Especifique de qué tabla seleccionar o eliminar los datos" 21 | }, 22 | "correct_answer": "answer_b" 23 | }, 24 | { 25 | "id": "123", 26 | "category": "sql", 27 | "level": "facil", 28 | "question": "¿Para que sirve la operador \"IN\"?", 29 | "answers": { 30 | "answer_a": "Permite seleccionar tablas específicas en la base de datos", 31 | "answer_b": "Permite especificar múltiples valores en una cláusula WHERE" 32 | }, 33 | "correct_answer": "answer_b" 34 | }, 35 | { 36 | "id": "124", 37 | "category": "sql", 38 | "level": "normal", 39 | "question": "¿Cuál de estos es un tipo de \"JOIN\" válido?", 40 | "answers": { 41 | "answer_a": "INSIDE JOIN", 42 | "answer_b": "JOIN IN", 43 | "answer_c": "INNER JOIN" 44 | }, 45 | "correct_answer": "answer_c" 46 | }, 47 | { 48 | "id": "125", 49 | "category": "sql", 50 | "level": "normal", 51 | "question": "¿Cuál de estos no es un operador lógico en SQL?", 52 | "answers": { 53 | "answer_a": "WITH", 54 | "answer_b": "BETWEEN", 55 | "answer_c": "LIKE" 56 | }, 57 | "correct_answer": "answer_a" 58 | }, 59 | { 60 | "id": "126", 61 | "category": "sql", 62 | "level": "facil", 63 | "question": "¿Qué significa SQL?", 64 | "answers": { 65 | "answer_a": "Standard Query Language", 66 | "answer_b": "Specified Query Language", 67 | "answer_c": "Structured Query Language" 68 | }, 69 | "correct_answer": "answer_c" 70 | }, 71 | { 72 | "id": "127", 73 | "category": "sql", 74 | "level": "facil", 75 | "question": "¿Qué declaración se utiliza para modificar datos en la base de datos?", 76 | "answers": { 77 | "answer_a": "MODIFY", 78 | "answer_b": "EDIT", 79 | "answer_c": "UPDATE" 80 | }, 81 | "correct_answer": "answer_c" 82 | }, 83 | { 84 | "id": "128", 85 | "category": "sql", 86 | "level": "facil", 87 | "question": "¿Qué declaración se usa para insertar un nuevo registro en la tabla?", 88 | "answers": { 89 | "answer_a": "INSERT VALUE", 90 | "answer_b": "INSERT INTO", 91 | "answer_c": "INSERT" 92 | }, 93 | "correct_answer": "answer_b" 94 | }, 95 | { 96 | "id": "129", 97 | "category": "sql", 98 | "level": "facil", 99 | "question": "¿Qué declaración se usa para crear una tabla de base de datos?", 100 | "answers": { 101 | "answer_a": "CREATE TABLE", 102 | "answer_b": "ADD TABLE", 103 | "answer_c": "NEW TABLE" 104 | }, 105 | "correct_answer": "answer_a" 106 | }, 107 | { 108 | "id": "130", 109 | "category": "sql", 110 | "level": "normal", 111 | "question": "¿Cuándo apareció SQL por primera vez?", 112 | "answers": { 113 | "answer_a": "Principios de la década de 1970", 114 | "answer_b": "Principios de la década de 1980", 115 | "answer_c": "Principios de la década de 1990" 116 | }, 117 | "correct_answer": "answer_a" 118 | }, 119 | { 120 | "id": "131", 121 | "category": "sql", 122 | "level": "normal", 123 | "question": "¿Qué operador se utiliza para verificar la presencia de cualquier registro en una subconsulta?", 124 | "answers": { 125 | "answer_a": "IS PRESENT", 126 | "answer_b": "EXISTS", 127 | "answer_c": "INCLUDE" 128 | }, 129 | "correct_answer": "answer_b" 130 | }, 131 | { 132 | "id": "132", 133 | "category": "sql", 134 | "level": "facil", 135 | "question": "¿Qué operador se usa para seleccionar valores dentro de un rango?", 136 | "answers": { 137 | "answer_a": "RANGE", 138 | "answer_b": "BETWEEN", 139 | "answer_c": "WITHIN" 140 | }, 141 | "correct_answer": "answer_b" 142 | }, 143 | { 144 | "id": "133", 145 | "category": "sql", 146 | "level": "normal", 147 | "question": "¿Qué es cierto acerca de eliminar filas de una tabla?", 148 | "answers": { 149 | "answer_a": "No se eliminan filas si se omite la cláusula where", 150 | "answer_b": "Eliminas filas existentes de una tabla usando la declaración DELETE", 151 | "answer_c": "No puede eliminar filas en función de los valores de otra tabla" 152 | }, 153 | "correct_answer": "answer_b" 154 | }, 155 | { 156 | "id": "134", 157 | "category": "sql", 158 | "level": "facil", 159 | "question": "¿Qué operador se usa para buscar un patrón específico en una columna?", 160 | "answers": { 161 | "answer_a": "SEARCH", 162 | "answer_b": "LIKE", 163 | "answer_c": "FROM" 164 | }, 165 | "correct_answer": "answer_b" 166 | }, 167 | { 168 | "id": "135", 169 | "category": "sql", 170 | "level": "normal", 171 | "question": "¿Cuál es un problema de seguridad común relacionado con SQL?", 172 | "answers": { 173 | "answer_a": "SQL encryption", 174 | "answer_b": "SQL blocking", 175 | "answer_c": "SQL injection" 176 | }, 177 | "correct_answer": "answer_c" 178 | }, 179 | { 180 | "id": "136", 181 | "category": "sql", 182 | "level": "facil", 183 | "question": "¿Cómo seleccionar todos los registros de la \"Productos\"?", 184 | "answers": { 185 | "answer_a": "SELECT ALL FROM Products", 186 | "answer_b": "SELECT * FROM Products", 187 | "answer_c": "SELECT Products" 188 | }, 189 | "correct_answer": "answer_b" 190 | }, 191 | { 192 | "id": "137", 193 | "category": "sql", 194 | "level": "facil", 195 | "question": "¿Cómo seleccionar varias columnas de la tabla Products?", 196 | "answers": { 197 | "answer_a": "SELECT Name, Surname FROM Products", 198 | "answer_b": "SELECT Name Surname FROM Products" 199 | }, 200 | "correct_answer": "answer_a" 201 | }, 202 | { 203 | "id": "138", 204 | "category": "sql", 205 | "level": "facil", 206 | "question": "¿Qué palabra clave de SQL se utiliza para ordenar un conjunto de resultados?", 207 | "answers": { 208 | "answer_a": "SORT", 209 | "answer_b": "ORDER", 210 | "answer_c": "ORDER BY" 211 | }, 212 | "correct_answer": "answer_c" 213 | }, 214 | { 215 | "id": "139", 216 | "category": "sql", 217 | "level": "normal", 218 | "question": "¿Cuál de estas no es una base de datos SQL?", 219 | "answers": { 220 | "answer_a": "Oracle", 221 | "answer_b": "PostgreSQL", 222 | "answer_c": "Cassandra" 223 | }, 224 | "correct_answer": "answer_c" 225 | }, 226 | { 227 | "id": "140", 228 | "category": "sql", 229 | "level": "normal", 230 | "question": "¿Cómo seleccionar todos los registros de la tabla \"Products\" donde el valor de \"Nombre\" comienza con \"z\"?", 231 | "answers": { 232 | "answer_a": "SELECT * FROM Products WHERE Name is 'z%'", 233 | "answer_b": "SELECT * FROM Products WHERE Name Like 'z%'" 234 | }, 235 | "correct_answer": "answer_b" 236 | }, 237 | { 238 | "id": "141", 239 | "category": "sql", 240 | "level": "normal", 241 | "question": "¿Qué función SQL se usa para contar el número de filas en una consulta SQL?", 242 | "answers": { 243 | "answer_a": "SELECT()", 244 | "answer_b": "COUNT()", 245 | "answer_c": "TOTAL()" 246 | }, 247 | "correct_answer": "answer_b" 248 | }, 249 | { 250 | "id": "142", 251 | "category": "sql", 252 | "level": "normal", 253 | "question": "¿Qué declaración SQL se usa para devolver solo valores diferentes?", 254 | "answers": { 255 | "answer_a": "SELECT DIFFERENT", 256 | "answer_b": "SELECT DISTINCT", 257 | "answer_c": "SELECT UNIQUE" 258 | }, 259 | "correct_answer": "answer_b" 260 | }, 261 | { 262 | "id": "143", 263 | "category": "sql", 264 | "level": "normal", 265 | "question": "¿La cláusula WHERE solo se usa en declaraciones de selección?", 266 | "answers": { 267 | "answer_a": "Verdadero", 268 | "answer_b": "Falso" 269 | }, 270 | "correct_answer": "answer_b" 271 | }, 272 | { 273 | "id": "144", 274 | "category": "sql", 275 | "level": "dificil", 276 | "question": "¿Cuál de las siguientes combinaciones extrae datos de filas coincidentes de ambas tablas?", 277 | "answers": { 278 | "answer_a": "Full Outer Join", 279 | "answer_b": "Left Join", 280 | "answer_c": "Right Join", 281 | "answer_d": "Ninguna de estas" 282 | }, 283 | "correct_answer": "answer_a" 284 | }, 285 | { 286 | "id": "145", 287 | "category": "sql", 288 | "level": "facil", 289 | "question": "¿Cuál de las siguientes es la forma correcta de comentar en SQL?", 290 | "answers": { 291 | "answer_a": "/* Esto es un comentario*/", 292 | "answer_b": "# Esto es un comentario", 293 | "answer_c": "% Esto es un comentario %", 294 | "answer_d": "& Esto es un comentario" 295 | }, 296 | "correct_answer": "answer_a" 297 | }, 298 | { 299 | "id": "146", 300 | "category": "sql", 301 | "level": "facil", 302 | "question": "¿Cuántas claves primarias se pueden crear en una tabla?", 303 | "answers": { 304 | "answer_a": "Infinitas", 305 | "answer_b": "2", 306 | "answer_c": "1", 307 | "answer_d": "24" 308 | }, 309 | "correct_answer": "answer_c" 310 | }, 311 | { 312 | "id": "147", 313 | "category": "sql", 314 | "level": "facil", 315 | "question": "¿Cuál de los siguientes no es parte de las operaciones CRUD en SQL?", 316 | "answers": { 317 | "answer_a": "Crear una tabla", 318 | "answer_b": "Eliminar registros de una tabla", 319 | "answer_c": "Crear una copia de una tabla", 320 | "answer_d": "Actualizar los datos almacenados en la tabla" 321 | }, 322 | "correct_answer": "answer_c" 323 | }, 324 | { 325 | "id": "148", 326 | "category": "sql", 327 | "level": "dificil", 328 | "question": "¿Cuál de las siguientes respuestas es cierta acerca de una vista?", 329 | "answers": { 330 | "answer_a": "La vista se elimina automáticamente después de que se completa la sesión", 331 | "answer_b": "Las vistas no se pueden actualizar una vez creadas", 332 | "answer_c": "Las vistas se crean agrupando un solo atributo deseado de una base de datos", 333 | "answer_d": "Ninguna de estas" 334 | }, 335 | "correct_answer": "answer_c" 336 | }, 337 | { 338 | "id": "149", 339 | "category": "sql", 340 | "level": "normal", 341 | "question": "¿Cuál de las siguientes consultas limitaría la salida a 5 filas?", 342 | "answers": { 343 | "answer_a": "SELECT * FROM DataFlair 5", 344 | "answer_b": "SELECT * FROM DataFlair LIMIT 5", 345 | "answer_c": "SELECT * FROM DataFlair 5 LIMIT", 346 | "answer_d": "SELECT LIMIT(5) * FROM DataFlair" 347 | }, 348 | "correct_answer": "answer_b" 349 | }, 350 | { 351 | "id": "150", 352 | "category": "sql", 353 | "level": "normal", 354 | "question": "¿La base de datos SQL sigue cuál de los siguientes principios?", 355 | "answers": { 356 | "answer_a": "ACID", 357 | "answer_b": "AGILE", 358 | "answer_c": "SQL", 359 | "answer_d": "DBMS" 360 | }, 361 | "correct_answer": "answer_a" 362 | }, 363 | { 364 | "id": "350", 365 | "category": "sql", 366 | "level": "normal", 367 | "question": "¿Qué palabra clave de SQL se utiliza para agrupar un conjunto de resultados?", 368 | "answers": { 369 | "answer_a": "GROUP WITH", 370 | "answer_b": "GROUP BY", 371 | "answer_c": "GROUPING BY" 372 | }, 373 | "correct_answer": "answer_b" 374 | }, 375 | { 376 | "id": "351", 377 | "category": "sql", 378 | "level": "dificil", 379 | "question": "¿Cuáles de los siguientes tipos de PROCEDURES es correcto?", 380 | "answers": { 381 | "answer_a": "Procedure with CALL parameter", 382 | "answer_b": "Procedure with IN-OUT parameter", 383 | "answer_c": "Procedure with ERASE parameter" 384 | }, 385 | "correct_answer": "answer_b" 386 | }, 387 | { 388 | "id": "352", 389 | "category": "sql", 390 | "level": "normal", 391 | "question": "¿Qué es cierto sobre las TRANSACTIONS?", 392 | "answers": { 393 | "answer_a": "Si falla, tira una excepción de tipo SQLTransactionException", 394 | "answer_b": "Cuando finaliza correctamente registra un log en la tabla mysql_logs", 395 | "answer_c": "Si falla, hace un ROLLBACK de los cambios" 396 | }, 397 | "correct_answer": "answer_c" 398 | } 399 | ] 400 | -------------------------------------------------------------------------------- /server/database/quizzes/swift.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": "151", 4 | "category": "swift", 5 | "level": "facil", 6 | "question": "¿Qué palabra clave usas para anunciar constantes en Swift?", 7 | "answers": { 8 | "answer_a": "Var", 9 | "answer_b": "Let", 10 | "answer_c": "Con", 11 | "answer_d": "Value" 12 | }, 13 | "correct_answer": "answer_b" 14 | }, 15 | { 16 | "id": "152", 17 | "category": "swift", 18 | "level": "facil", 19 | "question": "¿Cuántos tipos de enteros hay en Swift?", 20 | "answers": { 21 | "answer_a": "1", 22 | "answer_b": "2", 23 | "answer_c": "3", 24 | "answer_d": "4" 25 | }, 26 | "correct_answer": "answer_b" 27 | }, 28 | { 29 | "id": "153", 30 | "category": "swift", 31 | "level": "facil", 32 | "question": "¿Cuáles son los tipos de colección en Swift?", 33 | "answers": { 34 | "answer_a": "Dictionary y array", 35 | "answer_b": "Array y library", 36 | "answer_c": "Dictionary y library", 37 | "answer_d": "Library, dictionary, library" 38 | }, 39 | "correct_answer": "answer_a" 40 | }, 41 | { 42 | "id": "154", 43 | "category": "swift", 44 | "level": "facil", 45 | "question": "¿Qué debe usar para proporcionar un valor predeterminado para una variable en Swift?", 46 | "answers": { 47 | "answer_a": "?", 48 | "answer_b": "??", 49 | "answer_c": "&", 50 | "answer_d": "&&" 51 | }, 52 | "correct_answer": "answer_b" 53 | }, 54 | { 55 | "id": "155", 56 | "category": "swift", 57 | "level": "facil", 58 | "question": "¿Cuál de las siguientes definiciones de funciones es incorrecta considerando el lenguaje Swift?", 59 | "answers": { 60 | "answer_a": "func mean(numbers: Double...) -> Double", 61 | "answer_b": "func minMax(array: [Int]) -> (min: Int, max: Int)?", 62 | "answer_c": "func minMax(array: [Int]) -> (min: Int?, max: Int?)", 63 | "answer_d": "func haveChar(#string: String, character: Character) -> (Bool)" 64 | }, 65 | "correct_answer": "answer_d" 66 | }, 67 | { 68 | "id": "156", 69 | "category": "swift", 70 | "level": "normal", 71 | "question": "¿Cuál crea un diccionario con un tipo de clave de Entero y valor de Cadena?", 72 | "answers": { 73 | "answer_a": "var dict = [\"one\":1]", 74 | "answer_b": "var dict: [String: Int] = [1:\"one\"]", 75 | "answer_c": "var dict: [Int: String] = [1:\"one\"]", 76 | "answer_d": "var dict:[Int: String] = [\"one\":1]" 77 | }, 78 | "correct_answer": "answer_c" 79 | }, 80 | { 81 | "id": "157", 82 | "category": "swift", 83 | "level": "normal", 84 | "question": "¿Cuál de estas no es una declaración de propiedad válida en Swift?", 85 | "answers": { 86 | "answer_a": "final var x = 0", 87 | "answer_b": "final lazy var x = 0", 88 | "answer_c": "final lazy let x = 0", 89 | "answer_d": "final let x = 0" 90 | }, 91 | "correct_answer": "answer_c" 92 | }, 93 | { 94 | "id": "158", 95 | "category": "swift", 96 | "level": "normal", 97 | "question": "¿Cuál es la definición incorrecta de un protocolo en Swift?", 98 | "answers": { 99 | "answer_a": "protocol SomeProtocol { var first: Int{ set } }", 100 | "answer_b": "protocol SomeProtocol { var first: Int{ get } }", 101 | "answer_c": "protocol SomeProtocol { var first: Int { get set } }", 102 | "answer_d": "protocol SomeProtocol { var first: Int { get set } var second: Int { get } }" 103 | }, 104 | "correct_answer": "answer_a" 105 | }, 106 | { 107 | "id": "159", 108 | "category": "swift", 109 | "level": "normal", 110 | "question": "¿De qué clase raíz deben heredar todas las clases de Swift?", 111 | "answers": { 112 | "answer_a": "Root", 113 | "answer_b": "@ObjC", 114 | "answer_c": "NSObject", 115 | "answer_d": "Las clases Swift no requieren una clase raíz" 116 | }, 117 | "correct_answer": "answer_d" 118 | }, 119 | { 120 | "id": "160", 121 | "category": "swift", 122 | "level": "normal", 123 | "question": "¿Cuál es correcta sobre las enumeraciones?", 124 | "answers": { 125 | "answer_a": "Las enumeraciones no pueden ajustarse a los protocolos", 126 | "answer_b": "Las enumeraciones pueden definir inicializadores" 127 | }, 128 | "correct_answer": "answer_b" 129 | }, 130 | { 131 | "id": "161", 132 | "category": "swift", 133 | "level": "normal", 134 | "question": "¿Cuál de las siguientes declaraciones podría usarse para determinar si una variable dada es de tipo String?", 135 | "answers": { 136 | "answer_a": "if unkownVariable: String { }", 137 | "answer_b": "if (String)unknownVariable { }", 138 | "answer_c": "if unknownVariable is String { }", 139 | "answer_d": "if String.hierarchy(unknownVariable) { }" 140 | }, 141 | "correct_answer": "answer_c" 142 | }, 143 | { 144 | "id": "162", 145 | "category": "swift", 146 | "level": "normal", 147 | "question": "¿Cuál de estas podría ser una declaración de protocolo adecuada en Swift?", 148 | "answers": { 149 | "answer_a": "protocol someProtocal { var first: Int { set } }", 150 | "answer_b": "protocol someProtocal { optional var first: Int { get } }", 151 | "answer_c": "@objc protocol someProtocal { optional var first: Int { set } }", 152 | "answer_d": "@objc protocol someProtocal { optional var first: Int { get } }" 153 | }, 154 | "correct_answer": "answer_d" 155 | }, 156 | { 157 | "id": "163", 158 | "category": "swift", 159 | "level": "normal", 160 | "question": "¿Qué se usa para importar archivos Objective-C a Swift?", 161 | "answers": { 162 | "answer_a": "Las clases de Objective-C se importan automáticamente", 163 | "answer_b": "Las clases de Objective-C se importan mediante un \"Bridging Header\"", 164 | "answer_c": "Las clases de Objective-C se importan declarando @SwiftImportable", 165 | "answer_d": "Las clases de Objective-C se importan en el archivo Swift usando la clase" 166 | }, 167 | "correct_answer": "answer_b" 168 | }, 169 | { 170 | "id": "164", 171 | "category": "swift", 172 | "level": "dificil", 173 | "question": "¿Qué tipo de objeto son las \"Swift Structures\"?", 174 | "answers": { 175 | "answer_a": "Value Type", 176 | "answer_b": "Abstract Type", 177 | "answer_c": "Memory Type", 178 | "answer_d": "Reference Type" 179 | }, 180 | "correct_answer": "answer_a" 181 | }, 182 | { 183 | "id": "165", 184 | "category": "swift", 185 | "level": "dificil", 186 | "question": "¿Qué palabra clave en el contexto de una instrucción Switch se requiere para forzar la ejecución de un caso posterior?", 187 | "answers": { 188 | "answer_a": "Break", 189 | "answer_b": "Return", 190 | "answer_c": "Continue", 191 | "answer_d": "Fallthrough" 192 | }, 193 | "correct_answer": "answer_d" 194 | }, 195 | { 196 | "id": "166", 197 | "category": "swift", 198 | "level": "normal", 199 | "question": "¿Cuál es el tipo de de las enumeraciones?", 200 | "answers": { 201 | "answer_a": "Value type", 202 | "answer_b": "Class type", 203 | "answer_c": "Collection type", 204 | "answer_d": "Reference type" 205 | }, 206 | "correct_answer": "answer_a" 207 | }, 208 | { 209 | "id": "167", 210 | "category": "swift", 211 | "level": "normal", 212 | "question": "¿Qué tipos de colección están disponibles en Swift?", 213 | "answers": { 214 | "answer_a": "Array", 215 | "answer_b": "Dictionary", 216 | "answer_c": "Las dos estan disponibles", 217 | "answer_d": "Ninguna de las anteriores" 218 | }, 219 | "correct_answer": "answer_c" 220 | }, 221 | { 222 | "id": "168", 223 | "category": "swift", 224 | "level": "dificil", 225 | "question": "_____________ es un proceso de consulta y llamada de propiedades.", 226 | "answers": { 227 | "answer_a": "Lazy Chaining", 228 | "answer_b": "Swift Chaining", 229 | "answer_c": "Optional Chaining", 230 | "answer_d": "Todas las anteriores" 231 | }, 232 | "correct_answer": "answer_c" 233 | }, 234 | { 235 | "id": "169", 236 | "category": "swift", 237 | "level": "dificil", 238 | "question": "Dado lo siguiente... var stringValue:String = \"Jane Doe\", ¿cuál es el resultado de realizar... stringValue = nil?", 239 | "answers": { 240 | "answer_a": "stringValue == nil", 241 | "answer_b": "stringValue == \"Jane Doe\"", 242 | "answer_c": "El compilador no lo permitirá" 243 | }, 244 | "correct_answer": "answer_b" 245 | }, 246 | { 247 | "id": "170", 248 | "category": "swift", 249 | "level": "normal", 250 | "question": "¿Qué tipo de lenguaje es Swift?", 251 | "answers": { 252 | "answer_a": "Scripting language", 253 | "answer_b": "Programación orientada a objetos", 254 | "answer_c": "Type-safe language", 255 | "answer_d": "Todo lo anterior" 256 | }, 257 | "correct_answer": "answer_d" 258 | } 259 | ] 260 | -------------------------------------------------------------------------------- /server/database/quizzes/typescript.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": "191", 4 | "category": "typescript", 5 | "level": "normal", 6 | "question": "Las declaraciones ambientales permiten usar de forma segura las bibliotecas JavaScript populares existentes.", 7 | "answers": { 8 | "answer_a": "Verdadero", 9 | "answer_b": "Falso" 10 | }, 11 | "correct_answer": "answer_a" 12 | }, 13 | { 14 | "id": "192", 15 | "category": "typescript", 16 | "level": "normal", 17 | "question": "¿Cuál de estas no es un tipo incorporado en TypeScript?", 18 | "answers": { 19 | "answer_a": "Integer", 20 | "answer_b": "String", 21 | "answer_c": "Boolean" 22 | }, 23 | "correct_answer": "answer_a" 24 | }, 25 | { 26 | "id": "193", 27 | "category": "typescript", 28 | "level": "normal", 29 | "question": "¿Qué categoría describe mejor TypeScript?", 30 | "answers": { 31 | "answer_a": "Framework", 32 | "answer_b": "Library", 33 | "answer_c": "Superset" 34 | }, 35 | "correct_answer": "answer_c" 36 | }, 37 | { 38 | "id": "194", 39 | "category": "typescript", 40 | "level": "facil", 41 | "question": "Los programas JavaScript existentes también son programas TypeScript válidos.", 42 | "answers": { 43 | "answer_a": "Verdadero", 44 | "answer_b": "Falso" 45 | }, 46 | "correct_answer": "answer_a" 47 | }, 48 | { 49 | "id": "195", 50 | "category": "typescript", 51 | "level": "normal", 52 | "question": "¿Qué comando se usa para compilar un archivo TypeScript a JavaScript?", 53 | "answers": { 54 | "answer_a": "tsc file.js", 55 | "answer_b": "typescript file.ts", 56 | "answer_c": "typescript run file.js" 57 | }, 58 | "correct_answer": "answer_a" 59 | }, 60 | { 61 | "id": "196", 62 | "category": "typescript", 63 | "level": "facil", 64 | "question": "¿Qué archivo de configuración se requiere para compilar todo el proyecto TypeScript?", 65 | "answers": { 66 | "answer_a": "app.js", 67 | "answer_b": "tsconfig.js", 68 | "answer_c": "tsconfig.json" 69 | }, 70 | "correct_answer": "answer_c" 71 | }, 72 | { 73 | "id": "197", 74 | "category": "typescript", 75 | "level": "facil", 76 | "question": "¿Cuál es la extensión del archivo de declaración?", 77 | "answers": { 78 | "answer_a": ".tsx", 79 | "answer_b": ".d.ts", 80 | "answer_c": ".config.ts" 81 | }, 82 | "correct_answer": "answer_b" 83 | }, 84 | { 85 | "id": "198", 86 | "category": "typescript", 87 | "level": "facil", 88 | "question": "¿Qué empresa desarrolla y mantiene TypeScript?", 89 | "answers": { 90 | "answer_a": "Google", 91 | "answer_b": "Microsoft", 92 | "answer_c": "Facebook" 93 | }, 94 | "correct_answer": "answer_b" 95 | }, 96 | { 97 | "id": "199", 98 | "category": "typescript", 99 | "level": "normal", 100 | "question": "¿Cuál de las siguientes respuestas no es cierta sobre TypeScript?", 101 | "answers": { 102 | "answer_a": "Fuertemente tipado", 103 | "answer_b": "Débilmente tipado" 104 | }, 105 | "correct_answer": "answer_b" 106 | }, 107 | { 108 | "id": "200", 109 | "category": "typescript", 110 | "level": "facil", 111 | "question": "¿Qué comando se usa para instalar TypeScript?", 112 | "answers": { 113 | "answer_a": "npm install -g typescript", 114 | "answer_b": "npm install -g ts" 115 | }, 116 | "correct_answer": "answer_a" 117 | }, 118 | { 119 | "id": "201", 120 | "category": "typescript", 121 | "level": "normal", 122 | "question": "¿Qué palabra clave se utiliza para definir una interfaz?", 123 | "answers": { 124 | "answer_a": "set", 125 | "answer_b": "define", 126 | "answer_c": "interface" 127 | }, 128 | "correct_answer": "answer_c" 129 | }, 130 | { 131 | "id": "202", 132 | "category": "typescript", 133 | "level": "facil", 134 | "question": "Un \"namespace\" es una forma de agrupar lógicamente el código relacionado.", 135 | "answers": { 136 | "answer_a": "Verdadero", 137 | "answer_b": "Falso" 138 | }, 139 | "correct_answer": "answer_a" 140 | }, 141 | { 142 | "id": "203", 143 | "category": "typescript", 144 | "level": "facil", 145 | "question": "TypeScript se originó a partir de las deficiencias de JavaScript para el desarrollo de aplicaciones a gran escala.", 146 | "answers": { 147 | "answer_a": "Verdadero", 148 | "answer_b": "Falso" 149 | }, 150 | "correct_answer": "answer_a" 151 | }, 152 | { 153 | "id": "204", 154 | "category": "typescript", 155 | "level": "dificil", 156 | "question": "¿Qué \"flag\" se utiliza para observar los cambios en los archivos y volver a compilarlos sobre la marcha?", 157 | "answers": { 158 | "answer_a": "--compile", 159 | "answer_b": "-re-comp", 160 | "answer_c": "--watch" 161 | }, 162 | "correct_answer": "answer_c" 163 | }, 164 | { 165 | "id": "205", 166 | "category": "typescript", 167 | "level": "facil", 168 | "question": "Los puntos y comas son obligatorios en TypeScript.", 169 | "answers": { 170 | "answer_a": "Verdadero", 171 | "answer_b": "Falso" 172 | }, 173 | "correct_answer": "answer_b" 174 | }, 175 | { 176 | "id": "206", 177 | "category": "typescript", 178 | "level": "normal", 179 | "question": "¿Cuál de estas opciones es una forma válida de establecer un tipo para la variable?", 180 | "answers": { 181 | "answer_a": "let name:string = 'Jhon'", 182 | "answer_b": "let name type:string = 'Jhon'", 183 | "answer_c": "let name setType:string = 'Jhon'" 184 | }, 185 | "correct_answer": "answer_a" 186 | }, 187 | { 188 | "id": "207", 189 | "category": "typescript", 190 | "level": "facil", 191 | "question": "TypeScript admite conceptos como clases, interfaces y herencia.", 192 | "answers": { 193 | "answer_a": "Verdadero", 194 | "answer_b": "Falso" 195 | }, 196 | "correct_answer": "answer_a" 197 | }, 198 | { 199 | "id": "208", 200 | "category": "typescript", 201 | "level": "normal", 202 | "question": "¿Cuál de estos es un ejemplo válido de tupla?", 203 | "answers": { 204 | "answer_a": "let tuple:string|number = 123", 205 | "answer_b": "let tuple:[string,number] = ['Jhon', 123]", 206 | "answer_c": "let tuple:number = [144, 754, 123]" 207 | }, 208 | "correct_answer": "answer_b" 209 | }, 210 | { 211 | "id": "209", 212 | "category": "typescript", 213 | "level": "facil", 214 | "question": "¿Cuál de las siguientes es una variable de tipo unión válida?", 215 | "answers": { 216 | "answer_a": "var val:string|number = 567", 217 | "answer_b": "var val:{string|number} = 567", 218 | "answer_c": "var val:[string|number] = 567" 219 | }, 220 | "correct_answer": "answer_a" 221 | }, 222 | { 223 | "id": "210", 224 | "category": "typescript", 225 | "level": "facil", 226 | "question": "TypeScript no ignora los espacios, tabulaciones y saltos de línea que aparecen en los programas.", 227 | "answers": { 228 | "answer_a": "Verdadero", 229 | "answer_b": "Falso" 230 | }, 231 | "correct_answer": "answer_b" 232 | } 233 | ] 234 | -------------------------------------------------------------------------------- /server/index.js: -------------------------------------------------------------------------------- 1 | const express = require('express') 2 | const app = express() 3 | const path = require('path') 4 | 5 | require('dotenv').config() 6 | 7 | // settings 8 | const PORT = process.env.PORT || 5000 9 | 10 | // middlewares 11 | app.use(express.json()) 12 | 13 | // routes 14 | const buildPath = path.join(__dirname, '../web', 'dist') 15 | app.use(express.static(buildPath)) 16 | app.use('/api/', require('./routes/index')) 17 | app.get('*', (req, res) => { 18 | res.sendFile(path.resolve(__dirname, '../web/dist', 'index.html')) 19 | }) 20 | 21 | // starting the server 22 | const server = app.listen(PORT, () => { 23 | console.log(`🚀 Server started on port ${PORT}`) 24 | }) 25 | 26 | module.exports = { app, server } 27 | -------------------------------------------------------------------------------- /server/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "server", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "start": "node index.js", 8 | "dev": "nodemon --watch index.js", 9 | "test": "jest --verbose --silent", 10 | "test:watch": "npm run test -- --watch", 11 | "lint": "eslint .", 12 | "lint:fix": "eslint . --fix" 13 | }, 14 | "author": "", 15 | "license": "ISC", 16 | "dependencies": { 17 | "dotenv": "^16.0.3", 18 | "express": "^4.18.1", 19 | "qs": "^6.11.0" 20 | }, 21 | "devDependencies": { 22 | "jest": "29.0.3", 23 | "nodemon": "2.0.20", 24 | "supertest": "6.2.4" 25 | }, 26 | "eslintConfig": { 27 | "env": { 28 | "browser": true, 29 | "es2021": true, 30 | "node": true, 31 | "jest": true 32 | }, 33 | "extends": "standard" 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /server/repository/index.js: -------------------------------------------------------------------------------- 1 | const fs = require('fs') 2 | const path = require('path') 3 | 4 | const QUIZZES_PATH = path.join(__dirname, '..', 'database', 'quizzes') 5 | const quizzesJsonFileNames = fs.readdirSync(QUIZZES_PATH) 6 | const quizzes = {} 7 | for (const quizJsonFileName of quizzesJsonFileNames) { 8 | const fileName = path.parse(quizJsonFileName).name 9 | quizzes[fileName] = require(path.join(QUIZZES_PATH, quizJsonFileName)) 10 | } 11 | 12 | module.exports = { quizzes } 13 | -------------------------------------------------------------------------------- /server/routes/categories.js: -------------------------------------------------------------------------------- 1 | const { Router } = require('express') 2 | const router = Router() 3 | const { quizzes: data } = require('../repository') 4 | 5 | router.get('/:category?', (req, res) => { 6 | const category = req.params.category 7 | 8 | if (!category) { 9 | const link = getUrl(req) 10 | let countQuestions = 0 11 | const categories = Object.entries(data).map(([language, _data]) => { 12 | countQuestions += _data.length 13 | return { name: language, count_questions: _data.length, link: link + language } 14 | }) 15 | 16 | return res.status(200).json({ categories, totalCategories: categories.length, totalQuestions: countQuestions }) 17 | } 18 | 19 | if (!data[category]) { 20 | return res.status(404).json({ message: `Category {${category}} not found` }) 21 | } 22 | 23 | const { status = 200, response = {} } = quizzes(category, req.query) 24 | return res.status(status).json(response) 25 | }) 26 | 27 | module.exports = router 28 | 29 | /** 30 | * Response quizzes API path 31 | * 32 | * @param category Category filter 33 | * @param {limit, level} - Query string from URL 34 | * @returns 35 | */ 36 | const quizzes = (category, { limit, level }) => { 37 | let quizzes = data[category] 38 | 39 | /** Query `level` from URL */ 40 | if (level) { 41 | const levels = ['facil', 'dificil', 'normal', 'aleatorio'] 42 | if (levels.includes(level)) { 43 | quizzes = quizzes 44 | .filter((quiz) => level === 'aleatorio' || quiz.level === level) 45 | .sort(() => Math.random() - 0.5) 46 | } else { 47 | return { status: 401, response: { message: `Query level {${level}} is incorrect, fields permitted: [${levels}]` } } 48 | } 49 | } 50 | 51 | /** Query `limit` from URL */ 52 | if (limit) { 53 | if (!isNaN(limit)) { 54 | quizzes = quizzes.slice(0, limit) 55 | } else { 56 | return { status: 401, response: { message: `Query limit {${limit}} is incorrect, changed it and try again` } } 57 | } 58 | } 59 | 60 | return { status: 200, response: quizzes } 61 | } 62 | 63 | const getUrl = (req) => { 64 | const protocol = req.protocol 65 | const host = req.hostname 66 | const url = req.originalUrl 67 | const port = host === 'localhost' ? ':' + (process.env.PORT || 5000) : '' 68 | 69 | return `${protocol}://${host}${port}${url}/` 70 | } 71 | -------------------------------------------------------------------------------- /server/routes/index.js: -------------------------------------------------------------------------------- 1 | const express = require('express') 2 | const router = express.Router() 3 | 4 | router.use('/categories', require('./categories')) 5 | 6 | module.exports = router 7 | -------------------------------------------------------------------------------- /server/test/api.test.js: -------------------------------------------------------------------------------- 1 | const supertest = require('supertest') 2 | const { app } = require('../index') 3 | const api = supertest(app) 4 | 5 | test('return an json with key categories', async () => { 6 | await api 7 | .get('/api/v1/categories') 8 | .expect(200) 9 | .expect('Content-Type', /application\/json/) 10 | .expect((res) => { 11 | expect(res.body).toHaveProperty('categories') 12 | }) 13 | }) 14 | 15 | test('return an array and the first element should have an id', async () => { 16 | await api 17 | .get('/api/v1/quizzes?category=javascript&limit=5') 18 | .expect(200) 19 | .expect('Content-Type', /application\/json/) 20 | .expect((res) => { 21 | expect(res.body[0]).toHaveProperty('id') 22 | }) 23 | }) 24 | 25 | /** Api version 2 */ 26 | test('Return an JSON with key categories (api v2)', async () => { 27 | await api 28 | .get('/api/v2/categories') 29 | .expect(200) 30 | .expect('Content-Type', /application\/json/) 31 | .expect((res) => { 32 | expect(res.body).toHaveProperty('categories') 33 | }) 34 | }) 35 | 36 | test('Return an array and the first element should have an id (api v2)', async () => { 37 | await api 38 | .get('/api/v2/categories/javascript?limit=5') 39 | .expect(200) 40 | .expect('Content-Type', /application\/json/) 41 | .expect((res) => { 42 | expect(res.body[0]).toHaveProperty('id') 43 | }) 44 | }) 45 | 46 | test('Return a error message if category not exists (api v2)', async () => { 47 | const categoryNotFound = 'test-category' 48 | await api 49 | .get(`/api/v2/categories/${categoryNotFound}`) 50 | .expect(404) 51 | .expect('Content-Type', /application\/json/) 52 | .expect((res) => { 53 | expect(res.body).toEqual({ message: `Category {${categoryNotFound}} not found` }) 54 | }) 55 | }) 56 | 57 | test('Return a error message if level (query-string) not match (api v2)', async () => { 58 | const levelNotFound = 'notlevel' 59 | await api 60 | .get(`/api/v2/categories/javascript?level=${levelNotFound}`) 61 | .expect(401) 62 | .expect('Content-Type', /application\/json/) 63 | .expect((res) => { 64 | expect(res.body).toHaveProperty('message', expect.stringMatching(`Query level {${levelNotFound}} is incorrect, fields permitted:`)) 65 | }) 66 | }) 67 | -------------------------------------------------------------------------------- /web/.env.example: -------------------------------------------------------------------------------- 1 | VITE_URL_API=http://localhost:3001/ 2 | -------------------------------------------------------------------------------- /web/index.html: -------------------------------------------------------------------------------- 1 | <!DOCTYPE html> 2 | <html lang="es"> 3 | 4 | <head> 5 | <meta charset="UTF-8" /> 6 | <meta name="viewport" content="width=device-width, initial-scale=1.0" /> 7 | 8 | <title>PreguntAPI 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | -------------------------------------------------------------------------------- /web/jsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "baseUrl": ".", 4 | "paths": { 5 | "@/*": ["src/*"] 6 | } 7 | } 8 | } -------------------------------------------------------------------------------- /web/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "web", 3 | "version": "0.0.0", 4 | "type": "module", 5 | "private": true, 6 | "scripts": { 7 | "dev": "vite", 8 | "build": "vite build", 9 | "preview": "vite preview", 10 | "lint": "eslint {src,tests}/**/*.{js,jsx}", 11 | "lint:fix": "eslint --fix {src,tests}/**/*.{js,jsx}" 12 | }, 13 | "dependencies": { 14 | "@lottiefiles/react-lottie-player": "3.4.7", 15 | "daisyui": "2.31.0", 16 | "react": "18.2.0", 17 | "react-dom": "18.2.0", 18 | "react-router-dom": "6.4.2" 19 | }, 20 | "devDependencies": { 21 | "@playwright/test": "1.27.1", 22 | "@types/react": "18.0.21", 23 | "@types/react-dom": "18.0.6", 24 | "@vitejs/plugin-react": "2.1.0", 25 | "autoprefixer": "10.4.12", 26 | "postcss": "8.4.18", 27 | "tailwindcss": "3.1.8", 28 | "vite": "3.2.7" 29 | }, 30 | "eslintConfig": { 31 | "extends": [ 32 | "standard", 33 | "standard-jsx" 34 | ] 35 | } 36 | } -------------------------------------------------------------------------------- /web/postcss.config.cjs: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | tailwindcss: {}, 4 | autoprefixer: {} 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /web/public/vite.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /web/src/App.jsx: -------------------------------------------------------------------------------- 1 | import { Route, Routes, Navigate } from 'react-router-dom' 2 | 3 | import Doc from '@/components/Doc' 4 | import Home from '@/components/Home' 5 | import Footer from '@/components/Footer' 6 | import StartQuiz from '@/components/StartQuiz' 7 | import Navigation from '@/components/Navigation' 8 | 9 | export default function App () { 10 | return ( 11 |
12 | 13 | 14 | } /> 15 | } /> 16 | } /> 17 | } /> 18 | 19 |
20 |
21 | ) 22 | } 23 | -------------------------------------------------------------------------------- /web/src/components/Doc.jsx: -------------------------------------------------------------------------------- 1 | import PreCode from '@/components/PreCode.jsx' 2 | 3 | function Doc () { 4 | const texto1 = String.raw` 5 | { 6 | "categories": [ 7 | { 8 | "name": "html", 9 | "count_questions": 35, 10 | "link": "http://www.preguntapi.dev/api/categories/html" 11 | }, 12 | { 13 | "name": "css", 14 | "count_questions": 38, 15 | "link": "http://www.preguntapi.dev/api/categories/css" 16 | }, 17 | { 18 | "name": "javascript", 19 | "count_questions": 40, 20 | "link": "http://www.preguntapi.dev/api/categories/javascript" 21 | }, 22 | . 23 | . 24 | . 25 | ], 26 | "totalCategories": 13, 27 | "totalQuestions": 361 28 | } 29 | ` 30 | 31 | const texto2 = String.raw` 32 | [ 33 | { 34 | "id": "89", 35 | "category": "javascript", 36 | "level": "facil", 37 | "question": "const person = {name:\"John\", age:31, city:\"New York\"};... ¿cuál es la forma correcta de acceder a los valores?", 38 | "answers": { 39 | "answer_a": "person.name", 40 | "answer_b": "person[\"name\"]", 41 | "answer_c": "Ambas son correctas" 42 | }, 43 | "correct_answer": "answer_c" 44 | }, 45 | { 46 | "id": "325", 47 | "category": "javascript", 48 | "level": "facil", 49 | "question": "¿Qué sentencia puede tomar una sola expresión como entrada y luego buscar a través de un número de opciones hasta que se encuentre una que coincida con ese valor?", 50 | "answers": { 51 | "answer_a": "else", 52 | "answer_b": "when", 53 | "answer_c": "switch", 54 | "answer_d": "if" 55 | }, 56 | "correct_answer": "answer_c" 57 | }, 58 | { 59 | "id": "358", 60 | "category": "javascript", 61 | "level": "facil", 62 | "question": "¿Qué método de la API del navegador se utiliza para hacer una petición HTTP de forma nativa?", 63 | "answers": { 64 | "answer_a": "fetch(\"https://some-url-here.com\")", 65 | "answer_b": "axios.get(\"https://some-url-here.com\")", 66 | "answer_c": "makeRequest(\"https://some-url-here.com\")" 67 | }, 68 | "correct_answer": "answer_a" 69 | }, 70 | { 71 | "id": "66", 72 | "category": "javascript", 73 | "level": "facil", 74 | "question": "Cómo insertar un comentario que tiene más de una línea?", 75 | "answers": { 76 | "answer_a": "/*Este comentario tiene más de una línea.*/", 77 | "answer_b": "", 78 | "answer_c": "//Este comentario tiene más de una línea.//" 79 | }, 80 | "correct_answer": "answer_a", 81 | "feedback": " Los comentarios comienzan con /* y terminan con */ . Cualquier texto entre /* y */ serán ignorados por JavaScript." 82 | }, 83 | { 84 | "id": "78", 85 | "category": "javascript", 86 | "level": "facil", 87 | "question": "¿Cuál es la forma correcta de incluir un archivo JS externo en HTML?", 88 | "answers": { 89 | "answer_a": " solo puede utilizar el atributo 'src', 'href' es usado en enlaces con etiqueta ." 95 | } 96 | ] 97 | ` 98 | 99 | return ( 100 | <> 101 |
102 |
103 |

104 | Documentación 105 |

106 | 107 |
108 |

109 | Información 110 |

111 |

112 | ¡Bienvenido a preguntAPI! Una API de preguntas de programación. 113 |

114 |

115 | Esta es una API solo de consumo, solo el método GET está disponible en los recursos. 116 |

117 |

No se requiere autenticación y todos los recursos están completamente abiertos y disponibles.

118 |
119 |

120 | ¿Por qué? 121 |

122 |

123 | Porque quería construir un proyecto de código abierto y nunca 124 | había creado una API, después de investigar por un tiempo no 125 | encontré ninguna en español de esta temática y surgió la idea de 126 | preguntAPI. 127 |

128 |
129 | 130 |
131 |

132 | Como contribuir en el proyecto 133 |

134 |

135 | Si encuentras algún error en las preguntas o el funcionamiento de 136 | la API puedes{' '} 137 | 142 | enviar una sugerencia 143 | {' '} 144 | o contribuir directamente en el proyecto mediante{' '} 145 | 150 | GitHub 151 | {' '} 152 | para añadir categorías, preguntas, mejorar el funcionamiento de la 153 | API o reportar errores.{' '} 154 |

155 |
156 | 157 |
158 |

159 | URL base 160 |

161 |

162 | La URL base contiene información sobre todas las categorías 163 | disponibles, el número total de categorías, de preguntas por categoría y de preguntas de la API. 164 |

165 |
166 | 167 | 168 |
169 | 170 | 171 |
172 |

173 | Para obtener las preguntas concretas de una categoría, hay que añadir el nombre de la misma en la ruta y esta 174 | puede recibir los siguientes parámetros: "limit" y "level".
175 |
176 | Level puede recibir los valores: facil, normal o dificil.
177 |
178 | Si no se especifica un limite la API devolverá todas las 179 | preguntas de esa misma categoría.
180 |
181 | Todas las respuestas devolverán datos en formato json. 182 |

183 |

184 | Ejemplo: 185 |

186 | 187 | 188 |
189 | 190 | 191 |
192 |
193 |
194 | 195 | ) 196 | } 197 | 198 | export default Doc 199 | -------------------------------------------------------------------------------- /web/src/components/Footer.jsx: -------------------------------------------------------------------------------- 1 | import Link from "@/components/Link"; 2 | import IconGithub from "@/components/icons/IconGithub"; 3 | 4 | const Footer = () => { 5 | return ( 6 |
7 |
8 | 13 | 14 | preguntAPI 15 | 16 |
17 |
18 | ); 19 | }; 20 | 21 | export default Footer; 22 | -------------------------------------------------------------------------------- /web/src/components/Home.jsx: -------------------------------------------------------------------------------- 1 | import { useState, useEffect, useCallback } from 'react' 2 | import { Player } from '@lottiefiles/react-lottie-player' 3 | import Link from '@/components/Link' 4 | 5 | import { getAllCategories, getCategory, LEVEL } from '../services/quizzes' 6 | 7 | export default function Home () { 8 | const [categories, setCategories] = useState([]) 9 | const [category, setCategory] = useState('html') 10 | const [limit, setLimit] = useState(10) 11 | const [level, setLevel] = useState(LEVEL.RANDOM) 12 | const [totalLevelQuestions, setTotalLevelQuestions] = useState(0) 13 | const [randomQuiz, setRandomQuiz] = useState(true) 14 | const [totalQuizzes, setTotalQuizzes] = useState(0) 15 | 16 | const quizURL = `/startQuiz?category=${category}&level=${level}&limit=${limit}` 17 | 18 | useEffect(() => { 19 | getAllCategories() 20 | .then((data) => { 21 | setCategories(data.categories) 22 | setTotalQuizzes(data.totalQuestions) 23 | }) 24 | .catch((err) => console.log(err.message)) 25 | }, []) 26 | 27 | useEffect(() => { 28 | getCategory({ category, level }) 29 | .then((data) => { 30 | setTotalLevelQuestions(data.length) 31 | if (level !== LEVEL.RANDOM && data.length < 10) { 32 | setLimit(data.length) 33 | } 34 | }) 35 | }, [category, level]) 36 | 37 | const handleLevel = (e) => { 38 | setLevel(e.target.value) 39 | setRandomQuiz(e.target.value === LEVEL.RANDOM) 40 | } 41 | 42 | const handleSelectCategory = (e) => { 43 | const categorySelected = e.target.getAttribute('data-category') 44 | setCategory(categorySelected) 45 | setLevel(LEVEL.RANDOM) 46 | setLimit(10) 47 | } 48 | 49 | /** 50 | * Returns an array with the range of options 10 - 20 in multiples of 5 or if totalLevelQuestions is within this range. 51 | */ 52 | const getOptionsCount = useCallback(() => { 53 | const limit = randomQuiz || totalLevelQuestions >= 20 ? 20 : totalLevelQuestions 54 | const options = Array.from({ length: (limit - 6) / 5 }, (_, i) => (i + 2) * 5) 55 | options.push(limit) 56 | 57 | return options 58 | }, [randomQuiz, totalLevelQuestions]) 59 | 60 | return ( 61 |
62 |
63 |
64 | 70 |
71 | 72 |
73 |
74 |

75 | ¡Preguntas de programación! 76 |

77 |

78 | Integra nuestra API en tus proyectos o pon a prueba tus conocimientos. 79 |
80 | Dispones de un total de {totalQuizzes} preguntas y {categories.length} lenguajes de programación. 81 |

82 |
83 |
    84 | {categories.map((c) => ( 85 |
  • 86 | 94 |
  • 95 | ))} 96 |
97 |
98 |
99 |
100 |

Dificultad:

101 | 111 |
112 |
113 |

Cantidad de preguntas:

114 | 122 |
123 |
124 | 125 | ¡Iniciar Quiz! 126 | 127 |
128 |
129 |
130 |
131 |
132 |
133 | ) 134 | } 135 | -------------------------------------------------------------------------------- /web/src/components/Link.jsx: -------------------------------------------------------------------------------- 1 | import { Link as RouterLink } from 'react-router-dom' 2 | 3 | const Link = ({ to, external, children, className }) => { 4 | const LinkTag = external ? 'a' : RouterLink 5 | 6 | return ( 7 | 14 | {children} 15 | 16 | ) 17 | } 18 | 19 | export default Link 20 | -------------------------------------------------------------------------------- /web/src/components/Navigation.jsx: -------------------------------------------------------------------------------- 1 | import Link from '@/components/Link' 2 | import IconHamburguer from '@/components/icons/IconHamburguer' 3 | 4 | const Navigation = () => { 5 | return ( 6 | <> 7 |
8 |
9 |
10 |
11 |
12 | 15 |
    19 |
  • 20 | 24 | ¡Empieza un Quiz! 25 | 26 |
  • 27 |
  • 28 | 32 | Documentación 33 | 34 |
  • 35 |
36 |
37 | 41 | preguntAPI 42 | 43 |
44 |
45 |
    46 |
  • 47 | 51 | ¡Empieza un Quiz! 52 | 53 |
  • 54 |
  • 55 | 59 | Documentación 60 | 61 |
  • 62 |
63 |
64 |
65 |
66 |
67 | 68 | ) 69 | } 70 | 71 | export default Navigation 72 | -------------------------------------------------------------------------------- /web/src/components/PreCode.jsx: -------------------------------------------------------------------------------- 1 | import IconCopy from '@/components/icons/IconCopy' 2 | 3 | const PreCode = ({ code = '', prefix = '$', copy = true }) => { 4 | const clickOnCopy = () => { 5 | navigator.clipboard.writeText(code) 6 | } 7 | 8 | return ( 9 |
10 | {copy &&

} 11 |
12 |         {code}
13 |       
14 |
15 | ) 16 | } 17 | 18 | export default PreCode 19 | -------------------------------------------------------------------------------- /web/src/components/StartQuiz.jsx: -------------------------------------------------------------------------------- 1 | import { useEffect, useState } from 'react' 2 | import { useSearchParams } from 'react-router-dom' 3 | 4 | import Link from '@/components/Link' 5 | import IconInfo from '@/components/icons/IconInfo' 6 | 7 | export default function StartQuiz () { 8 | const [searchParams] = useSearchParams() 9 | const category = searchParams.get('category') 10 | const level = searchParams.get('level') 11 | const limit = searchParams.get('limit') 12 | 13 | const [quizzes, setQuizzes] = useState([]) 14 | const [actualQuizIndex, setActualQuestionIndex] = useState(0) 15 | const [actualQuestion, setActualQuestion] = useState(null) 16 | 17 | const [showFeedback, setShowFeedback] = useState(false) 18 | const [quizScore, setQuizScore] = useState(0) 19 | const [quizEnd, setQuizEnd] = useState(false) 20 | 21 | const [btnDisabled, setBtnDisabled] = useState() 22 | const [btnNextDisabled, setBtnNextDisabled] = useState(true) 23 | 24 | useEffect(() => { 25 | fetch(`/api/categories/${category}?level=${level}&limit=${limit}`) 26 | .then((res) => res.json()) 27 | .then((data) => { 28 | setQuizzes(data) 29 | setActualQuestion(data[0]) 30 | }) 31 | .catch((err) => console.log(err.message)) 32 | }, []) 33 | 34 | const clearState = () => { 35 | setActualQuestionIndex(0) 36 | setActualQuestion(quizzes[0]) 37 | setQuizEnd(false) 38 | setQuizScore(0) 39 | setBtnDisabled(false) 40 | setShowFeedback(false) 41 | } 42 | 43 | const handlerSelectQuestion = (e) => { 44 | let classBtn = 'btn-error' 45 | 46 | if (e.target.id === actualQuestion.correct_answer) { 47 | classBtn = 'btn-success' 48 | setQuizScore(quizScore + 1) 49 | } else { 50 | setShowFeedback(true) 51 | document 52 | .getElementById(actualQuestion.correct_answer) 53 | .classList.replace( 54 | 'btn-ghost', 55 | 'btn-success' 56 | ) 57 | } 58 | 59 | e.target.classList.replace('btn-ghost', classBtn) 60 | setBtnDisabled(true) 61 | setBtnNextDisabled(false) 62 | 63 | if (actualQuizIndex === quizzes.length - 1) { 64 | setBtnNextDisabled(true) 65 | 66 | const idTimeout = setTimeout(() => { 67 | setQuizEnd(true) 68 | clearTimeout(idTimeout) 69 | }, 5000) 70 | } 71 | } 72 | 73 | return ( 74 |
75 |
76 |

{category.toUpperCase()}

77 |

Puntuación: {quizScore} de {quizzes.length}

78 | 79 | {!quizEnd && ( 80 | <> 81 |

Pregunta {actualQuizIndex + 1} de {quizzes.length}

82 | 83 | {actualQuestion && 84 |
85 |

{actualQuestion.question}

86 | 87 | {showFeedback && actualQuestion.feedback && 88 | } 98 | 99 |
100 | {Object.keys(actualQuestion.answers).map((key) => ( 101 | 110 | ))} 111 |
112 |
} 113 | 114 | )} 115 |
116 | 117 |
118 | {quizEnd 119 | ? ( 120 | <> 121 | 127 | 128 | SALIR 129 | 130 | 131 | ) 132 | : ( 133 | 146 | )} 147 |
148 |
149 | ) 150 | } 151 | -------------------------------------------------------------------------------- /web/src/components/icons/IconCopy.jsx: -------------------------------------------------------------------------------- 1 | export default ({ className, color = 'currentColor' }) => { 2 | return ( 3 | 10 | 16 | 17 | ) 18 | } 19 | -------------------------------------------------------------------------------- /web/src/components/icons/IconGithub.jsx: -------------------------------------------------------------------------------- 1 | export default ({ className, color = 'currentColor' }) => { 2 | return ( 3 | 10 | 13 | 14 | ) 15 | } 16 | -------------------------------------------------------------------------------- /web/src/components/icons/IconHamburguer.jsx: -------------------------------------------------------------------------------- 1 | export default ({ className, color = 'currentColor' }) => { 2 | return ( 3 | 10 | 16 | 17 | ) 18 | } 19 | -------------------------------------------------------------------------------- /web/src/components/icons/IconInfo.jsx: -------------------------------------------------------------------------------- 1 | export default ({ className, color = 'currentColor' }) => { 2 | return ( 3 | 16 | ) 17 | } 18 | -------------------------------------------------------------------------------- /web/src/index.css: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; 4 | 5 | .lightBackground{ 6 | background-image: linear-gradient(22.5deg, rgba(242, 242, 242, 0.03) 0%, rgba(242, 242, 242, 0.03) 16%,rgba(81, 81, 81, 0.03) 16%, rgba(81, 81, 81, 0.03) 26%,rgba(99, 99, 99, 0.03) 26%, rgba(99, 99, 99, 0.03) 73%,rgba(43, 43, 43, 0.03) 73%, rgba(43, 43, 43, 0.03) 84%,rgba(213, 213, 213, 0.03) 84%, rgba(213, 213, 213, 0.03) 85%,rgba(125, 125, 125, 0.03) 85%, rgba(125, 125, 125, 0.03) 100%),linear-gradient(22.5deg, rgba(25, 25, 25, 0.03) 0%, rgba(25, 25, 25, 0.03) 54%,rgba(144, 144, 144, 0.03) 54%, rgba(144, 144, 144, 0.03) 60%,rgba(204, 204, 204, 0.03) 60%, rgba(204, 204, 204, 0.03) 76%,rgba(37, 37, 37, 0.03) 76%, rgba(37, 37, 37, 0.03) 78%,rgba(115, 115, 115, 0.03) 78%, rgba(115, 115, 115, 0.03) 91%,rgba(63, 63, 63, 0.03) 91%, rgba(63, 63, 63, 0.03) 100%),linear-gradient(157.5deg, rgba(71, 71, 71, 0.03) 0%, rgba(71, 71, 71, 0.03) 6%,rgba(75, 75, 75, 0.03) 6%, rgba(75, 75, 75, 0.03) 15%,rgba(131, 131, 131, 0.03) 15%, rgba(131, 131, 131, 0.03) 18%,rgba(110, 110, 110, 0.03) 18%, rgba(110, 110, 110, 0.03) 37%,rgba(215, 215, 215, 0.03) 37%, rgba(215, 215, 215, 0.03) 62%,rgba(5, 5, 5, 0.03) 62%, rgba(5, 5, 5, 0.03) 100%),linear-gradient(90deg, #ffffff,#ffffff); 7 | } -------------------------------------------------------------------------------- /web/src/main.jsx: -------------------------------------------------------------------------------- 1 | import { createRoot } from 'react-dom/client' 2 | import { BrowserRouter } from 'react-router-dom' 3 | 4 | import App from './App' 5 | import './index.css' 6 | 7 | createRoot(document.getElementById('root')).render( 8 | 9 | 10 | 11 | ) 12 | -------------------------------------------------------------------------------- /web/src/services/quizzes/index.js: -------------------------------------------------------------------------------- 1 | export const LEVEL = { 2 | RANDOM: 'aleatorio', 3 | EASY: 'facil', 4 | NORMAL: 'normal', 5 | HARD: 'dificil' 6 | } 7 | 8 | export function getAllCategories () { 9 | return fetch('/api/categories') 10 | .then((res) => res.json()) 11 | } 12 | 13 | export function getCategory ({ category, level = LEVEL.RANDOM }) { 14 | if (!category) { 15 | throw new Error('Missing category param') 16 | } 17 | return fetch(`/api/categories/${category}?level=${level}`) 18 | .then((res) => res.json()) 19 | } 20 | -------------------------------------------------------------------------------- /web/tailwind.config.cjs: -------------------------------------------------------------------------------- 1 | /** @type {import('tailwindcss').Config} */ 2 | module.exports = { 3 | content: [ 4 | './index.html', 5 | './src/**/*.{js,ts,jsx,tsx}' 6 | ], 7 | theme: { 8 | extend: { 9 | fontFamily: { 10 | montserrat: ['Montserrat', '-apple-system', 'Arial', 'sans-serif'] 11 | } 12 | } 13 | }, 14 | plugins: [require('daisyui')], 15 | daisyui: { 16 | styled: true, 17 | themes: true, 18 | base: true, 19 | utils: true, 20 | logs: true, 21 | rtl: false, 22 | prefix: '', 23 | darkTheme: 'light' 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /web/tests/quiz-flow.spec.js: -------------------------------------------------------------------------------- 1 | // @ts-check 2 | import { test, expect } from '@playwright/test' 3 | import { categories } from './utils/constans.js' 4 | 5 | test.describe('Quiz flow', async () => { 6 | test('displayed categories should be the same as those obtained from the API', async ({ page }) => { 7 | // Goes to the home page and waits for the item that takes the longest to load 8 | await page.goto('/') 9 | await page.waitForSelector('.lf-player-container svg') 10 | 11 | // Gets the list of categories and checks that it exists 12 | const categoryUl = page.locator('ul').nth(2) 13 | expect(categoryUl).toHaveCount(1) 14 | 15 | // Compare the list of categories has the same amount as the one obtained from the API. 16 | const categoriesLi = categoryUl.locator('li') 17 | expect(await categoriesLi.count()).toEqual(categories.length) 18 | 19 | // Compare the list of categories displayed with those obtained from the API. 20 | const categoriesButtons = categoriesLi.locator('button') 21 | const categoriesList = await categoriesButtons.allTextContents() 22 | categories.forEach((category, index) => { 23 | expect(categoriesList[index]).toContain(category.toUpperCase()) 24 | }) 25 | }) 26 | 27 | test('should generate the correct link to quiz', async ({ page }) => { 28 | const category = 'javascript' 29 | const level = 'normal' 30 | const limit = 10 31 | 32 | // Goes to the home page and waits for the item that takes the longest to load 33 | await page.goto('/') 34 | await page.waitForSelector('.lf-player-container svg') 35 | 36 | // Click on the selected category button 37 | const categoryBtn = page.locator(`[data-category=${category}]`) 38 | await categoryBtn.click() 39 | 40 | // Select the level and number of questions configured 41 | await page.locator('select').first().selectOption({ label: level.toUpperCase() }) 42 | await page.locator('select').nth(1).selectOption({ label: limit.toString() }) 43 | 44 | // Check that the link generated to start the quiz is correct 45 | const startQuizBtn = page.getByRole('link', { name: '¡Iniciar Quiz!' }).first() 46 | expect(startQuizBtn).toHaveCount(1) 47 | const startQuizPath = await startQuizBtn.getAttribute('href') 48 | expect(startQuizPath).toEqual(`/startQuiz?category=${category}&level=${level}&limit=${limit}`) 49 | }) 50 | 51 | categories.forEach(async (category) => { 52 | test(`should redirect to the correct quiz for ${category} category`, async ({ page }) => { 53 | // Goes to the home page and waits for the item that takes the longest to load 54 | await page.goto('/') 55 | await page.waitForSelector('.lf-player-container svg') 56 | 57 | // Click on the selected category button 58 | const categoryBtn = page.locator(`[data-category=${category}]`) 59 | await categoryBtn.click() 60 | 61 | // Select the random level 62 | await page.locator('select').first().selectOption({ label: 'ALEATORIO' }) 63 | 64 | // Click and wait for redirection 65 | const startQuizBtn = page.getByRole('link', { name: '¡Iniciar Quiz!' }) 66 | await startQuizBtn.click() 67 | 68 | // Check that it has been redirected to the correct path 69 | const { pathname, search } = new globalThis.URL(page.url()) 70 | expect(pathname + search).toEqual(`/startQuiz?category=${category}&level=aleatorio&limit=10`) 71 | 72 | // Check that the title is correct 73 | const titleElement = page.getByText(category.toUpperCase()).first() 74 | const titleText = await titleElement.textContent() 75 | expect(titleText).toEqual(category.toUpperCase()) 76 | }) 77 | }) 78 | 79 | test('should complete the quiz', async ({ page }) => { 80 | const category = 'javascript' 81 | const limit = 10 82 | let score = 0 83 | 84 | // Goes to the quiz page 85 | await page.goto(`/startQuiz?category=${category}&level=aleatorio&limit=10`) 86 | 87 | // TODO: investigate if there is a better way to do it 88 | score = await testOneQuestion(page, { quizNum: 1, score, limit }) 89 | score = await testOneQuestion(page, { quizNum: 2, score, limit }) 90 | score = await testOneQuestion(page, { quizNum: 3, score, limit }) 91 | score = await testOneQuestion(page, { quizNum: 4, score, limit }) 92 | score = await testOneQuestion(page, { quizNum: 5, score, limit }) 93 | score = await testOneQuestion(page, { quizNum: 6, score, limit }) 94 | score = await testOneQuestion(page, { quizNum: 7, score, limit }) 95 | score = await testOneQuestion(page, { quizNum: 8, score, limit }) 96 | score = await testOneQuestion(page, { quizNum: 9, score, limit }) 97 | score = await testOneQuestion(page, { quizNum: 10, score, limit }) 98 | 99 | // Wait for the quiz to finish 100 | await page.waitForTimeout(5500) 101 | 102 | // Compares the obtained score with the calculated score 103 | const finalScore = await page.getByText(`Puntuación: ${score} de ${limit}`).textContent() 104 | expect(finalScore?.trim()).toEqual(`Puntuación: ${score} de ${limit}`) 105 | 106 | // Check that the buttons to repeat the quiz and to return to home page are present 107 | const quizAgainBtn = page.getByRole('button', { name: 'REPETIR QUIZ' }) 108 | expect(quizAgainBtn).toHaveCount(1) 109 | const goToHomeBtn = page.getByRole('link', { name: 'SALIR' }) 110 | expect(goToHomeBtn).toHaveCount(1) 111 | 112 | // Back to home page 113 | await goToHomeBtn.click() 114 | 115 | // Check that you are on the home page 116 | const { pathname } = new globalThis.URL(page.url()) 117 | expect(pathname).toEqual('/') 118 | }) 119 | }) 120 | 121 | /** 122 | * @param {import('@playwright/test').Page} page 123 | * @param {object} opts 124 | * @param {number} opts.quizNum 125 | * @param {number} opts.score 126 | * @param {number} opts.limit 127 | * @returns {Promise} 128 | */ 129 | async function testOneQuestion (page, { quizNum, score, limit }) { 130 | // Waits for the item that takes the longest to load 131 | await page.waitForSelector('button') 132 | 133 | // Check that the question number is correct 134 | const questionCountText = await page.getByText(`Pregunta ${quizNum} de ${limit}`).textContent() 135 | expect(questionCountText?.trim()).toEqual(`Pregunta ${quizNum} de ${limit}`) 136 | 137 | // Check that the score is correct 138 | const scoreCountText = await page.getByText(`Puntuación: ${score} de ${limit}`).textContent() 139 | expect(scoreCountText?.trim()).toEqual(`Puntuación: ${score} de ${limit}`) 140 | 141 | // Check that the question is present on the page 142 | const questionLocator = page.locator('p').nth(2) 143 | expect(questionLocator).toHaveCount(1) 144 | 145 | // Check that there are at least 2 options to choose from 146 | const questionsBtn = page.locator('button:not(:disabled)') 147 | const questionsBtnCount = await questionsBtn.count() 148 | const thereAreOptions = (questionsBtnCount >= 2) && (questionsBtnCount <= 6) 149 | expect(thereAreOptions).toBe(true) 150 | 151 | // Check that the button is disabled at startup 152 | const nextBtn = page.locator('button').last() 153 | const isDisabled = await nextBtn.isDisabled() 154 | expect(isDisabled).toBe(true) 155 | 156 | // Choose the first option and wait a moment 157 | await questionsBtn.first().click() 158 | await page.waitForTimeout(250) 159 | 160 | // Gets the background color of the selected option 161 | const selectedButtonBackground = await page.locator('button:disabled').first().evaluate((ele) => { 162 | return window.getComputedStyle(ele).getPropertyValue('background-color') 163 | }) 164 | 165 | if (quizNum < limit) { 166 | // Check that the button is enabled 167 | const isEnabled = await nextBtn.isEnabled() 168 | expect(isEnabled).toBe(true) 169 | await nextBtn.click() 170 | } 171 | 172 | // Returns the corresponding score 173 | if (selectedButtonBackground === 'rgb(248, 114, 114)') return score 174 | return score + 1 175 | } 176 | -------------------------------------------------------------------------------- /web/tests/utils/constans.js: -------------------------------------------------------------------------------- 1 | export const categories = [ 2 | 'cpp', 3 | 'csharp', 4 | 'css', 5 | 'html', 6 | 'java', 7 | 'javascript', 8 | 'kotlin', 9 | 'php', 10 | 'python', 11 | 'sql', 12 | 'swift', 13 | 'typescript' 14 | ] 15 | -------------------------------------------------------------------------------- /web/vite.config.js: -------------------------------------------------------------------------------- 1 | import url from 'node:url' 2 | import path from 'node:path' 3 | import { defineConfig, loadEnv } from 'vite' 4 | import react from '@vitejs/plugin-react' 5 | 6 | // // https://vitejs.dev/config/ 7 | // export default defineConfig( 8 | // { 9 | // process.env = {...process.env, ...loadEnv(mode, process.cwd())} 10 | // }) 11 | 12 | const dirname = typeof __dirname !== 'undefined' ? __dirname : path.dirname(url.fileURLToPath(import.meta.url)) 13 | 14 | export default ({ mode }) => { 15 | // Load app-level env vars to node-level env vars. 16 | process.env = { ...process.env, ...loadEnv(mode, process.cwd()) } 17 | 18 | return defineConfig({ 19 | server: { 20 | proxy: { 21 | '/api': process.env.VITE_URL_API 22 | } 23 | }, 24 | resolve: { 25 | alias: { 26 | '@': path.resolve(dirname, './src') 27 | } 28 | }, 29 | plugins: [react()], 30 | build: { 31 | chunkSizeWarningLimit: 1000 32 | } 33 | }) 34 | } 35 | --------------------------------------------------------------------------------