uz
Feedback
ToCode

ToCode

Kanalga Telegramโ€™da oโ€˜tish

ื˜ื™ืคื™ื ืงืฆืจื™ื ืœืžืชื›ื ืชื™ื ืžืืช ื™ื ื•ืŸ ืคืจืง

Ko'proq ko'rsatish
1 419
Obunachilar
Ma'lumot yo'q24 soatlar
Ma'lumot yo'q7 kunlar
-530 kunlar
Postlar arxiv
ToCode
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 ืขื“ื™ื™ืŸ ืœื ืขื•ื‘ื“ ื‘ืฆื•ืจื” ืžื•ืฉืœืžืช ื•ื‘ืขื™ื•ืช ืชืื™ืžื•ืช ืฉื ื™ื›ื•ืœื•ืช ืœืชืกื›ืœ.

ToCode
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-ื™ื ื™ื—ืกื™ื™ื ื‘ื™ืŸ ืงื‘ืฆื™ ืžืงื•ืจ ื•ื”ื›ืœ ืขื•ื‘ื“.

ToCode
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-demo

ToCode
1 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"]

ToCode
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) }
 .print

ToCode
1 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, ืื– ื”ื—ื™ืคื•ืฉ ืชืžื™ื“ ื™ื™ื›ืฉืœ ืื‘ืœ ื”ื›ืœ ื™ืจืื” ืชืงื™ืŸ, ืืคื™ืœื• ืฉื”ืžืขืจื›ืช ืชืชืขืœื ืžื›ืœ ื”ื”ื•ื“ืขื•ืช ืขืœ ื›ืฉืœื•ื ื•ืช. ื–ื” ืคืฉื•ื˜ ื™ืจืื” ื›ืื™ืœื• ื›ืœ ืฉืœื™ื—ืช ืžื™ื™ืœ ืžืฆืœื™ื—ื”. ื”ืคื™ืชืจื•ืŸ ื”ื•ื ืงืœ ืื‘ืœ ื”ืืชื’ืจ ืœื˜ื•ื•ื— ื”ืืจื•ืš ื”ื•ื ืงืฉื”: ืฆืจื™ืš ืœื–ื›ื•ืจ ืชืžื™ื“ ืฉื“ื‘ืจื™ื ื™ื›ื•ืœื™ื ืœื”ืฉืชื ื•ืช, ื•ื’ื ื›ืฉืื ื—ื ื• ืžื•ื›ื ื™ื "ืœื”ื›ื™ืœ" ื›ืฉืœื•ื ื•ืช ืขื“ื™ื™ืŸ ืœืจืฉื•ื ืื•ืชื ื•ืœื“ื•ื•ื— ืขืœื™ื”ื. ื”ืžืขืจื›ืช ืœื ืฆืจื™ื›ื” ืœื”ืชืจืกืง ื•ืœื ืœื’ืจื•ื ืœืชื’ื•ื‘ืช ืฉืจืฉืจืช ื›ืฉื“ื‘ืจื™ื ืจืขื™ื ืงื•ืจื™ื, ืื‘ืœ ื›ืŸ ื›ื“ืื™ ืœื“ื•ื•ื— ืขืœ ื–ื” ื›ื“ื™ ืฉืืคืฉืจ ื™ื”ื™ื” ืœืชืงืŸ ื‘ื–ืžืŸ.

ToCode
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 ืžืžืฉื™ืš ืœื”ื™ื•ืช ืžืชื•ื—ื–ืง.

ToCode
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
}

ToCode
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))
ืื ื™ ื—ื™ื™ื‘ ืœื”ื•ื“ื•ืช ืฉืœืžืจื•ืช ืฉื”ืงื•ื“ ืืจื•ืš ื–ื” ื”ื™ื” ืื—ื“ ื”ืชืจื’ื™ืœื™ื ื”ืงืœื™ื ืฉืœ ื”ืฉื ื”, ื‘ืžื™ื•ื—ื“ ืื—ืจื™ ืฉื›ื‘ืจ ื”ื™ื• ืœื™ ืืช ื›ืœ ื”ืคื•ื ืงืฆื™ื•ืช ืฉืœ ืคื™ืขื ื•ื— ื”ืงืœื˜ ื”ืžื˜ืจื™ืฆื™ื•ื ื™ ืžืชืจื’ื™ืœื™ื ืงื•ื“ืžื™ื.

ToCode
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) {
        // left

ToCode
1 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)