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 419
ืืื ืืืืื ืืจืื
ืืืืช ืกืคืจ ืืืืื ืืืชื ืฉืืืืื ืืืืื ืืืืืื ืืืจืื ืืืจ ืืืชืจ. ืฉืขืืืฃ ืืืืื ืืช ืืืืืจ ืืคืืืช ืืื ืืื ืฉื ื ืืืืื ืืงืืืื ืืช ืืืชื ืฆืืื ืื ืื ืฉืืื ืคืืืช ืืื ืืืืชืจ ืืื.
ืืืืื ืืืืืชืืื ืืืืื ืืืชื ืืช ืืืืคื. ืืืื ืื ื ืืืื ืฉืื ืฉืื ืื ื ืฆืจืืืื ืื ืืช ืืืืืืช ืืืืื ืืฉืื ืืืืจื ืืื ืืจืื. ืืช ืืืืืืช ืืืชืจืื, ืืืขืืืง, ืืฉืืื ืขืื ืฉืืืืช. ืืืื ืชื ืืกืืื ืืกืคืืง ืืจืื ืืชืืื ืื ืฆืืช ืืืืจืืช ืืื ืคืขื.
1 419
ืืื ืืกืืจ ืืืืคืกืงืจืืคื?
ืืงืื ืืื ืืืืืคืกืงืจืืคื ืืฆืืื ืืืืื ืืืชื ืืจืืข-
type MyItem = {type: 'a', url: string, id: number}
function go(item: MyItem) {}
const f = {type: 'a', url: 'url', id: 0}
go(f)
ืืื ืื ืืชืงืืคื.
ืืคืื ืงืฆืื ืื ืืืื ื ืืงืื ืืช f ืื ืืื ืืืขื ืช ืฉืืื ืืืืคืืก ืื ืืชืืื. ืืื ืืกืืจ ืืืืคืกืงืจืืคื? ืชืกืชืื ืืืืคืืก MyItem, ืื ืืืืืง ืืชืืื.
ืืืืช ืฉืืืืคืกืงืจืืคื ืฆืืืง (ืืคืืืช ืืืงืืช). ืืืจื ืื ืืืืคืกืงืจืืคื ืขืืื ืืฉืืฉ ืื ืืฉืื ืฉื ืืืืืงื ืืืฉืชื ื ืืื ืื ืกืืช ืืืกืืง ืืืืืืืืช ืื ืืืืคืืก ืืื ืืืืื ื ืฉื ืืืชื ืืฉืชื ื, ืืืคื ืืืืคืืก ืืื ืืื ืืืืื ืืช ืืคืขืืืืช ืืืืืช ืฉืืคืฉืจ ืืขืฉืืช ืขื ืืืชื ืืฉืชื ื. ืืืงืจื ืฉื f ืืืืคืืก ืฉืืืืคืกืงืจืืคื ืืกืืง ืืื:
const f: {
type: string;
url: string;
id: number;
}
ืืืืืจ ื type ืืื ืืกืื string ืืื ืืืกืื ืืกืคืฆืืคื 'a'. ืืืืื ืช ืืืืคืกืงืจืืคื ืืืชืจ ืืฉื ืืช ืืช ื type ืืขืจื ืืืจ, ืืืืืจ ืืงืื ืืื ืื ืืชืงืืคื:
type MyItem = {type: 'a', url: string, id: number}
function go(item: MyItem) {}
const f = {type: 'a', url: 'url', id: 0}
f.type = 'b';
ืืฉืืืืคืกืงืจืืคื ืจืืื ืืช ืืงืจืืื:
go(f)
ืืื ืืกืชืื ืจืง ืขื ืืืืคืืก ืฉื f ืืขื ืืืืคืืก ืฉืืคืื ืงืฆืื ืฆืจืืื ืืงืื ืืืืื ืฉืืื ืืชืืื. ืืืืคืกืงืจืืคื ืื ืืืื ืืืชืืืื ืฉืืฃ ืืื ืื ืฉืื ื ืืช ืืขืจื ืฉื type ืื ืืืืื ืชื ืืืชืจ ืืฉื ืืช ืืช ืืขืจื ืฉื. ืืื ืืื ืื ืื ืืืื ืืืชืืืื ืฉืื ืฉื ืืฆื ืืจืืข ืืืฉืชื ื f ืืืืช ืืชืืื ืืืชืืื ืฉื ืืคืื ืงืฆืื.
ืืื ืคืืชืจืื ืืช ืื? ืื ืืกืชืืจ ืฉืืฉ ืืื ืืจืืื - ืงืืื ืื ืืคืฉืจ ืืืืื ืืืืืคืกืงืจืืคื ืืฆืืจื ืืคืืจืฉืช ืื ืืืืคืืก ืฉื f:
type MyItem = {type: 'a', url: string, id: number}
function go(item: MyItem) {}
const f: MyItem = {type: 'a', url: 'url', id: 0}
ืขืืฉืื ืืคืฉืจ ืืืื ืืืขืืืจ ืืืชื ืืคืื ืงืฆืื go ืืื ืืคืฉืจ ืืืื ืืฉื ืืช ืืช ืืขืจื ืฉื f.type.
ืขืื ืืืคืฆืื ืืื ืืืืืืจ ืฉ type ืืื ืงืืืข ืืชืื ืืืืจืช ืืืืืืงื:
const f = {type: 'a' as const, url: 'url', id: 0}
ืืืจื ืฉืืืฉืืช ืืงืื ืืช ืืืชื ืืืคืืก ืืื ืืืืืืจ ืืช type ืืืฉ ืืืืืช a:
const f = {type: 'a' as 'a', url: 'url', id: 0}
ืืืืจืื ืจืขืืื ืืช ื ืืกืคืื? ืฉืชืคื ืืชืืืืืช ืืฉืื ืืฉืืืข.1 419
ืื map ืืืืืจื
ืขืื ืืจื ืืืกืชืื ืขื ืืืืื ืืื ืชืื ืืช ืืื ืื ืขืฆืืื ืืชืื ืืช ืคืื ืงืฆืืื ืืื ืืื ืืืกืชืื ืขื ืคืื ืงืฆืืืช ืืขืจืื ืืืืืจ ืฉืืื. ื ืืงื ืืช ืืคืื ืงืฆืื map ืืืืืื ืื ืฉืืื -
ืกืงืืื, ืฉืืื ืฉืคื ืืื ืืืช ืขืฆืืื, ืชืืืืจ ืืื Collection ืคืื ืงืฆืืืช map ืฉืื ื ืฉืืืืืจื Collection ืืืฉ ืืืืชื ืืกืื. ืืืื ืื ืืฉืื ื ืืจืืฅ map ืขื ืงืืืฆื ืื ื ืืงืื ืืืจื ืงืืืฆื:
scala> Set(1, 2, 3).map(_ * 2)
val res1: Set[Int] = Set(2, 4, 6)
scala> List(1, 2, 3).map(_ * 2)
val res4: List[Int] = List(2, 4, 6)
ืงืืื'ืจ ืืขืืืชื ืฉืื ืืช ืืืืฉ ืขื ืืคืื ืงืฆืื ืืืื ืืคืขืื ืฉื map ืขื ืื ืืืจ ืืืืืจื ืชืืื LazySeq:
user=> (type (map (partial * 2) #{1 2 3}))
clojure.lang.LazySeq
user=> (type (map (partial * 2) [1 2 3]))
clojure.lang.LazySeq
ื JavaScript ืืกืืืื ืืืืืืจ map ืจืง ืขื ืจืฉืืื ืืืื:
new Set([1, 2, 3]).map(i => i * 2)
TypeError: new Set([1, 2, 3]).map is not a function. (In 'new Set([1, 2, 3]).map(i => i * 2)', 'new Set([1, 2, 3]).map' is undefined)
ืื ืขืืืฃ? ืื ื ืขืื ืืืืื ืืื ืื ื ืืฆืืื ืืืขืืช ืืื ืืฉืคืืช. ืืืืจ ืืืฉืื ืืื ืชืืื ืืืืืจ ืืืืื ืฉืคื ืื ืื ื ืืื ืืืืคืืื ืื ืฉื ืืืชื ืฉืคื. ืืคืืื (ืืืืื ืืืืืื) ืืฉืืคืื ืงืฆืืืช ืืฉ ืืช ืืืชื ืฉื.
ื .ื. ืืื ืืืืืจ ืืงืื ืืื ืืจืืื? ื ืกื ืืืืืง ืืชืจืื ืื ืืื ืชื ืืื:
3.1.1 :002 > [1, 2, 3].map { _ * 2 }1 419
ืืืคืืืืืืฆืืืช ืื ื ืืจืงืืจืกืื ื JavaScript ื 2024
ืืคื ื 6 ืฉื ืื ืืชืืชื ืขื ืืืคืืืืืืฆืืืช ืื ื ืืจืงืืจืกืื ืืืคืืคื ืื:
https://www.tocode.co.il/blog/2018-09-javascript-tco
ืืื ืืจืื ืงืจื ืืืคืืคื ืืื ืืืืงื ืืคืืฆ'ืจ ืืื ื ืฉืืจ ืืืืืจ. ืกืคืืจื, ืืจืื ืืื ืคืืืจืคืืงืก ืื ืืฆืืืืื ืืืฉื ืจืงืืจืกืืืืช ืืกืคืจืื ืืืืืื.
ืืื ื ืงืืืช ืืืจ ืืืช ืื ืืฆืืจืคื ืืขืืื ืฉื JavaScript ืืฆื ืฉืจืช ืืืืืืื ืฉื bun (ื ืื ืืืื ื, ืืื ืืืคืืคื ืื ืขืืืื ืื ืชืืืืื ืืืืคืืืืืืฆืื ืื).
ืื ื ืืชืืื ืืช:
function factors_of(number, i=2) {
if (number < i) {
return [];
}
if (number % i === 0) {
return [i, ...factors_of(number / i, i)];
}
return factors_of(number, i+1);
}
console.log(factors_of(909090909090909090909090));
ืืืจืฆื ืืฆื ืฉืจืช ื node:
node a.js
/Users/ynonp/tmp/a.js:1
function factors_of(number, i=2) {
^
RangeError: Maximum call stack size exceeded
at factors_of (/Users/ynonp/tmp/a.js:1:20)
at factors_of (/Users/ynonp/tmp/a.js:10:12)
at factors_of (/Users/ynonp/tmp/a.js:10:12)
at factors_of (/Users/ynonp/tmp/a.js:10:12)
at factors_of (/Users/ynonp/tmp/a.js:10:12)
at factors_of (/Users/ynonp/tmp/a.js:10:12)
at factors_of (/Users/ynonp/tmp/a.js:10:12)
at factors_of (/Users/ynonp/tmp/a.js:10:12)
at factors_of (/Users/ynonp/tmp/a.js:10:12)
at factors_of (/Users/ynonp/tmp/a.js:10:12)
Node.js v21.7.1
ื Deno:
deno run a.js
error: Uncaught (in promise) RangeError: Maximum call stack size exceeded
function factors_of(number, i=2) {
^
at factors_of (file:///Users/ynonp/tmp/a.js:1:20)
at factors_of (file:///Users/ynonp/tmp/a.js:10:12)
at factors_of (file:///Users/ynonp/tmp/a.js:10:12)
at factors_of (file:///Users/ynonp/tmp/a.js:10:12)
at factors_of (file:///Users/ynonp/tmp/a.js:10:12)
at factors_of (file:///Users/ynonp/tmp/a.js:10:12)
at factors_of (file:///Users/ynonp/tmp/a.js:10:12)
at factors_of (file:///Users/ynonp/tmp/a.js:10:12)
at factors_of (file:///Users/ynonp/tmp/a.js:10:12)
at factors_of (file:///Users/ynonp/tmp/a.js:10:12)
ืืจืง bun ืืคืชืืข ืืืืื:
$ bun a.js
[
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
71, 101, 251, 401, 9384251
]1 419
ืืื ืื ืืช ืืช ืื ืืื?
ื ืชืื ื ืงืืืคืื ื ืืช ืจืืืงื:
function ItemData() {
const { id } = useParams();
const { data, error, isLoading } = useSWR('/api/user', fetcher);
if (isLoading) return <p>Loading...</p>;
if (error) return <p>Error</p>;
return <ItemView item={data} />
}
ืืงืืืคืื ื ืื ืืืงืืช ืืช ืืคืจืืืจ id ืืืืืจืืช ืื ืชืื, ืคืื ื ืืฉืจืช ืืื ืืืฉืื ืืช ืืืืืข ืขื ืืคืจืื ืืื ืืฆืืื ืืช ืืืืืข ื ItemView. ืืชืฆืืื ืืงืืืคืื ื ืื ื ืคืจืืช ืืื ืฉืืคืฉืจ ืืืื ืืืืืง ืืืชื ืืื ืงืฉืจ ืืืฉืืืช ืืืืืข ืืื ืื ืืืชืจ ื ืื ืืชืืืง ืืื ืืช ืืงืื, ืืื ืืื ืืคื ืืช ืืฉืจืช ืจืง ืืืจื ืฉืืงืืืคืื ื ืื ืืชืจื ืืจืช ืืื ืืืฉืื ืืช ืืืืืข?
ืชืฉืืื 1 - ืื ืื ืืื ืืืืจ
ืคื ืื ืฉื ืื ืืฉืจืช? ืื ืคืชืืื, ืคื ืืชื ืืฉืจืช ืจืง ืคืขื ืืืช. ื HTML ืื JavaScript ืฉืืืืขืื ืืืงืื ื ืฉืืืื ื CDN ืืื ืืืฉืจืช ืฉืื. ืจืง ืืืจื ืืขืื ืช ืืขืืื ืืืขืจืืช ืคืื ื ืืฉืจืช ืฉืื ืืื ืืืฉืื ืืช ืื ืืืืืข ืืจืืืื ืื ืืืืฆืื ืืช ืืขืืื.
ืื ืืคืฉืจ ืืขืฉืืช ืืืจืช? ืืืืช ืฉืืื ืฉืฉืืืช. ืื ืจืฉืืืช ืืคืจืืืื ืืืืขื ืืจืืฉ ืืคืฉืจ ืืื ืืื ืืช ื Offline ืขืืืื HTML ืฉืื ืื ืขืืืจ ืื id ืืืฉืืืจ ืืช ืืื ื CDN, ืืื ืืืคืืคื ืืื ืืืื ืืืฆืื ืืช ืืืืืข ืืื ืืืจ - ืืื ืืื ืฉืืื ืืงืื ืืช ืืขืืื ืืคืืื ืืื ืืืจืืฅ ืงืื ืจืืืงื. ืชืื'ืก ื ืงืกื ืืืืข ืืขืฉืืช ืืช ืื ืืืืืืืืช.
ืื ืืจืฉืืื ืืื ืืืช ืืคืฉืจ ืืืฉืชืืฉ ื Server Components ืืื ืืืฉืื ืืช ืื ืืืืืข ืืืกืืก ืื ืชืื ืื ืืคื ื ืฉืฉืืืืื ืืช ืืขืืื ืืืงืื ืืื ืืฆืืฆื ืงืจืืืืช. ืืืฆืช ืืืื ืืขื ืืื ืืืืืง ืืืืื ืช ืืืฆืืขืื ืืืื ืืืฉื ื ืืชื ืช ืชืืฆืืืช ืืืืืช ืืืชืจ.
ืชืฉืืื 2 - ืื ืื ืื ืืื ืืกืคืืง ืืฉืื
ืคื ืื ืฉื ืื ืืฉืจืช? ื ื ืืกืืจ ืืฉ ืื ืขืื 5 ืืืืคื ืฉืืืช ืืื. ืืื ืืืคืช ืืื ืคื ืืืช ืืฉืจืช ืืชื ืฉืืื ืืฉืืื ืืืฆืื ืืช ืืชืืื? ืื ื ืฉืืืจ ื DB ืกืืืืกืืืงื ืฉืืจืื ืฉื 95% ืืืืงืืืืช ืืขืืื ื ืืขื ืชืื ืคืืืช ืืฉื ืื ืืื ืื ืื ืฉืืฉืื. ืื ืขืื ืื ืื ื ืื ืืืจืืื ืืชืงืฆืื ืืืืฆืืขืื ืฉืื ื ืขืืืฃ ืืืชืืงื ืืคืืฆ'ืจืื ืืื ืืืืคืืืืืืฆืืืช.
ืชืฉืืื 3 - ืื ืื ืื ืฉืืื ืืชืื ืืชืืขืื
ืื ืื ืฉืืืชื ืจืืืงื ืืืืข ืฉ react-query ื swr ืื ืืืจื ืืื ืืืื ืืืฉืื ืืืืข ืืืฉืจืช. ืื ืจืฆืืช ืฉืืืชืื useEffect ืฉื? ืืืฅ ืืื ืืื ืขืืื ืื ืื ื ืืืขืื.
ืชืฉืืื ืืืื ื"ืืื ืื ืืช ืืช ืื ืืื" ืฆืจืืื ืืคืชืื ืืืื. ืฆืจืืื ืืืฉืืฃ ืขืื ืืืคืฆืืืช ืืืช ืืขืจื ืืฉืืงืืืื ืฉืืืืื ืืืืืจื ืืืจื ืืกืืืืช. ืื ืืื ืืื ืขืืืื ืชืฉืืื ืืืื ืื ืืืื ืืื ืืื ืืืชืืื ืืืคืฉ.1 419
ืฉืืืฉื ืืชืจืื ืืช ืฉื ื ืืืื ืืจืฉืืืช ืืืืกืก Policy
ื ืืืื ืืจืฉืืืช ืืืขืจืืช ืื ืืื ืื ืื ืฉืืืคืฉืจ ืื ื ืืจืืข ืฉืืฉืชืืฉ ืืชืืืจ ืืืืื ืื ืืืชืจ ืืืืชื ืืฉืชืืฉ ืืขืฉืืช. ืืื ืืืืช ืื ื ืงืจื Authorization ืืืืจื ืืื ืื ืื ื ืืคืจืืืื ืืช ืื ืื ืื ื ืืืื ืืืจืฉืืืช ืืื ืื ืื ืืืืืืืช (Authentication). ืืืืืืืช ืืืคืฉืจืช ืื ืืืืื ืฉืื ืฉื ืื ืก ืืจืืข ืืื ืืฉืชืืฉ X ืื ืืืื ืืืจืฉืืืช ืื ืื ืฉืืืคืฉืจ ืื ืืืืื ืฉืืืฉืชืืฉ X ืืืชืจ ืืืืื ืก ืืืฃ ืืกืืื.
ืืื ืื ืื ื ืืืื ืืืจืฉืืืช ืื ืื ื ืืืฆืืื ืฉืชื ืืืฉืืช ืืจืืืืืช (ืขื ืกืคืจืืืช ืงืื ืชืืืืืช). ืืืืฉื ืืจืืฉืื ื ืืื ื ืืืื ืืจืฉืืืช ืืืืกืก ืืฉืชืืฉ. ืคื ืืฉ ืื ื ื Rails ืืช cancancan ืื JavaScript/Typescript ืืช casl. ืืืืฉื ืืืช ืื ืื ื ืืชืืืืื ืืช ืืชืืื ืืช ืืืงืืช ืืืืืงื ืืฉืชืืฉ ื"ืืืืืืง" ืื ืืจืฉืืืช:
import { defineAbility } from '@casl/ability';
export default (user) => defineAbility((can) => {
can('read', 'Article');
if (user.isLoggedIn) {
can('update', 'Article', { authorId: user.id });
can('create', 'Comment');
can('update', 'Comment', { authorId: user.id });
}
});
ืืจืื ืคืขืืื ืื ื ืืืืง ืืช ืงืืข ืืงืื ืืื ืืคืื ืงืฆืืืช ืืชืืื ืื ืคืื ืงืฆืื ืืืช ืฉืืืคืืช ืืืฉืชืืฉ ืืกืื "ืืืืฉ ืจืืื" ืคืื ืงืฆืื ืืืจืช ื"ืืืืฉ ืืืืืจ" ืคืื ืงืฆืื ืฉืืืฉืืช ื"ืื ืื" ืืจืืืขืืช ื"ืื ืื ืืืชืจ". ืืื ืคืื ืงืฆืื ืื ื ืืืืืง ืืืฉืชืืฉ ืืช ืืืจืฉืืืช ืืืชืืืืืช.
ืคื ืืืชืจ ืืืฉื ืื ื ืืฉืชืืฉ ืืกืคืจืื ืืืืช ืืงืื ืจืืืืก ืืืฉ ืื ืืจืฉืืืช ืืื:
def guest_user(user)
can :read, BlogPost do |post|
post.published_at <= Time.now
end
can :read, Lesson, free: true
end
ืืืฉื ืืืืช ืขืืืืช ืืืื ืืื ืืชืืืืช ืืคืจืืืงื ืื ืืคืจืืืงืืื ืงืื ืื, ืื ืขืื ืื ืืืจืฉืืืช ื ืื ืกืืช ืืงืืืฅ ืืื.
ืืืฉื ืฉื ืืื ืื ืืืื ืืจืฉืืืช ืืื ื ืืืื ืืืืกืก ืืืื ืืืช. ืืืืฉื ืื ืื ื ืืืืืจ Policy ืืืืฉื ื"ืืืจ" ืืกืืื ืืืชืื ืืืืื ืืืช ืื ื ืืืืืจ ืื ืจืฉืื ืืขืฉืืช ืื ืขื ืืืชื ืืืจ. ืืืช ืืืืฉื ืฉืื ืื ื ืคืืืฉืื ืืกืคืจืืืช ืจืืืืก ืืื pundit ื action_policy, ืคืื ืืื ืื ืืืื ื ื JavaScript. ืื ื ืงืืข ืืชืื ืืชืืขืื ืฉื action_policy ืืื ืฉื ืจืื ืืช ืืืืื:
class PostPolicy < ApplicationPolicy
# everyone can see any post
def show?
true
end
def update?
# \user\ is a performing subject,
# \record\ is a target object (post we want to update)
user.admin? || (user.id == record.user_id)
end
end
ืื ื JavaScript ืืชืื ืืชืืขืื ืฉื pundit:
import { Policy } from 'pundit'
export default class PostPolicy extends Policy {
constructor(user, record) {
super(user, record)
this.setup.apply(this)
}
edit() {
return this.user.id === this.record.userId
}
destroy() {
return this.user.isAdmin
}
}
ืฉืืืฉื ืืชืจืื ืืช ืืืืจืื ืฉื ืืืื ืืืช ืืจืฉืืืช ืืืืกืกืช ืืืืืื ืื:
1. ืื ืืืจืฉืืืช ืฉื ืืืื ืืกืืื ืืจืืืืืช ืืืงืื ืืื.
2. ืืคืฉืจ ืืฉืชืฃ Policy ืืื ืืื ืืืืืื.
3. ื ืืืื ืฉืื ืืืื - ืื ืื ื ืจืืฆื ืืงืืืข ืืืืจ ืฉืชืืื ืืกืื ืืกืืื ืืืจ ืื ืืืคืฉื ืืืืฉื ืืจืืฉืื ื ืื ื ืฆืจืื ืืฉื ืืช ืืฉื ื ืืงืืืืช (ืื ืืคืื ืงืฆืื ืฉืืืืืจื ืืจืฉืืืช ืืืืจืืื ืืื ืืคืื ืงืฆืื ืฉืืืืืจื ืืจืฉืืืช ืืืฉืชืืฉืื ืจืฉืืืื). ืืืืฉื ืืฉื ืืื ืืกืคืืง ืืขืืื ืืช ืคืื ืงืฆืืืช ืืฆืคืืื ื Policy ืฉืืชืืื ืืืืจ ืืืชื ืื ื ืืืื.1 419
ืืืขื ืคืจืืื ื nodemon
ื ืืืืื ืืื ืืืจ ื ืืื ืืืฉื ืืจืื ืฉื ืื. ืืกืคืืง ืงืฉื ืืืืืจ ืืฉืืืจ ืืช ืืงืืืฅ ืื ืคืขื ืืืจื ืฉืื ืืืื, ืืืชืืืช ืืคืืืงืฆืืืช ืืื ืฆื ืฉืจืช ืืืงืกืคืจืก ืืืขืืื ืืื ืฆืจืื ืื ืืกืืืจ ืืืคืชืื ืืืืฉ ืืื ืืช ืืช ืืฉืจืช. ื ืืืืื ื ืชื ืคืืชืจืื ืื ืื ืืื ืฉืืืจ ืฉืืื ื ืฉืคืืฆ'ืจ ืืกืืกื ืืื ืืืขืื ืืืืฉ ืืช ืืืขืจืืช ืืืจื ืฉืืฉื ืื ืงืืฆืื ืื ืืฉืื ืฉืฆืจืื ืืืืืช ืืืื ื ืืืื ืืขืืืื.
ืืื ื ืืืืข ื ืื 20 ืืืคื ืืช ืื ืืขืกืง ืืืืกืืืจืื.
ืืืงืื ืืืชืงืื ืืืืคืขืื nodemon ืื ืื ื ืืืืืื ืืืจ ืืืชืื:
node --watch ./bin/www
ืืืฉืืืื ืฉืื ืื ืืืืืืืืช ื ืื ืืืขื ืืืืฉ ืืช ืืืคืืืงืฆืื.
ืื ืืื ืจืง ืืืขื? ืืฆืขืจื ืืฆื watch ืฉื node ืขืืืื ืื ืืืืข ืืขืืื ืขื ืงืืฆื TypeScript ื ts-node ืื ืืืืจ ืขืืืื ืืช ืืืชื ืืื, ืืื ืื ืืืคืืืงืฆืื ืืื ืืืืืคืกืงืจืืคื ืื ืื ื ืขืืืื ื ืฆืืจื ืืช nodemon, ืฉืืงืืคื ืืืืืืืืช ืืช ืืืืืคืกืงืจืืคื ืขื ืื ืฉืื ืื.1 419
ืืืืืช ืืืชืื ืช
ืื ืืฉ ืืืฉื ืืื ืืืคืืื ืขื ืจืืฉื ืชืืืืช - DX, Developer Experience.
ืงื ืืืืฉืื ืืื ืืื ืฉืื ืื ืื ื ืืืชืืื ืืืื ืฉืืืชืื ืชืื ืืืืชืื ืชืืช ืืืื ืงื ืืืฉืชืืฉ ืืื ืื ืืชืืื ืืช ืฉืืืชื ืื ืฉืื ืืืชืื ืืืื ืืืืืช ืืืชืจ, ืืืืจืืช ืืืชืจ ืืืืืืืช ืืืชืจ. ืืฆื ืฉื ื ืืฉืื ืฉืื ืฆืจืืืื ืืขืืื ืงืฉื ืืื ืืืืื ืืื ืืืฉืชืืฉ "ื ืืื" ืืืื ืฉืื ืื ืืขืฉื ืืืชืจ ืืขืืืืช ืืืชืืฆืื (ืืืคืืืงืฆืื ืฉืื ืืืชืืื) ืชืืื ืคืืืช ืืืื.
ืืืืื ืืืื ื DX ืืื ืืฉืื ืื ื ืืื ืื API. ืื ืงื ืืืฉืชืืฉ ื API ืืื ืืงื ืืืฉืื ืืื ื ืจืง ืืช ืืืืืข ืฉืืืชืื ืชืื ืฆืจืืืื ืื ืืืคืืืงืฆืืืช ืฉืืืืชืื ืขื ืืืชื API ืืฆืื ืืืืืช ืืืชืจ. ืื ื API ืืืจืื ืืช ืืืฉืชืืฉืื ืืืฉืื ืืจืื ืืืชืจ ืืืืข ืืื ืฉืื ืฆืจืืืื ืื ืืืคืชืืื ืฉืืฉืชืืฉื ืืืืชื API ืื ืชืืื ืืจืืจื ืืื ืืืืฆื ืืืชืื ืืขืจืืืช ืคืืืช ืืืืืช.
ืื ืื ืื ื ืืืชื ืคืจืืืืืืจืง ืขื ืชืืขืื ืืื ืื ืืชืื ืชืื ืืฉืชืืฉื ืืคืจืืืืืืจืง ืืื ืฉืชืื ื ืชื ืืืืขืจืืช ืฉืื ืืืชืืื ืชืืื ืืืืจื ืืืชืจ. ืื ืื ื ืื ืืืชื ืชืืขืื ืื ืืฉืชืืฉื ืื ืืฆืืจื ืฉืื ืืฉืืชื ืขืืื ืืืชืืฆืื ืชืืื ืืืืื ืืืืจืื ืืืขืจืืช ืืืืืช ืืื ืืืืืืืช.
ืืืขืื ื DX ืืชืืืื ืืฉ DX ืืชืืื ืืืื ืขื ืืฉืืื UX, ืืืฉืื ืื ื ืืืืืืื ืืื ืืืื ืืืชืืืช ืืขืจืืืช ืืืืืช ื"ืืืื ืฉืืืฃ ืื ื ืืืฉืชืืฉ ืืื". ืคืจืืืื ืืคืืจืกืืช ืืชืืจ ื ORM ืขื ื DX ืืืื ืืืืชืจ ืืขืืื, ืืื ืืื ืืคืฉืจืืช ืืขืฉืืช JOIN ืืื ืืืืืืช ืื ืืืฉืื ืฉืืฉืชืืฉ ืืคืจืืืื ืืฆืืจื ืืขืฉืืช ืืจืื ืืืชืจ ืขืืืื (ื ืืื ืืืืืืืืช ืืื ืืขืจื ืืช ืืืชืื ืชืื, ืืื ืขืืืื) ืืืื ืืืฉืืืื ืจืืื ืืืื ืืืืืื ืืืจืื ืืืฉืืืื ืืืืื ืฉืืืืชืื ืขื ืืจืืื.
ืขืื ืืืืื ืืคืืจืกืืช ืืืชื ืคืื ืืืค (ืืืืจืื ืงืืจืืืื) ืฉื ืชื ื ืืืคืชืืื ืืคืฉืจืืช ืืืชืื ืืคืืืงืฆืืืช ืืืืืื ืืืืื ืฉื ืคืืชืื ืืื ืฉืื ืืืจ ืืืืจืื, ืืื ืืืฆืจื ืืคืืืงืฆืืืช ืฉืขืืื ืืื ืืืื ืืืืืืืช ืืืืื ืช ืืืืืืืช ืืืืื ืืืจืฆืื ืขื ืืืืคืื.
ืืฉืขืืืืื ืืฆืืืช ืืืชืืจ ืืื ืืคืื: ืืืชื ืืืื ืฉืืกืคืงืื DX ืืืืืืืช ืืจืื ืคืขืืื ืขืืจื ืืกืคืืง ืืืืืฉ ืืื ืฉืื ื ืจืื ืืช ืืืขืืืช ืืืคืืืงืฆืืืช POC ืงืื ืืช. ืืคืขืืื ืืฉ ืชืืืฉื ืฉืืืชื ืืืื ื ืืชืื ืกืคืฆืืคืืช ืขืืืจ ืืืชื ืืคืืืงืฆืืืช ืงืื ืืช. ืืจืื ืคืขืืื ืืืืจืื ืืฆืืืช ืื ืืืืืื ืืืืชืจ ืขื ืืืืืช ืืืคืชื ืืืืฉืงืขืช ืืชืื ืืจืืฉื ืฉืืขืืืช ืืืืฆืืขืื ืื ืืืื ืฉื ืืขืชืื ืื ืฉืืืื ืืืื ืื ืืืืขื ืืืื ื.
ืืื ืื ืคืืชืจืื ืงื ืืืฆืืื ืืืื. ืืืื ืืื ืฉืื ืื ื ืืืื ืื ืืืชืจ ืืื ืืช ืืืืื ืืืช ืืืืืืืช ืืืืื ืืช ืฉืืื ืงื ืื ื ืืืชืจ ืืืืืจ ืืช ืืืชื ืืืื ืฉืืฉืืืื ืืืืืช ืืคืชืืื ืืืื ืขื ืืืฆืจ ืืื ืืืงืื.
1 419
ืคื ืืืขื ืืชืืืืฉืชื ืขื ืฉืืฆืืชื ืืช ืืคืืกื ืืื:
https://aymarino.github.io/polygon-area/
ืฉืืกืืืจ ืขื ื ืืกืื ืืฉื ื ืืกืืช ืฉืจืื ืื ืขื ืฉืืืคืฉืจืช ืืืฉื ืฉืื ืฉื ืคืืืืืื ืจืง ืืคื ืืงืืืงืืืื ืฉืื. ืืฉืืื ืืืฉืชืืฉ ืื ืืกืื ืชืืืื ืืคืืชื ืืช ืจืฉืืืช ืืืืจืืืช ืืจืฉืืื ืฉื ืงืืืงืืืื:
def coordinates(input: Source, parseLine: (line: String) => PaintingInstruction): List[(Long, Long, Long)] =
input
.getLines()
.scanLeft((0L, 0L, 0L)) { (acc, line) =>
val (row, column, distance) = acc
val paintingInstruction = parseLine(line)
paintingInstruction.dir match
case "L" => (row, column - paintingInstruction.count, distance + paintingInstruction.count)
case "R" => (row, column + paintingInstruction.count, distance + paintingInstruction.count)
case "U" => (row - paintingInstruction.count, column, distance + paintingInstruction.count)
case "D" => (row + paintingInstruction.count, column, distance + paintingInstruction.count)
}.toList
ืืขืจื ืืฉืืืฉื ืืจืฉืืื ืืื ืืืจืืง ืืืืื ืฉื ืืฆืืจื, ืืื ืืขืืืจ ืื ื ืืืืฉื ืืืืฉืื. ืืชืืชื ืฉืชื ืคืื ืงืฆืืืช ืืงืจืืืช ืฉืืจืืช ืืืชืืื ืืฉื ื ืืืงื ืืชืจืืื:
def parsePart1(line: String): PaintingInstruction =
val lineRE = """(\w) (\d+) \((#\w+)\)""".r
val List(d, count, color) = lineRE.findFirstMatchIn(line).get.subgroups
PaintingInstruction(d, count.toInt, color)
def parsePart2(line: String): PaintingInstruction =
val lineRE = """\w \d+ \(#(\w\w\w\w\w)(\w)\)""".r
val List(count, d) = lineRE.findFirstMatchIn(line).get.subgroups
val distance = java.lang.Long.parseLong(count, 16)
val direction = d match
case "0" => "R"
case "1" => "D"
case "2" => "L"
case "3" => "U"
PaintingInstruction(direction, distance, "...")
ืืื ืืช ืื ืืกืื ืืฉืื ืคืืืืืื:
def shoelace(coordinates: List[(Long, Long, Long)]): Long =
coordinates.zip(coordinates.tail).map { pair =>
val ((x1, y1, d1), (x2, y2, d2)) = pair
x1 * y2 - y1 * x2
}
.sum
.abs / 2
ืื ืืงืื ืืืืง ืืจืืฉืื:
def day18part1(): Unit =
val coords = coordinates(Source.fromResource("day18.txt"), parsePart1)
val distance = coords.last._3
val area = shoelace(coords)
val poolSize = area + distance / 2 + 1
println(poolSize)
ืืื ืืืืง ืืฉื ื:
def day18part1(): Unit =
val coords = coordinates(Source.fromResource("day18.txt"), parsePart2)
val distance = coords.last._3
val area = shoelace(coords)
val poolSize = area + distance / 2 + 1
println(poolSize)
ืื ื ืืืื ืฉืืืื ืจืืฉืื ืืชืจืืื ืืื ื ืจืื ืื ืืฉืขืื ืืืื ืืงื ืื ืืจืื ืืื ืืืฉืช ืืืื. ืืกืืคื ืฉื ืืืจ ืืื ืืืืืกื ืืืืืชื ืืื ื ืืกืืืืช ืืืฉืืช ืื ืฉืืฆื ืืืฆืื.1 419
ืคืืชืจืื Advent Of Code ืืื 18 ืืกืงืืื
ืืืื ืื ืืชืื ื Advent Of Code ืืื ืืืืื ืืช ืืฆืืื ืช ืืืืืืจ ืืืืชืงืื. ืืฉ ืื ื 25 ืืืืืช ืกื ืืื ืื ืื ืื ื ืืืฉ ืืชืงืจืืื ืืกืืื. ืืืื ื ืจืื ืืช ืืื 18, ืืช ืื ืืกืืื ืืจืืฉืื ืืืจืื ืืืื ืืืฆืื ืฉืื ืืื ืืช ืืคืืชืจืื ืืืืืชื.
ืื ืฆืจืื ืืืฉื
ืืืื ืื ืื ื ืืืืืื ืืืคืืจ ืืจืืื. ืืืจื ืืื ืืฉืืฆืืืจืื ืืืจืืฆื ืื-ืืืืืืช ืื ืื ื ืืืืืื ืื ืฉืื ืื ื ืืกืชืืืื ืขื ืืืฉืื ืืืืขืื, ืืื ืืชืจืืื ืืืื ืื ืื ื ืืกืชืืืื ืขื ืืืจืืื ืืืฆื. ืื ืืฆืืืจ ืืืืืฉื:
#######
#.....#
###...#
..#...#
..#...#
###.###
#...#..
##..###
.#....#
.######
ืืื ืืืคืจืื ืืช ืืืจืืื ืืชื ืฉืืืืื? ืืื ืืขืื ืื ืืืืืง ืืงืื ืืคืืื. ืืฉืืื ืืืคืืจ ืื ืื ื ืืงืืืื ืจืฉืืืช ืืืจืืืช ืฉื ืจืืืช ืื:
R 6 (#70c710)
D 5 (#0dc571)
L 2 (#5713f0)
D 2 (#d2c081)
R 2 (#59c680)
D 2 (#411b91)
L 5 (#8ceee2)
U 2 (#caa173)
L 1 (#1b58a2)
U 2 (#caa171)
R 2 (#7807d2)
U 3 (#a77fa3)
L 2 (#015232)
U 2 (#7a21e3)
ืืืืชืืืช R, D, L ื U ืงืืืขืืช ืืืืื ืืืืื ืืืคืืจ (ืฉืืืื, ืืืื, ืืืื ื ืื ืืืขืื) ืืืืกืคืจ ืงืืืข ืืื ืืืจ. ื ืชืขืื ืืื ืชืืื ืืืืกืคืจ ืืืืจืื ืืฉืืจื.
ืืืจื ืฉืืคืจื ื ืืช ืืืจืืื ืืืืืื ืืืชื ืืืื ืืื ื ืจืื ืืื:
#######
#######
#######
..#####
..#####
#######
#####..
#######
.######
.######
ืืขืืฉืื ืฆืจืื ืืืืืช ืืื ืืฉืืฆืืช ืขื ืกืืืืืช ืืฉ ืืฆืืืจ. ืืืืืื ืืฉ 64 (ืืชื ืืืืืื ืืกืคืืจ).
ืืื ืื ืืกืคืืจ ืกืืืืืืช
ืืฉืจืืืชื ืืช ืืืืจืืฆื ืืืืจ ืืจืืฉืื ืฉืจืฆืืชื ืืขืฉืืช ืืื ืืฉืืืจ ืืืชื ืืืคื ืืกืงืืื ืืฉืืืคืชื ืืื ืืงืืืืจืืื ืืืช ืืืขืจื ืืื ืกืืืืืช ืื ืืืจืืืช ืืฆืืืจ ืื true ืื ืื ืฉืื ืืืื.
ืืืจื ืื ืจืฆืืชื ืืงืืช ื ืงืืื ืืชืื ืืืจืืื ืืืืชืืื ืืืคืฉ ืืื ื ืืช ืื ืื ืงืืืืช ืฉืกืืืื ืืืคื ืืืฅ ืขื ืฉืื ื ืืืืข ืืงื ืืืจืืื ืืื ืื ื ืืืื ืืืขืช ืืื ืืฉืืฆืืช ื ืืฆืืืช ืืชืื ืฉืื ืืืจืืื. ืืืกืืคืื ืืช ืื ืืืืงืฃ ืืืฆืื ื ืืช ืืกืคืจ ืืกืืืืืืช. ืืคืืื ืืชืืชื ืืช ืืงืื.
ืฉืชื ืืคืื ืงืฆืืืช ืืืื ืืืคืจืืช ืืช ืืืจืืื:
case class PaintingInstruction(dir: String, count: Long, color: String)
def dig(input: Source): Canvas =
val lineRE = """(\w) (\d+) \((#\w+)\)""".r
input
.getLines()
.foldLeft(((0, 0), Map[(Int, Int), PaintingInstruction]())) { (acc, line) =>
Try {
val (pos, canvas) = acc
val List(d, count, color) = lineRE.findFirstMatchIn(line).get.subgroups
val paintingInstruction = PaintingInstruction(d, count.toInt, color)
paint(pos, canvas, paintingInstruction)
}.recover { err =>
// skip line in case of error
println(s"Error in line ${line} - ${err}")
acc
}.get
}._2
def paint(pos: Point, canvas: Canvas, cmd: PaintingInstruction): (Point, Canvas) =
0L.until(cmd.count).foldLeft((pos, canvas)) { (acc, count) =>
val ((row, column), canvas) = acc
val nextCanvas = canvas.updated((row, column), cmd)
cmd.dir match
case "R" => ((row, column + 1), nextCanvas)
case "L" => ((row, column - 1), nextCanvas)
case "U" => ((row - 1, column), nextCanvas)
case "D" => ((row + 1, column), nextCanvas)
}
ืืืคืื ืงืฆืื ืืืืช ืืืคืฉืช ืืช ืื ืื ืงืืืืช ืืชืื ืืืจืืื:
@tailrec
def floodFill(canvas: Canvas, finished: Set[Point], inProgress: List[Point]): Set[Point] =
inProgress match
case head :: tail =>
val (row, column) = head
println(head)
val neighbors = List(
(row-1, column),
(row+1, column),
(row, column-1),
(row, column+1),
).filterNot { p => canvas.contains(p) }
.filterNot(finished.contains)
.filterNot(inProgress.contains)
floodFill(canvas, finished + head, tail ++ neighbors)
case Nil => finished
ืืงืื ืคืืชืจ ืืช ืืืืง ืืจืืฉืื ืืื ื ืืฉื ืืฆืืจื ืืืืืช ืืืืง ืืฉื ื ืืืื ืื ืื ืืขืื.
ื ืืกืืื ืฉื ื
ืืืืง ืืฉื ื ืฉื ืืชืจืืื ืืกืคืจืื ืื ื ืฉืืขืฆื ืงืจืื ื ืืช ืืฉืืจื ืื ื ืืื ืื ืืืื. ืืืกืคืจ ืืืืจืื ืืื ืืืืจ ืืืฉืื - ืืืฉ ืืกืคืจืืช ืืจืืฉืื ืืช ืฉืื ืื ืืกืคืจ ืืืกืืก 16, ืืืกืืคืจื ืืืืจืื ื ืืืืฆืืช ืืช ืืืืืื 0 ืขืืืจ ืืืื ื, 1 ืขืืืจ ืืืื 2 ืขืืืจ ืฉืืืื ื 3 ืืืืจ ืืืขืื. ืืืกืคืจืื ืืืืืื ืืืื ืืืจ ืื ืจืืืื ืืฉืืืจ ืืช ืื ืืืฉืืฆืืช ืืืืจืืฆื. ืื ืืืื ื ืฉืืืจืื ืืืืฉืืื ืงืื ืืืืืื ืืื ืืกืชืื ื 952408144115 ืืฉืืฆืืช.
Endi mavjud! Telegram Tadqiqoti 2025 โ yilning asosiy insaytlari 
