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 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"))

}
ืื ื™ืฉ ืœื›ื ืจืขื™ื•ื ื•ืช ืื™ืš ืœื›ืชื•ื‘ ืืช ื–ื” ื‘ืกืงืืœื” ืขื ืคื—ื•ืช ื—ื–ืจืชื™ื•ืช ืืœ ืชืชื‘ื™ื™ืฉื• ืœืฉืชืฃ ื‘ืชื’ื•ื‘ื•ืช ืื• ื‘ื˜ืœื’ืจื.

ToCode
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" =>

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

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

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

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

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

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

ToCode
1 419
ื›ื‘ืจ ืœื ืžื” ื™ื•ืชืจ ืžื”ื™ืจ, ืฉืื™ืœืชื” ืื—ืช ืขื JOIN ืื• ืžืกืคืจ ืฉืื™ืœืชื•ืช ื•ื—ื™ื‘ื•ืจ ื”ื ืชื•ื ื™ื ื‘ื–ื™ื›ืจื•ืŸ? ืžื” ื™ื•ืชืจ ืžื”ื™ืจ, ื—ื™ื‘ื•ืจ ื›ืœ ืงื‘ืฆื™ ื” JavaScript ืœืงื•ื‘ืฅ ืื—ื“ ืืจื•ืš ืื• ืฉืœื™ื—ืช 50 ืคื ื™ื•ืช ืœืฉืจืช ืœ 50 ืงื‘ืฆื™ื ืฉื•ื ื™ื? ืžื” ื™ื•ืชืจ ืžื”ื™ืจ, ื”ื•ืกืคื” ืื• ืขื“ื›ื•ืŸ? ืื—ืจื™ ืžืกืคื™ืง ืฉื ื™ื ื‘ืชืขืฉื™ื™ื” ื™ืฉ ืœื ื• ืขื•ืœื ืฉืœื ืฉืœ ืžื™ื“ืข ืฉื’ื™ืœื™ื ื• ื‘ื“ืจืš ื”ืงืฉื”. ืžื™ื“ืข ื‘ื• ืื ื—ื ื• ืฉืžื—ื™ื ืœื”ืฉืชืžืฉ ืœืคืจื•ื™ืงื˜ ื”ื‘ื ื•ืœืงื—ืช ื›ืžื•ื‘ืŸ ืžืืœื™ื•, ื›ื™ ื›ื‘ืจ ืฉื™ืœืžื ื• ืืช "ืžื—ื™ืจ" ื”ืœืžื™ื“ื” ืฉืœื•. ืžืชื›ื ืชื™ื ื˜ื•ื‘ื™ื ื–ื•ื›ืจื™ื ืฉื‘ืชืขืฉื™ื™ื” ืฉืœื ื• ื›ืœ ื”ืžื™ื“ืข ืฉื ืœืžื“ ื‘ืขืžืœ ืจื‘ ื”ื•ืคืš ืžื”ืจ ืžืื•ื“ ืœืœื ืจืœื•ื•ื ื˜ื™. ืžื” ืฉื—ืฉื•ื‘ ืœืงื—ืช ืื™ืชื ื• ืœืคืจื•ื™ืงื˜ ื”ื‘ื ื”ื•ื ืชื”ืœื™ืš ื”ื’ื™ืœื•ื™, ืชืฉื•ืžืช ื”ืœื‘ ืœืคืจื˜ื™ื ื•ื”ื™ื›ื•ืœืช ืœืฉืื•ืœ ืฉืืœื•ืช ื•ืœื—ืคืฉ ืชืฉื•ื‘ื•ืช. ื›ืŸ ืื•ืชื• "ืžื—ื™ืจ" ืฉืฉื™ืœืžื ื• ืขืœ ื”ืœืžื™ื“ื” ื”ื•ื ื‘ืขืฆื ื”ื“ื‘ืจ ืฉืื ื—ื ื• ืฆืจื™ื›ื™ื ืœืœืžื•ื“.

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

