ToCode
Kanalga Telegramโda oโtish
ืืืคืื ืงืฆืจืื ืืืชืื ืชืื ืืืช ืื ืื ืคืจืง
Ko'proq ko'rsatish1 419
Obunachilar
Ma'lumot yo'q24 soatlar
Ma'lumot yo'q7 kunlar
-530 kunlar
Postlar arxiv
1 420
ื ืฉืื ืื ืฉ esbuild ืื ืืืืง ืืืืจืืช ืืืคืืกืื ืืืื ืื ืืกืฃ ืืืื ื ืฆืืจื ืืืืืืจ ืงืืืฅ tsconfig.json ืืคืจืืืงื ืืื ืืืจืืฅ ืืช ื TypeScript Compiler, ืชืื ืฉืื ืื ื ืืืืจืื ืฉ tsc ืืื ื ืจืง ืืืจืกื ืฉื ืืคืจืืืงื ืฉืืืชืืืช ื node (ืืื ืื ืืื ืืืฉืื ืื ืืืชื ืืจื ืืฉืื ืข ืืช tsc ืืื ืืช ืืืจืกื ืฉืืชืืืื ื deno. ืขื ืืื ืฉืื ื ืืืืข ืืื).
ืืืื ื ืจืื ืืช ืื ืืงืื.
ืืชืืงืืืช ืืืืืื ืื ื ืืฉื ื ืืช ืืกืืืืืช ืฉื ืฉื ื ืงืืฆื ืืงืื ื ts, ืืืกืืฃ ืงืืืฅ tsconfig.json ืขื ืืชืืื ืืื:
{
"compilerOptions": {
"target": "ESNext",
"module": "commonjs",
"esModuleInterop": true,
"forceConsistentCasingInFileNames": true,
"moduleResolution": "node",
"strict": true,
"skipLibCheck": true,
"outDir": "./distNode"
}
}
ืืฉื ื ืืช ืฉืืจืช ื import ื:
import { text } from './helper';
ืืืจืืฅ tsc ืืื ืืจืืืช ืฉืืื ืืชืงืืคื.
ืืืจื ืื ืื ื ืืจืืฅ ืืช ืฉืชื ืคืงืืืืช ื esbuild ืฉืืจืืืชื:
$ esbuild --bundle main.ts --packages=external --outdir=distNode --format=cjs
$ esbuild --bundle main.ts --packages=external --outdir=distDeno --format=esm
ืื ืืฆืจื ืื ืฉื ื ืคืจืืืงืืื ืืฉืชื ืชืืงืืืช ืืืขื. ืื ื ืืืื ืืืจืืฅ ืื ืืื ืืื ืขื ืืืื ืฉืืชืืื ืื:
$ deno run -A distDeno/main.js
_________________
< I'm a moooodule >
-----------------
\ ^__^
\ (oO)\_______
(__)\ )\/\
U ||----w |
|| ||
$ node distNode/main.js
_________________
< I'm a moooodule >
-----------------
\ ^__^
\ (oO)\_______
(__)\ )\/\
U ||----w |
|| ||
ืืฉืืื ืืืืืง ืฉืืื ืืชืงืืคื ืื ืขื ืืื ื ื ืืื ืืืคืขืื:
$ deno check --unstable-sloppy-imports *.ts
ืืืฉืจ ืืืชื --unstable-sloppy-imports ืืืจื ืืืื ื ืืขืืื ืื ืขื import-ืื ืืื ืกืืืืช, ืืื ืืื ืืงืืฆื ืืืงืืจ ืฉื ืืืืืคืกืงืจืืคื ืฉืื ื. ืืื ืื ืืชื ืขืืืื ืื ืืืืืฅ ืืืืืจ ืืจืืช ืืืืจืกื 2 ืฉื ืืื ื.
ืืขืื ืื ืฉืืื ืื ืคืืืช ืืืื ืื ืืืื ืฉืืื ืืกืืจืืืช ืืืชืจ ืืื ืืืื ืฉืืื ืืืืช ืืขื ืืื ืืช ืืช ืืืชื ืคืจืืืงื ืื ื node ืืื ื deno.
ืืืืื ืขืืืื ืืืืืฅ
ืื ืื ื ื ืืฆืืื ืืืื ืืฆืืืช ืืจืืื ืืืืื ืช ืืขืชืื ืฉื ืกืืืืืช ืืืจืฆืช JavaScript ืืืืฅ ืืืคืืคื. ืขื ืื ืืืื node.js ืืืชื ืืืืคืฆืื ืืืืืื ืฉืื ื, ืืื ืืืื ืืฉ ืืืจ ืฉืืืฉ ืกืืืืืช ืืืืืช ืืืจืฆื - deno ,node, ื bun ืฉืืื ื ืืกืืื ืืืืฆืจ ืกืืืื ืืคืืื ืืืชืจ ืืืืจื ื deno ืืืืชืจ ืชืืืืช ื node.js. ืื ื ืื ืืืืข ืืื ืืชืืจืืช ืืืืช ืชืืืืจ, ืืื ืืกืืคื ืฉื ืืืจ ืืืื ืื ืฆื ืื ืฉืื ืฉืื ืืฉืชืืฉื ืืฉืืืฉืช ืืืืื ืืคื ืกืื ืืคืจืืืงื.
ืืจืืข ืืฉ ืืืืืืช ืฉืขืืืืืช ืืื ืืืชืจ ืืืื ื, ืืืืืืืช ืืืจืืช ืฉืขืืืืืช ืืื ืืืชืจ ื node, ืืืืืืืช ืฉืขืืืืืช ืื ืืื ืืฉืชื ืืกืืืืืช. ืืงืกืคืจืก ืขืืืืช ืกืืืจ ืืฉืชื ืืกืืืืืช ืืื ืขืืืื ืคืืฆ'ืจืื ืืกืืืืื ืฉืื ืขืืืืื ืจืง ื node. ืืืื ื ืืฉ ืคืจืืืืืืจืง ืืชืืจื ืืกืคืฆืืคื ืืืื ื ืืฉื Oak. ื ืงืกื ืขืืืืช ืจืง ื node ืืื ืืืื ื ืืฉ ืคืจืืืืืืจืง ืืชืืจื ืืฉื fresh.
ืขืื ืืืืื ืืื ืืืืืืช ืืืืืืจ ืืืกืืก ื ืชืื ืื. ืืจืืืืจืื ืฉื ืืกืืก ื ืชืื ืื ืื ืขืืืืื ืืฆืืจื ืืืงื ืืื ืฉืชื ืืกืืืืืช ืืืฉ ืืจืื ืกืคืจืืืช ืืืืฉื ืืืกืืก ื ืชืื ืื ืฉืืืืืืืช ืจืง ื node.js. ืื ื ืืืื ืืขืืื ืขื ืกืคืจืื ืืฉื kysely ืฉืื ืขืืืืช ืขื ืฉืชื ืืกืืืืืช (ืืฉ ืื ืืช drizzle ืฉืขืืืืช ืืื ืืงืื), ืืื ืืจืื ืกืคืจืืืช ืืืืืืืช ืืืืืื ืกืคืจืืืช ORM ืื ืชืืืืืช ืืืื ื.
ืื ื ืืงืืื ืืจืืืช ืืช ืืืงืืกืืกืื ืฉื ืืื ื ืืืฉืื ืืืืื ืืืื ืืื ืืงืื ืืขืจืืช ืฉืืืืื ืืกืคืืง ืืืืืืื ืืชืืขืื ืืื ืฉืืคืฉืจ ืืืื ืืขืืื ืืืชื ืืงืืืช ืืื ืงืฉืจ ื node.js. ืืจืืข ืืื ื ืืชืืื ืืืชืจ ืืืจืคืชืงื ืื ืื ืืคืืชืื ืืืฉืืืื ืกืคืฆืืคืืื. ืฉืืจืืช Deno Deploy ืฉืืื ืืื ืืฆืืื ืืืื ืื ืืืืชื ืืื ื ืืืชื ืืืื ืืขืจืืช ืืื ืชืื ืฉืืืืฉ ื Web Frameworks ืฉืืื, ืืื ืืืืืืจ ืืืืืืืื ื npm ืขืืืื ืื ืขืืื ืืฆืืจื ืืืฉืืืช ืืืขืืืช ืชืืืืืช ืฉื ืืืืืืช ืืชืกืื.1 420
ืคืืชืื ืงืื ืฉืืชืืื ืื ื Node ืืื ื Deno
ืืฆื ืืื deno ืืืื ืืืืืช ืืืืจ ืืืืื ืืื ืืื ืืฆื ืฉื ื ืืื ืขืืืื ืื ืฉื. ืืื ืืคืฉืจ ืืฉืื ืืช ืืื ื ืืงืื ื? ืืื ืืคืฉืจ ืืืชืื ืงืื node.js ืฉืืขืืื ืืขืชืื ืื ื deno ืืฉื ืืืื ืืฉืืจื? ืืื ืืขืืืช? ืืืื ื ื ืกื ืืื ืืืืืืืช.
ืืืืืื ืืื Deno ื Node
ื ืชืืื ืืืืจืื ืืคืฉืืืื - ืืคืจืืืงื JavaScript ืจืืื (ืืื ืืืืคืกืงืจืืคื), ืื ื ืืืืจ ืืช ืืชืืืืืช ืฉืื ื ืืงืืืฅ deno.json ืืืงืืืฅ package.json ืืืงืืื ื ืืื ืืืชืื ืงืื ืฉืืขืืื ืืฉืชื ืืกืืืืืช, ืืื ืชืืื ืืืืืื ืืจืืฉืื ื ืืคืืกื ืื:
ืงืืืฅ package.json:
{
"type": "module",
"dependencies": {
"cowsay": "1.6.0"
}
}
ืงืืืฅ deno.json:
{
"tasks": {
"dev": "deno run --watch main.ts"
},
"imports": {
"cowsay": "npm:cowsay@^1.6.0"
}
}
ืงืืืฅ main.js:
import cowsay from 'cowsay';
import { text } from './helper.js';
console.log(cowsay.say({
text : text(),
e : "oO",
T : "U "
}));
ืงืืืฅ helper.js:
export function text() {
return "I'm a moooodule";
}
ืืืขืื ืืชืืืื ืืืขืืจ ืืืืืคืกืงืจืืคื, ืืืขืืงืจ ืืืื ืืงืฉืจ ืืื ืืืืืืื ืืืืฉืื. ื ืชืืื ื ืืฉืืจื:
import { text } from './helper.js';
ืื node ืืื deno ืืืืขืื ืืืชืืืื ืขื ืืชืื ES Modules ืืืืขืื ืกืืืื ืืงืืฆื JavaScript ืืืจืื. ืืืขืื ืืื ืฉ node ืื ืืืืข ืืงืจืื ืงืืฆื ืืืืคืกืงืจืืคื ืืฉืืจืืช ืืืื ืืืขืืจ ืืืืืคืกืงืจืืคื ื Node ืฆืจืื ืืืคืขืื ืืื ื ืืกืฃ - ื TypeScript Compiler.
ืืงืืืคืืืืจ ืฉื ืืืืคืกืงืจืืคื ืืจืืข ืื ืืืืข ืืืชืืืื ืขื ืฉืืจืืช import ืฉืืืืืืืช ืงืืฆื ts ืืืจืื, ืืืืืจ ืื ืื ืขืืืจ ืงืืืคืืืฆืื:
import { text } from './helper.ts;
ืืืืืคืกืงืจืืคื ืขืืื ื ืืืฉืืื ืืช ืืกืืืืช ืืืงืืืคืืืืจ ืฉื ืืืืคืกืงืจืืคื ืืืกืืฃ ืืืชื ืืขืฆืื ืืคื ืืืืจ ืฉืืื ืืื ื. ืืฉืืื ืฉืฉืืจื ืืื ืฉืืจืืืชื ืชืชืงืืคื ืืืืืคืกืงืจืืคื ืื ื ืฆืจืื ืืืชืื:
import { text } from './helper;
ืืื Deno ืื ืืืื ืืืขืื ืืืืื ืืืืคืกืงืจืืคื ืื ืืื ืกืืืืช ts ืืคืืจืฉืช ืืงืืืฅ. ืืื ืืฆืคื ืฉืืืืื ืืืืคืกืงืจืืคื ืืืืขื ืืืืืง ืืื ืืืืื JavaScript ืืืื ืฉืืืืืืื ื ืืขื ืื ืืืคืืคื - ืืืืืจ ืขื ืืกืืืืช. (ืกืืืจืืื - ืืฉ ืืืคืฆืื ืืขืงืืฃ ืืช ืืืืืื ืืืืช ืืื ืื ืจืืฆืื ืืืืจืื ืืืชื ืืืืืืฆืื ืื ืืืฉืชืืฉ ืื, ืื ืื ื ืืขืืืฃ ืืืฉืืืจ ืืืชื ืืืืฅ ืืฉืืื).
ืืืื ื ืืกืฃ ืฉืืืื ืืืคืจืืข ืืืจืื ืชืืื ืืืช ืืื ืฉืืฉืืื ืืืชืืืก ืืชืืงืื ืื ืืงืืืฅ ืื ืืืื ื node ืืฉ ืืฉืชื ืื ืืืืืืื ืืฉื __dirname ื __filename. ืืืื ื ืืื ืืืชื ืืืื ืืฉืชืืฉ ืืืฉืชื ื ืืกืื ืืจืื import.meta.url. ื ืื ืืืืจ ืืช import.meta.url ืจืง ืืืฆื ืขืืืื ืขื ES Modules, ืืื ืืืฆื ืื ืืจืื ืืืืืืื ื npm ืื ืขืืืืื ืืืืืื ืืชืื ืืืืคืกืงืจืืคื.
ืคืืชืจืื 1 - ืืืืจืื ืกืืืื
ืื ื ืืืื ืืืืืืช ืฉืืคืืชืจืื ืืื ืืื ืืืขืืืช ืืชืืืืืช ืืืืืืฆื ืฉืื ืืื ืืืืืจ ืืช ืืืช ืืกืืืืืช ืืืืืฉืืจ ืืืชื. ืื ืฉืืื ืขืชื ืฉืืขืชืื ืืื node.js ืืืืืคืกืงืจืืคื ืชืื ื ืืช ืืืืฉืื ืืื ืืื ืืชื ืืืฉืืื ืฉืืื ื ืืืื ืืืฉืชืื ืขื ืืขืืื ืืื ืขืืื. ืืคืขืืื ืื ืืฉ ืืืืืฆืื ืฉืื ืชืืืืื ืื ื, ืืืฉื ืกืคืจืืืช next.js ืื ืชืืืืช ืืืื ื ืืืื ืื ืืชื ืจืืฆืื ืืืชืื ืืืฉืื next.js ืชืฆืืจืื ืืืืืจ ื Node. ืืืืืจื ืืืื ืืื ืื ืืืคืฉืจืช ืืื ืืืฉืชืืฉ ืืืืืืืช ืืกืคืฆืืคืืืช ืฉื ืืืื (ืืื ืื ืื node ืื Deno) ืืื ืืืชืื ืงืื ืืขืื ืืืชืจ.
ืื ืืื ืืื ืชืฆืืจืื ืืขืืืจ ืืกืืืื ืืฉื ืื ืืคืืืช ืชืืขื ืืื ืื ืืจืื ืืชืืืื ืืืขืจืื ืืช ืืืฉืงืขื ืืืจืืฉื.
ืคืืชืจืื 2 - ืื ืื ืขื esbuild, ืืจืฆื ืืื ืฉืจืืฆืื
ืื ืืื ืืืช ืืชืขืงืฉืื ืืืชืื ืงืื ืฉืืืื ืืื ืฉืืืชืจ ืชืืื ืืฉืชื ืืกืืืืืช ืืคืฉืจ ืืงืืคื ืืช ืืคืจืืืงื ืขื ืืื ืฉืืืืจ ืืืืืืืืช ืืช ืื ืงืืฆื ืืืงืืจ ืืงืืืฅ ืืื ืืื ืืื import ืืื ืงืืฆืื ืฉืื ืื ืฉืืื ืืืื ืืกืชืืจ ืขื ืืกืืืืืช. ืื ื ืืืืข ืื ื ืฉืืข ืจืขืืื ืืืืจ ืืื ืืื ืขืืื. ืืื ืืื ืืื ื ืงืจื esbuild. ืืื ืืืืจ ืืงื ืืขืืื ืืืชื ืืจื ืฉืืจืช ืืคืงืืื.
ื ืชืงืื ืืช esbuild ืขื:
npm install -g esbuild
ืืขืืฉืื ืืคืงืืื:
$ esbuild --bundle main.ts --packages=external --outdir=distNode --format=cjs
ืืื ื ืืช ืืคืจืืืงื ืืชืืงืื ืืฉื distNode ืืฆืืจื ืฉืืชืืืื ื node, ืืืคืงืืื:
$ esbuild --bundle main.ts --packages=external --outdir=distDeno --format=esm
ืืื ื ืืช ืืคืจืืืงื ืืชืืงืืืช distDeno ืืฆืืจื ืฉืชืืืืช ืืืื ื. ืืคืจืืืงื ืืืื ื ืชืืื ืืงืืืฅ js ืืื ืืืื ืื ืืืฆืข import-ืื ืืืกืืื ืืื ืงืืฆื ืืงืืจ ืืืื ืขืืื.1 420
ืื ื ืจืื ืืื Ajax
ืืืืืื Ajax ืืื ืืืื ืงืืฆืืจ ืฉื Asynchronous JavaScript and XML. ืขืืฉืื ืืคืฉืจ ืืฉืืื, ืื ืงืฉืืจ XML? ืื ืื ื ื 2024, ืืื ืื ื ืืืชื ืืช ืื ืืฉืืื ืืืืืืจ ืืื ืืืจืื ืืฉืชื ืื ืื ืืืื. ื Ajax ืงืฉืืจ ื XML ืื ืืฉืืคืืคื ืื ืจืง ืืชืืืื ืืคื ืืช ืืฉืจืชืื ืืืจื ืฉืขืืื HTML ื ืืขื ืื ืืฉืชืืฉื ืืืืฉืง ืฉื ืงืจื
XMLHttpRequest, ืฉืืืื ืืื ืืืง ืืืืืื ืฉื XML (ืืคืืื ืฉืืจื ืืืืฉืง ืืื ืื ืงืืืื ืืช ืืชืฉืืื ื JSON). ืืืืื ืืืื ืขืืจื ืืืฉืชืืฉ ืืืืฉืง fetch ืฉืืืื ืื ืืืื ืืช ืืืืื XML ืืฉืืื ืืื ืืช ืืช ืืืชื ืื ืื ืื ืื.
ืขื ืืืจืกื 14 ืฉื next.js ืืงืื ืกืคื ืฉื Ajax ืฉืื ืืฉืชื ื. ืืคืขื ืืกืคืืง ืืืคืขืื await ืืชืื ืงืื ืืืคืื ืืืืจืืข ืืื ืืฉืืื ืืืืขื ืืฉืจืช, ืืงืื ืชืฉืืื ืืืคืขื ื ืืืชื. ืฉืืื ืื ืืงืื ืืื ืืฆื ืืืงืื:
async function handleInput(ev: FormEvent<HTMLInputElement>) {
if (ev.target) {
const input = ev.target as HTMLInputElement;
const text = input.value;
const options = await search(text);
setOptions(options);
}
}
ืืืงืื ืฉืืชืืื ืื ืืฆื ืืฉืจืช:
export async function search(what: string) {
if (what.length < 3) {
return []
} else {
return sentences.filter(s => s.toLowerCase().includes(what))
}
}
ืืฉ ืคื ืืื ืืืจืื ืืืืืืื:
1. ืืื ืืฉืื ืืงืื ืืืืจื ืฉื Endpoint. ืื ืืืืืืจ ืืื ืืืงืื ืืฉืจืช ืืืฆืืจืช ื REST API ืงืจื ืืืืืืืืช. ืื ืื ืืชืจืืื ื ืฉืื ืื ื ืฆืจืืืื ืืืฉืื ืขื ืืืฉืงืื ืฉืฉืืื ื ืฉืืจืื ืคืขืืื ืื ืื ื ืืื ืื ืืช ืืืืฉืง ืจืง ืืฉืืื ืืคืืืงืฆืื ืืืช, ืืืืื ืืืชืจ ืงื ืืขืืื ืขื ืืืฉืง ืฉืืื ื ืืช ืขืฆืื.
2. ืืื ืฆืืจื ืืืชืื ืืช ืืงืจืืื ื fetch. ืื ืฆืจืื ืืื ืืช RTK Query ืื React Query ืื ืฉืื ืืืจ. ืืคืจืืืจืื ืขืืืจืื ืืื ืืขืืจืช ืคืจืืืจืื ืจืืืื ื JavaScript.
ืืื ืื ืืขืชืื? ืืืคืืืงืฆืืืช ืืกืืืืืช ืืืืื ืื. ืืืขืื ืืืืืื ืฉืขืืืื ื ืฉืืจื ืืื ืฉืืื ื next ืื ืื ืื ืืื ืืขืืื React Server Components ืืืจื ืฉืื ืืืื ืืฉืจืช, ืื ืฉืืืืจ ืฉืื ืื ื ืขืืืื ืฆืจืืืื ืืฉืืืจ Client Side State ืืืจืื ืืคืืืงืฆืืืช. ืื ื ืืงืืื ืืขืชืื ืืงืจืื ืืจืืืช ืื ืืช ืื ื ืคืชืจ ืขื ืื ืื ืื Subscriptions ืืืืืืื ืืื ื ืืื ืจืฉืืืช ืืืืคืจื ื Redux ืืืืจืื.
ื .ื. ืจืืฆืื ืืจืืืช ืืช ืืงืื ืืื ืืคืขืืื? ืื ืืืื ืง:
https://next-search-demo.vercel.app/
ื ืกื ืืืชืื ืืชืืื java, ืืื ืืจืืืช ืืช ืืื ืืืฉืคืืื. ืืฉ 15. ืืฉืืืืืก ืืื ืื ืืฉ ืชืืืื ืืจืืืช ืืช ืืืื ืืื ืขื ืงืื ืืืขืจืืช ืืืืืืื ืืื:
https://github.com/ynonp/next-search-demo1 420
ืืืค JavaScript - ืืืื ื ืกืชืืจ ืืืคืืื ื Object.keys
ืืคืื ืงืฆืื
Object.keys ืืืืืจื ืืช ืื ืืืคืชืืืช ืืืืืืืงื ื ืืื? ืื ืืืืืง. ืืืช ืืืืืจื ืฉืื ื MDN:
> The Object.keys() static method returns an array of a given object's own enumerable string-keyed property names.
ืืืืช ืืืคืชื ืืื ืืื enumerable. ืืื ืืืจืืช ื Keys ืืืืืืจ ืจืง ืืช ืืืคืชืืืช ืฉืืืืจื ื for ... in, ืื ืืืชืจ ืืืืง ืจืง ืืช ืืื ืืชืื for ... in ืฉืื ืืืืขื ืืืคืจืืืืืืืค.
ืืคืขืื ืจืืืื ืขืฉืืื ืืชืช ืืช ืืืจืืฉื ืฉืื ืื ืืืคืชืืืช:
const object1 = {
a: 'somestring',
b: 42,
c: false,
};
console.log(Object.keys(object1));
// Expected output: Array ["a", "b", "c"]
ืืื ืื ืื ืืืืืง. ื JavaScript ืื ื ืืืื ืืืืืืจ ืื ืืืคืืื ืื ืฉืื ืืืคืืขื ืืจืฉืืื ืืืืช ืืืกืคืจ ืืจืืื. ืืจื ืืืช ืืื ืืคืื ืงืฆืื defineProperty. ืฉืืื ืื ืืงืื ืืื:
const object1 = {
a: 'somestring',
b: 42,
c: false,
};
Object.defineProperty(object1, 'secret', {
value: 'secret',
enumerable: false
})
console.log(Object.keys(object1));
console.log(object1.secret)
ืืคืขื ืื ืื ื ืขืืืื ืืงืืืื ืจืง ืืช ืืืคืชืืืช a, b ื c, ืืืจืืช ืฉืืืืคืกื ืืฉื ืืื ืืฆืืืื ืืืืคืืกื ืืช ืืืืื secret.
ืืืื ืืื ืืืช ื ืงืื ืืช ืื ืจืฉืืืช ืืืคืชืืืช ืืืื ืืื ืฉืืื ื enumerable? ื JavaScript ืืฉืื ืขื ืืื ืืืฉ ืคืื ืงืฆืื ืืืจืช ืืฉื getOwnPropertyNames ืฉืืืืืจื ืืช ืื ืืืคืชืืืช. ืืงืจืืื ืืื:
console.log(Object.getOwnPropertyNames(object1))
ืืืคืืกื ืืช:
Array ["a", "b", "c", "secret"]1 420
ืคืื ืงืฆืืืช Pipe ืืฉืจืฉืืจ ืืชืืืืช
ืืชืืขืื ืฉื ืืืืื ืื ืื ื ืืืฆืืื ืืช ืืืืืื ืืืื ืืฉืืืืฉ ื Polly ื Java:
new SynthesizeSpeechRequest()
.withText(text)
.withVoiceId(voice.getId())
.withOutputFormat(format).withEngine("neural");
ืืชืื ืืช ืืืืช ื ืงืจืืช Builder ืืืื ืืฆืืขื ืืื ืืงื ืืืชืืืื ืขื ืื ืื ืฉืฆืจืื ืืงืื ืืจืื ืคืจืืืจืื. ืืจืขืืื ืืื ืฉืืืงืื ืืืขืืืจ ืืช ืื ืืคืจืืืจืื ืืงืจืืื ืืืช ืืื ืื ืื ืื ื ื ืคืขืื ืขืื ืืขืื ืคืื ืงืฆืืืช ืขื ืืืืืืงื ืืฉืื ืคืื ืงืฆืื ืืืืืจื ืขืื ืคืจืืืจ ืืื ืืืช ืืืืจ ืฉืื ืื ื ืจืืฆืื ืืื ืืช. ืืืืชืจืื ืืชืื ืืช ื Builder ืืื ืฉืืคืฉืจ ืืื ืืช ืืช ืืืืจ ืืฉืืืื ืืืคืืื ืืฉืื ืืืืฆืข ืชื ืืื ืื ืืืืืืช.
ืชืื ืืช ืืืื ืื ื ืงืจืืช Fluent Interface ืืืื ืืฆืืขื ืฉืืืืฉ ืืฉืจืฉืืจ ืืชืืืืช ืืื ืืชืืจ ืคืื ืงืฆืืื ืืืืืช ืื ืจืฆืฃ ืคืขืืืืช. ืืืืืื ืืงืื ืืื ืืกืคืจืืืช jQuery:
$('#myButton')
.click(function() {
$(this).addClass('active');
})
.hover(
function() {
$(this).css('background-color', 'lightblue');
},
function() {
$(this).css('background-color', '');
}
)
.fadeOut(1000)
.fadeIn(1000);
ืืชืื ืืช ืืชืืจืช ืืืฉืง ืืฆืืจื ื ืืื ืฉื ืงืจืืืืช ืืฉืจืฉืจืช ืืคืื ืงืฆืืืช ืืฉืื ืืช ืฉื ืืืืืืงื. ืืื ื Builder, ืื ื Fluent Interface ืื ืคืื ืงืฆืื ืืืืืจื ืืช ืืืืืืงื ืฉืขืืื ืื ืื ื ืขืืืืื ืืื ืืคืฉืจ ืืืืจ ืขืื ืืขืื ืคืขืืืืช.
ืืื ืืืขืื ืืชืื ืืช ืืืืช ืืืื ืฉืจืฉืืจ ืฉื ืคืื ืงืฆืืืช ืืื ืฉืงืฉื ืืจืืืช ืืื ืืืืจ ืืช ืื ืืชื ืืื ืืืืืืืช ืฉืื ืื ื ืืืืจืื. ืืืืืื ืฉื ื jQuery ืื ืืืืชื ืจืืฆื ืืืคืขืื ืคืขืืื 10 ืคืขืืื ืืจืฆืฃ ืืืืชื ืฆืจืื ืืืชืื ืืืชื ืืืฉ 10 ืคืขืืื, ืื ืืฉืืืจ ืืช ืืฆื ืืืื ืืื ืฉื ืืฉืจืฉืจืช ืืืฉืชื ื ืืื ืฉืืืื ืืืืฉืื ืืช ืืฉืจืฉืจืช ืขื ืืืฉืชื ื ืืชืื ืืืืืื.
ืืื ืืงื ืคืฉืืื ืืืชืืืื ืขื ืืืืืืช ืืชืื ืฉืจืฉืจืืืช ืฉื ืคืื ืงืฆืืืช ืืื ืืคืื ืงืฆืื tap. ืืื ืงืืืืช ืืืืื ืฉืคืืช ืืืฉืืืช ืฉืื ืื ืืืื ืืงืจื ืืคืฉืจ ืชืืื ืืืืฉ ืืืชื ืืืฉ ืืงืืืช, ืืฉืืจืขืืื ืืืกืืกื ืืื ืฉ tap ืืื ืืชืืื ืฉืืฉ ืืื ืืืืืงื ืืฉืคื, ืืื ืืงืืืช ืืชืืจ ืคืจืืืจ ืคืื ืงืฆืื ืืืฉืื, ืืื ืชืคืขืื ืืช ืืคืื ืงืฆืื ืืชืืืืจ ืืช ืืืืืืงื (ื this). ืืืืืฉ ืคืฉืื ื JavaScript ืฉื tap ื ืจืื ืื:
function tap(fn) {
fn(this);
return this;
};
ืืืื ื ืืงื ืืืืื ื Ruby ืฉื tap ืืืจ ืืืื ืืช ืืฉืคื ืื ืจืื ืืื ืืืฉืชืืฉ ืื ืืื ืืืืกืืฃ ืืืืืืช ืืฉืจืฉืจืืืช ืฉื ืคืื ืงืฆืืืช. ืื ื ืืชืืื ืขื ืืืืงื ืืฉื Polly ืฉืขืืืืช ืืชืื ืืช ืืื ืื ืขื ืืงืื ืืื:
class Polly
attr_accessor :text, :engine
def initialize
@text = []
end
def with_text(text)
@text.append(text)
self
end
def with_engine(engine)
@engine = engine
self
end
def print
puts "Engine: #{@engine}; Text: #{@text}"
end
end
ืืขืืฉืื ืื ื ืจืืฆื ืืืคืขืื ืืช with_text ืืืืืื ืขื ืืืืจืืืืช a, b ื c. ืืคืฉืจ ืืืืื ืืืฉืชืืฉ ืืืฉืชื ื ืืื ื ืงืื:
p = Polly.new
p.with_engine("engine")
['a', 'b', 'c'].each {|t| p.with_text(t) }
p.print
ืืื ืื ืจืืฆืื ืืืืชืจ ืขื ืืืฉืชื ื ืืคืฉืจ ืืืฉืชืืฉ ื tap ืืื ื ืงืื:
Polly
.new
.with_engine("engine")
.tap { |p| ['a', 'b', 'c'].reduce(p, &:with_text) }
.print1 420
ืืืื ืืืืชื (ืฉืื) - ืชืืื ืืกืื ืฉืืืืืช
ืืฉ ืคื ืืืชืจ ืื ืื ืื ืฉืืืคืฉืจ ืืื ืืงืื ืื ืคืืกื ืืืฉ ืืืืืื ืืืืืืื. ืืื ืื ื ืจืฉืืชื ืืืื ืืื ื ืกืืืืช ืื ืืฆืืืชื ืืฉืืื ืืื ืืช ืืืืื ืื ื ืืืื ืืช ืืจืืฉืื ืืื ืื ืืฉืืื ืกืชื. ืขื ืืชืืื ืื ืืื ืืงืื ืฉืืื ืืืจืื ืขื ืืื ืื ืื:
def bounced
mp = find_mp('bounced')
if mp.present?
mp.update(sent_status: :failed)
mp.prospect.subscriptions.destroy_all
end
head :ok
end
ืืืืื ืืืกืืื ืืชืงืื ืืืคืืข ืืคืื ืงืฆืื ืืฆืืจื ืืืื ืืจืืจื - ืื ืงืืืื ื ืืืืขื ืฉืื ืืคืฉืจ ืืื ืืฉืืื ืืช ืืืืื ืื ื ืืืง ืืช ืืื ืื ืืื ืฉืื ื ืฆืืจื ืืฉืืื ืืืืืื ืื ืืืจ. ืืกืืื ืืฉืืืืืช ืื ืืืจ ืืขืื ืืืจืช. ืืคืื ืงืฆืื ื ืืชืื ืืื ืืืฆืืื ืชืืื, ืื ืืืืืขื ืืืืขื ื Webhook ืืื ืืืคืช ืืฉืจืช ืืืืืืื ืฉืฉืื ืืช ืืืืืขื ืื ืืฆืืชื ืื ืื ืืฆืืชื ืืช ืืื ืื ืขืืื ืืื ืืืืื.
ืืื ืื ืื ืืืคืช.
ืื ืื ืื ืืฉื ืื ืืช ืฉื ืืืืจืืข - ืืืงืจื ืฉืื ื ืื ืืฉืชื ื ื bounced ื failed, ืื ืืืืคืืฉ ืชืืื ืืืืฉื ืืื ืืื ืืจืื ืชืงืื, ืืคืืื ืฉืืืขืจืืช ืชืชืขืื ืืื ืืืืืขืืช ืขื ืืฉืืื ืืช. ืื ืคืฉืื ืืจืื ืืืืื ืื ืฉืืืืช ืืืื ืืฆืืืื.
ืืคืืชืจืื ืืื ืงื ืืื ืืืชืืจ ืืืืื ืืืจืื ืืื ืงืฉื: ืฆืจืื ืืืืืจ ืชืืื ืฉืืืจืื ืืืืืื ืืืฉืชื ืืช, ืืื ืืฉืื ืื ื ืืืื ืื "ืืืืื" ืืฉืืื ืืช ืขืืืื ืืจืฉืื ืืืชื ืืืืืื ืขืืืื. ืืืขืจืืช ืื ืฆืจืืื ืืืชืจืกืง ืืื ืืืจืื ืืชืืืืช ืฉืจืฉืจืช ืืฉืืืจืื ืจืขืื ืงืืจืื, ืืื ืื ืืืื ืืืืื ืขื ืื ืืื ืฉืืคืฉืจ ืืืื ืืชืงื ืืืื.1 420
ืืืฉ ืืขืืืช ืืจืืืืืช ืฉืืฉ ืื ืขื ืืื ื ืืืื
ืืื ื ืืื ืืืืืื ืืืืืื ืืืื ืืื ืืื ืชืืื ืืืืจืืช ืฉืื ืื ืืืื ื ืจืืื ืืืืืื ืื ืืื ืืฉ ืขืืืื ืืื ืืชืืจืื ืืฉืืขืืชืืื ืืื ืฉืื ืกื ืืืืฅ ืืืชื ืืืืืืื ืื ืจืืฆืื ืืฉืื ืขืืืื ืขื ืงืื ืืฉื. ืืื ืืืขืืืช ืืืจืืืืืช ืฉืื ืขื ืืื ื ืืืื -
1. ืืืืจ ืืืืืืช - ืืื ื ืชืืืืื ื JSR, ื NPM ืืืืขืื ื ืฉื ืื ืงืืืฅ ืืืืื ื denoland. ืืื
deno add ืืืืข ืืขืืื ืจืง ืขื ืืืืืืช npm ื jsr, ืืื ืืคืฉืจ ืืฉื ืืช ืืช ืืจืืจืช ืืืืื ืฉืื. ืื ืืชืืฉ. ืื ื ืืืื ืฉืืืืื ืฉืืื ืืื ืฉืื ืืืืืืืช ืืขืืื ื JSR ืืื ืขื ืฉืื ืืงืจื ืฆืจืืืื ืืจืืืช ืฉืืคืฉืจ ืืขืืื ืขื npm ืืฆืืจื ืืจืื ืืืชืจ ืืืงื.
2. ืืืืื ืืืืจืื ืืืืืืืช ื npm - ืืืกืคืชื ืชืืืื ื npm ืืื ืืขืืื, ืืื ืฆืจืื ืื ืืืืื ืฉืืงืื ืืฉื ืจืฅ ืื ืืคืืืช ืืืฆืืจ ืจืฉืืื ืืกืืืจืช ืฉื ืืืจืื ืฉืืืืข ืฉืื ืขืืืืื. ืื ืืกืืื ืฉืื ืืืขืืืจ ืงืื ืืืงืกืคืจืก ืืืื ื ืืืืืชื ืืืืจื ืืืงืจื ืฉ express.static ืื ืขืืื ืืื cookie-session. ืืืื ืขืื? ืืืื ืื ืืชื ืื ืขื ืืขืจืืืช ืืคืขืื ืฉืื ืืช? ืืื ืืืจืื ืฉืื ืคืจืืืงื ืคืืจืืื ื ืืฆืืจื ืืืืืช ืืื ืืืคืืื ืื ืืชืืืืช ืืคืจืืืงื.
3. ืืกืจืืช ืืืืืืช ืืืืืื ืืจืืืืจืื ืฉื ืืกืืกื ื ืชืื ืื - ืืืจืืืืจ ืฉื SQLite ืื ืขืืื ืขื ืืื ื ืืืฉ ืืืืื ืืืจืช ืขื ืืจืืืืจ ืืืจ. ืขื MSSql ืืื ืืืื ืื ืืืืจ. ืงืืืืจ ืฉืืฆืืชื ืืจืืื ืืืืื ืืชืืืจืชื ืืืื ืืืจ:
> I'm spending wayyyy too much time on this. I really wish someone could plug up this one hole in the Deno libraries -- it's the only thing stopping me from getting my company to let me convert everything to Deno (which I desperately want to do).
4. ืืืจืกื 0.2 ืฉื ืืืืืื ืืกืื ืืจืืืช - ืื ื ืืืืข ืืฉ ืฉืืืืื ืฉืื ื ื ืืคื ืืฉืืืืืช ืืื ืื ืืกืคืจ ืืืจืกื ืืื ืื ืขืืืื ืื ืืฆืืืชื ืืืืืข ืืคืืืช ืืืืจืกื 1 ืฉื ืืืืืื ืืกืื ืืจืืืช ืื ืื ืืืืจ? ืืจื ืืื ื ืขืฆืื ืชืืฃ ืืืืข ืืืืจืกื 2.
5. ืืฉ ืืคืฉืจืืช ืืืขืื ืืืืืืื ืืืื ืื ื node ืขื ืืชืืืืืช node:. ืจืืื ืขืืืืื ืืื ืื ืืื ืืชืืืืืช ืื 100%. ืืคืืืช ืคื ืื ืคืืจืกืื ืืืืช ืชืืืืืช.
ืกื ืืื ืืื ื ื ืจืื ืืื ืืืืจ ืืื ืฉื node.js. ืืื ืจืง ืฉืืืชืขืงืฉืืช ืฉืืื ืขื ืืืจื ืืืืฉื ืืื ืืื ื ืืขืฉืืช ืืืจืื ืืื ืขื ืืฉืืื ื ืืืืช ืฉื ืืืฉืชืืฉืื. ืืืกืข ืืืืืืฅ ืืื ื ืืืื ืืืืืช ืืจืื ืืื ืจืื ืืืืื ืคืจืืื ืืกืคืจืืืช ืืฉื ืืช ืืืขืืจ ืืืืฉืืช. ืื ืืคืฉืจื ืืื ืื ืื ืืงืจื ืืืจ ืืืืงืจ ืืืื ืชืืื ืขืืืื ืงืฉื ืืจืืืช ืืช ืืืืืืืฆืื ืฉื ืื ืฉืื ืืืืืืฃ ืืืืืื ืื ืขืื node.js ืืืฉืื ืืืืืช ืืชืืืืง.1 420
ืืืื ื ืืชืื ืืช maxBy ื TypeScript
ืืคืื ืงืฆืื
maxBy ืืืชื ืืืืื ืืืืืช ืืืคื ืฉื ืชืืกืคืช ื JavaScript ื TypeScript ืืื ืืื ืืื ื ืกืืืืช ืื ื ืืืื ืืกืื ืืจื. ืืืื ื ืจืื ืืื ืืชืงื ืืช ืืืขืื ืขื reduce ืืฆืืจื ืืืืืืชืืช ื TypeScript.
ืืชืืื
ืื ื ืจืืฆื ืืื ืืช ืคืื ืงืฆืื ืืฉื maxBy ืฉืชืงืื ืืขืจื ืืคืื ืงืฆืืืช ืืคืชื ืืชืืืืจ ืืช ืืืืืจ ืืืืขืจื ืขืืืจื ืคืื ืงืฆืืืช ืืืคืชื ืืื ืืืืืื ืืืืชืจ. ืืืชืืื ืืื ืืื:
function maxBy<T>(data: Array<T>, key: (t: T) => number): T { ... }
ืื ื ืืืืืื ืฉืื ื ืืคืขืื ืืืชื ืืืืคื ืืื:
const data = [
{ name: "Leela", age: 31 },
{ name: "Fry", age: 1031 },
{ name: "Hubert", age: 165 },
{ name: "Bender", age: 10 }
];
console.log(maxBy(data, d => d.age));
ืืืงืื ืืช Fry ืฉืืืื 1031.
ืืืืืฉ
ืืืื ืฉืื ื ืื ืืืืข ืื ืืืื ืืืขืจื ืื ื ืืขืืืฃ ืืืฉืชืืฉ ื Generics. ืืฆืืจื ืืืืช ืื ื ืืืื ืืืืืืจ ืืืืืง ืืช ืืืืืจ ืืชืื ืืืขืจื ืืื ืืงืืงื ืืช ืืืืคืืกืื. ืื ืืกืฃ ืื ื ืจืืฆื ืืืคืขืื ืืช ืคืื ืงืฆืืืช ืืืคืชื ืจืง ืคืขื ืืืช ืขื ืื ืืืืจ ืื ืืืื ืืืืฉืื ืืื ืืกืืื ืื ืืื. ืกื ืืื ืืืืืืฉ ืืืื:
function maxBy<T>(data: Array<T>, key: (t: T) => number): T {
if (data.length === 0) {
throw new Error("Array is empty");
}
return data
.map(i => ({ key: key(i), value: i }))
.reduce((max, value) => max.key > value.key ? max : value)
.value
}
ืืืฉืืชื ืืช ืคืืงื ืฆืืืช ืืืคืชื ืขื ืื ืคืจืื ืืืขืจื, ืฉืืจืชื ืืช ืืชืืฆืืืช ืืื ืขื ืืคืจืืืื ืืชืื ืืืืืงืืื ืืืฉืื ืืืกืืฃ ืืืืจืชื ืืช ืืืืืจ ืฉืขืจื ืืืคืชื ืฉืื ืืื ืืื ืืืื.
ืืื ืืฉืื ืื
ืืืืจ ืืจืืฉืื ืขืืื ืื ื ืืกืชืื ืืืืืืฉ ืืื ืืื ืืืืคืื ืืืขืจื ืจืืง. ืืื ืืืืจ ืืงืกืืืื ืืืขืจื ืจืืง ืืืื ืฆืจืื ืืืืืื ืื ืืืจืืง ืฉืืืื ืื ืืืืืืจ ืขืจื ืจืืง (null ืื ืืฉืื). ืื ื ืืขืืืฃ ืืืจืืง ืฉืืืื ืืฉืชืืื ืืื ืฉืืืชืจ ืกืคืฆืืคืืช ืืื ืฉื ืืื ืืืจ ืื ืืืขืืช.
ื ืงืืื ืฉื ืื ืืื ืืื ืืกืคืจ ืืคืขืืื ืฉืฆืจืื ืืืคืขืื ืืช ืคืื ืงืฆืืืช ืืืคืชื. ืื ืื ื ืจืืฆืื ืืฉืื ืื ืืืคืขืื ืืืชื ืจืง ืคืขื ืืืช ืขื ืื ืืืืจ ืืืจืช ื ืงืื ืืืืืฉ ืืืืื ื. ืื ืืืฉื ืงืื ืฉืขืืื ืืื ืืืืชืจ:
function maxBy<T>(data: Array<T>, key: (t: T) => number): T {
return data
.reduce((max, value) => key(max) > key(value) ? max : value)
}
ื ืงืืื ืฉืืืฉืืช ืืื ืืืืคืืกืื. ืื ืื ื ืจืืฆืื ืฉืืืืคืกืงืจืืคื ืืืื ืืืืื ืื ืืืืคืืก ืฉื ืขืจื ืืืืืจ ืืืื ืขืืืฃ ืืฉืืืจ ืืช ืืืคืชื ืืืขืจื ืืืืืืงื ืืื ืืืขืจื. ืืืืืืฉ ืืื ืืืฉื ืขืืื ืืื ืืืจืฉ ืืกืื ืกืคืฆืืคืืช ืฉื ืืืืคืืก:
function maxBy<T>(data: Array<T>, key: (t: T) => number): T {
if (data.length === 0) {
throw new Error("Array is empty");
}
return data
.map(i => [i, key(i)])
.reduce((max, value) => max[1] > value[1] ? max : value)
[0] as T
}1 420
List(Beam(row, col, Direction.Right))
} else if (row == numRows) {
// bottom
List(Beam(row, col, Direction.Up))
} else if (col == numColumns) {
// right
List(Beam(row, col, Direction.Left))
} else {
List()
}
}.toList
@main
def day16part2(): Unit =
val matrix = parseInput(Source.fromResource("day16.txt"))
val bestBeam = border(matrix).maxBy { b => countVisited(b, matrix) }
println(countVisited(bestBeam, matrix))
ืื ื ืืืื ืืืืืืช ืฉืืืจืืช ืฉืืงืื ืืจืื ืื ืืื ืืื ืืชืจืืืืื ืืงืืื ืฉื ืืฉื ื, ืืืืืื ืืืจื ืฉืืืจ ืืื ืื ืืช ืื ืืคืื ืงืฆืืืช ืฉื ืคืืขื ืื ืืงืื ืืืืจืืฆืืื ื ืืชืจืืืืื ืงืืืืื.1 420
def right(): Beam = Beam(this.row, this.column + 1, Direction.Right)
}
val demoInput: String =
""".|...\....
||.-.\.....
|.....|-...
|........|.
|..........
|.........\
|..../.\\..
|.-.-/..|..
|.|....-|.\
|..//.|....
|""".stripMargin
def step(beam: Beam, ch: Char): List[Beam] =
ch match
case '.' => List(beam.continue())
case '|' if vertical(beam.direction) => List(beam.continue())
case '|' if horizontal(beam.direction) => List(beam.up(), beam.down())
case '-' if horizontal(beam.direction) => List(beam.continue())
case '-' if vertical(beam.direction) => List(beam.left(), beam.right())
case '/' if beam.direction == Direction.Right => List(beam.up())
case '/' if beam.direction == Direction.Left => List(beam.down())
case '/' if beam.direction == Direction.Up => List(beam.right())
case '/' if beam.direction == Direction.Down => List(beam.left())
case '\\' if beam.direction == Direction.Right => List(beam.down())
case '\\' if beam.direction == Direction.Left => List(beam.up())
case '\\' if beam.direction == Direction.Up => List(beam.left())
case '\\' if beam.direction == Direction.Down => List(beam.right())
@tailrec
def travel(beams: List[Beam],
matrix: Map[(Int, Int), Char],
visited: Set[Beam] = Set()): Set[Beam] =
val activeBeams = beams.filter { b =>
matrix.contains(b.row, b.column) && !visited.contains(b)
}
if (activeBeams.nonEmpty) {
val nextRound = activeBeams.flatMap { b => step(b, matrix(b.row, b.column)) }
travel(nextRound, matrix, visited ++ activeBeams.toSet)
} else {
visited
}
def parseInput(input: Source): Map[(Int, Int), Char] =
input
.getLines()
.zipWithIndex
.collect {
case (line: String, index: Int) =>
line.toList.zipWithIndex.map((ch, column) => (index, column, ch))
}
.flatten
.flatMap { case (row, column, ch) => Map((row, column) -> ch) }
.toMap
def printMatrix(matrix: Map[(Int, Int), Char]): Unit =
val maxRow = matrix.keys.maxBy(_._1)._1
val maxColumn = matrix.keys.maxBy(_._2)._2
0.to(maxRow).foreach { row =>
0.to(maxColumn).foreach { col =>
print(matrix((row, col)))
}
println()
}
def countVisited(start: Beam, matrix: Map[(Int, Int), Char]) =
val visited = travel(List(start), matrix)
visited.map(b => (b.row, b.column)).size
@main
def day16part1(): Unit =
val matrix = parseInput(Source.fromResource("day16.txt"))
println(countVisited(Beam(0, 0, Direction.Right), matrix))
}
ืืืืง ืืฉื ื ืืืงืฉื ืืืฆืื ื ืงืืืช ืื ืืกื ืืืืคืืช ืืงืจื ืืื ื ืืคืฉืจ ืืืื ืืืงืจ ืืืืชืจ ืืฉืืฆืืช. ืื ื ืื ืืฆืืชื ืืจืืง ืืื ืืคืฉืื ืืืฉืืชื ืืืื ืืฉืืฆืืช ืืืงืจืื ืืื ื ืงืืืช ืื ืืกื ืืคืฉืจืืช ืืืืืจืชื ืืช ืื ืฉืืืกืคืจ ืขืืืจื ืืื ืืืืื ืืืืชืจ. ืื ืืงืื:
def border(matrix: Map[(Int, Int), Char]): List[Beam] =
val numRows = matrix.keys.maxBy(_._1)._1
val numColumns = matrix.keys.maxBy(_._2)._2
matrix.keys.filter { (row, col) =>
row == 0 || row == numRows || col == 0 || col == numColumns
}.flatMap { (row, col) =>
if (row == 0 && col == 0) {
// top left
List(Beam(0, 0, Direction.Down), Beam(0, 0, Direction.Right))
} else if (row == 0 && col == numColumns) {
// top right
List(Beam(row, col, Direction.Down), Beam(row, col, Direction.Left))
} else if (row == numRows && col == 0) {
// bottom left
List(Beam(row, col, Direction.Up), Beam(row, col, Direction.Right))
} else if (row == numRows && col == numColumns) {
// bottom right
List(Beam(row, col, Direction.Up), Beam(row, col, Direction.Left))
} else if (row == 0) {
// top row
List(Beam(row, col, Direction.Down))
} else if (col == 0) {
// left1 420
ืคืืชืจืื Advent Of Code ืืื 16 ืืกืงืืื
ืขืืจ ืืจืื ืืื ืืื ืฉืคืืจืกืืชื ืืช ืืคืืชืจืื ืืืื 15 ืืกืืืจืช Advent Of Code. ืืคืฉืจ ืืงืจืื ืืื ืืฉืืจ ืืืืฆืข ืื ืขืืืก ืืกืืืืช ืืืจืืช. ืืื ืืงืจื ืืืื ื ืขืฉื ืขืื ืฆืขื ืืืจื ืืกืืื ืื 25 ืืืืืืช ืขื ืกืืฃ ืืฉื ื.
ืืืชืืจ - ืืืื ืืืจืืืช
ืืืชืืจ ืฉืื ื ืืืื ืืื ืืืืืื ืืืื ืฉื ืืจืืืช ืืงืจื ืืืจ ืฉืขืืืจืช ืืื ืืืจืืืช. ืื ืงืื ืืืืืื:
.|...\....
|.-.\.....
.....|-...
........|.
..........
.........\
..../.\\..
.-.-/..|..
.|....-|.\
..//.|....
ืืงืจื ื ืื ืกืช ืืืคืื ื ืืฉืืืืืช ืขืืืื ื ืืืืื ืืืชืงืืืช ืืืืืื ืืืื. ืืืชื ืืืืช ืฉืื ืชืืืื ืืกืื ืืืจืื ืฉืืื ืชืคืืืฉ:
1. ืื ืืื ืคืืืฉืช ืืจืื ืืืืกืื ืืช ืืื ืชืฉื ื ืืช ืืืืืื ืืคื ืืืืืกืื (ืืืืืื ืงืจื ืฉืืืืืช ืืืื ื ืืคืืืฉืช ืืืจืื / ืชืฉื ื ืืช ืืืืืื ืืืขืื).
2. ืื ืืื ืคืืืฉืช ืืจืื ืืฉืจื ืืฆื ืืฆื ืืืืืื ืฉืื ืื ืงืืจื ืืืื.
3. ืื ืืื ืคืืืฉืช ืืจืื ืืฉืจื ืืฆื ืืฉืืื ืฉืื, ืืืฉื ืงืจื ืฉืืืืืช ืืืื ื ืืคืืืฉืช ืืืจืื |, ืื ืืงืจื ืชืชืคืฆื ื-2 ืืืงืจื ืืื ืืืื ืืฉื ื ืืฆืืืื ืืืขืื ืืืืื.
ืืืชืืจ ืฉืื ื ืืื ืืืฆืื ืืืื ืืฉืืฆืืช ืืงืจื ืขืืจื.
ืคืืชืจืื ืืกืงืืื
ืืืจืืง ืืืฉืื ืืื ืืื ืืืืื ืืช ืชื ืื ืืขืฆืืจื. ืงืจื ืืคืกืืงื ืืขื ืืื ืืืชื ื ืืฉืืื ืืืฆืืช ืืืืืจืืฆื ืืืืื, ืืื ืื ืื ืืื ืืืืขื ืฉืื ืื ืงืืื ืฉืืื ืืืจ ืืืงืจื ืื ืืืืืชื ืืืืื, ืื ืืืฆื ืืื ืืื ื ืื ืกืช ืืืขืื.
ืืื ืืคืื ืงืฆืื ืืืขื ืืื ืช ืฉื ืืคืืชืจืื ืืื:
@tailrec
def travel(beams: List[Beam],
matrix: Map[(Int, Int), Char],
visited: Set[Beam] = Set()): Set[Beam] =
val activeBeams = beams.filter { b =>
matrix.contains(b.row, b.column) && !visited.contains(b)
}
if (activeBeams.nonEmpty) {
val nextRound = activeBeams.flatMap { b => step(b, matrix(b.row, b.column)) }
travel(nextRound, matrix, visited ++ activeBeams.toSet)
} else {
visited
}
ืื ืคืื ืงืฆืื ืจืงืืจืกืืืืช ืฉืืงืืืช ืจืฉืืื ืฉื ืงืจื ืืื, ืืืจืืฆื ืืจืฉืืืช ืืืงืืืื ืฉืืืงืจื ื ืืื ืืืืฉืืช ืืช ืจืฉืืืช ืืงืจื ืืื ืืืื. ืืฉืืื ืื ืืื ืงืืจืืช ืืคืื ืงืฆืืืช ืขืืจ ืืฉื step ืฉืื ืืืืืืฉ ืฉืื:
def step(beam: Beam, ch: Char): List[Beam] =
ch match
case '.' => List(beam.continue())
case '|' if vertical(beam.direction) => List(beam.continue())
case '|' if horizontal(beam.direction) => List(beam.up(), beam.down())
case '-' if horizontal(beam.direction) => List(beam.continue())
case '-' if vertical(beam.direction) => List(beam.left(), beam.right())
case '/' if beam.direction == Direction.Right => List(beam.up())
case '/' if beam.direction == Direction.Left => List(beam.down())
case '/' if beam.direction == Direction.Up => List(beam.right())
case '/' if beam.direction == Direction.Down => List(beam.left())
case '\\' if beam.direction == Direction.Right => List(beam.down())
case '\\' if beam.direction == Direction.Left => List(beam.up())
case '\\' if beam.direction == Direction.Up => List(beam.left())
case '\\' if beam.direction == Direction.Down => List(beam.right())
ืืืจื ืฉืื ืงืจื ืืชืงืืื ืฆืขื ืืื ืชืืื ืื ื ืจืฉืืื ืฉื ืงืจื ืืื ืืืฉืืช, ืืืชื ื ืฉืื ืฉืื ื travel ืืื ืืืื ืขื ืฉืื ืืืื ืืืชืจ ืงืจื ืืื ืืจืฉืืื.
ืกื ืืื ืืคืืชืจืื ืืกืงืืื ืืืืง ืืจืืฉืื ืืื:
import aoc2023day16.Direction
import aoc2023day16.Direction.{Down, Up}
import scala.annotation.tailrec
import scala.io.Source
object aoc2023day16 {
enum Direction {
case Up, Down, Left, Right
}
def vertical(dir: Direction): Boolean = dir == Direction.Up || dir == Direction.Down
def horizontal(dir: Direction): Boolean = dir == Direction.Left || dir == Direction.Right
case class Beam(row: Int, column: Int, direction: Direction) {
def continue(): Beam = {
this.direction match
case Direction.Right => right()
case Direction.Left => left()
case Direction.Up => up()
case Direction.Down => down()
}
def up(): Beam = Beam(this.row - 1, this.column, Direction.Up)
def down(): Beam = Beam(this.row + 1, this.column, Direction.Down)
def left(): Beam = Beam(this.row, this.column - 1, Direction.Left)
Endi mavjud! Telegram Tadqiqoti 2025 โ yilning asosiy insaytlari 
