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

ToCode
1 419
}
      }

    def helper(modules: Map[String, CommunicationModule]): Map[String, CommunicationModule] =
      this.pressButton()
      process(modules)

    def findCycleSize(modules: Map[String, CommunicationModule], end: String): Long =
      val relevantModules = influencedBy(modules, inputs, Set(end))

      val data = LazyList.iterate(modules)(helper).map { modules =>
        modules.view.filterKeys(relevantModules.contains).toMap
      }
      findCycleIndex(data)

    @tailrec
    final def process(modules: Map[String, CommunicationModule]): Map[String, CommunicationModule] =
      if (this.pendingSignals.nonEmpty) {
        val updatedModules = handleSignals(modules)
        this.process(updatedModules)
      } else {
        modules
      }
  }

  sealed trait CommunicationModule {
    def name: String
  }

  case class FlipFlop(name: String, state: Boolean) extends CommunicationModule
  case class Conjunction(name: String, state: Map[String, Int]) extends CommunicationModule
  case class Broadcaster(name: String) extends CommunicationModule
  case class UntypedModule(name: String) extends CommunicationModule

  def parseInput(input: Source): (Map[String, CommunicationModule], Map[String, List[String]], Map[String, List[String]]) =

    input
      .getLines()
      .concat(List("button -> broadcaster"))
      .map { line => line.split(" -> ") }
      .collect { case Array(name, outputs) =>
        val outputModules = outputs.split(", ").toList
        val module = name match
          case "broadcaster" => Broadcaster(name)
          case s"%${name}" => FlipFlop(name, false)
          case s"&${name}" => Conjunction(name, Map[String, Int]())
          case s"${name}" => UntypedModule(name)
        (module, outputModules)

      }.foldLeft((
        Map[String, CommunicationModule](),
        Map[String, List[String]](),
        Map[String, List[String]]())) { (a, v) =>
        val (modules, inputs, outputs) = a
        val (newModule, itsOutputs) = v
        val newName = newModule.name

        val updatedInputs = itsOutputs.foldLeft(inputs) { (inputs, output) =>
          inputs.updatedWith(output) {
            case Some(existingInputs) => Some(existingInputs :+ newName)
            case None => Some(List(newName))
          }
        }

        val updatedOutputs = outputs.updatedWith(newName) {
          case Some(existingOutputs) => Some(existingOutputs ++ itsOutputs) // unreachable, because there's only one line per module
          case None => Some(itsOutputs)
        }

        val updatedModules = modules.updated(newName, newModule)

        (updatedModules, updatedInputs, updatedOutputs)
      }

  @main
  def day20part1(): Unit =
    val (modules, inputs, outputs) = parseInput(Source.fromResource("day20.txt"))
    println(modules)
    println(inputs)
    println(outputs)
    val runner = Runner(inputs, outputs)
    var round = 0L
    var modules_i = modules

    1.to(1000).foreach { i =>
      runner.pressButton()
      modules_i = runner.process(modules_i)
    }

    println(runner.lowCount)
    println(runner.highCount)
    println(runner.lowCount * runner.highCount)


  @main
  def day20part2(): Unit =
    val (modules, inputs, outputs) = parseInput(Source.fromResource("day20.txt"))
    println(influencedBy(modules, inputs, Set("output")))
    val runner = Runner(inputs, outputs)
    var m = modules

    while (true) {
      m = runner.helper(m)
    }
//    println(runner.findCycleSize(modules, "xf"))
}

ืกืš ื”ื›ืœ ื–ื” ื”ื™ื” ืื—ื“ ื”ืชืจื’ื™ืœื™ื ื”ืžืขื™ื™ืคื™ื ืฉืœ ื”ืกื™ื“ืจื” ื”ื–ื•, ืื‘ืœ ืื•ืœื™ ื–ื” ื—ืœืง ืžื”ืขื ื™ื™ืŸ ืขื ื”ืชืจื’ื™ืœื™ื ื‘ืžืกืคืจื™ื ื”ื’ื‘ื•ื”ื™ื. ื”ื ื—ืžื” ื”ื™ื—ื™ื“ื” ื”ื™ื ืฉืื ื—ื ื• ืœืงืจืืช ื”ืกื•ืฃ.

ToCode
1 419
import org.neo4j.driver.internal.messaging.request.CommitMessage

import scala.annotation.tailrec
import scala.collection.mutable
import scala.io.Source
import scala.util.chaining._

object aoc2023day20 {
  val HIGH_PULSE = 1
  val LOW_PULSE = -1

  val demoInput: String = """broadcaster -> a, b, c
                            |%a -> b
                            |%b -> c
                            |%c -> inv
                            |&inv -> a""".stripMargin

  val demoInput2: String = """broadcaster -> a
                             |%a -> inv, con
                             |&inv -> b
                             |%b -> con
                             |&con -> output""".stripMargin

  def receive(sender: String, target: CommunicationModule, signal: Int, runner: Runner): CommunicationModule =
    target match
      case cm @ FlipFlop(name, state) if signal == LOW_PULSE && state =>
        runner.sendSignal(LOW_PULSE, name)
        cm.copy(state = false)

      case cm @ FlipFlop(name, state) if signal == LOW_PULSE && !state =>
        runner.sendSignal(HIGH_PULSE, name)
        cm.copy(state = true)

      case cm @ Conjunction(name, state) =>
        val updatedState = runner.inputs(name).map {
          case i if i == sender => Map(sender -> signal)
          case i if state.contains(i) => Map(i -> state(i))
          case i => Map(i -> LOW_PULSE)
        }.foldLeft(Map[String, Int]())(_ ++ _)

        if (updatedState.values.forall(_ == HIGH_PULSE)) {
          runner.sendSignal(LOW_PULSE, name)
        } else {
          runner.sendSignal(HIGH_PULSE, name)
        }

        cm.copy(state = updatedState)

      case cm @ Broadcaster(name) =>
        runner.sendSignal(signal, name)
        cm

      case _ => target

  @tailrec
  def influencedBy(modules: Map[String, CommunicationModule],
                   inputs: Map[String, List[String]],
                   searching: Set[String] = Set(),
                   found: Set[String] = Set()): Set[String] =
    if (searching.isEmpty) {
      found
    } else {
      val nextModule = searching.head
      val nextSearching = searching ++ inputs.getOrElse(nextModule, List()) - nextModule -- found
      val nextFound = found + nextModule

      influencedBy(modules,
        inputs,
        nextSearching,
        nextFound)
    }

  def findCycleIndex[T](data: Seq[T]): Long =
    data
      .scanLeft(Some(Set()): Option[Set[T]]) {
        case (Some(seen), newItem) if seen.contains(newItem) => None
        case (Some(seen), newItem) => Some(seen + newItem)
        case (None, newItem) => None
      }.zipWithIndex
      .find { (item, index) => item.isEmpty }.get._2 - 1


  class Runner(val inputs: Map[String, List[String]], val outputs: Map[String, List[String]]) {
    val pendingSignals: mutable.Queue[(String, String, Int)] = mutable.Queue()
    var lowCount = 0
    var highCount = 0
    var buttonPresses = 0

    def pressButton(): Unit =
      buttonPresses += 1
      this.sendSignal(LOW_PULSE, "button")

    def sendSignal(signal: Int, from: String): Unit =
      val to = outputs(from)
      if (signal == LOW_PULSE) {
        lowCount += to.size
      } else if (signal == HIGH_PULSE) {
        highCount += to.size
      }

      to.foreach { to =>
        if (to == "gc" && signal == HIGH_PULSE) {
          throw new Exception(s"gc ${this.buttonPresses}")
        }
        this.pendingSignals.enqueue((from, to, signal))
      }