ToCode
1 419
ืœืžื™ ื—ืฉื•ื‘ ื” git diff? ื“ืจืš ืื—ืช ืœื—ืฉื•ื‘ ืขืœ ืขื‘ื•ื“ื” ืขื ื’ื™ื˜ ื”ื™ื ืฉืื ื—ื ื• ืขื•ื‘ื“ื™ื ืขื ื’ื™ื˜ ื›ื™ ื–ื” ืžื” ืฉื”ืคืจื•ื™ืงื˜ ืžื›ืชื™ื‘. ืื ื”ื™ื” ืืคืฉืจ ื”ื™ื™ืชื™ ืžืขืœื” ืืช ื”ืงื‘ืฆื™ื ืœืื™ื–ื” ื“ืจื•ืคื‘ื•ืงืก, ืื‘ืœ ื–ืืช ืœื ื‘ื—ื™ืจื” ืฉืœื™. ื›ื›ื” ืžื ื”ืœื™ื ืืช ื”ืขื‘ื•ื“ื” ื‘ื—ื‘ืจื”. ื“ืจืš ืฉื ื™ื™ื” ืœื—ืฉื•ื‘ ืขืœ ื’ื™ื˜ ื”ื™ื ืฉืื ื—ื ื• ืžืฉืชืžืฉื™ื ื‘ื’ื™ื˜ ื›ื“ื™ "ืœืฉืžื•ืจ" ื’ื™ืจืกืื•ืช. ืื ื™ ื™ื•ื“ืข ืžื” ื–ื” ื’ื™ืจืกื” ื•ื›ืœ ืคืขื ืฉื™ืฉ ืœื™ ืžืฉื”ื• ืฉืขื•ื‘ื“ ืื ื™ ื“ื•ื—ืฃ ืื•ืชื• ืœืฉืจืช ื•ื ื•ืชืŸ ืœื• ืฉื. ื‘ื–ื›ื•ืช ื’ื™ื˜ ืื ื™ ื™ื›ื•ืœ ืœื“ืคื“ืฃ ื‘ื™ืŸ ื›ืœ ื”ื’ื™ืจืกืื•ืช ืฉื™ืฆืจืชื™ ื‘ืฉื‘ื™ืœ ืœืงื‘ืœ ืจืขื™ื•ื ื•ืช, ืœื”ื™ื–ื›ืจ ืื• ืœื”ืฆื™ืœ ืืช ื”ืžืฆื‘ ื›ืฉืคืชืื•ื ื”ืงื•ื“ ืžืคืกื™ืง ืœืขื‘ื•ื“. ื“ืจืš ืฉืœื™ืฉื™ืช ืœื—ืฉื•ื‘ ืขืœ ื’ื™ื˜ ื”ื™ื ื‘ืชื•ืจ ื›ืœื™ ืœืชืงืฉื•ืจืช. ืœื ืชืงืฉื•ืจืช ื‘ื™ืŸ ืžื—ืฉื‘ื™ื ืืœื ื‘ื™ืŸ ืื ืฉื™ื - ื’ื™ื˜ ืžืืคืฉืจ ืœื”ื•ืกื™ืฃ ืขื•ื“ ืจืžื” ืฉืœ ืžื™ื“ืข ืขืœ ื”ืงื•ื“, ืฉืžืกื‘ื™ืจื” ืœื ืจืง ืžื” ื”ื“ื‘ืจ ื”ื–ื” ืขื•ืฉื” ืืœื ื’ื ืœืžื” ื–ื” ืขื•ืฉื” ืืช ืžื” ืฉื–ื” ืขื•ืฉื”. ืžืื™ืคื” ื–ื” ื”ื’ื™ืข, ืื™ืš ื”ื—ืœื˜ืชื™ ืœื‘ื—ื•ืจ ื“ื•ื•ืงื ื‘ืฉื™ื˜ื” ื”ื–ืืช, ื•ืœืฉืžื•ืจ ืืช ื”ืžื™ื“ืข ื”ื–ื” ืœื™ื“ ื”ืงื•ื“ ื‘ืฆื•ืจื” ืžืกื•ื™ืžืช ืื‘ืœ ืœื ื‘ืชื•ื›ื•. ื›ืฉืื ืฉื™ื ื›ื•ืชื‘ื™ื ื‘ื”ื•ื“ืขืช ื”ืงื•ืžื™ื˜ Push Daily Work ื”ื ืœื ืžืกืคืจื™ื ืœื ื• ืžื” ื”ื ืขืฉื• ืืœื ืื™ืš ื”ื ื—ื•ืฉื‘ื™ื ืขืœ ื’ื™ื˜. ื•ืื ืื ื—ื ื• ืจื•ืฆื™ื ืœืงื‘ืœ ื™ื•ืชืจ ืคื™ืจื•ื˜ ื›ื“ืื™ ืงื•ื“ื ื›ืœ ืœื“ื‘ืจ ื•ืœื”ืกื›ื™ื ืขืœ ื”ืชืคืงื™ื“ ืฉืœ ื’ื™ื˜ ื‘ืชื”ืœื™ืš ื”ืคื™ืชื•ื— ืืฆืœื ื• ื‘ื—ื‘ืจื”.

