ToCode
Kanalga Telegramโda oโtish
ืืืคืื ืงืฆืจืื ืืืชืื ืชืื ืืืช ืื ืื ืคืจืง
Ko'proq ko'rsatish1 419
Obunachilar
Ma'lumot yo'q24 soatlar
Ma'lumot yo'q7 kunlar
-530 kunlar
Postlar arxiv
1 419
ืืงืืกืืกืื, ืืื ืืจืืืค ืืชืืืืจ
ืฉืืืฉืช ืืฉืืงืืืื ืฉืื ืืืืืจืช ืฉืคืช ืชืื ืืช ืืคืจืืืงื ืืื, ืืืคื ืกืืจ ืืฉืืืืช:
1. ืืงืืกืืกืื - ืื ืืืืจ ืืื ืืฉืื ืฉืืืื ืืขืืื ืขื ืกืคืจืืืช ืืชืงืืืืช ืืจืืืื ืืืืช ืืขืืื ืืชืืื ืื ืื ื ืืื ื.
2. ืืื ืืจืืืค - ืื ืื ืืืงืืกืืกืื ืื ืืกืคืืง ืืื ืืืื ื ืืื ืืืฉืืื ืคืขืจืื ืืฉืคืืช ืืืจืืช.
3. ืชืืืืจ - ืื ืืืจื ืฉืืฉ ืื ืืช ืื ืืืืื ืืื ืืช ืืช ืื ืฉืื ื ืจืืฆื ืขืืืฃ ืฉืืื ื ืืืืชืืื ืขืฆืื.
ืืคืขืืื ืื ืื ื ืืืฉืืื ืฉืืื ืืจืืืค ืืขืืืจ ืืืชืืืื ืขื ืืงืืกืืกืื ืืืฉ ืื ืฉืชืืืืจ ืืื ืืืจืื ืืื ืฉืืืื ืื ืืืฃ ืืืชืื ืืขืฆืื ืืช ืืืืื (ืื ืืช ืืขืืืคืืช ืืื ืืฉืคืจ ืืช ืืืื ืืจืืืค). ืืคืจืืืงืืื ืฉืืชืืชื ืขื ืขืืฉืื ืื ืื ืืื ืืืฆื.
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"))
}
ืกื ืืื ืื ืืื ืืื ืืชืจืืืืื ืืืขืืืคืื ืฉื ืืกืืืจื ืืื, ืืื ืืืื ืื ืืืง ืืืขื ืืื ืขื ืืชืจืืืืื ืืืกืคืจืื ืืืืืืื. ืื ืืื ืืืืืื ืืื ืฉืื ืื ื ืืงืจืืช ืืกืืฃ.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}")
None1 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 ืืืืฆืื ืืืช ืืืฉ ืืืกืืื ืืช ืืฉืืื.
ืื ืงืื ืืคืืชืจืื ืืืื ืืกืงืืื: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.name1 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 ืืื ืืืช ืฉืื ืืืช ืืช ืชืืจ ืืืืืขืืช ืืื ืืงืื ืฉืื:1 419
ืงืื ืื ืื ืฉืื
ืฉืืื ืื ืฉืื ืืืืงืจื ืืื ืื ืืงืื ืืื ืืื ืฉืขืืืชื ืขืืื?
ืฆืืคืืชื ืืืฆืื ืฉื ืืฆืืจืืช ืืืื ืืช ืฉื ืืงืืืืื ืืืื ืื ืฉืืฉืื ืืืขืจื ืืืชืื ืงืื ืฉื ืจืื ืืื ืงืกื. ืื ืฉืื ืืื ืืจืงืืก ืคืจืกืื ืก (ืืืืฆืจ ืฉื ืืืื ืงืจืคื), ืืื ืืก ืืืจืืืืืก ืื ืืจืื ืืืื ืืจ.
ืืืงืื ืื ืืฉ ืืืกืฃ ืืจืฉืื ืฉื ืื ืฉืื ืืืืชืืื ืฉืืืืจืื: ืืงืื ืืืื ืืืืชืจ ืฉืืฆื ืื ืืขืืื ืขืืื ื ืืชื ืขื ืืื ืงืืืฆื ืฉื ืืชืื ืชืื ืืจืืืช ืืืืื ืืช ืฉืื ืืช ืฉืืืื ืืชืงืฉืืจืช ืืืื ืืื ืขื ืืฉื ื. ืื ืฉืื ืฉืืืืื ืืื ืืช ืืฉื ื, ืฉืืงืฉืืื, ืืฉืืืืื ืืฉืืื ืืืงืืจืชืืช ืืืฆืืจืชืืืช ืืืงืื ืืขืืืื.
ืืื ืืืืื ื - ืืฉืืืฉื ืืชืื ืช ืขื ืืืืื ืืฆืจืื ืืืชืื ืืื ืงืื ืฉืื ืืื ืฉืื ืืฆืืืช (ืฉืื ืจืง ืืื) ืืืืืื ืืืืื ืื ืืขืฆื ืืืชืื ืงืื ืฉืืื ืืืื ืืืืื ืืืืชื ืจืืข, ืื ืฉืื ืืืืื ืืจืื ืืืืื ืช ืืืืืืช ืืงืจืื ืืช ืืงืื. ืืื ืืฉืืฉ ืื 3-4 ืื ืฉืื ืฉืืืฉืืื ืขื ืืงืื ืืืืื ืฆืจืืืื ืืืืื ืืช ืืงืื ืฉื ืื ืืืืจืื, ืื ืื ื ืืืจ ืืืฉืืง ืืืจ ืืืืื ืช ืืจืืฉืืช ืืชืงืฉืืจืช ืื ืฉืืืืื ืืืืื ืืจืื ืืจืื ืืืชืจ ืืืืื ืฉื ืืชืืฆืื.
ืืืช ืืืืค ืืื ืงื ืืืืฉื ืืคืืื ืื ืืชื ื'ืื ืืืจืื ืฉืขืืืืื ืขื ืชืืง ืขืืืืืช ืื ืคืจืืืงื ืฆื: ืงืื ืืืจ ืื ืืืจื ืฉืืขืืื ืืชืื. ืืืื ืฉืืชื ืืืื ืื ืืช ืื ืืงืื ืฉืืื ืืื ืืช ืฉืืื. ืืืื ืืชืขื ืืช ืืื ืืื ืฉืืืื ืืฉื ื ืืฆืืืื ืงื ืืชืงืฉืจ ืืืืืื. ืืืืจื ืืื ืชืืื ืื ืฉืืืฆื ืงืื ืืื ืืืชืจ ืืืื ืืืชื ืื ืืชื ืืืคืืื ืืืชืื ืชืื ืืืืื ืืืชืจ.
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 ืืฉืคื ืืืช. ื ืกื ืืืฆืื ืคืจืืืืืืจืงืื ืืืื ืืชืจืื ืืืื ืืื ืืชืืืืื ืืคืจืืืงื ืฉืืื.
ืืฉืืกืชืืืื ืขื ืืืื ืืชืืจ ืงืืืืจืืืช ืื ื ืืืฉื ืฉืืืชืจ ืงื ืืงืืช ืืื ืฉืื ืื ื ืืืจ ืืืื ืืฉืชืืฉืื ืื ืืืืคืฉ ืืืื ืืืจืื ืืืงืืื ืื ืื ืืกืฃ ืืืื, ืื ืืืืืช ืงืืืืจืืืช ืืืฉืืช ืฉื ืืืจืื ืฉืืคืืื ืื ืืืขื ื ืฉืงืืืืื.
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.1 419
ืืืืืช ืืคืขืืชื ืืช
ืืืืืช ืืคืขืืชื ืืช ืืืืจืช ืฉืื ืื ื ืืขืืืคืื ืืืืืช ืืคืขืืื, ืืืืืืกืื ืืืชืจ ืขืจื ืืคืขืืื ืืฉืืืืืฅ ืืืื ืืืชืจ. ืืืืื ืื ืืกืืื ืืช ืืืื ืืฉืชื ืขืืืืืช ืืฉืืืืช-
1. ืื ืืฉืืื ืืืืฉืืจ ืืืงืื ืฆืจืื ืืขืืื.
2. ืืืืช ืืืืืฅ ืืืจืืฉื ืืฉืืื "ืืืืช ืืืืจื", "ืืืืฉืืจ ืืืงืื" ืื "ืืืื ืงืืืื" ืื ืคืจืืคืืจืฆืืื ืืืช ืืชืืฆืืืช.
ืื ืืื ืฉืชืงืืข ืืืืฆืข ืืื ืืฆืืจื ืืขืืื ืงืฉื ืจืง ืืฉืืื ืืืฉืืืจ ืืช ืืจืืฉ ืืขื ืืืื, ืืื ืื ืื ืืืืจ ืฉืืื ืืชืงืจื ืืืืฃ. ืืืืืฅ ืืื ืืขื ืขืจื ืจืง ืืฉืืื ืืืฉืงืข ืืืืจืื ืฉืืงืืืื ืืืชื ื ืืืืืื ืืืืจืืช ืฉืืืจื ื.
ืืกืืคืืจ ืขื ืืฆืคืจืืข ืฉืืชืืฉืืช ืืืื ืฉืืืืืื ืื ืืืื ืืืชืจ ืืืื ืื ืื ื ืืืืืื ืืืืืืฉ ืืช ืืกืืฃ - ืืฆืคืจืืข ืืชื ืื ืืื ืื ืฉืื ืื ืฉืืฆืื ืืืื ืื ืืื ืืจืืข ืืืชืจ ืืืื ืฉืืื ืืฉืื ืฉืืื ืขืืืืช ืืืงืื. ืื ื ืืื, ืื ืืืื ืืฆืคืจืืขืื, ืชืืื ืื ืกืื ืืฉืคืจ ืืช ืืฆืื ืืืืชืืจ ืืื ืืจืืืช ืืชื ืืืจืืช ืืืืืฅ (ืืืืื ืืืืื) ืื ืื ื ืืืืงื ื ืฉืืจืื ืืืงืื.
1 419
ืืื ืื ื ืชืืื ืืืคืก?
ืืืจ ืฉืื ืืืชื ืขื ืขืืฆืื ืืืืฉ ืืืชืจ ืืฉื ืฉืืชืื ื Bootstrap. ืืื ืืืคืฉ Theme ืืคื ืืืชืจ ืืื ืื ืืืจ ืฉืืื ืืฆื ืืจืฉ ืืืชืจ ืืื ืืชืืืืช. ืืฉืืื ืืืื ืฉืื ืืืชื "ืืื ืื ื ืชืืื ืืืคืก?", ืืคืชืืื ืืืชื ืฉืชืืงื ืฉืืืืืจื ืฉืขืืื ื ืขื ืืฉืื.
ืืกืชืืจ ืฉืืืืงื ืืืชื ืืืืจื ืืฉื ื ื Bootstrap ืฉื ืขืฉืชื ืืคื ื ืฉื ืื, ืืื ืืืชืืืืช ืฉืขืืจื ืขื ืืืชืจ ืืื ืืื, ืื ืืืืจ ืฉืกืืื ืืื ืืจืื ืืช ืืขืืฆืื ืืืืฉ. ืืืขืืจ ื Green Field ืืืคืฉืจ ืื ืืืฉืชืืฉ ืืืืืืืช ืืืฉืืช ืฉื CSS ืืืืื ืืงืืช ืฉืืื ืืืืจ ืืคืจืืืงืืื ืืืจืื ืขืืื ืืื ืืืชืจ ืืืคืืชืื ืืชืืื ืืจืืฅ.
ืืื ืืคืขืืื ืืฉ ืืืื ืืชืจืื ืืช ืืืืฉื ืคืืชืื ืขื ืืกืืก ืชืฉืชืืช ืงืืืืช, ืืื ื ืืืื ืืืืื ืืื ืื ืื ื ื ืืฉืืื ืชืืื ืืกืืืืก ืงืื. ืืื ืืืชืจ ืืืฃ ืืคืฉืื ืืืขืชืืง ืงืื ืืืงืื ืืืจ ืืืกืืื ืขืื ืคืืฆ'ืจ. ืืื ืืื ืขื ืืงืกื ืฉื ืืกืืืืก ืงืื ืชืืื ืืฉืื ืืืฉืืืจ ืืจืืฉ ืืช ืืืืืจื - ืื ืื ื ืคื ืขืืฉืื. ืื ืื ืืคืจืืืงื ืฉืื ื ืขืืื ืขืืื ืืื ืืงืื ืืืชืฉืชืืืช ืขืืืื ืืคืจืืืงื ืืชืืกืก. ืืื ืื ื ืืืืจ ืืืืฉืื ืืืฉืชืืฉ ืืืืชื ืชืฉืชืืืช ืื ืืืช ืืืจื ืืื ืืืืจื ืืคืชืืจ ืืช ืืืขืื ืืืื ืฉืื. ืืื ืืื ืืืฉืคื ืืื ืืคืกืืง ืืืืืช ื ืืื, ืืืฉืื ืืืืืช ืืช ืืจืืข ืืื ืืคืื ืืืชืืื ืืืืฉ.
1 419
ืืื ืืื ืืื
ืืื ืืื ืืื ืืืจ ืื ืืคืฉืจ ืืื ืืช ืืช ืืคืจืืืงื ืขื ืืืืฉื ืฉืื. ืืืคืืื ืืืืื ื ืืืจืืืืืืช ืืื ืืื ืืืฆืื ืืช ืืืืจืกืืืช ืืืฉื ืืช ืฉื ืื ืืชืืื ืืช ืฉืฆืจืืืื. ืืืชื ืื ืกื ืืืืืืจ ืืืคื ืืืืื ื ืืืฉื ื ืืืื ืฉืืจืืฆื ืืืชื ืคืขื ืืืจืื ื ืืื ืื ืืืฆื, ืืืคื ืืฉื ืืชื ืืืื ืฉืื ืืืืืจ ืืื. ืฉืืคืจืืืงื ืืื ืืืจ ืืืืจ. ืฉืฆืจืื ืืืืฉืื ืืืื.
ืื-
ืืื ืืืื ืืื ืืฆืืจืคื ืืืฃ ืืฉืชืืฉืื ืืืฉืื ืืืขืจืืช. ืืื ืืืฉ ืฉืืืื ืฉืืฆืื ืืช ืืคืจืืืงื ืฉืื ืืจืฆืื ืืกืคืจ ืืืืจืืื, ืืืคื ืืฉื ืืฆืืืช ืืืจืืืื ืืืื ืื ืฉืืขืืืื ืืจืืืื ืืืงื ืฉื ื. ืืื ืืืื ืืื ืืชื ืืืื ืฉืืืื ืืื ืืขื ืืืืฉืืจ ืืขืืืื ืืื ืืื ืืื ืืืฉืงืืข Full Time ืืคืจืืืงื. ืฉืืืื ืขืืืช ืขื ืืืืจ ืืืืื ืืื.
ืืจืืืช ืืืืืืช ืืืืจืืืช "ืคืืชืืืืืืช", ืืื ืืืืช ืฉืื ืื ืงืจื ืืืื ืืื. ืชืืืืืื ืืืื ืืื ืืื ืืื ืืืชืจ ืืืจ ืืื ืคืชืืื ืืจืื ืืืชืจ ืืื ืืืจ. ืืืชืืจ ืฉืื ื ืืื ืืื ืืช ืืช ืืชืืืืืื ืื ืืื ืื ืืืฉืืืจ ืืช ืืฉืืืืื. ืืชืืฆืืืช ืืืจ ืืืืขื ืขื ืจืืืืช ืืกืืฃ.
Endi mavjud! Telegram Tadqiqoti 2025 โ yilning asosiy insaytlari 