    def handleSignals(modules: Map[String, CommunicationModule]): Map[String, CommunicationModule] =
      this.pendingSignals.dequeueAll((item) => true).foldLeft(modules) { (modules, message) =>
        val (from, to, signal) = message
        println(s"${from} - ${if (signal == -1) "low" else "high"} - ${to}")
        modules.updatedWith(to) {
          case Some(cm) =>
            Some(receive(from, cm, signal, this))
          case _ =>
            println(s"Tried to send signal to untyped module: ${to}")
            None

ToCode
1 419
val updatedInputs = itsOutputs.foldLeft(inputs) { (inputs, output) =>
          inputs.updatedWith(output) {
            case Some(existingInputs) => Some(existingInputs :+ newName)
            case None => Some(List(newName))
          }
        }

        val updatedOutputs = outputs.updatedWith(newName) {
          case Some(existingOutputs) => Some(existingOutputs ++ itsOutputs) // unreachable, because there's only one line per module
          case None => Some(itsOutputs)
        }

        val updatedModules = modules.updated(newName, newModule)

        (updatedModules, updatedInputs, updatedOutputs)
      }
ื‘ืฉื‘ื™ืœ ื”ื—ืœืง ื”ืจืืฉื•ืŸ ืฆืจื™ืš ืจืง ืœืœื—ื•ืฅ ืขืœ ื”ื›ืคืชื•ืจ ืืœืฃ ืคืขืžื™ื ื•ืœืจืื•ืช ื›ืžื” ืกื™ื’ื ืœื™ื ื—ื–ืงื™ื ื•ื›ืžื” ื—ืœืฉื™ื ื ืฉืœื—ื•:
  @main
  def day20part1(): Unit =
    val (modules, inputs, outputs) = parseInput(Source.fromResource("day20.txt"))
    println(modules)
    println(inputs)
    println(outputs)
    val runner = Runner(inputs, outputs)
    var round = 0L
    var modules_i = modules

    1.to(1000).foreach { i =>
      runner.pressButton()
      modules_i = runner.process(modules_i)
    }

    println(runner.lowCount)
    println(runner.highCount)
    println(runner.lowCount * runner.highCount)
ืคื™ืชืจื•ืŸ ื—ืœืง ืฉื ื™ ื”ื—ืœืง ื”ืฉื ื™ ื”ื™ื” ื™ื•ืชืจ ืžื•ืจื›ื‘ ื•ื“ืจืฉ ืขื‘ื•ื“ื” ื™ื“ื ื™ืช. ืืœื” ื”ืฉื•ืจื•ืช ื”ืจืœื•ื•ื ื˜ื™ื•ืช ืžืชื•ืš ื”ืงืœื˜ ื”ืกืคืฆื™ืคื™ ืฉืื ื™ ืงื™ื‘ืœืชื™:
&zr -> rx
&gc -> zr
&sz -> zr
&cm -> zr
&xf -> zr
ืื ื™ ืจื•ืื” ืฉ rx ืžื•ืฉืคืข ืž zr, ื• zr ืžื•ืฉืคืข ืž 4 ืžื•ื“ื•ืœื™ื ืื—ืจื™ื. ืขื›ืฉื™ื• ื”ืชื—ื™ืœื” ืขื‘ื•ื“ืช ื”ื—ื™ืคื•ืฉ: ื‘ืฉื‘ื™ืœ ืฉ rx ื™ืงื‘ืœ ืื•ืช ื—ืœืฉ zr ืฆืจื™ืš ืœืฉืœื•ื— ืœื• ืื•ืช ื—ืœืฉ. zr ื”ื•ื ืžื•ื“ื•ืœ ื—ื™ื‘ื•ืจ ื•ื”ื•ื ืฉื•ืœื— ืื•ืช ื—ืœืฉ ืจืง ื›ืฉื›ืœ ื”ืžื•ื“ื•ืœื™ื ืฉืžื—ื•ื‘ืจื™ื ืืœื™ื• ืฉื•ืœื—ื™ื ืื•ืช ื—ื–ืง. ืขื›ืฉื™ื• ืื ื—ื ื• ืจืง ืฆืจื™ื›ื™ื ืœื‘ื“ื•ืง ืžืชื™ gc, sz, cm ื• xf ืžืงื‘ืœื™ื ืื•ืช ื—ื–ืง ื™ื—ื“ ื›ื“ื™ ืœืขื ื•ืช ืขืœ ื”ืฉืืœื”. ื‘ืฉื‘ื™ืœ ืœื”ื‘ื™ืŸ ืžืชื™ ืžื™ืฉื”ื• ืžืงื‘ืœ ืื•ืช ื—ื–ืง ื”ื•ืกืคืชื™ ืืช ื” Exception ื”ื‘ื ืœืคื•ื ืงืฆื™ื” sendSignal:
    def sendSignal(signal: Int, from: String): Unit =
      val to = outputs(from)
      if (signal == LOW_PULSE) {
        lowCount += to.size
      } else if (signal == HIGH_PULSE) {
        highCount += to.size
      }

      to.foreach { to =>
        if (to == "gc" && signal == HIGH_PULSE) {
          throw new Exception(s"gc ${this.buttonPresses}")
        }
        this.pendingSignals.enqueue((from, to, signal))
      }
ืื—ืจื™ ื—ื™ืคื•ืฉื™ื ื’ื™ืœื™ืชื™ ืฉื›ืœ ื”-4 ืžืงื‘ืœื™ื ืื•ืช ื—ื–ืง ืžืžืฉ ื‘ืœื—ื™ืฆื” ื”ืจืืฉื•ื ื”. ื”ืฉืืœื” ื”ื‘ืื” ื”ื™ื ืžืชื™ ื‘ืคืขื ื”ื‘ืื” ื”ื ื™ืงื‘ืœื• ืื•ืช ื—ื–ืง, ื›ืœื•ืžืจ ื›ืœ ื›ืžื” ืœื—ื™ืฆื•ืช ื”ืžืฆื‘ ืฉืœื”ื ืžืชืืคืก. ืืช ื–ื” ื›ื‘ืจ ื”ื™ื” ื™ื•ืชืจ ืžืกื•ื‘ืš ืœื—ืฉื‘ - ื”ื˜ืจื™ืง ื”ื™ื” ืœื–ื”ื•ืช ืžื™ ื”ืžื•ื“ื•ืœื™ื ืฉืžืฉืคื™ืขื™ื ืขืœ ืžื•ื“ื•ืœ ืžืกื•ื™ื ื‘ืขื–ืจืช ื”ืคื•ื ืงืฆื™ื” ื”ื‘ืื”:
  @tailrec
  def influencedBy(modules: Map[String, CommunicationModule],
                   inputs: Map[String, List[String]],
                   searching: Set[String] = Set(),
                   found: Set[String] = Set()): Set[String] =
    if (searching.isEmpty) {
      found
    } else {
      val nextModule = searching.head
      val nextSearching = searching ++ inputs.getOrElse(nextModule, List()) - nextModule -- found
      val nextFound = found + nextModule

      influencedBy(modules,
        inputs,
        nextSearching,
        nextFound)
    }
ืœืื—ืจ ืžื›ืŸ ืœื‘ื ื•ืช ืชืช-ืžืคื” ืจืง ืฉืœ ื”ืžื•ื“ื•ืœื™ื ื”ืืœื” ื•ืœื‘ื ื•ืช ืจืฉื™ืžื” ืฉืœ ื›ืœ ื”ืžืฆื‘ื™ื ืฉืœื”ื ืœืื•ืจืš ื”ืœื—ื™ืฆื•ืช, ื›ืœื•ืžืจ ืœื‘ื ื•ืช ืจืฉื™ืžื” ืฉื‘ืžืงื•ื ื”ืจืืฉื•ืŸ ืฉืœื” ื™ื”ื™ื” ื”ืžืฆื‘ ืฉืœ ื”ืžื•ื“ื•ืœื™ื ื”ืจืœื•ื•ื ื˜ื™ื ืื—ืจื™ ืœื—ื™ืฆื” ืื—ืช, ื‘ืžืงื•ื ื”ืฉื ื™ ืื—ืจื™ ืฉืชื™ ืœื—ื™ืฆื•ืช ื•ื›ืš ื”ืœืื”:
    def findCycleSize(modules: Map[String, CommunicationModule], end: String): Long =
      val relevantModules = influencedBy(modules, inputs, Set(end))

      val data = LazyList.iterate(modules)(helper).map { modules =>
        modules.view.filterKeys(relevantModules.contains).toMap
      }
      findCycleIndex(data)
ืื—ืจื™ ืฉื™ืฉ ืœื ื• ืืช ื”ืจืฉื™ืžื” (data) ืืคืฉืจ ืœืžืฆื•ื ืžื” ื”ืื™ื ื“ืงืก ืฉืœ ื”ืื™ื‘ืจ ื”ืจืืฉื•ืŸ ื‘ื” ืฉื—ื•ื–ืจ ืขืœ ืขืฆืžื•, ื•ื–ื” ื’ื•ื“ืœ ื”ืžืขื’ืœ ืฉืœื”ื. ืื—ืจื™ ืฉืžืฆืืชื™ ืืช ืืจื‘ืขืช ื”ืžืขื’ืœื™ื ื”ื™ื” ืฆืจื™ืš ืจืง ืœื›ืคื•ืœ ืืช 4 ื”ืžืกืคืจื™ื ื›ื“ื™ ืœืžืฆื•ื ืžืชื™ ื›ืœ ื”-4 ื™ืกืชื ื›ืจื ื• ืขื ืื•ืช ื—ื–ืง ืžื” ืฉื™ื’ืจื•ื ืœ zr ืœื”ื•ืฆื™ื ืื•ืช ื—ืœืฉ ื•ื™ืกื™ื™ื ืืช ื”ืฉืืœื”. ื–ื” ืงื•ื“ ื”ืคื™ืชืจื•ืŸ ื”ืžืœื ื‘ืกืงืืœื”:

ToCode
1 419
  class Runner(val inputs: Map[String, List[String]], val outputs: Map[String, List[String]]) {
    val pendingSignals: mutable.Queue[(String, String, Int)] = mutable.Queue()
    var lowCount = 0
    var highCount = 0
    var buttonPresses = 0

    def pressButton(): Unit =
      buttonPresses += 1
      this.sendSignal(LOW_PULSE, "button")

    def sendSignal(signal: Int, from: String): Unit =
      val to = outputs(from)
      if (signal == LOW_PULSE) {
        lowCount += to.size
      } else if (signal == HIGH_PULSE) {
        highCount += to.size
      }

      to.foreach { to =>
//        if (to == "xf" && signal == LOW_PULSE) {
//          throw new Exception(s"xf ${this.buttonPresses}")
//        }
        this.pendingSignals.enqueue((from, to, signal))
      }

    def handleSignals(modules: Map[String, CommunicationModule]): Map[String, CommunicationModule] =
      this.pendingSignals.dequeueAll((item) => true).foldLeft(modules) { (modules, message) =>
        val (from, to, signal) = message
        println(s"${from} - ${if (signal == -1) "low" else "high"} - ${to}")
        modules.updatedWith(to) {
          case Some(cm) =>
            Some(receive(from, cm, signal, this))
          case _ =>
            println(s"Tried to send signal to untyped module: ${to}")
            None
        }
      }

    def helper(modules: Map[String, CommunicationModule]): Map[String, CommunicationModule] =
      this.pressButton()
      process(modules)

    def findCycleSize(modules: Map[String, CommunicationModule], end: String): Long =
      val relevantModules = influencedBy(modules, inputs, Set(end))

      val data = LazyList.iterate(modules)(helper).map { modules =>
        modules.view.filterKeys(relevantModules.contains).toMap
      }
      findCycleIndex(data)

    @tailrec
    final def process(modules: Map[String, CommunicationModule]): Map[String, CommunicationModule] =
      if (this.pendingSignals.nonEmpty) {
        val updatedModules = handleSignals(modules)
        this.process(updatedModules)
      } else {
        modules
      }
  }
ื—ืœืง ืžื”ืงื•ื“ ื›ืืŸ ืจืœื•ื•ื ื˜ื™ ืจืง ืœื—ืœืง ื”ืฉื ื™ ืฉืœ ื”ืชืจื’ื™ืœ, ื‘ื’ื“ื•ืœ ืžื‘ื—ื™ื ืช ื”ื—ืœืง ื”ืจืืฉื•ืŸ ื”ืคื•ื ืงืฆื™ื” ื”ื›ื™ ื—ืฉื•ื‘ื” ื”ื™ื sendSignal ืฉืžืงื‘ืœืช ืกื™ื’ื ืœ ื•ืžื•ื“ื•ืœ ื•ืฉื•ืœื—ืช ืืช ื”ืกื™ื’ื ืœ ืœื›ืœ ื”ืžื•ื“ื•ืœื™ื ืฉืžื—ื•ื‘ืจื™ื ืœืื•ืชื• ืฉื•ืœื—. ื”ืคื•ื ืงืฆื™ื” handleSignals ืžื•ืฉื›ืช ืžื”ืชื•ืจ ืืช ื›ืœ ื”ืกื™ื’ื ืœื™ื ื•ืžื˜ืคืœืช ื‘ื”ื ื•ื”ืคื•ื ืงืฆื™ื” process ืงื•ืจืืช ืœ handleSignals ื‘ืœื•ืœืื” ื›ืœ ืขื•ื“ ืกื™ื’ื ืœื™ื ื—ื“ืฉื™ื ืžืฆื˜ืจืคื™ื ืœืชื•ืจ. ื”ืคื•ื ืงืฆื™ื” helper ืžืชืืจืช ืื™ื˜ืจืฆื™ื” ืื—ืช ืฉืœ ืขื‘ื•ื“ื” ืขื ื”ืžื›ื•ื ื” - ื”ื™ื ืœื•ื—ืฆืช ืขืœ ื”ื›ืคืชื•ืจ ื•ืื– ืžื˜ืคืœืช ื‘ื›ืœ ื”ืกื™ื’ื ืœื™ื ืฉื•ื‘ ื•ืฉื•ื‘ ืขื“ ืฉื”ืชื•ืจ ืžืชืจื•ืงืŸ. ื”ื—ืœืง ื”ืžืกื•ื‘ืš ื”ืฉื ื™ ืฉืœ ื”ืชืจื’ื™ืœ ื”ื™ื” ืœืคืขื ื— ืืช ื”ืงืœื˜. ื‘ืฉื‘ื™ืœ ื”ื—ืœืง ื”ืฉื ื™ ืฉืœ ื”ืชืจื’ื™ืœ ืจืฆื™ืชื™ ืœื”ื—ื–ื™ืง ืื™ื ื“ืงืก ื›ืคื•ืœ ื’ื ืœืฉืžื•ืจ ืืช ื”ื—ื•ื˜ื™ื ืฉื™ื•ืฆืื™ื ืžื›ืœ ืžื•ื“ื•ืœ ื•ื’ื ืืช ื”ื—ื•ื˜ื™ื ืฉื ื›ื ืกื™ื ืืœื™ื•. ืกืš ื”ื›ืœ ื‘ื ื™ืชื™ 3 ืžืคื•ืช: ื”ืžืคื” modules ืžื—ื–ื™ืงื” ืœื›ืœ ืื•ืช ืืช ื”ืžื•ื“ื•ืœ ืฉืžืชืื™ื ืœื”, ืขื ื”ืกื˜ื™ื™ื˜ ื”ืคื ื™ืžื™ ืฉืœื•, ื”ืฉื ืฉืœื• ื•ื”ืกื•ื’ ืฉืœื•. ื”ืžืคื” outputs ืžื—ื–ื™ืงื” ืœื›ืœ ืื•ืช ืืช ื”ืื•ืชื™ื•ืช ืฉืืœื™ื”ืŸ ื”ื™ื ืฉื•ืœื—ืช ืกื™ื’ื ืœื™ื. ื”ืžืคื” inputs ืžื—ื–ื™ืงื” ืœื›ืœ ืื•ืช ืืช ื”ืื•ืชื™ื•ืช ืฉืฉื•ืœื—ื•ืช ืืœื™ื” ืกื™ื’ื ืœื™ื. ื”ืคื•ื ืงืฆื™ื” ื”ื–ื• ื‘ืกืงืืœื” ื‘ื•ื ื” ืืช ืฉืœื•ืฉืช ื”ืžืคื•ืช:
  def parseInput(input: Source): (Map[String, CommunicationModule], Map[String, List[String]], Map[String, List[String]]) =

    input
      .getLines()
      .concat(List("button -> broadcaster"))
      .map { line => line.split(" -> ") }
      .collect { case Array(name, outputs) =>
        val outputModules = outputs.split(", ").toList
        val module = name match
          case "broadcaster" => Broadcaster(name)
          case s"%${name}" => FlipFlop(name, false)
          case s"&${name}" => Conjunction(name, Map[String, Int]())
          case s"${name}" => UntypedModule(name)
        (module, outputModules)

      }.foldLeft((
        Map[String, CommunicationModule](),
        Map[String, List[String]](),
        Map[String, List[String]]())) { (a, v) =>
        val (modules, inputs, outputs) = a
        val (newModule, itsOutputs) = v
        val newName = newModule.name

ToCode
1 419
ืคื™ืชืจื•ืŸ Advent Of Code 2023 ื™ื•ื 20 ื‘ืกืงืืœื” ื™ื•ื ืขืฉืจื™ื ืฉืœ Advent Of Code ื”ื•ื ืื—ื“ ื”ืชืจื’ื™ืœื™ื ืขื ื”ืจื‘ื” ื™ื•ืชืจ ืžื“ื™ ื˜ืงืกื˜, ื”ืจื‘ื” ื™ื•ืชืจ ืžื“ื™ ืงื•ื“ ื•ื”ืจื‘ื” ื™ื•ืชืจ ืžื“ื™ ืขื‘ื•ื“ื” ื™ื“ื ื™ืช. ื‘ืงื™ืฆื•ืจ ืœื ืชืจื’ื™ืœ ืฉืื•ื›ืœ ืื™ ืคืขื ืœื”ืฉืชืžืฉ ื‘ื• ื‘ืงื•ืจืกื™ื ื•ืœื ืชืจื’ื™ืœ ืฉื ื”ื ื™ืชื™ ืžืžื ื• ื‘ืžื™ื•ื—ื“. ืื‘ืœ ื™ืฉ ื’ื ื›ืืœื” ื‘ื—ื™ื™ื. ื‘ื•ืื• ื ืจืื” ืืช ื”ืžืฉื™ืžื” ื•ื”ืคื™ืชืจื•ืŸ ื‘ืงืฆืจื”. ืœื™ื ืง ืœืชืจื’ื™ืœ: https://adventofcode.com/2023/day/20 ืžื” ืฆืจื™ืš ืœืžืฆื•ื ื ืชื•ืŸ ืงืœื˜ ืฉื ืจืื” ื›ืžื• ืชืจืฉื™ื ื—ื•ืžืจื”:
broadcaster -> a, b, c
%a -> b
%b -> c
%c -> inv
&inv -> a
ื”ืงืœื˜ ืžืชืืจ ืจื›ื™ื‘ื™ื ื•ืœื›ืœ ืจื›ื™ื‘ ื™ืฉ ืืช ื”ืœื•ื’ื™ืงื” ืฉืœื•. ื”ืจื›ื™ื‘ ืฉื ืงืจื broadcaster ืžืขื‘ื™ืจ ืืช ื”ืื•ืช ืฉื”ื•ื ืžืงื‘ืœ ืœื›ืœ ืืœื” ืฉื”ื•ื ืžื—ื•ื‘ืจ ืืœื™ื”ื, ืจื›ื™ื‘ื™ื ืฉืžืชื—ื™ืœื™ื ื‘ืื—ื•ื– ื ืงืจืื™ื Flip Flop ื•ื™ืฉ ืœื”ื ืœื•ื’ื™ืงื” ืคื ื™ืžื™ืช ื•ืจื›ื™ื‘ื™ื ืฉืžืชื—ื™ืœื™ื ื‘ืืžืคืจืกื ื“ ื ืงืจืื™ื Conjunction ื•ื’ื ืœื”ื ื™ืฉ ืœื•ื’ื™ืงื” ืคื ื™ืžื™ืช ืฉืœื”ื. ืจื›ื™ื‘ Flip Flop ืžื—ื–ื™ืง ืžืฆื‘ ืคื ื™ืžื™ ืฉืžืชื—ื™ืœ False. ื”ื•ื ื™ื›ื•ืœ ืœืงื‘ืœ ืื•ืช "ื—ื–ืง" ืื• "ื—ืœืฉ". ืื ื”ื•ื ืžืงื‘ืœ ืื•ืช ื—ืœืฉ ื”ื•ื ื”ื•ืคืš ืืช ื”ืžืฆื‘ ื”ืคื ื™ืžื™ ืฉืœื• ื•ื’ื ืฉื•ืœื— ืื•ืช ื—ื“ืฉ. ืื ื”ื•ื ื”ืชื—ื™ืœ ื›ื‘ื•ื™ ื”ื•ื ื™ืฉืœื— ืื•ืช ื—ื–ืง ืœื›ืœ ืืœื” ืฉื”ื•ื ืžื—ื•ื‘ืจ ืืœื™ื”ื, ื•ืื ื”ื•ื ื”ืชื—ื™ืœ ื“ืœื•ืง ื”ื•ื ื™ืฉืœื— ืื•ืช ื—ืœืฉ. ืจื›ื™ื‘ Conjunction ื–ื•ื›ืจ ืืช ื”ืื•ืช ื”ืื—ืจื•ืŸ ืฉื”ื•ื ืงื™ื‘ืœ ืžื›ืœ ื”ืจื›ื™ื‘ื™ื ืฉื ื›ื ืกื™ื ืืœื™ื• (ืื ืœื ื”ืชืงื‘ืœ ืื•ืช ื”ื•ื ื–ื•ื›ืจ ื–ืจื "ื—ืœืฉ"). ื›ืฉืžืงื‘ืœ ืื•ืช ื”ื•ื ืžืขื“ื›ืŸ ืืช ื”ื–ื™ื›ืจื•ืŸ ื•ืื– ื‘ื•ื“ืง ืื ื›ืœ ื”ืงืœื˜ื™ื ืฉืœื• ื”ื ื–ืจื "ื—ื–ืง" ื”ื•ื ื™ืฉืœื— ื–ืจื ื—ืœืฉ, ืื—ืจืช ื”ื•ื ื™ืฉืœื— ื–ืจื ื—ื–ืง. ืื” ื•ื™ืฉ ืขื•ื“ ืจื›ื™ื‘ ืฉื ืงืจื button. ื”ื•ื ืžื—ื•ื‘ืจ ืœ broadcaster, ืœื ืžื•ืคื™ืข ื‘ืฆื™ื•ืจ ื•ื›ืฉืœื•ื—ืฆื™ื ืขืœื™ื• ืฉื•ืœื— ื–ืจื "ื—ืœืฉ" ืœ broadcaster. ืื ื”ืœื›ืชื ืœืื™ื‘ื•ื“ ืขื“ ืคื” ืืชื ืœื ืœื‘ื“. ืœื™ ืœืงื— ื›ืžื” ืคืขืžื™ื ืœืงืจื•ื ืืช ื”ื”ื•ืจืื•ืช ืขื“ ืฉื”ื‘ื ืชื™ ื•ื’ื ื‘ื–ืžืŸ ื›ืชื™ื‘ืช ื”ืคื™ืชืจื•ืŸ ื”ืžืฉื›ืชื™ ืœื—ื–ื•ืจ ืœื”ื•ืจืื•ืช ื”ืืœื”. ื ืงื•ื“ื” ืื—ืจื•ื ื” ื”ื™ื ืฉืฆืจื™ืš ืœื˜ืคืœ ื‘ืื•ืชื• ื‘ืกื“ืจ ื‘ื• ื”ื ื ืฉืœื—ื™ื, ืœื›ืŸ ืื a ืฉื•ืœื— ืื•ืช ืœ b ื•ืœ c ื•ืื– b ืฉื•ืœื— ืื•ืช ื—ื“ืฉ ืœ c, ืื– ืงื•ื“ื ืฆืจื™ืš ืœื˜ืคืœ ื‘ืฉื ื™ ื”ืื•ืชื•ืช ืฉ a ืฉืœื— ื•ืจืง ืื– ืœื”ืžืฉื™ืš ืœืื•ืช ืฉ b ืฉืœื— ืœ c. ื‘ืฉืืœื” ื”ืจืืฉื•ื ื” ืœื•ื—ืฆื™ื ืขืœ ื”ื›ืคืชื•ืจ ืืœืฃ ืคืขืžื™ื ื•ืฆืจื™ืš ืœืžืฆื•ื ื›ืžื” ืื•ืชื•ืช ื—ื–ืงื™ื ื•ื›ืžื” ืื•ืชื•ืช ื—ืœืฉื™ื ื ืฉืœื—ื•. ื‘ื—ืœืง ื”ืฉื ื™ ืฆืจื™ืš ืœืžืฆื•ื ื›ืžื” ืคืขืžื™ื ืฆืจื™ืš ืœืœื—ื•ืฅ ืขืœ ื”ื›ืคืชื•ืจ ืขื“ ืฉืžื•ื“ื•ืœ ื‘ืฉื rx ื™ืงื‘ืœ ืื•ืช ื—ืœืฉ. ืคื™ืชืจื•ืŸ ื—ืœืง ืจืืฉื•ืŸ ื‘ืกืงืืœื” ื‘ื—ืœืง ื”ืจืืฉื•ืŸ ืจื•ื‘ ื”ืขื‘ื•ื“ื” ื”ื™ื ืœืงื•ื“ื“ ืืช ื”ื”ื•ืจืื•ืช ืœืกืงืืœื” (ืื• ืœื›ืœ ืฉืคื” ืื—ืจืช ืฉื‘ื—ืจืชื). ื”ืืชื’ืจ ื”ื™ื—ื™ื“ ื›ืืŸ ื”ื™ื” ื”ื˜ื™ืคื•ืœ ื‘ืื•ืชื• ืœืคื™ ื”ืกื“ืจ, ื•ื‘ืฉื‘ื™ืœ ื–ื” ื”ื’ื“ืจืชื™ ืžื—ืœืงื” ื‘ืฉื Runner ืฉืžื’ื“ื™ืจื” ืชื•ืจ ื”ื•ื“ืขื•ืช. ื›ืœ ืคืขื ืฉืžื™ืฉื”ื• ืฉื•ืœื— ืื•ืช ื”ืื•ืช ืžืฆื˜ืจืฃ ืœืชื•ืจ ื•ื™ืฉ ืคื•ื ืงืฆื™ื” ืฉืžื•ืฆื™ืื” ืืช ื›ืœ ื”ืื•ืชื•ืช ืฉืœ ืกื™ื‘ื•ื‘ ืžืกื•ื™ื ืžื”ืชื•ืจ ื•ืžื˜ืคืœืช ื‘ื”ื ืœืคื™ ื”ืกื“ืจ. ืžื‘ื—ื™ื ืช ืžื—ืœืงื•ืช ืืœื” ื”ืžื—ืœืงื•ืช ืฉืžื—ื–ื™ืงื•ืช ืืช ื”ืžื™ื“ืข ืขืœ ื”ืžื•ื“ื•ืœื™ื:
  sealed trait CommunicationModule {
    def name: String
  }

  case class FlipFlop(name: String, state: Boolean) extends CommunicationModule
  case class Conjunction(name: String, state: Map[String, Int]) extends CommunicationModule
  case class Broadcaster(name: String) extends CommunicationModule
  case class UntypedModule(name: String) extends CommunicationModule
ื•ื–ืืช ื”ืคื•ื ืงืฆื™ื” ืฉื ืงืจืืช ื›ืฉืžื•ื“ื•ืœ ืžืงื‘ืœ ืื•ืช:
  def receive(sender: String, target: CommunicationModule, signal: Int, runner: Runner): CommunicationModule =
    target match
      case cm @ FlipFlop(name, state) if signal == LOW_PULSE && state =>
        runner.sendSignal(LOW_PULSE, name)
        cm.copy(state = false)

      case cm @ FlipFlop(name, state) if signal == LOW_PULSE && !state =>
        runner.sendSignal(HIGH_PULSE, name)
        cm.copy(state = true)

      case cm @ Conjunction(name, state) =>
        val updatedState = runner.inputs(name).map {
          case i if i == sender => Map(sender -> signal)
          case i if state.contains(i) => Map(i -> state(i))
          case i => Map(i -> LOW_PULSE)
        }.foldLeft(Map[String, Int]())(_ ++ _)

        if (updatedState.values.forall(_ == HIGH_PULSE)) {
          runner.sendSignal(LOW_PULSE, name)
        } else {
          runner.sendSignal(HIGH_PULSE, name)
        }

        cm.copy(state = updatedState)

      case cm @ Broadcaster(name) =>
        runner.sendSignal(signal, name)
        cm

      case _ => target
ืืคืฉืจ ืœืจืื•ืช ืฉืžืงื•ื“ื“ืช ืคื” ื›ืœ ื”ืœื•ื’ื™ืงื” ืฉืœ ื›ืœ ื”ืžื•ื“ื•ืœื™ื. ื‘ืื•ืคืŸ ื›ืœืœื™ ืื—ืจื™ ืฉื›ืชื‘ืชื™ ืืช ื”ืคื•ื ืงืฆื™ื” ื—ืฉื‘ืชื™ ืฉืื•ืœื™ ื”ื™ื” ืขื“ื™ืฃ ืœื‘ื ื•ืช ืืช ื”ืงื•ื“ ื‘ื’ื™ืฉืช Object Oriented ื•ืœื‘ื ื•ืช ืœื•ื’ื™ืงื” ืฉืœ ื›ืœ ืžื•ื“ื•ืœ ื‘ืชื•ืš ื”ืžื—ืœืงื” ืฉืœื•. ื”ืžื—ืœืงื” Runner ื”ื™ื ื–ืืช ืฉืžื ื”ืœืช ืืช ืชื•ืจ ื”ื”ื•ื“ืขื•ืช ื•ื–ื” ื”ืงื•ื“ ืฉืœื”:

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

ToCode
1 419
ื›ืœื™ื ืื• ืงื˜ื’ื•ืจื™ื•ืช ื’'ื•ื“ื™ ืœื™ ืคืจืกืžื” ืจืฉื™ืžื” ืฉืœ 20 ื›ืœื™ื ืฉื›ืœ ืžืชื›ื ืช ื•ืžืชื›ื ืชืช ืฆืจื™ื›ื™ื ืœื”ื›ื™ืจ. ื”ื™ื ื›ืœืœื” ืืช ื”ื›ืœื™ื ื”ื‘ืื™ื: VS Code, Copilot, Docker, Kubernetes, Postman, Jira, Slack, Figma, Node.js, Webpack, Terraform, VS Code Live Share, Sentry, SonarQube, Prometheus, Grafana, Ansible, Elasticsearch, CircleCI, Tailwind CSS. ื›ืฉืžืงื‘ืœื™ื ื›ื–ืืช ืจืฉื™ืžื” ื™ืฉ ื›ืžื” ืฉืืœื•ืช ืฉื›ื“ืื™ ืœืฉืื•ืœ ืœืคื ื™ ืฉืฆื•ืœืœื™ื ืœืœืžื•ื“ ืืช ื”ื›ืœื™ื (ืื ื‘ื›ืœืœ ืฆืจื™ืš): 1. ืœืžื™ ื”ืจืฉื™ืžื” ืžื™ื•ืขื“ืช? ืื™ื–ื” ืกื•ื’ ืžืคืชื—ื™ื ื™ืจืฆื• ืืช ื”ื›ืœื™ื ื”ืืœื”? 2. ืžื” ื”ืžื˜ืจื” ืฉืœ ื›ืœ ื›ืœื™? ื”ืื ื™ืฉ ื›ืœื™ื ืื—ืจื™ื ืขื“ื™ืคื™ื ืฉืื ื™ ื›ื‘ืจ ืขื•ื‘ื“ ืื™ืชื? 3. ืื™ืคื” ื”ื”ื–ื“ืžื ื•ืช ืฉืœื™ ืœืฉืคืจ ืืช ื”ืคืจื•ื“ื•ืงื˜ื™ื‘ื™ื•ืช? 4. ืื™ืคื” ื”ื”ื–ื“ืžื ื•ืช ืฉืœื™ ืœืœืžื•ื“ ื™ื›ื•ืœื•ืช ื—ื“ืฉื•ืช? ืื ื™ ืžืชื—ื™ืœ ืขื ื”ืฉืืœื” ื”ืจืืฉื•ื ื” - ื‘ื’ืœืœ ืฉื”ืจืฉื™ืžื” ื›ื•ืœืœืช ืคืจื™ื™ืžื•ื•ืจืง ืœ CSS, ื›ืœื™ ืœื‘ืื ื“ืœื™ื ื’ ืฉืœ ืงื‘ืฆื™ ืฆื“-ืœืงื•ื— ื•ื›ืœื™ ืขื™ืฆื•ื‘ ืื ื™ ืžื‘ื™ืŸ ืฉื”ื™ื ืžื™ื•ืขื“ืช ืœืžืคืชื—ื™ ืฆื“-ืœืงื•ื—. ื‘ื’ืœืœ ื›ืœื™ ื” Deployment ื•ื” Monitoring ืื ื™ ืžื‘ื™ืŸ ืฉื”ื™ื ืžื™ื•ืขื“ืช ืœ DevOps ื•ื‘ื’ืœืœ Node ื• Elastic ืื ื™ ืžื‘ื™ืŸ ืฉื™ืฉ ืคื” ืงืจื™ืฆื” ืœืžืคืชื—ื™ ืฆื“ ืฉืจืช. ื—ื™ื‘ื•ืจ ื›ืœ ื”-3 ืฉื ืื•ืชื™ ื‘ืžื’ืจืฉ ืฉืœ Full Stack Developers. ืขื›ืฉื™ื• ื‘ืชื•ืจ Full Stack Developer ืื ื™ ื™ื›ื•ืœ ืœื”ืžืฉื™ืš ื•ืœืฉืื•ืœ ื”ืื ืื ื™ ื‘ืืžืช ืฆืจื™ืš ืืช ื”ื›ืœื™ื ื”ืืœื” ื“ืจืš ืฉืœื•ืฉืช ื”ืฉืืœื•ืช ื”ื‘ืื•ืช - ืžื” ื”ืžื˜ืจื” ืฉืœ ื”ื›ืœื™, ืื™ืคื” ื”ื–ื“ืžื ื•ืช ื”ืœืžื™ื“ื” ืžืžื ื• ื•ื”ืื ื”ื•ื ื‘ืืžืช ืจืœื•ื•ื ื˜ื™ ืœ Workflow ืฉืœื™. ืกืจื™ืงื” ื–ืจื™ื–ื” ืฉืœ ื”ื›ืœื™ื ืžืจืื” ืฉืœื›ืœ ืื—ื“ ืžื”ื ื™ืฉ ืืœื˜ืจื ื˜ื™ื‘ื•ืช ืœื ืคื—ื•ืช ื˜ื•ื‘ื•ืช ื•ื—ืฉื•ื‘ื•ืช, ื•ืœื›ืŸ ืื ื”ื™ื• ืฉื•ืืœื™ื ืื•ืชื™ ื”ื™ื™ืชื™ ืžืืจื’ืŸ ืืช ื”ืจืฉื™ืžื” ืœืคื™ ื ื•ืฉืื™ื: 1. ืกื‘ื™ื‘ืช ืคื™ืชื•ื— - ื‘ื™ืŸ ืื ื–ื” ื™ื”ื™ื” VS Code, ื”ื›ืœื™ื ืฉืœ Jetbrains ืื• vim, ื›ื“ืื™ ืœืžืฆื•ื ืกื‘ื™ื‘ืช ืคื™ืชื•ื— ืฉืืชื ืื•ื”ื‘ื™ื ื•ื›ืœ ื”ื–ืžืŸ ืœื—ืคืฉ ืกื‘ื™ื‘ื•ืช ื—ื“ืฉื•ืช. 2. ื™ื•ืขืฅ AI - ื™ืฉ ืœื ื• ืืช ChatGPT, Claude ื•ื›ืžื•ื‘ืŸ copilot, ืื‘ืœ ื’ื ืืช ื” AI ืฉืœ ืคื™ื™ืกื‘ื•ืง ื•ื–ื” ืฉืœ ื’ื•ื’ืœ ื•ืžื™ืกื˜ืจืœ ื•ืจื‘ื™ื ื ื•ืกืคื™ื. ื›ื“ืื™ ืœื”ื›ื™ืจ ื›ืœื™ื ื›ืืœื” ื•ืœืœืžื•ื“ ืื™ืš ืœืฉืœื‘ ืื•ืชื ื‘ืฆื•ืจื” ืืคืงื˜ื™ื‘ื™ืช ื‘ Workflow ืฉืœื ื•. 3. ื›ืœื™ Deployment ื• CI/CD - ื—ืฉื•ื‘ ืœื”ื‘ื™ืŸ ืื™ืš ืชื•ื›ื ื” ืขื•ื‘ืจืช ืžื”ืžื—ืฉื‘ ืฉืœื ื• ืœืฉืจืช ืื• ืฉืจืชื™ื ื‘ืขื ืŸ ื•ืื™ืš ื”ื™ื ืžื ื•ื”ืœืช ืฉื. ื™ืฉ ื”ืžื•ืŸ ื›ืœื™ื ืฉื™ื›ื•ืœื™ื ืœืขื–ื•ืจ ื‘ื–ื” ื›ืžื• Docker, Kubernetes, Ansible, Terraform ืื‘ืœ ื’ื Github Actions ื•ืจื‘ื™ื ื ื•ืกืคื™ื. 4. ื›ืœื™ ื ื™ื”ื•ืœ ื•ื ื™ื˜ื•ืจ - ื™ืฉ ื”ืžื•ืŸ ื›ืœื™ื ืื•ื˜ื•ืžื˜ื™ื™ื ืฉืขื•ื–ืจื™ื ืœื”ื‘ื™ืŸ ืžื” ืžืฆื‘ ื”ืฉืจืชื™ื, ื”ื—ืœ ืžื›ืœื™ื ืฉืžืฆื™ื’ื™ื ืœื•ื’ื™ื ื“ืจืš ืืœื” ืฉื‘ื•ื“ืงื™ื ืฉื”ืฉืจืชื™ื ืœืžืขืœื” ื•ืžืฆื™ื’ื™ื ืกื˜ื˜ื™ืกื˜ื™ืงื•ืช ื•ื’ืจืคื™ื. 5. ื‘ืกื™ืกื™ ื ืชื•ื ื™ื - ื™ืฉ ื”ืžื•ืŸ ืกื•ื’ื™ื ืฉืœ ื‘ืกื™ืกื™ ื ืชื•ื ื™ื ืžืขื ื™ื™ื ื™ื ื”ื—ืœ ืž Postgresql ื”ืกื˜ื ื“ืจื˜ื™ ื“ืจืš DynamoDB, Mongo, CouchDB, neo4j ื•ืจื‘ื™ื ื ื•ืกืคื™ื. ื›ื“ืื™ ืœื”ื›ื™ืจ ื›ืžื” ืฉื™ื•ืชืจ ืกื•ื’ื™ื ืฉืœ ื‘ืกื™ืกื™ ื ืชื•ื ื™ื ื›ื“ื™ ืœื”ืชืื™ื ืืช ื‘ืกื™ืก ื”ื ืชื•ื ื™ื ืœืžืขืจื›ืช. 6. ืฉืคื•ืช ืคื™ืชื•ื— - ืžืคืชื—ื™ Full Stack ืจื’ื™ืœื™ื ืœืขื‘ื•ื“ ื‘ TypeScript ื’ื ื‘ืฆื“ ืฉืจืช ื•ื’ื ื‘ืฆื“ ืœืงื•ื— ื•ื–ื” ื‘ืืžืช ืžืื•ื“ ื ื•ื—. ื”ื™ื•ื ื‘ื ื•ืกืฃ ืœ node.js ื™ืฉ ื’ื ืืช bun ื•ื’ื ืืช deno ืฉืžืจื™ืฆื™ื TypeScript ื‘ืื•ืคืŸ ื–ื”. ื‘ื ื•ืกืฃ ื™ืฉ ืขื“ื™ื™ืŸ ื”ืจื‘ื” ืฉืคื•ืช ืคื™ืชื•ื— ืฉืžืชืงืžืคืœื•ืช ืœ JavaScript ื•ืžืืคืฉืจื•ืช ื‘ื ื™ื™ื” ืฉืœ ื™ื™ืฉื•ืžื™ Full Stack ื‘ืฉืคื” ืื—ืช. ื ืกื• ืœืžืฆื•ื ืคืจื™ื™ืžื•ื•ืจืงื™ื ื›ืืœื” ื•ืชืจืื• ืื™ื–ื” ืžื”ื ืžืชืื™ืžื™ื ืœืคืจื•ื™ืงื˜ ืฉืœื›ื. ื›ืฉืžืกืชื›ืœื™ื ืขืœ ื›ืœื™ื ื‘ืชื•ืจ ืงื˜ื’ื•ืจื™ื•ืช ืื ื™ ื—ื•ืฉื‘ ืฉื™ื•ืชืจ ืงืœ ืœืงื—ืช ื›ืœื™ ืฉืื ื—ื ื• ื›ื‘ืจ ื”ื™ื•ื ืžืฉืชืžืฉื™ื ื‘ื• ื•ืœื—ืคืฉ ื›ืœื™ื ืื—ืจื™ื ื‘ืžืงื•ืžื• ืื• ื‘ื ื•ืกืฃ ืืœื™ื•, ืื• ืœื’ืœื•ืช ืงื˜ื’ื•ืจื™ื•ืช ื—ื“ืฉื•ืช ืฉืœ ื“ื‘ืจื™ื ืฉืืคื™ืœื• ืœื ื™ื“ืขื ื• ืฉืงื™ื™ืžื™ื.

ToCode
1 419
ื”ืคื™ืฆ'ืจ ืฉืขื“ื™ื™ืŸ ื—ืกืจ ืœื™ ื‘ืจื™ื“ืืงืก ืื—ื“ ื”ืคื™ืฆ'ืจื™ื ืฉืื ื™ ืžืื•ื“ ืื•ื”ื‘ ื‘ืจื™ืื™ื™ื’'ื ื˜ (ื’ื™ืจืกืช ื”ืงืœื•ื–'ืจ ืฉืœ ืจื™ืืงื˜) ื ืงืจื Cursors. ื–ื” ืงืฆืช ื›ืžื• useSelector ืฉืœ ืจื™ื“ืืงืก ืื‘ืœ ืขื ืืคืฉืจื•ืช ืœืขื“ื›ืŸ. ืœื“ื•ื’ืžื”:
(def state (reagent/atom {:foo {:bar "BAR"}
                          :baz "BAZ"
                          :quux "QUUX"}))
;; Now create a cursor
(def bar-cursor (reagent/cursor state [:foo :bar]))

(defn bar-component []
  (js/console.log "bar-component is rendering")
  [:div @bar-cursor])
ื”ืชื•ื›ื ื™ืช ืžื’ื“ื™ืจื” ืžืฉืชื ื” ืื—ื“ ื‘ืฉื state ืฉื‘ื• ืžื•ื—ื–ืง ื›ืœ ื”ืกื˜ื™ื™ื˜ ืฉืœ ื”ื™ื™ืฉื•ื (ื›ืžื• ื” store ื‘ืจื™ื“ืืงืก) ื•ืื– ืขื•ื“ ืžืฉืชื ื” ื‘ืฉื bar-cursor ืฉื”ื•ื ืกื•ื’ ืฉืœ ืžืฆื‘ื™ืข ืœืชื•ืš ื”ืกื˜ื™ื™ื˜. ื”ืงืจื™ืื” ืžื” cursor, ืงืฆืช ื›ืžื• ืงืจื™ืื” ืž store ื“ืจืš useSelector ื™ื•ืฆืจืช ื—ื™ื‘ื•ืจ ื‘ื™ืŸ ื”ืงื•ืžืคื•ื ื ื˜ื” ืœื—ืœืง ื”ื–ื” ื‘ืกื˜ื™ื™ื˜ ื›ืš ืฉื›ืฉื”ืžื™ื“ืข ื‘ืชื•ืš ื”ื ืชื™ื‘ [:foo :bar] ื™ืฉืชื ื” ื’ื ื”ืงื•ืžืคื•ื ื ื˜ื” ืชืจื•ื ื“ืจ ืžื—ื“ืฉ, ืื‘ืœ ื™ืฉ ืคื” ืฉื ื™ ื›ื•ื—ื•ืช ืขืœ ืฉื—ืกืจื™ื ื‘ืจื™ื“ืืงืก: 1. ื” cursor ืžื™ื•ืฆืจ ืžื—ื•ืฅ ืœืงื•ืžืคื•ื ื ื˜ื•ืช (ืœื ื›ื–ื” ืžืœื”ื™ื‘, ื’ื ื‘ืจื™ื“ืืงืก ื”ื™ื™ืชื™ ื™ื›ื•ืœ ืœื”ื’ื“ื™ืจ Selector ื‘ืงื•ื‘ืฅ ื ืคืจื“). 2. ืืคืฉืจ ืœืขื“ื›ืŸ ืืช ื” State ื“ืจืš ื” Cursor. ื”ื™ื›ื•ืœืช ื”ืฉื ื™ื” ื”ื™ื ื”ื“ื‘ืจ ื”ื’ื“ื•ืœ. ื‘ืจื™ื“ืืงืก ื‘ืฉื‘ื™ืœ ืœื”ืฉื™ื’ ืืคืงื˜ ื“ื•ืžื” ืื ื™ ืฆืจื™ืš ืœื”ื’ื“ื™ืจ Reducer ื• Action ื•ื›ืœ ื” Boilerplate.

ToCode
1 419
ื”ื˜ื™ื™ืช ื”ืคืขืœืชื ื•ืช ื”ื˜ื™ื™ืช ื”ืคืขืœืชื ื•ืช ืื•ืžืจืช ืฉืื ื—ื ื• ืžืขื“ื™ืคื™ื ืœื”ื™ื•ืช ื‘ืคืขื•ืœื”, ื•ืžื™ื™ื—ืกื™ื ื™ื•ืชืจ ืขืจืš ืœืคืขื•ืœื” ื›ืฉื”ืžืืžืฅ ื’ื“ื•ืœ ื™ื•ืชืจ. ื”ื˜ื™ื™ื” ื–ื• ืžืกื™ื˜ื” ืืช ื”ืžื‘ื˜ ืžืฉืชื™ ืขื•ื‘ื“ื•ืช ื—ืฉื•ื‘ื•ืช- 1. ื’ื ื‘ืฉื‘ื™ืœ ืœื”ื™ืฉืืจ ื‘ืžืงื•ื ืฆืจื™ืš ืœืขื‘ื•ื“. 2. ื›ืžื•ืช ื”ืžืืžืฅ ื”ื“ืจื•ืฉื” ื‘ืฉื‘ื™ืœ "ืœืœื›ืช ืื—ื•ืจื”", "ืœื”ื™ืฉืืจ ื‘ืžืงื•ื" ืื• "ืœื–ื•ื– ืงื“ื™ืžื”" ืœื ืคืจื•ืคื•ืจืฆื™ื•ื ืœื™ืช ืœืชื•ืฆืื•ืช. ื‘ืŸ ืื“ื ืฉืชืงื•ืข ื‘ืืžืฆืข ื”ื™ื ื™ืฆื˜ืจืš ืœืขื‘ื•ื“ ืงืฉื” ืจืง ื‘ืฉื‘ื™ืœ ืœื”ืฉืื™ืจ ืืช ื”ืจืืฉ ืžืขืœ ื”ืžื™ื, ืื‘ืœ ื–ื” ืœื ืื•ืžืจ ืฉื”ื•ื ืžืชืงืจื‘ ืœื—ื•ืฃ. ื”ืžืืžืฅ ื”ื•ื ื‘ืขืœ ืขืจืš ืจืง ื›ืฉื”ื•ื ืžื•ืฉืงืข ื‘ื“ื‘ืจื™ื ืฉืžืงื“ืžื™ื ืื•ืชื ื• ืœื›ื™ื•ื•ืŸ ื”ืžื˜ืจื•ืช ืฉื‘ื—ืจื ื•. ื‘ืกื™ืคื•ืจ ืขืœ ื”ืฆืคืจื“ืข ืฉืžืชื‘ืฉืœืช ื‘ืžื™ื ืฉื”ื•ืœื›ื™ื ื•ื ื”ื™ื™ื ื™ื•ืชืจ ื—ืžื™ื ืื ื—ื ื• ืื•ื”ื‘ื™ื ืœื”ื“ื’ื™ืฉ ืืช ื”ืกื•ืฃ - ื”ืฆืคืจื“ืข ืžืชื” ื›ื™ ื”ื™ื ืœื ืฉืžื” ืœื‘ ืฉืžืฆื‘ื” ื”ื•ืœืš ื•ื ื”ื™ื” ื’ืจื•ืข ื™ื•ืชืจ ื‘ื–ืžืŸ ืฉื”ื™ื ื—ืฉื‘ื” ืฉื”ื™ื ืขื•ืžื“ืช ื‘ืžืงื•ื. ื‘ื ื™ ืื“ื, ื‘ื ื™ื’ื•ื“ ืœืฆืคืจื“ืขื™ื, ืชืžื™ื“ ืžื ืกื™ื ืœืฉืคืจ ืืช ืžืฆื‘ื ื•ื”ืืชื’ืจ ื”ื•ื ืœืจืื•ืช ืžืชื™ ืœืžืจื•ืช ื”ืžืืžืฅ (ื•ืื•ืœื™ ื‘ื’ืœืœื•) ืื ื—ื ื• ื“ื•ื•ืงื ื ืฉืืจื™ื ื‘ืžืงื•ื.

ToCode
1 419
ื•ืžื” ืื ื ืชื—ื™ืœ ืžืืคืก? ื—ื‘ืจ ืฉืืœ ืื•ืชื™ ืขืœ ืขื™ืฆื•ื‘ ืžื—ื“ืฉ ืœืืชืจ ื™ืฉืŸ ืฉื›ืชื•ื‘ ื‘ Bootstrap. ื”ื•ื ื—ื™ืคืฉ Theme ื™ืคื” ื™ื•ืชืจ ืื‘ืœ ื›ืœ ื“ื‘ืจ ืฉื”ื•ื ืžืฆื ื“ืจืฉ ื™ื•ืชืจ ืžื“ื™ ื”ืชืืžื•ืช. ื”ืฉืืœื” ื”ื‘ืื” ืฉืœื™ ื”ื™ืชื” "ื•ืžื” ืื ื ืชื—ื™ืœ ืžืืคืก?", ื•ืคืชืื•ื ื”ื™ืชื” ืฉืชื™ืงื” ืฉื”ื‘ื”ื™ืจื” ืฉืขืœื™ื ื• ืขืœ ืžืฉื”ื•. ืžืกืชื‘ืจ ืฉื“ื•ื•ืงื ืื•ืชื” ื‘ื—ื™ืจื” ื™ืฉื ื” ื‘ Bootstrap ืฉื ืขืฉืชื” ืœืคื ื™ ืฉื ื™ื, ื•ื›ืœ ื”ื”ืชืืžื•ืช ืฉืขื‘ืจื• ืขืœ ื”ืืชืจ ื”ื–ื” ืžืื–, ื”ืŸ ื”ื“ื‘ืจ ืฉืกื™ื‘ืš ื”ื›ื™ ื”ืจื‘ื” ืืช ื”ืขื™ืฆื•ื‘ ื”ื—ื“ืฉ. ื”ืžืขื‘ืจ ืœ Green Field ืื™ืคืฉืจ ืœื• ืœื”ืฉืชืžืฉ ื‘ื™ื›ื•ืœื•ืช ื—ื“ืฉื•ืช ืฉืœ CSS ื•ื‘ื˜ื›ื ื™ืงื•ืช ืฉื”ื•ื ืžื›ื™ืจ ืžืคืจื•ื™ืงื˜ื™ื ืื—ืจื™ื ืขื“ื›ื ื™ื™ื ื™ื•ืชืจ ื•ื”ืคื™ืชื•ื— ื”ืชื—ื™ืœ ืœืจื•ืฅ. ื•ื›ืŸ ืœืคืขืžื™ื ื™ืฉ ื”ืžื•ืŸ ื™ืชืจื•ื ื•ืช ื‘ื”ืžืฉืš ืคื™ืชื•ื— ืขืœ ื‘ืกื™ืก ืชืฉืชื™ืช ืงื™ื™ืžืช, ื•ืื ื™ ื™ื›ื•ืœ ืœื”ื‘ื™ืŸ ืœืžื” ืื ื—ื ื• ื ืžืฉื›ื™ื ืชืžื™ื“ ืœืกื˜ื˜ื•ืก ืงื•ื•. ืื™ืŸ ื™ื•ืชืจ ื›ื™ืฃ ืžืคืฉื•ื˜ ืœื”ืขืชื™ืง ืงื•ื“ ืžืžืงื•ื ืื—ืจ ื•ืœืกื™ื™ื ืขื•ื“ ืคื™ืฆ'ืจ. ืื‘ืœ ื™ื—ื“ ืขื ื”ืงืกื ืฉืœ ื”ืกื˜ื˜ื•ืก ืงื•ื• ืชืžื™ื“ ื—ืฉื•ื‘ ืœื”ืฉืื™ืจ ื‘ืจืืฉ ืืช ื”ื‘ื—ื™ืจื” - ื›ืŸ ืื ื™ ืคื” ืขื›ืฉื™ื•. ื›ืŸ ื–ื” ื”ืคืจื•ื™ืงื˜ ืฉืื ื™ ืขื•ื‘ื“ ืขืœื™ื• ื•ื–ื” ื”ืงื•ื“ ื•ื”ืชืฉืชื™ื•ืช ืขืœื™ื”ื ื”ืคืจื•ื™ืงื˜ ืžืชื‘ืกืก. ื•ื›ืŸ ืื ื™ ื‘ื•ื—ืจ ืœื”ืžืฉื™ืš ืœื”ืฉืชืžืฉ ื‘ืื•ืชืŸ ืชืฉืชื™ื•ืช ื›ื™ ื–ืืช ื”ื“ืจืš ื”ื›ื™ ืžื”ื™ืจื” ืœืคืชื•ืจ ืืช ื”ื‘ืขื™ื” ื”ื‘ืื” ืฉืœื™. ื™ื•ื ืื—ื“ ื”ืžืฉืคื˜ ื”ื–ื” ื™ืคืกื™ืง ืœื”ื™ื•ืช ื ื›ื•ืŸ, ื•ื—ืฉื•ื‘ ืœื–ื”ื•ืช ืืช ื”ืจื’ืข ื•ืœื ืœืคื—ื“ ืœื”ืชื—ื™ืœ ืžื—ื“ืฉ.

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