ToCode
1 419
ืžื” ืœืคื ื™ ืื™ืš ื’ื ื”ืžืชื›ื ืช ื”ื›ื™ ื˜ื•ื‘ ื‘ืขื•ืœื ืœื ื™ืฆืœื™ื— ืœื”ืชืงื“ื ื‘ืœื™ ืœื“ืขืช ืœืืŸ. ื–ื” ื›ื ืจืื” ื ื›ื•ืŸ ื‘ื›ืœ ืชื—ื•ื ืื‘ืœ ื‘ืžื™ื•ื—ื“ ื‘ืคื™ืชื•ื— ืชื•ื›ื ื” - ื›ืฉืื ื—ื ื• ืฆืจื™ื›ื™ื ื›ืœ ื”ื–ืžืŸ ืœื‘ื—ื•ืจ ื‘ื™ืŸ ืฉื™ื˜ื•ืช ืขื‘ื•ื“ื” ื•ื›ืœ ื‘ื—ื™ืจื” ืžื’ื™ืขื” ืขื ืžืฉืžืขื•ื™ื•ืช ื•ื”ืฉืคืขื” ืขืœ ืขืชื™ื“ ื”ืžืขืจื›ืช. ื‘ืฉื‘ื™ืœ ืœื™ื™ืฉื ื’ื™ืฉื” ืžื•ื ื—ื™ืช ืžื˜ืจื” ืœืคื™ืชื•ื— ืชื•ื›ื ื” ื ืจืฆื” ืœื™ื™ืฆืจ ืฉื ื™ ืžื ื’ื ื•ื ื™ื: ืžื ื’ื ื•ืŸ ืื—ื“ ืฉืขื•ื–ืจ ืœื ื• ืœื”ื‘ื™ืŸ ืื™ื–ื” ืคื™ืฆ'ืจื™ื ืœืคืชื— ื•ื‘ืื™ื–ื” ื›ืœื™ื ืœื”ืฉืชืžืฉ, ื•ืžื ื’ื ื•ืŸ ื‘ืงืจื” ืฉืขื•ื–ืจ ืœื ื• ืœื”ื‘ื™ืŸ ืื™ืคื” ืฆื“ืงื ื• ื•ืื™ืคื” ื˜ืขื™ื ื• ื›ื“ื™ ืฉื ื•ื›ืœ ืœืงื‘ืœ ื”ื—ืœื˜ื•ืช ื˜ื•ื‘ื•ืช ื™ื•ืชืจ ืคืขื ื”ื‘ืื”. ื‘ืžื ื’ื ื•ืŸ ื”ืจืืฉื•ืŸ ื”ื™ื™ืชื™ ืžื•ืกื™ืฃ ืœื›ืœ ื“ืจื™ืฉื” ืžื•ืฆืจื™ืช (ื‘ื™ืŸ ืื ื”ื’ื™ืขื” ืž Product ื•ื‘ื™ืŸ ื“ืจื™ืฉื” ืคื ื™ืžื™ืช ืžื”ืคื™ืชื•ื—): 1. ืžื™ ืฆืจื™ืš ืืช ื”ืคื™ืฆ'ืจ ื”ื–ื”? 2. ืžื” ื”ื‘ืขื™ื” ืฉื”ืคื™ืฆ'ืจ ืืžื•ืจ ืœืคืชื•ืจ ืœืื•ืชื• ืœืงื•ื—? 3. ืžื” ืื•ืชื• ืœืงื•ื— ืขื•ืฉื” ื”ื™ื•ื? 4. ืื™ืš ื”ืคื™ืฆ'ืจ ื™ืฉื ื” ืืช ื” Workflow ืฉืœ ื”ืœืงื•ื—? 5. ืื™ื–ื” ืคื™ืฆ'ืจื™ื ืื—ืจื™ื ืขืฉื•ื™ื™ื ืœื”ืฉืคื™ืข ืขืœ ืื•ืชื” ื‘ืขื™ื”? ื‘ืžื ื’ื ื•ืŸ ื”ืฉื ื™ ื”ื™ื™ืชื™ ืžื•ืกื™ืฃ ืœืชื”ืœื™ืš ื”ืขื‘ื•ื“ื” ืคืขื ื‘ื—ืฆื™ ืฉื ื” ืคื’ื™ืฉื” ืžืกื•ื“ืจืช ื‘ื” ืขื•ื‘ืจื™ื ืขืœ ื”ืคื™ืฆ'ืจื™ื ืฉืคื™ืชื—ื ื• ื•ื”ื‘ืขื™ื•ืช ืฉืคืชืจื ื•, ืžื•ื•ื“ืื™ื ืฉื”ืคื™ืฆ'ืจื™ื ืฉื‘ื ื™ื ื• ื‘ืืžืช ืคื•ืชืจื™ื ืœืœืงื•ื—ื•ืช ืืช ื”ื‘ืขื™ื•ืช ืฉื”ื ืืžื•ืจื™ื ืœืคืชื•ืจ ื•ืื ืœื ืžื ืกื™ื ืœื”ื‘ื™ืŸ ืื™ืคื” ื”ื™ื• ื”ื˜ืขื•ื™ื•ืช ื•ืžื” ืืคืฉืจ ืœืขืฉื•ืช ื˜ื•ื‘ ื™ื•ืชืจ ื‘ืขืชื™ื“. ื‘ื•ืื• ื ื™ืงื— ื“ื•ื’ืžื” ืงืฆืจื” ื›ื™ ื”ืกื™ืคื•ืจ ื”ื–ื” ื—ืฉื•ื‘. ื ื ื™ื— ืฉืื ื™ ื‘ื•ื ื” ืžืขืจื›ืช ืœืื™ื—ืกื•ืŸ ืชืžื•ื ื•ืช ื•ืื ื™ ืžื–ื”ื” ืฉืžืฉืชืžืฉื™ื ื‘ื˜ืขื•ืช ืžื•ื—ืงื™ื ืœืขืฆืžื ืชืžื•ื ื•ืช ื—ืฉื•ื‘ื•ืช ื•ืื– ืžืชืงืฉืจื™ื ืœืชืžื™ื›ื” ื›ื“ื™ ืฉื™ืฉื—ื–ืจื• ืœื”ื ืืช ื”ืชืžื•ื ื•ืช. ืื ื™ ื™ื›ื•ืœ ืœืงื‘ืœ ืจืขื™ื•ืŸ ืœื‘ื ื•ืช ืžื ื’ื ื•ืŸ ืฉืœ "ืกืœ ืžื™ื—ื–ื•ืจ", ื‘ื• ื›ืœ ืชืžื•ื ื” ืฉื ืžื—ืงืช ืชืขื‘ื•ืจ ืœืกืœ ื”ืžื™ื—ื–ื•ืจ ื•ืจืง ืื—ืจื™ 30 ื™ืžื™ื ืฉื ื”ื™ื ืชื™ืžื—ืง ืกื•ืคื™ืช ืžื”ืžืขืจื›ืช ื•ื›ืš ืœืžืฉืชืžืฉื™ื ืชื”ื™ื” ื”ื–ื“ืžื ื•ืช ืœื”ื—ื–ื™ืจ ืืช ื”ืชืžื•ื ื”. ื›ืฉืื ื™ ืžื‘ืจืจ ืืช ื”"ืžื”" ืœืคื ื™ ื”"ืื™ืš" ืื ื™ ืงื•ื“ื ื›ืœ ืžื ืกื” ืœื”ื‘ื™ืŸ ื›ืžื” ืื ืฉื™ื ืคื ื• ืœืชืžื™ื›ื” ื‘ืฉื‘ื™ืœ ืฉื™ื—ื–ื™ืจื• ืœื”ื ืืช ื”ืชืžื•ื ื•ืช ืฉื‘ื˜ืขื•ืช ื ืžื—ืงื•? ืžื™ ื”ืื ืฉื™ื ื”ืืœื”? ื”ืื ื”ื ืžืฉืชืžืฉื™ื ื—ื“ืฉื™ื ื‘ืžืขืจื›ืช ืื• ื•ื•ืชื™ืงื™ื? ื”ืื ืžืฉืชืžืฉื™ื ื‘ืชื•ื›ื ื™ืช ื”ื—ื™ื ืžื™ืช ืื• ืœืงื•ื—ื•ืช ืžืฉืœืžื™ื? ื”ืื ื™ืฉ ื›ื‘ืจ ื’ื™ื‘ื•ื™ ืœืชืžื•ื ื•ืช? ืœืžื” ืื™ืŸ ืžื ื’ื ื•ืŸ ืฉืžืืคืฉืจ ืœื”ื ืœืฉื—ื–ืจ ืชืžื•ื ื•ืช ืžื’ื™ื‘ื•ื™? ื›ืžื” ื–ืžืŸ ืื—ืจื™ ืฉื”ืชืžื•ื ื•ืช ื ืžื—ืงื• ื”ื ืคื ื• ืœืชืžื™ื›ื”? ื”ืื ื–ื” ืื•ืชื ืžืฉืชืžืฉื™ื ืฉืคื•ื ื™ื ืื• ื›ืœ ืคืขื ืžืฉืชืžืฉื™ื ืื—ืจื™ื? ื”ืื ืืคืฉืจ ืœื“ื‘ืจ ืื™ืชื? ื›ื›ืœ ืฉื™ืฉ ืœื™ ื™ื•ืชืจ ืงื•ื ื˜ืงืกื˜ ืื ื™ ื™ื›ื•ืœ ืœื‘ื ื•ืช ืžืขืจื›ืช ืฉื™ื•ืชืจ ืชืชืื™ื ืœื‘ืขื™ื” ื”ืกืคืฆื™ืคื™ืช ื•ืœื”ื‘ื™ืŸ ื›ืžื” ื–ืžืŸ ื›ื“ืื™ ืœืฉืžื•ืจ ืชืžื•ื ื•ืช ื‘ืื•ืชื• ืกืœ ืžื™ื—ื–ื•ืจ, ืื™ื–ื” ืกื•ื’ ืื™ื ื“ื™ืงืฆื™ื” ืœื”ืฆื™ื’ ืœืžืฉืชืžืฉื™ื ืœื’ื‘ื™ ืกืœ ื”ืžื™ื—ื–ื•ืจ, ืื™ืš ืœืชืงืฉืจ ืืช ื”ื™ื—ืกื™ื ื‘ื™ืŸ ืกืœ ื”ืžื™ื—ื–ื•ืจ ืœื’ื™ื‘ื•ื™ ื”ืฉื•ื˜ืฃ ื•ื›ืœ ื”ื—ืœื˜ื” ืื—ืจืช ืฉื ืฆื˜ืจืš ืœืงื‘ืœ ืœืื•ืจืš ื”ื“ืจืš. ืฆืจื™ืš ืœื”ื‘ื™ืŸ ื’ื ืฉื™ืฉ ืขืœื•ืช ืœื›ืœ ืคื™ืฆ'ืจ. ื‘ื“ื•ื’ืžื” ืฉืœ ืกืœ ื”ืžื™ื—ื–ื•ืจ ืื•ืœื™ ืžืฉืชืžืฉื™ื ืžืฆืคื™ื ืฉื”ืชืžื•ื ื” ื‘ืืžืช ืชื™ืžื—ืง ื›ืฉื”ื ืžื•ื—ืงื™ื ืื•ืชื” ืžื”ืžืขืจื›ืช ื•ืื•ืœื™ ื”ื ื™ื•ืคืชืขื• ืœืจืขื” ืื ื™ื•ื ืื—ื“ ื™ืคืจืฆื• ืœื™ ืœืฉืจืชื™ื ื•ื™ืงื—ื• ืืช ื›ืœ ื”ืชืžื•ื ื•ืช ืฉื›ื‘ื™ื›ื•ืœ "ื ืžื—ืงื•". ื‘ืจื•ืจ ืฉื™ืฉ ืคื” ืฉืืœื” ืžื•ืฆืจื™ืช ืื‘ืœ ืื™ ืืคืฉืจ ืœื ืชืง ืื•ืชื” ืžื”ื”ื™ื‘ื˜ ื”ื˜ื›ื ื™ ืฉืœ ื”ืคื™ืชื•ื—. ื›ื›ืœ ืฉื—ื‘ืจื ื• ื” AI ื”ื•ืœืš ืœืขื–ื•ืจ ื™ื•ืชืจ ื‘ื›ืชื™ื‘ืช ืงื•ื“, ื›ืš ื”ื™ื›ื•ืœืช ืœื”ืกืชื›ืœ ืขืœ ื”"ืžื”" ืœืคื ื™ ื”"ืื™ืš" ื”ื•ืคื›ืช ืœื”ื™ื•ืช ื—ืœืง ื‘ืœืชื™ ื ืคืจื“ ืžื”ืขื‘ื•ื“ื” ืฉืœื ื•.