From 2b889c6f890ed2cd5593df23d7872d0a4c377153 Mon Sep 17 00:00:00 2001 From: Sangeeth Sudheer Date: Sat, 2 Apr 2022 15:39:31 +0530 Subject: [PATCH] feat(792-binary-search): add py3 solution --- .gitignore | 163 +++++++++++++++- .scripts/addnew | 55 ++++++ .scripts/graphql.mjs | 23 +++ 0792_binary-search/README.md | 26 +++ 0792_binary-search/python3/solution.py | 16 ++ Makefile | 3 + jsconfig.json | 6 + package.json | 10 + pnpm-lock.yaml | 258 +++++++++++++++++++++++++ 9 files changed, 554 insertions(+), 6 deletions(-) create mode 100755 .scripts/addnew create mode 100644 .scripts/graphql.mjs create mode 100644 0792_binary-search/README.md create mode 100644 0792_binary-search/python3/solution.py create mode 100644 Makefile create mode 100644 jsconfig.json create mode 100644 package.json create mode 100644 pnpm-lock.yaml diff --git a/.gitignore b/.gitignore index 3ca47aa..f3bcbab 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,6 @@ -# Created by https://www.toptal.com/developers/gitignore/api/windows,linux,macos,python -# Edit at https://www.toptal.com/developers/gitignore?templates=windows,linux,macos,python +# Created by https://www.toptal.com/developers/gitignore/api/node,python,windows,linux,macos +# Edit at https://www.toptal.com/developers/gitignore?templates=node,python,windows,linux,macos ### Linux ### *~ @@ -45,6 +45,146 @@ Network Trash Folder Temporary Items .apdisk +### Node ### +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* +.pnpm-debug.log* + +# Diagnostic reports (https://nodejs.org/api/report.html) +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage +*.lcov + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# Snowpack dependency directory (https://snowpack.dev/) +web_modules/ + +# TypeScript cache +*.tsbuildinfo + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Optional stylelint cache +.stylelintcache + +# Microbundle cache +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variable files +.env +.env.development.local +.env.test.local +.env.production.local +.env.local + +# parcel-bundler cache (https://parceljs.org/) +.cache +.parcel-cache + +# Next.js build output +.next +out + +# Nuxt.js build / generate output +.nuxt +dist + +# Gatsby files +.cache/ +# Comment in the public line in if your project uses Gatsby and not Next.js +# https://nextjs.org/blog/next-9-1#public-directory-support +# public + +# vuepress build output +.vuepress/dist + +# vuepress v2.x temp and cache directory +.temp + +# Docusaurus cache and generated files +.docusaurus + +# Serverless directories +.serverless/ + +# FuseBox cache +.fusebox/ + +# DynamoDB Local files +.dynamodb/ + +# TernJS port file +.tern-port + +# Stores VSCode versions used for testing VSCode extensions +.vscode-test + +# yarn v2 +.yarn/cache +.yarn/unplugged +.yarn/build-state.yml +.yarn/install-state.gz +.pnp.* + +### Node Patch ### +# Serverless Webpack directories +.webpack/ + +# Optional stylelint cache + +# SvelteKit build / generate output +.svelte-kit + ### Python ### # Byte-compiled / optimized / DLL files __pycache__/ @@ -90,7 +230,6 @@ htmlcov/ .nox/ .coverage .coverage.* -.cache nosetests.xml coverage.xml *.cover @@ -104,7 +243,6 @@ cover/ *.pot # Django stuff: -*.log local_settings.py db.sqlite3 db.sqlite3-journal @@ -142,6 +280,13 @@ ipython_config.py # install all needed dependencies. #Pipfile.lock +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control +#poetry.lock + # PEP 582; used by e.g. github.com/David-OConnor/pyflow __pypackages__/ @@ -153,7 +298,6 @@ celerybeat.pid *.sage.py # Environments -.env .venv env/ venv/ @@ -185,6 +329,13 @@ dmypy.json # Cython debug symbols cython_debug/ +# PyCharm +# JetBrains specific template is maintained in a separate JetBrains.gitignore that can +# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore +# and can be added to the global gitignore or merged into this file. For a more nuclear +# option (not recommended) you can uncomment the following to ignore the entire idea folder. +#.idea/ + ### Windows ### # Windows thumbnail cache files Thumbs.db @@ -211,5 +362,5 @@ $RECYCLE.BIN/ # Windows shortcuts *.lnk -# End of https://www.toptal.com/developers/gitignore/api/windows,linux,macos,python +# End of https://www.toptal.com/developers/gitignore/api/node,python,windows,linux,macos n \ No newline at end of file diff --git a/.scripts/addnew b/.scripts/addnew new file mode 100755 index 0000000..e80fcad --- /dev/null +++ b/.scripts/addnew @@ -0,0 +1,55 @@ +#!/usr/bin/env zx + +import Turndown from "turndown"; +import { client, gql } from "./graphql.mjs"; + +const langExt = { python3: "py", nodejs: "js", cpp: "cpp" }; + +const link = await question("Enter leetcode problem link: "); +const titleSlug = path.basename(new URL(link).pathname); + +const language = await question("Enter language: ", { + choices: Object.keys(langExt), +}); + +const { question: q } = await client.request( + gql` + query questionData($titleSlug: String!) { + question(titleSlug: $titleSlug) { + questionId + questionFrontendId + boundTopicId + title + titleSlug + content + } + } + `, + { + titleSlug, + } +); + +const questionIdPadded = q.questionId.padStart(4, "0"); +const questionDir = `${questionIdPadded}_${q.titleSlug}`; +const solutionDir = `${questionDir}/${language}`; +const solutionFilePath = `${solutionDir}/solution.${langExt[language]}`; + +const td = new Turndown({}); +td.addRule("pre-code", { + filter: "pre", + replacement(content) { + return "```\n" + content + "```"; + }, +}); +const mdBody = td.turndown(q.content); + +await $`mkdir -p ${solutionDir}`; +await $`touch ${solutionFilePath}`; + +fs.writeFileSync(`${questionDir}/README.md`, mdBody, { encoding: "utf-8" }); + +// TODO: Wait for solution to be pasted and saved +// TODO: If above is successful (prompt for a key), then git add . and git commit + +console.log("Done!"); diff --git a/.scripts/graphql.mjs b/.scripts/graphql.mjs new file mode 100644 index 0000000..8b1b863 --- /dev/null +++ b/.scripts/graphql.mjs @@ -0,0 +1,23 @@ +import { request, GraphQLClient, gql } from "graphql-request"; + +const customFetch = require("fetch-cookie")(fetch); +export const client = new GraphQLClient("https://leetcode.com/graphql", { + headers: { + Referer: "https://leetcode.com", + }, + fetch: customFetch, +}); + +const lastFetch = await customFetch("https://leetcode.com", { + redirect: "follow", + headers: { + Referer: "https://leetcode.com", + }, +}); + +client.setHeader( + "x-csrftoken", + /csrftoken=([^;]+)/.exec(lastFetch.headers.get("set-cookie"))[1] +); + +export { gql }; diff --git a/0792_binary-search/README.md b/0792_binary-search/README.md new file mode 100644 index 0000000..373d6ba --- /dev/null +++ b/0792_binary-search/README.md @@ -0,0 +1,26 @@ +Given an array of integers `nums` which is sorted in ascending order, and an integer `target`, write a function to search `target` in `nums`. If `target` exists, then return its index. Otherwise, return `-1`. + +You must write an algorithm with `O(log n)` runtime complexity. + +**Example 1:** + +``` +**Input:** nums = \[-1,0,3,5,9,12\], target = 9 +**Output:** 4 +**Explanation:** 9 exists in nums and its index is 4 +``` + +**Example 2:** + +``` +**Input:** nums = \[-1,0,3,5,9,12\], target = 2 +**Output:** -1 +**Explanation:** 2 does not exist in nums so return -1 +``` + +**Constraints:** + +* `1 <= nums.length <= 104` +* `-104 < nums[i], target < 104` +* All the integers in `nums` are **unique**. +* `nums` is sorted in ascending order. \ No newline at end of file diff --git a/0792_binary-search/python3/solution.py b/0792_binary-search/python3/solution.py new file mode 100644 index 0000000..d8ab5e0 --- /dev/null +++ b/0792_binary-search/python3/solution.py @@ -0,0 +1,16 @@ +class Solution: + def search(self, nums: List[int], target: int) -> int: + start = 0 + end = len(nums) - 1 + + while start <= end: + mid = (start + end) // 2 + + if nums[mid] == target: + return mid + elif target < nums[mid]: + end = mid - 1 + else: + start = mid + 1 + + return -1 diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..40d7926 --- /dev/null +++ b/Makefile @@ -0,0 +1,3 @@ +addnew: + ./.scripts/addnew +.PHONY: addsoln diff --git a/jsconfig.json b/jsconfig.json new file mode 100644 index 0000000..e8eec38 --- /dev/null +++ b/jsconfig.json @@ -0,0 +1,6 @@ +{ + "compilerOptions": { + "module": "esnext" + }, + "include": [".scripts/*"] +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..7c2e522 --- /dev/null +++ b/package.json @@ -0,0 +1,10 @@ +{ + "type": "module", + "dependencies": { + "cheerio": "^1.0.0-rc.10", + "fetch-cookie": "^2.0.3", + "graphql": "^16.3.0", + "graphql-request": "^4.2.0", + "turndown": "^7.1.1" + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..77de0b3 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,258 @@ +lockfileVersion: 5.3 + +specifiers: + cheerio: ^1.0.0-rc.10 + fetch-cookie: ^2.0.3 + graphql: ^16.3.0 + graphql-request: ^4.2.0 + turndown: ^7.1.1 + +dependencies: + cheerio: 1.0.0-rc.10 + fetch-cookie: 2.0.3 + graphql: 16.3.0 + graphql-request: 4.2.0_graphql@16.3.0 + turndown: 7.1.1 + +packages: + + /asynckit/0.4.0: + resolution: {integrity: sha1-x57Zf380y48robyXkLzDZkdLS3k=} + dev: false + + /boolbase/1.0.0: + resolution: {integrity: sha1-aN/1++YMUes3cl6p4+0xDcwed24=} + dev: false + + /cheerio-select/1.6.0: + resolution: {integrity: sha512-eq0GdBvxVFbqWgmCm7M3XGs1I8oLy/nExUnh6oLqmBditPO9AqQJrkslDpMun/hZ0yyTs8L0m85OHp4ho6Qm9g==} + dependencies: + css-select: 4.3.0 + css-what: 6.1.0 + domelementtype: 2.2.0 + domhandler: 4.3.1 + domutils: 2.8.0 + dev: false + + /cheerio/1.0.0-rc.10: + resolution: {integrity: sha512-g0J0q/O6mW8z5zxQ3A8E8J1hUgp4SMOvEoW/x84OwyHKe/Zccz83PVT4y5Crcr530FV6NgmKI1qvGTKVl9XXVw==} + engines: {node: '>= 6'} + dependencies: + cheerio-select: 1.6.0 + dom-serializer: 1.3.2 + domhandler: 4.3.1 + htmlparser2: 6.1.0 + parse5: 6.0.1 + parse5-htmlparser2-tree-adapter: 6.0.1 + tslib: 2.3.1 + dev: false + + /combined-stream/1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + dependencies: + delayed-stream: 1.0.0 + dev: false + + /cross-fetch/3.1.5: + resolution: {integrity: sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==} + dependencies: + node-fetch: 2.6.7 + transitivePeerDependencies: + - encoding + dev: false + + /css-select/4.3.0: + resolution: {integrity: sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==} + dependencies: + boolbase: 1.0.0 + css-what: 6.1.0 + domhandler: 4.3.1 + domutils: 2.8.0 + nth-check: 2.0.1 + dev: false + + /css-what/6.1.0: + resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} + engines: {node: '>= 6'} + dev: false + + /delayed-stream/1.0.0: + resolution: {integrity: sha1-3zrhmayt+31ECqrgsp4icrJOxhk=} + engines: {node: '>=0.4.0'} + dev: false + + /dom-serializer/1.3.2: + resolution: {integrity: sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==} + dependencies: + domelementtype: 2.2.0 + domhandler: 4.3.1 + entities: 2.2.0 + dev: false + + /domelementtype/2.2.0: + resolution: {integrity: sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==} + dev: false + + /domhandler/4.3.1: + resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==} + engines: {node: '>= 4'} + dependencies: + domelementtype: 2.2.0 + dev: false + + /domino/2.1.6: + resolution: {integrity: sha512-3VdM/SXBZX2omc9JF9nOPCtDaYQ67BGp5CoLpIQlO2KCAPETs8TcDHacF26jXadGbvUteZzRTeos2fhID5+ucQ==} + dev: false + + /domutils/2.8.0: + resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==} + dependencies: + dom-serializer: 1.3.2 + domelementtype: 2.2.0 + domhandler: 4.3.1 + dev: false + + /entities/2.2.0: + resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} + dev: false + + /extract-files/9.0.0: + resolution: {integrity: sha512-CvdFfHkC95B4bBBk36hcEmvdR2awOdhhVUYH6S/zrVj3477zven/fJMYg7121h4T1xHZC+tetUpubpAhxwI7hQ==} + engines: {node: ^10.17.0 || ^12.0.0 || >= 13.7.0} + dev: false + + /fetch-cookie/2.0.3: + resolution: {integrity: sha512-Awxvuqsf0Rc4tckszW1iJpBIRrKwEiYDL/XxQkRhpCTcuQdiCN1XP9MFOyzGaGbf0MU7gjBkcgwxT7IyjpCz3g==} + dependencies: + set-cookie-parser: 2.4.8 + tough-cookie: 4.0.0 + dev: false + + /form-data/3.0.1: + resolution: {integrity: sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==} + engines: {node: '>= 6'} + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + dev: false + + /graphql-request/4.2.0_graphql@16.3.0: + resolution: {integrity: sha512-uFeMyhhl8ss4LFgjlfPeAn2pqYw+CJto+cjj71uaBYIMMK2jPIqgHm5KEFxUk0YDD41A8Bq31a2b4G2WJBlp2Q==} + peerDependencies: + graphql: 14 - 16 + dependencies: + cross-fetch: 3.1.5 + extract-files: 9.0.0 + form-data: 3.0.1 + graphql: 16.3.0 + transitivePeerDependencies: + - encoding + dev: false + + /graphql/16.3.0: + resolution: {integrity: sha512-xm+ANmA16BzCT5pLjuXySbQVFwH3oJctUVdy81w1sV0vBU0KgDdBGtxQOUd5zqOBk/JayAFeG8Dlmeq74rjm/A==} + engines: {node: ^12.22.0 || ^14.16.0 || >=16.0.0} + dev: false + + /htmlparser2/6.1.0: + resolution: {integrity: sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==} + dependencies: + domelementtype: 2.2.0 + domhandler: 4.3.1 + domutils: 2.8.0 + entities: 2.2.0 + dev: false + + /mime-db/1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + dev: false + + /mime-types/2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + dependencies: + mime-db: 1.52.0 + dev: false + + /node-fetch/2.6.7: + resolution: {integrity: sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + dependencies: + whatwg-url: 5.0.0 + dev: false + + /nth-check/2.0.1: + resolution: {integrity: sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==} + dependencies: + boolbase: 1.0.0 + dev: false + + /parse5-htmlparser2-tree-adapter/6.0.1: + resolution: {integrity: sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==} + dependencies: + parse5: 6.0.1 + dev: false + + /parse5/6.0.1: + resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} + dev: false + + /psl/1.8.0: + resolution: {integrity: sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==} + dev: false + + /punycode/2.1.1: + resolution: {integrity: sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==} + engines: {node: '>=6'} + dev: false + + /set-cookie-parser/2.4.8: + resolution: {integrity: sha512-edRH8mBKEWNVIVMKejNnuJxleqYE/ZSdcT8/Nem9/mmosx12pctd80s2Oy00KNZzrogMZS5mauK2/ymL1bvlvg==} + dev: false + + /tough-cookie/4.0.0: + resolution: {integrity: sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==} + engines: {node: '>=6'} + dependencies: + psl: 1.8.0 + punycode: 2.1.1 + universalify: 0.1.2 + dev: false + + /tr46/0.0.3: + resolution: {integrity: sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=} + dev: false + + /tslib/2.3.1: + resolution: {integrity: sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==} + dev: false + + /turndown/7.1.1: + resolution: {integrity: sha512-BEkXaWH7Wh7e9bd2QumhfAXk5g34+6QUmmWx+0q6ThaVOLuLUqsnkq35HQ5SBHSaxjSfSM7US5o4lhJNH7B9MA==} + dependencies: + domino: 2.1.6 + dev: false + + /universalify/0.1.2: + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} + engines: {node: '>= 4.0.0'} + dev: false + + /webidl-conversions/3.0.1: + resolution: {integrity: sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=} + dev: false + + /whatwg-url/5.0.0: + resolution: {integrity: sha1-lmRU6HZUYuN2RNNib2dCzotwll0=} + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + dev: false