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
cond.comparator match
case "<" if cond.second < compressed.maxS => compressed.copy(maxS = cond.second - 1)
case "<=" if cond.second < compressed.maxS => compressed.copy(maxS = cond.second)
case ">" if cond.second > compressed.minS => compressed.copy(minS = cond.second + 1)
case ">=" if cond.second > compressed.minS => compressed.copy(minS = cond.second)
case _ => compressed
}
@main
def day19part1(): Unit =
val (workflows, items) = parse(Source.fromString(demoWorkflow))
val start = workflows("in")
println(items.filter {
item => process(workflows, start, item)
}.map { item =>
item.x + item.m + item.a + item.s
}.sum)
def count(workflows: Workflows,
name: String,
ruleNumber: Int = 0,
constraints: List[Condition] = List()): Long =
if (name == "R") {
0L
} else if (name == "A") {
sizeOf(compress(constraints))
} else {
val rules = workflows(name)
val rule = rules(ruleNumber)
if (rule.condition.second < MAX_VALUE) {
count(workflows, rule.destination, 0, constraints :+ rule.condition) +
count(workflows, name, ruleNumber + 1, constraints :+ inverseCondition(rule.condition))
} else {
count(workflows, rule.destination, 0, constraints :+ rule.condition)
}
}
@main
def day19part2(): Unit =
val (workflows, items) = parse(Source.fromString(demoWorkflow))
println(count(workflows, "in"))
}
ืื ืืฉ ืืื ืจืขืืื ืืช ืืื ืืืชืื ืืช ืื ืืกืงืืื ืขื ืคืืืช ืืืจืชืืืช ืื ืชืชืืืืฉื ืืฉืชืฃ ืืชืืืืืช ืื ืืืืืจื.1 419
rule.split(":") match
case Array(destination) => Rule(parseCondition(""), destination)
case Array(condition, destination) => Rule(parseCondition(condition), destination)
// workflow - ex{x>10:one,m<20:two,a>30:R,A}
def parseWorkflow(line: String): (String, Workflow) =
val List(name, workflow) = """(\w+)\{(.*)}""".r.findFirstMatchIn(line).get.subgroups
val rules = workflow.split(",").map(parseRule).toList
(name, rules)
def parseItem(line: String): Item =
val pattern = """\{x=(\d+),m=(\d+),a=(\d+),s=(\d+)}""".r
val List(x, m, a, s) = pattern.findFirstMatchIn(line).get.subgroups
Item(x.toLong,
m.toLong,
a.toLong,
s.toLong)
def parse(source: Source): (Workflows, List[Item]) =
val lines = source.getLines().toList
val workflows = lines
.takeWhile(_.nonEmpty)
.map(parseWorkflow)
.foldLeft(Map[String, Workflow]()) {(workflow, map) =>
val (name, data) = map
workflow ++ Map(name -> data)
}
val items = lines
.dropWhile(_.nonEmpty)
.drop(1)
.map(parseItem)
(workflows, items)
def checkCondition(condition: Condition, item: Item): Boolean =
val op1 = condition.first match
case "x" => item.x
case "m" => item.m
case "a" => item.a
case "s" => item.s
condition.comparator match
case "<" => op1 < condition.second
case "<=" => op1 <= condition.second
case ">" => op1 > condition.second
case ">=" => op1 >= condition.second
def inverseCondition(condition: Condition): Condition =
condition.comparator match
case "<" => condition.copy(comparator=">=")
case "<=" => condition.copy(comparator=">")
case ">" => condition.copy(comparator="<=")
case ">=" => condition.copy(comparator = "<")
def process(workflows: Workflows, current: Workflow, item: Item): Boolean =
current.find(r => checkCondition(r.condition, item)) match
case Some(rule) =>
rule.destination match
case "A" => true
case "R" => false
case next => process(workflows, workflows(next), item)
def sizeOf(condition: CompressedConditions): Long =
(condition.maxX - condition.minX + 1) *
(condition.maxS - condition.minS + 1) *
(condition.maxA - condition.minA + 1) *
(condition.maxM - condition.minM + 1)
def compress(conditions: List[Condition]): CompressedConditions =
conditions.foldLeft(CompressedConditions(1, 4000, 1, 4000, 1, 4000, 1, 4000)) { (compressed, cond) =>
cond.first match
case "x" =>
cond.comparator match
case "<" if cond.second < compressed.maxX => compressed.copy(maxX=cond.second - 1)
case "<=" if cond.second < compressed.maxX => compressed.copy(maxX=cond.second)
case ">" if cond.second > compressed.minX => compressed.copy(minX=cond.second + 1)
case ">=" if cond.second > compressed.minX => compressed.copy(minX=cond.second)
case _ => compressed
case "m" =>
cond.comparator match
case "<" if cond.second < compressed.maxM => compressed.copy(maxM=cond.second - 1)
case "<=" if cond.second < compressed.maxM => compressed.copy(maxM=cond.second)
case ">" if cond.second > compressed.minM => compressed.copy(minM=cond.second + 1)
case ">=" if cond.second > compressed.minM => compressed.copy(minM=cond.second)
case _ => compressed
case "a" =>
cond.comparator match
case "<" if cond.second < compressed.maxA => compressed.copy(maxA=cond.second - 1)
case "<=" if cond.second < compressed.maxA => compressed.copy(maxA=cond.second)
case ">" if cond.second > compressed.minA => compressed.copy(minA=cond.second + 1)
case ">=" if cond.second > compressed.minA => compressed.copy(minA=cond.second)
case _ => compressed
case "s" =>1 419
case "<" if cond.second < compressed.maxX => compressed.copy(maxX=cond.second - 1)
case "<=" if cond.second < compressed.maxX => compressed.copy(maxX=cond.second)
case ">" if cond.second > compressed.minX => compressed.copy(minX=cond.second + 1)
case ">=" if cond.second > compressed.minX => compressed.copy(minX=cond.second)
case _ => compressed
case "m" =>
cond.comparator match
case "<" if cond.second < compressed.maxM => compressed.copy(maxM=cond.second - 1)
case "<=" if cond.second < compressed.maxM => compressed.copy(maxM=cond.second)
case ">" if cond.second > compressed.minM => compressed.copy(minM=cond.second + 1)
case ">=" if cond.second > compressed.minM => compressed.copy(minM=cond.second)
case _ => compressed
case "a" =>
cond.comparator match
case "<" if cond.second < compressed.maxA => compressed.copy(maxA=cond.second - 1)
case "<=" if cond.second < compressed.maxA => compressed.copy(maxA=cond.second)
case ">" if cond.second > compressed.minA => compressed.copy(minA=cond.second + 1)
case ">=" if cond.second > compressed.minA => compressed.copy(minA=cond.second)
case _ => compressed
case "s" =>
cond.comparator match
case "<" if cond.second < compressed.maxS => compressed.copy(maxS = cond.second - 1)
case "<=" if cond.second < compressed.maxS => compressed.copy(maxS = cond.second)
case ">" if cond.second > compressed.minS => compressed.copy(minS = cond.second + 1)
case ">=" if cond.second > compressed.minS => compressed.copy(minS = cond.second)
case _ => compressed
}
def inverseCondition(condition: Condition): Condition =
condition.comparator match
case "<" => condition.copy(comparator=">=")
case "<=" => condition.copy(comparator=">")
case ">" => condition.copy(comparator="<=")
case ">=" => condition.copy(comparator = "<")
ืืื ืืชื ืืื ืืืื ืื ืื ืฉืืชืืืื ืชื ืืฉืืชืืชื ืฉืกืงืืื ืขืืื ืืจืขืชื.
ืกื ืืื ืงืื ืืคืืชืจืื ืืืื ืืกืงืืื ืืื:
import scala.io.Source
import scala.util.matching.Regex
object aoc2023day19 {
val MAX_VALUE = 4000
case class Item(x: Long, m: Long, a: Long, s: Long)
case class CompressedConditions(minX: Long, maxX: Long,
minM: Long, maxM: Long,
minA: Long, maxA: Long,
minS: Long, maxS: Long)
case class Condition(first: String, comparator: String, second: Long)
case class Rule(condition: Condition, destination: String)
type Workflow = List[Rule]
type Workflows = Map[String, Workflow]
val demoWorkflowLine: String = "ex{x>10:one,m<20:two,a>30:R,A}"
val demoWorkflow: String = """px{a<2006:qkq,m>2090:A,rfg}
|pv{a>1716:R,A}
|lnx{m>1548:A,A}
|rfg{s<537:gd,x>2440:R,A}
|qs{s>3448:A,lnx}
|qkq{x<1416:A,crn}
|crn{x>2662:A,R}
|in{s<1351:px,qqz}
|qqz{s>2770:qs,m<1801:hdj,R}
|gd{a>3333:R,R}
|hdj{m>838:A,pv}
|
|{x=787,m=2655,a=1222,s=2876}
|{x=1679,m=44,a=2067,s=496}
|{x=2036,m=264,a=79,s=2244}
|{x=2461,m=1339,a=466,s=291}
|{x=2127,m=1623,a=2188,s=1013}""".stripMargin
// condition - x>10
def parseCondition(condition: String): Condition =
val pattern: Regex = "([xmas])([<>])(\\d+)".r
condition match
case "" => Condition("x", "<=", MAX_VALUE)
case pattern(a, b, c) => Condition(a, b, c.toLong)
// rule - x>10:one
def parseRule(rule: String): Rule =1 419
// workflow - ex{x>10:one,m<20:two,a>30:R,A}
def parseWorkflow(line: String): (String, Workflow) =
val List(name, workflow) = """(\w+)\{(.*)}""".r.findFirstMatchIn(line).get.subgroups
val rules = workflow.split(",").map(parseRule).toList
(name, rules)
def parseItem(line: String): Item =
val pattern = """\{x=(\d+),m=(\d+),a=(\d+),s=(\d+)}""".r
val List(x, m, a, s) = pattern.findFirstMatchIn(line).get.subgroups
Item(x.toLong,
m.toLong,
a.toLong,
s.toLong)
def parse(source: Source): (Workflows, List[Item]) =
val lines = source.getLines().toList
val workflows = lines
.takeWhile(_.nonEmpty)
.map(parseWorkflow)
.foldLeft(Map[String, Workflow]()) {(workflow, map) =>
val (name, data) = map
workflow ++ Map(name -> data)
}
val items = lines
.dropWhile(_.nonEmpty)
.drop(1)
.map(parseItem)
(workflows, items)
ืืคืื ืงืฆืื ืืืขื ืืื ืช ืืืื ืืงืืืช ืคืจืื ืืชื ืื ืืืืืงืช ืื ืืคืจืื ืืชืืื ืืชื ืื:
def checkCondition(condition: Condition, item: Item): Boolean =
val op1 = condition.first match
case "x" => item.x
case "m" => item.m
case "a" => item.a
case "s" => item.s
condition.comparator match
case "<" => op1 < condition.second
case "<=" => op1 <= condition.second
case ">" => op1 > condition.second
case ">=" => op1 >= condition.second
ืืืืจืื ืืคืฉืจ ืืื ืืืชืื ืคืื ืงืฆืืืช ืืืฉื ืจืงืืจืืืกืืช ืฉืืืืงืช ืื ืืคืจืื ืืกืชืืื ื A ืื ื R:
def process(workflows: Workflows, current: Workflow, item: Item): Boolean =
current.find(r => checkCondition(r.condition, item)) match
case Some(rule) =>
rule.destination match
case "A" => true
case "R" => false
case next => process(workflows, workflows(next), item)
ืื ืืกืคืืง ืืฉืืื ืืืืง ืืจืืฉืื:
def day19part1(): Unit =
val (workflows, items) = parse(Source.fromResource("day19.txt"))
val start = workflows("in")
println(items.filter {
item => process(workflows, start, item)
}.map { item =>
item.x + item.m + item.a + item.s
}.sum)
ืืจืขืืื ืืืจืืื ืฉื ืืืืง ืืฉื ื ืืื ืืคืื ืงืฆืื ืืืื:
def count(workflows: Workflows,
name: String,
ruleNumber: Int = 0,
constraints: List[Condition] = List()): Long =
if (name == "R") {
0L
} else if (name == "A") {
sizeOf(compress(constraints))
} else {
val rules = workflows(name)
val rule = rules(ruleNumber)
if (rule.condition.second < MAX_VALUE) {
count(workflows, rule.destination, 0, constraints :+ rule.condition) +
count(workflows, name, ruleNumber + 1, constraints :+ inverseCondition(rule.condition))
} else {
count(workflows, rule.destination, 0, constraints :+ rule.condition)
}
}
ืื ืคืื ืงืฆืื ืจืงืืจืกืืืืช ืฉืขืืืจืช ืขื ืื ืืืกืืืืื ืฉืืืืขืื ื A ื"ืืืกืคืช" ืืช ืื ืืชื ืืื ืฉืืืืขืื ืืฉื - ืืืืืื ืื ืืื ืชื ืื x<50 ืื ื ืืกืืฃ ืืืชื ืืื ืืืขืช ืฉืืืกืืื ืืกืืื ืื ืื ื ืืืืืื ืืืชืงืื ืจืง ืื ืืชื ืื ืืื ืืชืงืืื. ืื "ืืื" ืืชืืื ืืช ืืืืฆืจ ืฉืชื ืืคืฉืจืืืืช, ืืคืฉืจืืช ืืืช ืื ืืืื ืืื ืืืืชื ืืืคืฉืจืืช ืฉื ืื ืื ืืื ืฉืงืจื. ืื ืืืืืื ืื ืืฉ ืื ื ืืช ืืฉืืจื:
crn{x>2662:A,R}
ืื ืื ื ืืืืข ืืืืง ืืืชื ืืฉื ื ืืกืืืืื - ืืืกืืื ืืื x ืืืืช ืงืื ื 2662 ืืื ื ืืืข ื A, ืืืืกืืื ืฉื ื x ืืืื ืื ืฉืืื ื 2662 ืืื ืืืืขืื ื R. ืื ืืกืืคืืจ ืฉื ืืืืืืจ ืืจืงืืจืกืืื ืฉืืืคืืข ืืคืื ืงืฆืื.
ืืื ืืฉืืื ืฉืืคืื ืงืฆืื ืชืขืืื ืืื ืฆืจืืื ืืช ืืืืืืฉืื ืฉื ืคืื ืงืฆืืืช ืืขืืจ:
def sizeOf(condition: CompressedConditions): Long =
(condition.maxX - condition.minX + 1) *
(condition.maxS - condition.minS + 1) *
(condition.maxA - condition.minA + 1) *
(condition.maxM - condition.minM + 1)
def compress(conditions: List[Condition]): CompressedConditions =
conditions.foldLeft(CompressedConditions(1, 4000, 1, 4000, 1, 4000, 1, 4000)) { (compressed, cond) =>
cond.first match
case "x" =>
cond.comparator match1 419
ืคืืชืจืื Advent Of Code ืืื 19 ืืกืงืืื
ืื ื ืืืจ ืื ืืืืจ ืืื ืืื ืขืืจ ืืื ืืืืช ื Advent Of Code ืืงืืืืช ืฉืคืชืจืชื ืืื ืืกืงืืื, ืืื ืืฆื ืฉืชืืื ืืืช ืืฉืชื ื ืืืื ืืกืืฃ ืกืืฃ ืืื ืื ืืื ืืืืฉืื ืืคืจืง ืืื. ืืื ืฉืขืืงื ืื ืื ื ืืืืื 19 ืืชืื 25 ืื ืฉืืืืจ ืฉืืฉ ืกืืืื ืื ืจืข ืฉืขื ืกืืฃ ืืฉื ื ืืฆืืื ืืกืืื ืืช ืื ื 25 ืืืืืช ืฉื ืฉื ื ืฉืขืืจื.
ืืืชืืจ
ืืืื ืกืงืืื ืขืืื ื ืืื ืื ืฉืืืื ืคืฉืื ืืฉืชืืฉืชื ืื ืื ื ืืื. ืืงืื ืฉืื ื ื ืจืื ืื:
px{a<2006:qkq,m>2090:A,rfg}
pv{a>1716:R,A}
lnx{m>1548:A,A}
rfg{s<537:gd,x>2440:R,A}
qs{s>3448:A,lnx}
qkq{x<1416:A,crn}
crn{x>2662:A,R}
in{s<1351:px,qqz}
qqz{s>2770:qs,m<1801:hdj,R}
gd{a>3333:R,R}
hdj{m>838:A,pv}
{x=787,m=2655,a=1222,s=2876}
{x=1679,m=44,a=2067,s=496}
{x=2036,m=264,a=79,s=2244}
{x=2461,m=1339,a=466,s=291}
{x=2127,m=1623,a=2188,s=1013}
ืืืื ืืืืืง ืืฉื ื ืืืืงืื. ืืืืืง ืืชืืชืื ืืฉ ืจืฉืืื ืฉื ืคืจืืืื, ืืื ืคืจืื ืืฉ 4 ืืืคืืื ืื ืืืกืืื ืื ืืืืชืืืช x, m, a, s. ืืืืืง ืืฉื ื ืืื "ืชืืื ืืช" ืฉืืชืืืื ืืฉืืจื ืฉืืชืืืื ื in ืืืืืืช ืจืฉืืืช ืชื ืืื ืืชืืฆืืืช. ืืฉืืฉ ืื ืคืจืื ืฉืืชืืื ืืชื ืื ืืืฉืืืื ืืชืืฆืื ืฉืืืื. ืืชืืฆืื A ืืืืจืช ืฉืืคืจืื "ืืชืงืื" ืืืชืืฆืื R ืืืืจืช ืฉืืคืจืื ืื ืืชืงืื. ืืื ืืื ืืืืืืืช ืืืจืืื ืฉื ืคืจืืืื ืืชืื ืชืืื ืืืช:
{x=787,m=2655,a=1222,s=2876}: in -> qqz -> qs -> lnx -> A
{x=1679,m=44,a=2067,s=496}: in -> px -> rfg -> gd -> R
{x=2036,m=264,a=79,s=2244}: in -> qqz -> hdj -> pv -> A
{x=2461,m=1339,a=466,s=291}: in -> px -> qkq -> crn -> R
{x=2127,m=1623,a=2188,s=1013}: in -> px -> rfg -> A
ืื ืื ืื ื ืจืืืื ืืืืืื ืืคืจืื ืืจืืฉืื ืฉืืื ืืชืืื ื in, ื s ืฉืื ืืืื ื 1351 ืืืื ืื ืืืฉืื ื px ืืื ื qqz. ืฉื ื s ืฉืื ืืืื ื 2770 ืืืื ืืืฉืื ื lnx ืืืืื ืฉื m ืฉืื ืืืื ื 1548 ืืื ืืืืข ื A ืืคื ืืกืืืืื.
ืืฉืืื ืืจืืฉืื ื ืืื ืืืืืช ืืืื ืคืจืืืื ืืืืขืื ื A ืืืืืจ ืืช ืื ื a, x, m ื s-ืื ืฉืืื.
ืืฉืืื ืืฉื ืืื ืขืืื ื ืืืืืื ืฉืื ืืืคืืื ืืืื ืืงืื ืขืจืืื ืืื 1 ื 4000, ืืืืืืช ืืื ืคืจืืืื ืชืืืืจืืืช ืกื ืืื (ืืื ืงืฉืจ ืืจืฉืืื ืฉืื ื ืชื ื) ืืืืืื ืืืืืข ื A.
ืคืืชืจืื ืืืง ืจืืฉืื
ืืืืจืชื ืืืื ืืืคืืกืื ืืกืงืืื ืืื ืฉืืขืืจื ืื ืืืชืืืื ืขื ืื ืืืงืกื ืฉื ืืืืื:
import scala.io.Source
import scala.util.matching.Regex
object aoc2023day19 {
val MAX_VALUE = 4000
case class Item(x: Long, m: Long, a: Long, s: Long)
case class CompressedConditions(minX: Long, maxX: Long,
minM: Long, maxM: Long,
minA: Long, maxA: Long,
minS: Long, maxS: Long)
case class Condition(first: String, comparator: String, second: Long)
case class Rule(condition: Condition, destination: String)
type Workflow = List[Rule]
type Workflows = Map[String, Workflow]
val demoWorkflowLine: String = "ex{x>10:one,m<20:two,a>30:R,A}"
val demoWorkflow: String = """px{a<2006:qkq,m>2090:A,rfg}
|pv{a>1716:R,A}
|lnx{m>1548:A,A}
|rfg{s<537:gd,x>2440:R,A}
|qs{s>3448:A,lnx}
|qkq{x<1416:A,crn}
|crn{x>2662:A,R}
|in{s<1351:px,qqz}
|qqz{s>2770:qs,m<1801:hdj,R}
|gd{a>3333:R,R}
|hdj{m>838:A,pv}
|
|{x=787,m=2655,a=1222,s=2876}
|{x=1679,m=44,a=2067,s=496}
|{x=2036,m=264,a=79,s=2244}
|{x=2461,m=1339,a=466,s=291}
|{x=2127,m=1623,a=2188,s=1013}""".stripMargin
ืืื ืืืฉืืชื ืืืชืื ืืช ืื ืืคืื ืงืฆืืืช ืฉืืคืขื ืืืช ืืช ืืงืื:
// condition - x>10
def parseCondition(condition: String): Condition =
val pattern: Regex = "([xmas])([<>])(\\d+)".r
condition match
case "" => Condition("x", "<=", MAX_VALUE)
case pattern(a, b, c) => Condition(a, b, c.toLong)
// rule - x>10:one
def parseRule(rule: String): Rule =
rule.split(":") match
case Array(destination) => Rule(parseCondition(""), destination)
case Array(condition, destination) => Rule(parseCondition(condition), destination)1 419
ืื ืืืคื ืืืืืฉ ืืงืฉื ืืงืจืืื
ืื ืืฉื ื ืื ืื ืื ื ืืืืจืื ืขื JavaScript, ืขื ืคืืืชืื, ืขื ืคืจื ืื ืขื ืจืืกื, ืืฉ ืืื ืืืคืืื ืื ืฉืืืืืื ืืืคืื ืืืืืฉ ืฉื ืืืืืจืืชื ืืงืฉื ืืืืืื ืืงืจืืื. ืื ืืื ืืืืื ืื ืจืืื ืืืืืฉืื ืฉื UUID7 ื 32 ืฉืคืืช ืืงืืฉืืจ ืืื:
https://antonz.org/uuidv7/
ืืื ื ืืฉืืชื ืฉืื ืืืืื ืืช ืืฆืืื ืช ืืืคืฉ ืืช ืืงืืฉื.
ืื ืื ืื ื ืืื ืื
ืืืื ื ืฉื UUID7 ืืืื 48 ืืืืื ืฉื ืชืืืืช ืืื, ืืืจื ืื 4 ืืืืื ืฉื ืืืจืกื (ืืงืืืข 7), ืืืจืืื 12 ืืืืื ืืงืจืืืื, ืฉื ื ืืืืื ืฉืื 10 - ืฉืืืื ืฉืื ืื ื ืืืืฆืืื ืืช ืืขืจื ืืืืจืืืช ืืชื ืืืืจืืืช ืืื 4 ืืืืื ืืืืืื ืืืืืช ืื ืืื ืืืขืจืืื 8, 9, a, b ืืื ืขืื 62 ืืืืื ืืงืจืืืื. ืื ื ืืกืืื ืื ืงืฆืช ืืกืืจืื ืืื ืื ืฉืืฉืื ืื ืืื ืืชืจืืืื ืืืชื ืืงืื.
ืื ืืืคื ืืช ืืืืืืฉ ืืงืฉื ืืงืจืืื
ืื ืื ืืฉื ื ืขื ืืืื ืฉืคืช ืชืื ืืช ืื ืื ื ืืืืจืื, ืืื ื ืืืืืฅ ืืื ืืืขืืฃ ืืื ืืื ืืืืืืฉืื ืืฆื ืื ืืื, ืืงืืฉื ืืงืจืืื ืืื ืชืืื ืืืืชื ืืงืืืืช.
ืืืชืืจ ืืจืืฉืื ืืื ืืขืชืงืช ืืืขืจื. ืฉืืื ืื ืืงืืข ืืื ื JavaScript:
* timestamp *
value[0] = (timestamp >> 40) & 0xFF
value[1] = (timestamp >> 32) & 0xFF
value[2] = (timestamp >> 24) & 0xFF
value[3] = (timestamp >> 16) & 0xFF
value[4] = (timestamp >> 8) & 0xFF
value[5] = timestamp & 0xFF
ืืื ืฉืืืืจ ืืช ืืืืคืจืืืจ >> ืืื ืืขืื ืืจืืืช ืืื ืฉืืขืชืืงืื ืื ืคืขื ืงืืข ืืืจ ืืชืื timestamp ื value, ืืื ืืืืช ืฉืื ืืช ืื ืืืืืง ืืื ืืืื ื ืืขืืืจืื ืืคืื ืงืฆืื ืขื ืฉื ืืื ArrayCopy ืืื ืืื ืืืชืจ ืงืจืื. ื ืฉืืื ืขื Java:
System.arraycopy(timestamp.array(), 2, value, 0, 6);
ืืคืืื ืืื ืืืืืจ Java ืืจืืจ ืฉืืืืจื ืฉื ืืฉืืจื ืืื ืืืขืชืืง ืืืจืื ืืืขืจื ืืื ืืืืจ, ืืืืืคื ืืืื ืืคืฉืจ ืืกืื ืฉืงืื ืฉื ืืชื ืฉืืืช ืืคืขืืืืช ืืืื ืืืชืจ ืงื ืืืื ื ืืงืื ืฉืคืฉืื ืืืชื ืืืชื.
ืืชืืจ ืฉื ื ืืื ืืฉืืืช ืฉื ืืคืื ืงืฆืืืช ืืืืื ืืช ืืฉืคื. ืืฉืืจื ืืืืช ื PHP ืืืืืฉื ืืช ืืกืืคืืจ:
// current timestamp in ms
$timestamp = intval(microtime(true) * 1000);
ืืงืื ืื ืืกืคืจ ืื ืืืืืื ืืืื ืฆืจืื ืืขืจื ืฉืชืกืืืจ ืฉืืืืืจ ืืืืื ืฉื ืืืช. ืื ื ืืฉืืื ืืช ืื ืืกื ืฉืืจืค:
long timestamp = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
ืืืจืืจ ืฉืืืืจืกืช ืืกื ืฉืืจืค ืืืขืจื ืืืืชืจืช.
ืขืื ืืื ืืืืชื ืกืื ืืื ืืฆืืจืช ืืขืจืืื ืืืงืจืืืื. ืืื ืื ื ืจืื ืืงืืืืื:
private val random = SecureRandom()
ืื Ruby:
value = SecureRandom.random_bytes(16).bytes
ืื Elixir:
value = :crypto.strong_rand_bytes(16) |> :binary.bin_to_list()
ืืขืืืช Julia:
value = rand(UInt8, 16)
ืื PHP:
$value = random_bytes(16);
ืื ืืคืืื go:
_, err := rand.Read(value[:])
ืฉืืื ืื ืืื ืืฉืืืฉืช ืืจืืฉืื ืื ืืจืืจ ืฉืืืืืจ ืืืกืคืจืื ืืงืจืืืื ืืืงืื ืืืชืืืืื ืืฉืืืืฉ ืืืืืืช ืืืืข ืจืง ืืคื ืืฉื ืฉื ืืคืื ืงืฆืื, ืืืฉืืืฉืช ืืืืจืื ืื ืืืืชื ื ืืืจ ืืืชืื ืืื ืงืื ืืื ืืืืืง ืืื ืคืขืืื ืืชืืขืื.
ืกืืคืืจ ืืืจืื ืืื ืฉืืืช ืืืฉืชื ืื ืื ืืืืฉืืื ืืื ืืื. ืืืืจ ืืื ืืืื ืืืื ืืงืืื'ืจ:
(concat
;; timestamp
(map byte (.toByteArray (biginteger (System/currentTimeMillis))))
;; version
[(bit-or (bit-and (first rand-array) 0x0F) 0x70)]
[(nth rand-array 1)]
;; variant
[(bit-or (bit-and (nth rand-array 2) 0x3F) 0x80)]
(drop 3 rand-array))))
ืื ืืืื ื ืืคืจืืืื ืืช ืืืืฉืื ืฉื ืื ืืื ืืืืืงืื ืืืืื let ืืชืืืืช ืืคืื ืงืฆืื ืืืื ื ืืงืืืื concat ืืืชืจ ืงืจืื ืืื ืืฆืืจื ืืืขืจืืช:
(concat
timestamp
version
rand_a
variant
rand_b)
ืกื ืืื ืงืจืืืช ืืืืืืฉ ืืื ื 32 ืฉืคืืช ืชืื ืืช ืจืง ืืืืืจื ืื ืฉืืืจื ืืงืื ืงืจืื ืื ืงืฉืืจื ืื ืื ืืชืืืืจ ืืฉืคื ืืื ืืืชืจ ืืืืคื ืื ืื ืื ื ืืฉืชืืฉืื ืื. ืืืืจืช ืฉืืืช ืืืืื, ืืืืงื ืืจืืจื ืืคืื ืงืฆืืืช ืืืคืจืื ืืจืืืช ืืืกืืจืงืฆืื ืชืืื ืืขืืจื ืื ื ืืื ืืช ืงืื ืฉืืืื ืงื ืืืชืจ ืืืืจืื ืืงืจืื.1 419
ืืืคืืฉ ืชืืื ืืช ื pixabay ืืชืื ืกืงืืื
ืืืืืช ChatGPT ืืงื ืื ืฉืืืฉ ืืงืืช ืืืคืื ืืช ืืชืืขืื ืฉื ื API ืฉื pixabay ืืืืืจืืช ืืืคืืกืื ืืกืงืืื, ืืคืืืช ืขืืืจ ืืชืฉืืืืช ืฉืืงืืืื ืื API. ืื ืืืจ ืฉืืคืืจ ืืฉืืขืืชื ืืขืืืช ืืืืื ืืคื ื ChatGPT ืืื ืืืืชื ืฆืจืื ืืื ืืช ืืื ืืช ืืืืจืืช ืืืืคืืกืื ืื ืืืืชืจ ืขื Type Safety. ืืื ืืฆืขืจื ืื ืขืืืื ืื ืืกืคืืง.
ืฉืชื ืืืขืืืช ืฉื ืฉืืจื ืื ืขื ืืชืืืช ืืืืจืืช ืืืืคืืกืื ืืื ืื:
1. ืื ืืืจืื ืืฉืชื ื ืืขืชืื ืื ื ืืฆืืจื ืืขืงืื ืืืจื ืืฉืื ืืืื ืืืขืืื ืืช ืืงืื.
2. ืืืื ืืืืืฆื ืืืืื, ืื ืืชื ืจืง ืืืืจืืช ืืืคืืกืื ืืืืจืื ืฉืืืืชื ืฆืจืื. ืืจืืืืช ืขืชืืืืืช ืืืจืืื ืืืชื ืืขืืืจ ืฉืื ืืชืืขืื ืืืจืขื ื ืืช ืืงืื.
ืืฆื ืืฉื ื ืฉื ืืกืืคืืจ ืืื ืฉืกืคืจืื ืืกืืืจืช ืืืืื ืืืืืช ืื ืืกืคืืง ืืชืืืืงืช, ืื ืฉืคืืฆ'ืจืื ืฉืืืื ืื ื API ืื ืืืื ืืืื ืื ืขืืืจ ืืงืื ืฉืื ื ืจืง ืืืื ืืืืืจื ืืืฉืชืืฉ ืืกืคืจืืืช ืฆื-ืฉืืืฉื ืืื ืืืฉืช ืืจื ืืืฉืง REST.
ืืื ืชืืื ืืื ืขืื ืื ื ืืืชื ืืกืงืืื ืืกืืืื ืฉืืืฉืื ืืืื ืื ืืกืคืจืื ืืกืืืจืช ืจืง ืืืจื ืขื ืื ืืื ืฉืขืืืจ. ืื ืืืงืจื ืืชื ืืืืขืื ืืคื ืืฆืจืืืื ืงืื ืกืงืืื ืืขืืืื ืขื ืคืืงืกืืืื ืืืืื ืื ืืืฉืชืืฉ ืืื ืืชืืจ ืืกืืก:
package dictionary.images
import com.typesafe.scalalogging.Logger
import common.ClaudeSyncClient.getClass
import io.circe.generic.auto.*
import io.circe.parser.*
import sttp.client3.*
import sttp.client3.circe.*
import sttp.model.Uri
import scala.util.chaining.*
case class ImageHit(id: Int,
pageURL: String,
\type\: String,
tags: String,
previewURL: String,
previewWidth: Int,
previewHeight: Int,
webformatURL: String,
webformatWidth: Int,
webformatHeight: Int,
largeImageURL: String,
imageWidth: Int,
imageHeight: Int,
imageSize: Int,
views: Int,
downloads: Int,
collections: Int,
likes: Int,
comments: Int,
user_id: Int,
user: String,
userImageURL: String)
case class ApiResponse(total: Int,
totalHits: Int,
hits: List[ImageHit])
object Pixabay {
private val API_KEY: String = System.getenv("PIXABAY_API_KEY")
val client: SimpleHttpClient = SimpleHttpClient()
val logger: Logger = Logger(getClass)
def searchImages(query: String): ApiResponse =
val queryParams = Map(
"key" -> API_KEY,
"q" -> query,
"image_type" -> "photo",
"page" -> "1"
)
val baseUrl = uri"https://pixabay.com/api/"
val uriWithParams: Uri = uri"$baseUrl?$queryParams"
println(uriWithParams)
basicRequest
.get(uriWithParams)
.response(asJson[ApiResponse])
.pipe(client.send)
.body match
case Right(response) => response
case Left(err) =>
logger.error("Pixabay error: ", err)
throw Exception(s"Error getting images from pixabay", err)
@main
def testImageSearchPixabay(): Unit =
val response = searchImages("raisin")
println(response.hits.head.previewURL)
}
ื .ื. ืืื ืืื ื ืกืืืืช ืฉื ืกืงืืื ืืงืกืืื ืฉื JSON ืฉืื ื ืื ืืกืคืืง ืืืื, ืืฉืืื ืฉืืงืื ืืขืืื ืืฉ ืฆืืจื ืืืืกืืฃ ืืช ืืฉืืจื ืืืื ื build.sbt. ืื ืืืฉืื ืืืงืืจืืื ืื ืืงืืจืืืช ืืืืขืื ืืกืคืจ ืื ืืืชืจ ืขื ืื ืืฉืื ืืฉืืืข ืืชืืืืืช:
scalacOptions ++= Seq("-Xmax-inlines", "100")1 419
ืืจืืืื ื ืฉื ืืืชื
ืืืืชื ืฆืจืื ืืจืืืช ืืช ืื ืื. ืืืืชื ืฆืจืื ืืืฉืื ืขื ืื ืืฉืืชืืชื ืืช ืืงืื. ืืื ืืืืช ืฉืืืืชื ืจืืข ืื ืืขืืืชื ืขื ืืขืชื ืื ืฉืืืื ืืืืืข. ืื ืืกืืคืืจ ืขื ืืจืืืื ืืจืืฉืข ืืขื ืืืฉืืืืช ืฉื ืื ืืืช ืืืฉืง ืื ืืืืื.
ืื ื ืืชืืื ืขื ืื ืืืช ืืจืฃ ืืืฉ ืืืืืจืื. ืืฉืคื ืืื ืกืงืืื:
import org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerTransactionGraph
import org.apache.tinkerpop.gremlin.process.traversal.AnonymousTraversalSource.traversal
import scala.jdk.CollectionConverters._
val graph = TinkerTransactionGraph.open
val g = traversal.withEmbedded(graph)
ืืื ืืืฆืจ ืืื ืคืจืืืื:
g.addV("item").next()
g.addV("item").next()
g.addV("item").next()
ืืื ืืืื ืืืืคืืก ืืช ืืืืืข ืขืืืื ืขื ืืฉืืืืชื:
scala> g.V().hasLabel("item").limit(2).elementMap().toList.asScala
val res21: scala.collection.mutable.Buffer[java.util.Map[Object, Object]] = Buffer({id=0, label=item}, {id=1, label=item})
ืขืืฉืื ืืืืง ืฉืืคืชืืข ืืืชื (ืืืจืืช ืฉืืืื ืฉื ื ืขื ืืงืื ืืืฉืื ืืืื ืขืืื). ื ื ืื ืฉืื ื ืจืืฆื ืืคืฆื ืืช ืืฉืืืืชื ืืฉื ื ืืืงืื, ืงืืื ืืงืืช ืืช ืื ื IDs ืฉื ืืฆืืชืื ืฉืืฆืจืชื ืืจืง ืืืจ ืื ืืืชืืื ืืขืืจ ืืืฉ ืขื ืืฆืืชืื ืืคื ื ID ืืืืืคืืก ืืช ืืืืืข. ืื ื ืืืื ืืืชืคืชืืช ืืืืชืื:
scala> val allItems = g.V().hasLabel("item").limit(2).toList.asScala.toList
val allItems: List[org.apache.tinkerpop.gremlin.structure.Vertex] = List(v[0], v[1])
scala> g.V(allItems: _*).elementMap().toList
val res22: java.util.List[java.util.Map[Object, Object]] = [{id=0, label=item}, {id=1, label=item}]
ืืื ืขืืื ืืืฉ ืืื! ืืื ืื ืฉืงืจ, ืื ื ืฉืื ืื ืื ืงืืจื ืื ืื ื ืื ืกื ืืฉื ืืช ืงืฆืช ืืช ืืฉืืืืชื ืืจืืฉืื ื ืืืืืืจ ืคืจืืืื ืฉืืื ื ืงืืืืื:
scala> val allItems = g.V().hasLabel("x").limit(2).toList.asScala.toList
val allItems: List[org.apache.tinkerpop.gremlin.structure.Vertex] = List()
scala> g.V(allItems: _*).elementMap().toList
val res23: java.util.List[java.util.Map[Object, Object]] = [{id=0, label=item}, {id=1, label=item}, {id=2, label=item}]
ืืฉืืืืชื ืืจืืฉืื ื ืืื ืืืื ื ืฉืืื ืคืจืืืื ืขื ืืชืืืืช x ืืืืืืจื ืจืฉืืื ืจืืงื, ืืื ืืคืงืืื ืืฉื ืืื ืืืคืขืืช ืขื ืจืฉืืื ืจืืงื ืฉืื ืืืืืง ืืื ืืืคืขืื g.V() ืืื ืคืจืืืจืื, ืฉืืืช ืคืงืืื ืฉืจืฆื ืขื ืื ืืฆืืชืื ืืืจืฃ, ืืืื ืื ื ืืงืื ืืช ืืืืืข ืขื ืื ืืฆืืชืื.
ืืืืงื ืืืกืืคืืจ - ืื ืืืฉืชืืฉ ื spread operator, ืื ืืคืืืช ืื ืืฉืชืืฉืื ืื ืชืืื ืืืืืง ืื ืงืืจื ืืฉืืจืฉืืื ืจืืงื.1 419
ืืืจ ืื
ืื ืืืชืจ ืืืืจ, ืฉืืืืชื ืืืช ืขื JOIN ืื ืืกืคืจ ืฉืืืืชืืช ืืืืืืจ ืื ืชืื ืื ืืืืืจืื?
ืื ืืืชืจ ืืืืจ, ืืืืืจ ืื ืงืืฆื ื JavaScript ืืงืืืฅ ืืื ืืจืื ืื ืฉืืืืช 50 ืคื ืืืช ืืฉืจืช ื 50 ืงืืฆืื ืฉืื ืื?
ืื ืืืชืจ ืืืืจ, ืืืกืคื ืื ืขืืืื?
ืืืจื ืืกืคืืง ืฉื ืื ืืชืขืฉืืื ืืฉ ืื ื ืขืืื ืฉืื ืฉื ืืืืข ืฉืืืืื ื ืืืจื ืืงืฉื. ืืืืข ืื ืื ืื ื ืฉืืืื ืืืฉืชืืฉ ืืคืจืืืงื ืืื ืืืงืืช ืืืืื ืืืืื, ืื ืืืจ ืฉืืืื ื ืืช "ืืืืจ" ืืืืืื ืฉืื.
ืืชืื ืชืื ืืืืื ืืืืจืื ืฉืืชืขืฉืืื ืฉืื ื ืื ืืืืืข ืฉื ืืื ืืขืื ืจื ืืืคื ืืืจ ืืืื ืืื ืจืืืื ืื. ืื ืฉืืฉืื ืืงืืช ืืืชื ื ืืคืจืืืงื ืืื ืืื ืชืืืื ืืืืืื, ืชืฉืืืช ืืื ืืคืจืืื ืืืืืืืช ืืฉืืื ืฉืืืืช ืืืืคืฉ ืชืฉืืืืช. ืื ืืืชื "ืืืืจ" ืฉืฉืืืื ื ืขื ืืืืืื ืืื ืืขืฆื ืืืืจ ืฉืื ืื ื ืฆืจืืืื ืืืืื.
1 419
ืืืืช JavaScript - ืืืจืืืช ืืืกืคืจ
ืื ืืืืืจ ืืงืื ืืื? ืืื?
['1', '2'].map(parseInt)
ืคืืชืจืื
ืืงืื ืืืืืจ ืืช ืืืขืจื:
[ 1, NaN ]
ืื ื ืืืื ืืื 1 ืืชื ืืจืืฉืื, ืืื ืืืืคื ืืืืข ื NaN? ืืืื parseFloat ืื ืขืืื ืฉื?
> parseInt(2)
2
> ['1', '2'].map(parseFloat)
[ 1, 2 ]
ืืกืืจ
ืืกืืคืืจ ืคืฉืื ืืื ืืืืืจ ืฉ JavaScript ืชืืื ืชืืฉืืจ JavaScript. ืืคืื ืงืฆืื parseInt ืืงืืืช ืืืขืฉื ืฉื ื ืคืจืืืจืื, ืคืจืืืจ ืจืืฉืื ืืื ืืืืจืืืช ืฉืฆืจืื ืืืคืื ืืืกืคืจ ืืคืจืืืจ ืฉื ื ืืื ืืกืืก ืืกืคืืจื. ืืฉืืจืืฆืื ืืืชื ืืชืื map ืืคืจืืืจ ืืจืืฉืื ืฉื ืฉืื ืืื ืืขืจื ืืืืขืจื ืืืฉื ื ืืื ืืืื ืืงืก ืฉืื, ืืื ืื ืฉืืืืช ื ืืกืื ื ืืืคืขืื ืฉื ืืื:
> parseInt('2', 1)
NaN
ืืื ืืืจ NaN ืื ืื ืืคืฉืจ ืืคืขื ื ืืช ืืืืจืืืช 2 ืืืกืคืจ ืืืกืืก 1. ืืืชื ืืืืช ืืืกืืจืช ืืคืืกืงื ืืืื ืืชืื ืืชืืขืื ืฉื parseInt:
> if it's nonzero and outside the range of 2, 36 after conversion, the function will always return NaN
ืืืื ืื ื ืจืื ืขื ืื ืืืขืจื ืฉื ืืกืืกื ืกืคืืจื ืขื 99:
> Array(100).fill(0).map((_, i) => \${i}\).map(parseInt)
[
0, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, 10, 12,
14, 16, 18, 20, 22, 24, 26, 28, 40, 43, 46, 49,
52, 55, 58, 61, 64, 67, 90, 94, 98, 102, 106, 110,
114, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN,
NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN,
NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN,
NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN,
NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN,
NaN, NaN, NaN, NaN
]
ืืื ืืืื parseFloat? ื ื, ืืื ืื ืืงืืืช ืคืจืืืจ ืฉื ื ืืืื ืืืืืจื ืชืืื ืืช ืืชืืฆืื ืื ืืื ื.
ื .ื. ืื ืืืืคืกืงืจืืคื ืื ืืชืืื ื ื ืขื ืงืื ืืื ืื ืฉืืคืขืืื ืืื ืชืืืืฃ ืืืื ื.1 419
ืืื ืืฉืื ื git diff?
ืืจื ืืืช ืืืฉืื ืขื ืขืืืื ืขื ืืื ืืื ืฉืื ืื ื ืขืืืืื ืขื ืืื ืื ืื ืื ืฉืืคืจืืืงื ืืืชืื. ืื ืืื ืืคืฉืจ ืืืืชื ืืขืื ืืช ืืงืืฆืื ืืืืื ืืจืืคืืืงืก, ืืื ืืืช ืื ืืืืจื ืฉืื. ืืื ืื ืืืื ืืช ืืขืืืื ืืืืจื.
ืืจื ืฉื ืืื ืืืฉืื ืขื ืืื ืืื ืฉืื ืื ื ืืฉืชืืฉืื ืืืื ืืื "ืืฉืืืจ" ืืืจืกืืืช. ืื ื ืืืืข ืื ืื ืืืจืกื ืืื ืคืขื ืฉืืฉ ืื ืืฉืื ืฉืขืืื ืื ื ืืืืฃ ืืืชื ืืฉืจืช ืื ืืชื ืื ืฉื. ืืืืืช ืืื ืื ื ืืืื ืืืคืืฃ ืืื ืื ืืืืจืกืืืช ืฉืืฆืจืชื ืืฉืืื ืืงืื ืจืขืืื ืืช, ืืืืืืจ ืื ืืืฆืื ืืช ืืืฆื ืืฉืคืชืืื ืืงืื ืืคืกืืง ืืขืืื.
ืืจื ืฉืืืฉืืช ืืืฉืื ืขื ืืื ืืื ืืชืืจ ืืื ืืชืงืฉืืจืช. ืื ืชืงืฉืืจืช ืืื ืืืฉืืื ืืื ืืื ืื ืฉืื - ืืื ืืืคืฉืจ ืืืืกืืฃ ืขืื ืจืื ืฉื ืืืืข ืขื ืืงืื, ืฉืืกืืืจื ืื ืจืง ืื ืืืืจ ืืื ืขืืฉื ืืื ืื ืืื ืื ืขืืฉื ืืช ืื ืฉืื ืขืืฉื. ืืืืคื ืื ืืืืข, ืืื ืืืืืชื ืืืืืจ ืืืืงื ืืฉืืื ืืืืช, ืืืฉืืืจ ืืช ืืืืืข ืืื ืืื ืืงืื ืืฆืืจื ืืกืืืืช ืืื ืื ืืชืืื.
ืืฉืื ืฉืื ืืืชืืื ืืืืืขืช ืืงืืืื Push Daily Work ืื ืื ืืกืคืจืื ืื ื ืื ืื ืขืฉื ืืื ืืื ืื ืืืฉืืื ืขื ืืื. ืืื ืื ืื ื ืจืืฆืื ืืงืื ืืืชืจ ืคืืจืื ืืืื ืงืืื ืื ืืืืจ ืืืืกืืื ืขื ืืชืคืงืื ืฉื ืืื ืืชืืืื ืืคืืชืื ืืฆืื ื ืืืืจื.
1 419
ืื ืืคื ื ืืื
ืื ืืืชืื ืช ืืื ืืื ืืขืืื ืื ืืฆืืื ืืืชืงืื ืืื ืืืขืช ืืื. ืื ืื ืจืื ื ืืื ืืื ืชืืื ืืื ืืืืืื ืืคืืชืื ืชืืื ื - ืืฉืื ืื ื ืฆืจืืืื ืื ืืืื ืืืืืจ ืืื ืฉืืืืช ืขืืืื ืืื ืืืืจื ืืืืขื ืขื ืืฉืืขืืืืช ืืืฉืคืขื ืขื ืขืชืื ืืืขืจืืช.
ืืฉืืื ืืืืฉื ืืืฉื ืืื ืืืช ืืืจื ืืคืืชืื ืชืืื ื ื ืจืฆื ืืืืฆืจ ืฉื ื ืื ืื ืื ืื: ืื ืื ืื ืืื ืฉืขืืืจ ืื ื ืืืืื ืืืื ืคืืฆ'ืจืื ืืคืชื ืืืืืื ืืืื ืืืฉืชืืฉ, ืืื ืื ืื ืืงืจื ืฉืขืืืจ ืื ื ืืืืื ืืืคื ืฆืืงื ื ืืืืคื ืืขืื ื ืืื ืฉื ืืื ืืงืื ืืืืืืช ืืืืืช ืืืชืจ ืคืขื ืืืื.
ืืื ืื ืื ืืจืืฉืื ืืืืชื ืืืกืืฃ ืืื ืืจืืฉื ืืืฆืจืืช (ืืื ืื ืืืืขื ื Product ืืืื ืืจืืฉื ืคื ืืืืช ืืืคืืชืื):
1. ืื ืฆืจืื ืืช ืืคืืฆ'ืจ ืืื?
2. ืื ืืืขืื ืฉืืคืืฆ'ืจ ืืืืจ ืืคืชืืจ ืืืืชื ืืงืื?
3. ืื ืืืชื ืืงืื ืขืืฉื ืืืื?
4. ืืื ืืคืืฆ'ืจ ืืฉื ื ืืช ื Workflow ืฉื ืืืงืื?
5. ืืืื ืคืืฆ'ืจืื ืืืจืื ืขืฉืืืื ืืืฉืคืืข ืขื ืืืชื ืืขืื?
ืืื ืื ืื ืืฉื ื ืืืืชื ืืืกืืฃ ืืชืืืื ืืขืืืื ืคืขื ืืืฆื ืฉื ื ืคืืืฉื ืืกืืืจืช ืื ืขืืืจืื ืขื ืืคืืฆ'ืจืื ืฉืคืืชืื ื ืืืืขืืืช ืฉืคืชืจื ื, ืืืืืืื ืฉืืคืืฆ'ืจืื ืฉืื ืื ื ืืืืช ืคืืชืจืื ืืืงืืืืช ืืช ืืืขืืืช ืฉืื ืืืืจืื ืืคืชืืจ ืืื ืื ืื ืกืื ืืืืื ืืืคื ืืื ืืืขืืืืช ืืื ืืคืฉืจ ืืขืฉืืช ืืื ืืืชืจ ืืขืชืื.
ืืืื ื ืืงื ืืืืื ืงืฆืจื ืื ืืกืืคืืจ ืืื ืืฉืื. ื ื ืื ืฉืื ื ืืื ื ืืขืจืืช ืืืืืกืื ืชืืื ืืช ืืื ื ืืืื ืฉืืฉืชืืฉืื ืืืขืืช ืืืืงืื ืืขืฆืื ืชืืื ืืช ืืฉืืืืช ืืื ืืชืงืฉืจืื ืืชืืืื ืืื ืฉืืฉืืืจื ืืื ืืช ืืชืืื ืืช. ืื ื ืืืื ืืงืื ืจืขืืื ืืื ืืช ืื ืื ืื ืฉื "ืกื ืืืืืืจ", ืื ืื ืชืืื ื ืฉื ืืืงืช ืชืขืืืจ ืืกื ืืืืืืืจ ืืจืง ืืืจื 30 ืืืื ืฉื ืืื ืชืืืืง ืกืืคืืช ืืืืขืจืืช ืืื ืืืฉืชืืฉืื ืชืืื ืืืืื ืืช ืืืืืืจ ืืช ืืชืืื ื. ืืฉืื ื ืืืจืจ ืืช ื"ืื" ืืคื ื ื"ืืื" ืื ื ืงืืื ืื ืื ืกื ืืืืื ืืื ืื ืฉืื ืคื ื ืืชืืืื ืืฉืืื ืฉืืืืืจื ืืื ืืช ืืชืืื ืืช ืฉืืืขืืช ื ืืืงื? ืื ืืื ืฉืื ืืืื? ืืื ืื ืืฉืชืืฉืื ืืืฉืื ืืืขืจืืช ืื ืืืชืืงืื? ืืื ืืฉืชืืฉืื ืืชืืื ืืช ืืืื ืืืช ืื ืืงืืืืช ืืฉืืืื? ืืื ืืฉ ืืืจ ืืืืื ืืชืืื ืืช? ืืื ืืื ืื ืื ืื ืฉืืืคืฉืจ ืืื ืืฉืืืจ ืชืืื ืืช ืืืืืื? ืืื ืืื ืืืจื ืฉืืชืืื ืืช ื ืืืงื ืื ืคื ื ืืชืืืื? ืืื ืื ืืืชื ืืฉืชืืฉืื ืฉืคืื ืื ืื ืื ืคืขื ืืฉืชืืฉืื ืืืจืื? ืืื ืืคืฉืจ ืืืืจ ืืืชื?
ืืื ืฉืืฉ ืื ืืืชืจ ืงืื ืืงืกื ืื ื ืืืื ืืื ืืช ืืขืจืืช ืฉืืืชืจ ืชืชืืื ืืืขืื ืืกืคืฆืืคืืช ืืืืืื ืืื ืืื ืืืื ืืฉืืืจ ืชืืื ืืช ืืืืชื ืกื ืืืืืืจ, ืืืื ืกืื ืืื ืืืงืฆืื ืืืฆืื ืืืฉืชืืฉืื ืืืื ืกื ืืืืืืืจ, ืืื ืืชืงืฉืจ ืืช ืืืืกืื ืืื ืกื ืืืืืืืจ ืืืืืื ืืฉืืืฃ ืืื ืืืืื ืืืจืช ืฉื ืฆืืจื ืืงืื ืืืืจื ืืืจื.
ืฆืจืื ืืืืื ืื ืฉืืฉ ืขืืืช ืืื ืคืืฆ'ืจ. ืืืืืื ืฉื ืกื ืืืืืืืจ ืืืื ืืฉืชืืฉืื ืืฆืคืื ืฉืืชืืื ื ืืืืช ืชืืืืง ืืฉืื ืืืืงืื ืืืชื ืืืืขืจืืช ืืืืื ืื ืืืคืชืขื ืืจืขื ืื ืืื ืืื ืืคืจืฆื ืื ืืฉืจืชืื ืืืงืื ืืช ืื ืืชืืื ืืช ืฉืืืืืื "ื ืืืงื". ืืจืืจ ืฉืืฉ ืคื ืฉืืื ืืืฆืจืืช ืืื ืื ืืคืฉืจ ืื ืชืง ืืืชื ืืืืืื ืืืื ื ืฉื ืืคืืชืื.
ืืื ืฉืืืจื ื ื AI ืืืื ืืขืืืจ ืืืชืจ ืืืชืืืช ืงืื, ืื ืืืืืืช ืืืกืชืื ืขื ื"ืื" ืืคื ื ื"ืืื" ืืืคืืช ืืืืืช ืืืง ืืืชื ื ืคืจื ืืืขืืืื ืฉืื ื.
Endi mavjud! Telegram Tadqiqoti 2025 โ yilning asosiy insaytlari 
