es
Feedback
ToCode

ToCode

Ir al canal en Telegram

ื˜ื™ืคื™ื ืงืฆืจื™ื ืœืžืชื›ื ืชื™ื ืžืืช ื™ื ื•ืŸ ืคืจืง

Mostrar mรกs
1 420
Suscriptores
+124 horas
+17 dรญas
-430 dรญas
Archivo de publicaciones
ToCode
1 420
ืžื›ื•ืจื™ื ืœื”ืคืกื“ื™ื ืื ื™ืฉ ื“ื‘ืจ ืฉื”ืžื•ื— ื”ืื ื•ืฉื™ ืฉื•ื ื ื™ื•ืชืจ ืžื›ืœ ื–ื” ืœื”ื•ื“ื•ืช ื‘ื”ืคืกื“, ืžื” ืฉื’ื•ืจื ื‘ืฆื•ืจื” ืื‘ืกื•ืจื“ื™ืช ื“ื•ื•ืงื ืœื™ื•ืชืจ ื”ืคืกื“ื™ื ืื• ื”ืคืกื“ื™ื ื™ื•ืชืจ ื’ื“ื•ืœื™ื. ื›ืžื• ืžื”ืžืจ ืฉืœื ืžื•ื›ืŸ ืœื”ื•ื“ื•ืช ื‘ื”ืคืกื“ ื•ืจืง ืžืขืœื” ืืช ืกื›ื•ื ื”ื”ื™ืžื•ืจ, ื›ืš ืžืชื›ื ืชื™ื ืขื ื›ื•ื•ื ื•ืช ื˜ื•ื‘ื•ืช ืžืฆืœื™ื—ื™ื ืœื”ืžืฉื™ืš ืœืขื‘ื•ื“ ืขืœ ืคื™ืฆ'ืจ ืฉื”ื•ื ื‘ืขืฆื ื—ื•ืจ ืฉื—ื•ืจ, ื‘ืœื™ ืœื”ื‘ื™ืŸ ืฉื”ืงื•ื“ ืฉื›ื‘ืจ ื›ืชื‘ื ื• ื”ื•ื ื”ืžืœื›ื•ื“ืช ื•ืฉื•ื ื“ื‘ืจ ื˜ื•ื‘ ืœื ื™ืฆื ืžื”ืกื‘ืš ื”ื–ื”. ื™ืฉ ื™ืžื™ื ืฉื”ื“ื‘ืจ ื”ื›ื™ ื˜ื•ื‘ ืฉืืคืฉืจ ืœืขืฉื•ืช ื‘ืฉื‘ื™ืœ ื”ืคืจื•ื™ืงื˜ ื”ื•ื git stash. ื›ืŸ ืกื˜ืืฉ, ืœื ืœื™ืฆื•ืจ ืื™ื–ื” ื‘ืจืื ืฅ ืฉืขื•ื“ ื—ื•ื“ืฉื™ื™ื ืžื™ืฉื”ื• ื™ื‘ื•ื ื•ื™ืฆื™ืข "ืœื”ื—ื™ื•ืช ืืช ื”ืคื™ืฆ'ืจ", ืกื˜ืืฉ ืฉืœื ืจื•ืื™ื (ื”ืืžื™ืฆื•ืช ื™ื›ื•ืœื•ืช ืœื ืกื•ืช git restore, ืื‘ืœ ืœื™ ืืฃ ืคืขื ืœื ื”ื™ื” ืื•ืžืฅ), ื•ืฉืœื ืžืกืคืจื™ื ืขืœื™ื• ืœืืฃ ืื—ื“. ืœืงื‘ื•ืจ ืืช ื”ืคื™ืฆ'ืจ, ืœื”ื•ืฆื™ื ืืช ื”ื’ื™ืจืกื” ื•ืœื”ืžืฉื™ืš ื”ืœืื”. ื‘ืกืคืจื™ื ื˜ ื”ื‘ื ืื•ืœื™ ื ื‘ื ื” ืืช ื–ื” ืžื—ื“ืฉ ืžืืคืก ื‘ื“ืจืš ืื—ืจืช.

ToCode
1 420
ื”ื™ื•ื ืœืžื“ืชื™: ืขื“ื™ืฃ ืœื”ืฉื•ื•ืช ื˜ื™ืคื•ืกื™ื ื‘ืคื™ื™ืชื•ืŸ ืขื is ื”ืœื™ื ื˜ืจ ืฉืœ ืคื™ื™ืชื•ืŸ ื”ืชืจื’ื– ืขืœื™ื™ ื”ื™ื•ื ื›ื™ ื›ืชื‘ืชื™ ืงื•ื“ ื›ื–ื”:
if type(x) == int:
    ...
ื•ืœื, ืœื ืขื ื™ื™ืŸ ืื•ืชื• ืื ืื ื™ ืžืฉืชืžืฉ ื‘ type ืื• ื‘ isinstance ื”ืคืขื ื•ื‘ื›ืœ ืžืงืจื” ื‘ืืžืช ืจืฆื™ืชื™ ืœื‘ื“ื•ืง ืืช ื” type. ืžื” ืฉื”ืคืจื™ืข ืœื• ื”ื™ื” ื“ื•ื•ืงื ื” ==, ื›ื™ ื‘ืขื•ืœื ืฉืœ ื”ืœื™ื ื˜ืจ ื”ืฉื•ื•ืื” ื‘ื™ืŸ ื˜ื™ืคื•ืกื™ื ืชืขื‘ื•ื“ ื˜ื•ื‘ ื™ื•ืชืจ ืขื is, ื›ืœื•ืžืจ ื–ื” ื”ืงื•ื“ ืฉื”ื™ื™ืชื™ ืฆืจื™ืš ืœื›ืชื•ื‘:
if type(x) is int:
    ...
ื›ื™ ื‘ืขื‘ื•ื“ื” ืขื ื˜ื™ืคื•ืกื™ื ื–ื”ื•ืช ื•ืฉื™ื•ื•ื™ื•ืŸ ื–ื” ืื•ืชื• ื“ื‘ืจ. ื ื•, ื”ืœื›ืชื™ ืœื‘ื“ื•ืง ืื ื™ืฉ ื”ื‘ื“ืœ ื‘ื–ืžืŸ ืจื™ืฆื” ื‘ื™ืŸ ืฉืชื™ ื”ืืคืฉืจื•ื™ื•ืช:
In [2]: %timeit type(8) == int
15.6 ns ยฑ 0.091 ns per loop (mean ยฑ std. dev. of 7 runs, 100,000,000 loops each)

In [3]: %timeit type(8) is int
13.4 ns ยฑ 0.0661 ns per loop (mean ยฑ std. dev. of 7 runs, 100,000,000 loops each)
ื•ื›ืŸ ื™ืฉ, ืื‘ืœ ื›ืœ ื›ืš ืงื˜ืŸ ืฉื–ื” ืœื ื‘ืืžืช ืžืฉื ื”, ืžื” ืฉื”ื•ืคืš ืืช ื”ืฉืืœื” ืœืขื ื™ื™ืŸ ืฉืœ ื˜ืขื. ื•ืžืื—ืจ ื•ืขืœ ื˜ืขื ื•ืขืœ ืจื™ื— ืœื ืžืชื•ื•ื›ื—ื™ื ืขื PEP8 ืื ื—ื ื• ื ืฉืืจื™ื ืขื is ื›ื“ื™ ืœื”ืฉื•ื•ืช ื˜ื™ืคื•ืกื™ื, ื›ืžื• ื’ื ื”ืฉื•ื•ืื•ืช ืœ None. ื .ื‘. ื‘ืžืงื•ืžื•ืช ื™ื•ืชืจ ืžืขื ื™ื™ื ื™ื ื”ืฉื•ื•ืื” ืขื is ืื• == ื™ื›ื•ืœื” ืœื”ื™ื•ืช ื‘ืขืœืช ืžืฉืžืขื•ืช, ืœืžืฉืœ ื‘ืขื‘ื•ื“ื” ืขื ืจืฉื™ืžื•ืช:
In [14]: [1, 2, 3] == [1, 2, 3]
Out[14]: True

In [15]: [1, 2, 3] is [1, 2, 3]
Out[15]: False
ืื‘ืœ ื‘ืžืงืจื™ื ื›ืืœื” ื‘ื“ืจืš ื›ืœืœ ื ืฉืงื™ืข ื™ื•ืชืจ ืžื—ืฉื‘ื” ื‘ื‘ื—ื™ืจืช ื”ืื•ืคืจื˜ื•ืจ ื”ื ื›ื•ืŸ ืฉื™ืชืื™ื ืœืžื” ืฉื”ืชื•ื›ื ื™ืช ืืžื•ืจื” ืœืขืฉื•ืช.

ToCode
1 420
ืจื™ืคืงื˜ื•ืจื™ื ื’ ื˜ื•ื‘ ื™ื•ืชืจ ืž Mock-ื™ื ื”ื“ื•ื’ืžื” ื”ื™ื•ื ื”ื™ื ื‘ืคื™ื™ืชื•ืŸ ืื‘ืœ ื”ืงื•ื ืกืคื˜ ื ื›ื•ืŸ ื‘ื›ืœ ืฉืคื”. ื”ืงื•ื“ ื”ื‘ื ื”ื•ื ืžื™ืžื•ืฉ ืœืžืฉื—ืง ื ื™ื—ื•ืฉ ืžืกืคืจื™ื. ื ื›ื•ืŸ ื”ื•ื ืœื ืžืชื•ื—ื›ื ื‘ืžื™ื•ื—ื“ ืื‘ืœ ื™ืขื‘ื•ื“ ื‘ืฉื‘ื™ืœ ื”ื“ื•ื’ืžื”. ื”ืžื—ืฉื‘ ืžื’ืจื™ืœ ืžืกืคืจ ืกื•ื“ื™, ืืชื” ืžื ืกื” ืœื ื—ืฉ ืื•ืชื• ื•ื”ืžื—ืฉื‘ ืขื•ื ื” ื‘"ื’ื“ื•ืœ ืžื“ื™" ืื• "ืงื˜ืŸ ืžื“ื™" ืขื“ ืฉืžื’ื™ืขื™ื ืœืžืกืคืจ ื”ื ื›ื•ืŸ. ื–ื” ืงื•ื“ ืฉืขื•ื‘ื“:
def main():
    secret_number = random.randint(1, 100)
    while True:
        next_guess = int(input("Next guess: "))
        if next_guess == secret_number:
            print("Bravo! You guessed it")
            break
        elif next_guess < secret_number:
            print("Sorry, too small")
        else:
            print("Sorry, too large")
ื›ืœ ืžื” ืฉืฆืจื™ืš ื‘ืฉื‘ื™ืœ ืœื‘ื“ื•ืง ืืช ื”ืงื•ื“ ื”ื•ื ืœื›ืชื•ื‘ ื›ืžื” Mock-ื™ื, ืœืžืฉืœ ืœื“ืจื•ืก ืืช input ื•ืืช random.randint ื•ืื– ืœื”ืกืชื›ืœ ืžื” ื”ื•ื“ืคืก. ืœืžืฉืœ ื”ื‘ื“ื™ืงื” ื”ื‘ืื” ืžื•ื•ื“ืืช ืฉื›ืฉืžืฉืชืžืฉ ืžื ื—ืฉ ืืช ื”ืžืกืคืจ ื”ืชื•ื›ื ื™ืช ืชื“ืคื™ืก ืืช ื”ื”ื•ื“ืขื” ื”ื ื›ื•ื ื” ื•ืชืฆื ืžื”ืœื•ืœืื”:
def test_stop_when_guess_is_correct(capsys):
    with patch('builtins.input', new=lambda _: "10\n"):
        with patch('random.randint') as randint:
            randint.return_value = 10
            main()
            assert capsys.readouterr()[0] == "Bravo! You guessed it\n"
ื–ื” ื ื”ื™ื” ืงืฆืช ื™ื•ืชืจ ืžืกื•ื‘ืš ื›ืฉืจื•ืฆื™ื ืœื•ื•ื“ื ืืช ื”ืชืฉื•ื‘ื” ืฉืœ ื”ืžืฉื—ืง ืœื ื™ื—ื•ืฉ ื’ื‘ื•ื” ืžื“ื™:
def test_says_too_small_when_guessing_small_number(capsys):
    with patch('builtins.input') as fake_input:
        with patch('random.randint') as randint:
            fake_input.side_effect = ["10\n"]
            randint.return_value = 30
            try:
                main()
            except StopIteration:
                pass
            assert capsys.readouterr()[0] == "Sorry, too small\n"
ื‘ืชื•ื›ื ื™ืช ืืžื™ืชื™ืช ืขื ื”ืจื‘ื” ื™ื•ืชืจ ืชืœื•ื™ื•ืช ืžืขืจื›ืช ื” Mock-ื™ื ืชืฆื ืžื”ืจ ืžืฉืœื™ื˜ื”. ื”ื‘ื“ื™ืงื•ืช ื™ื”ื™ื• ืžืกื•ื‘ื›ื•ืช ื•ื™ืงืฉื• ืขืœ ืจื™ืคืงื˜ื•ืจื™ื ื’ ืฉืœ ื”ืงื•ื“, ืขื“ ืฉื‘ื“ื™ืงื•ืช ื™ืชื—ื™ืœื• ืœื”ื™ื›ืฉืœ ื‘ืฆื•ืจื” ืกืคื•ื ื˜ื ื™ืช. ืขื›ืฉื™ื• ื ื ืกื” ืชืจื’ื™ืœ ืื—ืจ ื•ื”ื•ื ืœืืจื’ืŸ ืžื—ื“ืฉ ืืช ื”ืงื•ื“ ื›ื“ื™ ืฉืœื ื ืฆื˜ืจืš Mock-ื™ื. ื‘ื“ื™ืงื•ืช ื˜ื•ื‘ื•ืช ืขืฉื•ื™ื•ืช ืœื”ื™ืจืื•ืช ื›ืš:
def test_equal():
    assert game.check_user_input(20, "20\n") == game.TEXT['=']


def test_too_large():
    assert game.check_user_input(20, "50\n") == game.TEXT['>']


def test_too_small():
    assert game.check_user_input(20, "10\n") == game.TEXT['<']


def test_stop_when_equal(capsys):
    game.game(50, ["20\n", "40\n", "50\n", "80\n"])
    assert capsys.readouterr()[0] == f"""{game.TEXT['<']}
{game.TEXT['<']}
{game.TEXT['=']}
"""
ื ืฉื™ื ืœื‘ ืฉื›ืœ ื‘ื“ื™ืงื” ื”ืคืขื ื‘ื•ื“ืงืช ื‘ื“ื™ื•ืง ืืช ืžื” ืฉื”ื™ื ืฆืจื™ื›ื” ื‘ืœื™ ืœืžืœื ืืช ื”ืคื•ื ืงืฆื™ื” ื‘ Boilerplate ืฉืœ ื“ืจื™ืกื•ืช. ื•ื”ืงื•ื“ ืขืฆืžื•? ื”ื ื” ื”ื’ื™ืจืกื” ื”ื—ื“ืฉื” ืฉืขื•ืฉื” ื‘ื“ื™ื•ืง ืืช ืื•ืชื• ื“ื‘ืจ ื•ืžืชืื™ืžื” ืœืงื•ื“ ื”ื‘ื“ื™ืงื•ืช ื”ื—ื“ืฉ:
from typing import Callable
import random
import itertools

TEXT = {
    "=": "Bravo! You guessed it",
    "<": "Sorry, too small",
    ">": "Sorry, too large"
}

MIN = 1
MAX = 100


def check_user_input(secret_number: int, user_value: str) -> str:
    if int(user_value) == secret_number:
        return TEXT['=']
    elif int(user_value) < secret_number:
        return TEXT['<']
    else:
        return TEXT['>']


def input_stream():
    while True:
        yield input("Next Guess: ")

def secret_number_generator():
    return random.randint(MIN, MAX)


def game(secret_number, inputs):
    responses = (check_user_input(secret_number, i) for i in inputs)
    for response in responses:
        print(response)
        if response == TEXT['=']:
            break


if __name__ == "__main__":
    game(secret_number_generator(), input_stream())
ื•ื ื›ื•ืŸ ื–ื” ืงื•ื“ ืฉืœ 41 ืฉื•ืจื•ืช ื‘ืžืงื•ื 18. ื•ืื ื™ ืžื›ื™ืจ ื’ื ืืช ื”ื˜ื™ืขื•ืŸ ืฉืงืœ ื™ื•ืชืจ ืœืชื—ื–ืง ืงื•ื“ ืงืฆืจ ืžืืฉืจ ืงื•ื“ ืืจื•ืš, ื•ื”ื•ื ื ื›ื•ืŸ ื‘ืžื™ื“ื” ืžืกื•ื™ืžืช. ื”ื‘ืขื™ื” ืฉืื—ืจื™ ืฉื”ืงื•ื“ ืขื•ื‘ืจ ืื•ืจืš ืžืกื•ื™ื ื”ื•ื ื›ื‘ืจ ืœื ื ื—ืฉื‘ "ืงืฆืจ". ืงื•ื“ ืฉืœ 20,000 ืฉื•ืจื•ืช ืขื ื‘ื“ื™ืงื•ืช ื•ื—ืœื•ืงื” ื ื›ื•ื ื” ืœืคื•ื ืงืฆื™ื•ืช ื”ื•ื ื™ื•ืชืจ ืงืœ ืœืชื—ื–ื•ืงื” ืžืืฉืจ ืงื•ื“ ืฉืœ 10,000 ืฉื•ืจื•ืช ืžื‘ื•ืœื’ื ื•ืช.

ToCode
1 420
ืจื™ืคืงื˜ื•ืจื™ื ื’ ื˜ื•ื‘ ื™ื•ืชืจ ืž Mock-ื™ื ื”ื“ื•ื’ืžื” ื”ื™ื•ื ื”ื™ื ื‘ืคื™ื™ืชื•ืŸ ืื‘ืœ ื”ืงื•ื ืกืคื˜ ื ื›ื•ืŸ ื‘ื›ืœ ืฉืคื”. ื”ืงื•ื“ ื”ื‘ื ื”ื•ื ืžื™ืžื•ืฉ ืœืžืฉื—ืง ื ื™ื—ื•ืฉ ืžืกืคืจื™ื. ื ื›ื•ืŸ ื”ื•ื ืœื ืžืชื•ื—ื›ื ื‘ืžื™ื•ื—ื“ ืื‘ืœ ื™ืขื‘ื•ื“ ื‘ืฉื‘ื™ืœ ื”ื“ื•ื’ืžื”. ื”ืžื—ืฉื‘ ืžื’ืจื™ืœ ืžืกืคืจ ืกื•ื“ื™, ืืชื” ืžื ืกื” ืœื ื—ืฉ ืื•ืชื• ื•ื”ืžื—ืฉื‘ ืขื•ื ื” ื‘"ื’ื“ื•ืœ ืžื“ื™" ืื• "ืงื˜ืŸ ืžื“ื™" ืขื“ ืฉืžื’ื™ืขื™ื ืœืžืกืคืจ ื”ื ื›ื•ืŸ. ื–ื” ืงื•ื“ ืฉืขื•ื‘ื“:
def main():
    secret_number = random.randint(1, 100)
    while True:
        next_guess = int(input("Next guess: "))
        if next_guess == secret_number:
            print("Bravo! You guessed it")
            break
        elif next_guess < secret_number:
            print("Sorry, too small")
        else:
            print("Sorry, too large")
ื›ืœ ืžื” ืฉืฆืจื™ืš ื‘ืฉื‘ื™ืœ ืœื‘ื“ื•ืง ืืช ื”ืงื•ื“ ื”ื•ื ืœื›ืชื•ื‘ ื›ืžื” Mock-ื™ื, ืœืžืฉืœ ืœื“ืจื•ืก ืืช input ื•ืืช random.randint ื•ืื– ืœื”ืกืชื›ืœ ืžื” ื”ื•ื“ืคืก. ืœืžืฉืœ ื”ื‘ื“ื™ืงื” ื”ื‘ืื” ืžื•ื•ื“ืืช ืฉื›ืฉืžืฉืชืžืฉ ืžื ื—ืฉ ืืช ื”ืžืกืคืจ ื”ืชื•ื›ื ื™ืช ืชื“ืคื™ืก ืืช ื”ื”ื•ื“ืขื” ื”ื ื›ื•ื ื” ื•ืชืฆื ืžื”ืœื•ืœืื”:
def test_stop_when_guess_is_correct(capsys):
    with patch('builtins.input', new=lambda _: "10\n"):
        with patch('random.randint') as randint:
            randint.return_value = 10
            main()
            assert capsys.readouterr()[0] == "Bravo! You guessed it\n"
ื–ื” ื ื”ื™ื” ืงืฆืช ื™ื•ืชืจ ืžืกื•ื‘ืš ื›ืฉืจื•ืฆื™ื ืœื•ื•ื“ื ืืช ื”ืชืฉื•ื‘ื” ืฉืœ ื”ืžืฉื—ืง ืœื ื™ื—ื•ืฉ ื’ื‘ื•ื” ืžื“ื™:
def test_says_too_small_when_guessing_small_number(capsys):
    with patch('builtins.input') as fake_input:
        with patch('random.randint') as randint:
            fake_input.side_effect = ["10\n"]
            randint.return_value = 30
            try:
                main()
            except StopIteration:
                pass
            assert capsys.readouterr()[0] == "Sorry, too small\n"
ื‘ืชื•ื›ื ื™ืช ืืžื™ืชื™ืช ืขื ื”ืจื‘ื” ื™ื•ืชืจ ืชืœื•ื™ื•ืช ืžืขืจื›ืช ื” Mock-ื™ื ืชืฆื ืžื”ืจ ืžืฉืœื™ื˜ื”. ื”ื‘ื“ื™ืงื•ืช ื™ื”ื™ื• ืžืกื•ื‘ื›ื•ืช ื•ื™ืงืฉื• ืขืœ ืจื™ืคืงื˜ื•ืจื™ื ื’ ืฉืœ ื”ืงื•ื“, ืขื“ ืฉื‘ื“ื™ืงื•ืช ื™ืชื—ื™ืœื• ืœื”ื™ื›ืฉืœ ื‘ืฆื•ืจื” ืกืคื•ื ื˜ื ื™ืช. ืขื›ืฉื™ื• ื ื ืกื” ืชืจื’ื™ืœ ืื—ืจ ื•ื”ื•ื ืœืืจื’ืŸ ืžื—ื“ืฉ ืืช ื”ืงื•ื“ ื›ื“ื™ ืฉืœื ื ืฆื˜ืจืš Mock-ื™ื. ื‘ื“ื™ืงื•ืช ื˜ื•ื‘ื•ืช ืขืฉื•ื™ื•ืช ืœื”ื™ืจืื•ืช ื›ืš:
def test_equal():
    assert game.check_user_input(20, "20\n") == game.TEXT['=']


def test_too_large():
    assert game.check_user_input(20, "50\n") == game.TEXT['>']


def test_too_small():
    assert game.check_user_input(20, "10\n") == game.TEXT['<']


def test_stop_when_equal(capsys):
    game.game(50, ["20\n", "40\n", "50\n", "80\n"])
    assert capsys.readouterr()[0] == f"""{game.TEXT['<']}
{game.TEXT['<']}
{game.TEXT['=']}
"""
ื ืฉื™ื ืœื‘ ืฉื›ืœ ื‘ื“ื™ืงื” ื”ืคืขื ื‘ื•ื“ืงืช ื‘ื“ื™ื•ืง ืืช ืžื” ืฉื”ื™ื ืฆืจื™ื›ื” ื‘ืœื™ ืœืžืœื ืืช ื”ืคื•ื ืงืฆื™ื” ื‘ Boilerplate ืฉืœ ื“ืจื™ืกื•ืช. ื•ื”ืงื•ื“ ืขืฆืžื•? ื”ื ื” ื”ื’ื™ืจืกื” ื”ื—ื“ืฉื” ืฉืขื•ืฉื” ื‘ื“ื™ื•ืง ืืช ืื•ืชื• ื“ื‘ืจ ื•ืžืชืื™ืžื” ืœืงื•ื“ ื”ื‘ื“ื™ืงื•ืช ื”ื—ื“ืฉ:
from typing import Callable
import random
import itertools

TEXT = {
    "=": "Bravo! You guessed it",
    "<": "Sorry, too small",
    ">": "Sorry, too large"
}

MIN = 1
MAX = 100


def check_user_input(secret_number: int, user_value: str) -> str:
    if int(user_value) == secret_number:
        return TEXT['=']
    elif int(user_value) < secret_number:
        return TEXT['<']
    else:
        return TEXT['>']


def input_stream():
    while True:
        yield input("Next Guess: ")

def secret_number_generator():
    return random.randint(MIN, MAX)


def game(secret_number, inputs):
    responses = (check_user_input(secret_number, i) for i in inputs)
    for response in responses:
        print(response)
        if response == TEXT['=']:
            break


if __name__ == "__main__":
    game(secret_number_generator(), input_stream())
ื•ื ื›ื•ืŸ ื–ื” ืงื•ื“ ืฉืœ 41 ืฉื•ืจื•ืช ื‘ืžืงื•ื 18. ื•ืื ื™ ืžื›ื™ืจ ื’ื ืืช ื”ื˜ื™ืขื•ืŸ ืฉืงืœ ื™ื•ืชืจ ืœืชื—ื–ืง ืงื•ื“ ืงืฆืจ ืžืืฉืจ ืงื•ื“ ืืจื•ืš, ื•ื”ื•ื ื ื›ื•ืŸ ื‘ืžื™ื“ื” ืžืกื•ื™ืžืช. ื”ื‘ืขื™ื” ืฉืื—ืจื™ ืฉื”ืงื•ื“ ืขื•ื‘ืจ ืื•ืจืš ืžืกื•ื™ื ื”ื•ื ื›ื‘ืจ ืœื ื ื—ืฉื‘ "ืงืฆืจ". ืงื•ื“ ืฉืœ 20,000 ืฉื•ืจื•ืช ืขื ื‘ื“ื™ืงื•ืช ื•ื—ืœื•ืงื” ื ื›ื•ื ื” ืœืคื•ื ืงืฆื™ื•ืช ื”ื•ื ื™ื•ืชืจ ืงืœ ืœืชื—ื–ื•ืงื” ืžืืฉืจ ืงื•ื“ ืฉืœ 10,000 ืฉื•ืจื•ืช ืžื‘ื•ืœื’ื ื•ืช.

ToCode
1 420
ืื ื—ื ื• ื‘ 2024 ื•ืื ื™ ืขื“ื™ื™ืŸ ืฆืจื™ืš ืœืฉื‘ื•ืจ ืืช ื”ืฉื™ื ื™ื™ื ื‘ืฉื‘ื™ืœ ืœืขื‘ื•ื“ ืขื ืžืกืคืจื™ื ื‘ืกืงืืœื” ื›ืŸ ืื ื™ ืžื‘ื™ืŸ ืฉื™ืฉ ืžืกืคืจื™ื ื’ื“ื•ืœื™ื ื•ืžืกืคืจื™ื ืงื˜ื ื™ื ื•ืฉืžืกืคืจื™ื ืขื“ ื’ื•ื“ืœ ืžืกื•ื™ื ืงืœ ืœื™ื™ืฆื’ ื‘ืฆื•ืจื” ืžืกื•ื™ืžืช ื•ื”ื—ืœ ืžื”ื’ื•ื“ืœ ื”ื–ื” ื”ืžื—ืฉื‘ ืฆืจื™ืš ืœื™ื™ืฆื’ ืืช ื”ืžืกืคืจื™ื ืื—ืจืช. ืื‘ืœ ืขื ืฉืคื•ืช ื›ืžื• ืคื™ื™ืชื•ืŸ ื•ื˜ื™ื™ืคืกืงืจื™ืคื˜ ืฉื›ื•ื‘ืฉื•ืช ืืช ื”ืขื•ืœื ืกืงืืœื” ืœื ื™ื›ื•ืœื” ืœื”ืžืฉื™ืš ืœืกื‘ืš ืื•ืชื™ ืขื ื’ื“ืœื™ื ืฉืœ ืžืกืคืจื™ื. ื”ืงื•ื“ ืฉืœ ื”ืงื™ื˜ื•ืจ ื”ื™ื•ื ืžืชื—ื™ืœ ืขื ืจืขื™ื•ืŸ ืคืฉื•ื˜ ืฉื ืงืจื Range:
scala> 10.until(20)
val res0: Range = Range 10 until 20
ืขื Range ืืคืฉืจ ืœืขืฉื•ืช ื”ืžื•ืŸ ื“ื‘ืจื™ื ืœืžืฉืœ ืœื’ืœื•ืช ืžื” ื”ืกื›ื•ื:
scala> 10.until(20).sum
val res2: Int = 145
ืขื›ืฉื™ื• ื ื ืกื” ืืช ืื•ืชื• ื“ื‘ืจ ืขื ืžืกืคืจื™ื ื’ื“ื•ืœื™ื:
scala> 2728902838.until(4728902838)
-- Error: ----------------------------------------------------------------------
1 |2728902838.until(4728902838)
  |^^^^^^^^^^
  |number too large
-- Error: ----------------------------------------------------------------------
1 |2728902838.until(4728902838)
  |                 ^^^^^^^^^^
  |                 number too large
ื ื• ื‘ืจื•ืจ ืฉืื™ ืืคืฉืจ ืœื›ืชื•ื‘ ืžืกืคืจ ื’ื“ื•ืœ ื‘ืชื•ืจ ืœื™ื˜ืจืœ, ืื– ืื ื™ ืžื•ืกื™ืฃ ืœื• l ืงื˜ื ื” ื›ื“ื™ ืฉื™ื”ื™ื” Long, ื•ืื– ืžืงื‘ืœ ื”ื•ื“ืขืช ืฉื’ื™ืื” ืื—ืจืช:
scala> 2728902838.until(4728902838l)
-- Error: ----------------------------------------------------------------------
1 |2728902838.until(4728902838l)
  |^^^^^^^^^^
  |number too large
-- [E007] Type Mismatch Error: -------------------------------------------------
1 |2728902838.until(4728902838l)
  |                 ^^^^^^^^^^^
  |                 Found:    (4728902838L : Long)
  |                 Required: Int
  |
  | longer explanation available when compiling with \-explain\
ื”ืคืขื ื”ื•ื“ืขืช ื”ืฉื’ื™ืื” ื›ื‘ืจ ืจื•ืžื–ืช ืขืœ ื”ืฆืขื“ ื”ื‘ื, ื•ืื ื™ ื”ื•ืคืš ื’ื ืืช ื”ืžืกืคืจ ื”ืจืืฉื•ืŸ ืœ Long ื‘ืฉื‘ื™ืœ ืœืฉืžื— ืืช ืกืงืืœื”:
scala> 2728902838l.until(4728902838l)
val res4: scala.collection.immutable.NumericRange.Exclusive[Long] = NumericRange 2728902838 until 4728902838
ืขื•ื‘ื“? ืœื ื‘ื“ื™ื•ืง. ื ืฉื™ื ืœื‘ ืฉืคืงื•ื“ืช until ืฉืœ Int-ื™ื ื”ื—ื–ื™ืจื” ืžืฉื”ื• ืžื˜ื™ืคื•ืก ืื—ื“ ื• until ืฉืœ Long-ื™ื ื”ื—ื–ื™ืจื” ืžืฉื”ื• ืžื˜ื™ืคื•ืก ืื—ืจ. ื•ืœืžื” ื–ื” ืžืคืจื™ืข? ื ืžืฉื™ืš ืœื ื™ืกื•ื™ ื”ื‘ื ืขื ืจืฉื™ืžื•ืช:
scala> val l = List(a, b)
val l:
  List[scala.collection.immutable.AbstractSeq[Long | Int] &
    IndexedSeq[Long | Int]] = List(NumericRange 2728902838 until 4728902838, Range 10 until 20)

scala> a.start
val res0: Long = 2728902838

scala> l.head.start
-- [E008] Not Found Error: -----------------------------------------------------
1 |l.head.start
  |^^^^^^^^^^^^
  |value start is not a member of scala.collection.immutable.AbstractSeq[Long | Int] & IndexedSeq[Long | Int] - did you mean scala.collection.immutable.AbstractSeq[Long | Int] & IndexedSeq[Long | Int].last?
1 error found
ืœืžืจื•ืช ืฉื’ื ืœ a ื•ื’ื ืœ b ื™ืฉ ืคื•ื ืงืฆื™ื” start, ื‘ืจื’ืข ืฉืื ื™ ืฉื ืื•ืชื ื™ื—ื“ ื‘ืจืฉื™ืžื” ืื ื™ ืžืงื‘ืœ ืจืฉื™ืžื” ืฉืœ ื“ื‘ืจื™ื ื™ื•ืชืจ ื›ืœืœื™ื™ื ื•ืœื”ื ืื™ืŸ ืืช ื”ืคื•ื ืงืฆื™ื” start, ื•ื‘ืื•ืคืŸ ื›ืœืœื™ ืื™ืŸ ื™ื—ืกื™ ื™ืจื•ืฉื” ื‘ื™ืŸ ืฉื ื™ ืกื•ื’ื™ ื”ื˜ื•ื•ื—ื™ื. ื•ื›ืŸ ืื ื™ ื›ื ืจืื” ื™ื›ื•ืœ ืœื”ืฉืชืžืฉ ื‘ Structural Types ื‘ืฉื‘ื™ืœ ืœืขืงื•ืฃ ืืช ื”ืกื™ืคื•ืจ ื”ื–ื” ืื‘ืœ ืฆืจื™ืš ืœื–ื›ื•ืจ ืžืื™ืคื” ื”ืชื—ืœื ื• - ื›ืœ ืžื” ืฉืจืฆื™ืชื™ ื”ื™ื” ืœืงื‘ืœ ืคื•ื ืงืฆื™ื•ืช ื‘ืกื™ืกื™ื•ืช ืฉืœ ื˜ื•ื•ื— ืขืœ ืžืกืคืจื™ื ืฉื™ืขื‘ื“ื• ืื•ืชื• ื“ื‘ืจ ืœืžืกืคืจื™ื ื’ื“ื•ืœื™ื ื•ืงื˜ื ื™ื. ืฉื•ืจื” ืชื—ืชื•ื ื” ื”ืžืื–ืŸ ื‘ื™ืŸ Int ืœ Long ื”ื•ื ื‘ื™ืŸ ื™ืขื™ืœื•ืช (ืฉืœ Int) ืœื’ื ืจื™ื•ืช (ืฉืœ Long). ืื ื—ื ื• ื‘ 2024 ื•ื”ื’ื™ืข ื”ื–ืžืŸ ืฉ Long ืชื”ื™ื” ื‘ืจื™ืจืช ื”ืžื—ื“ืœ.

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

ToCode
1 420
ืขื“ ืฉื›ืŸ ืฆืจื™ืš ื”ืžืฉืคื˜ ื”ื–ื” ืžื”ืกื™ืคื•ืจ ืขืœ ื–ื ื“ืกืง ืชืคืก ืืช ืชืฉื•ืžืช ืœื‘ื™:
Eventually, they looked to Bloom Filters, further combined with Count-Min Sketch data structures, which together offered an effective way of supporting multi-field filter queries.
ื‘ื’ื“ื•ืœ ื–ื ื“ืกืง ืขื–ื‘ื• ืืช ื“ื™ื ืžื• ื“ื™ื‘ื™ ื‘ืฉื‘ื™ืœ ืœืฉืžื•ืจ ืืช ื”ืœื•ื’ื™ื ืฉืœื”ื ื‘ืงื‘ืฆื™ื ืขืœ S3. ื‘ืฉื‘ื™ืœ ืœื“ืขืช ืื™ื–ื” ื”ื•ื“ืขืช ืœื•ื’ ื ืžืฆืืช ื‘ืื™ื–ื” ืงื•ื‘ืฅ ื”ื ื™ืฆืจื• ื˜ื‘ืœื” ื‘ื‘ืกื™ืก ื ืชื•ื ื™ื ืฉืžื—ื–ื™ืงื” ืœื›ืœ ืงื•ื‘ืฅ ืžืžืชื™ ืขื“ ืžืชื™ ื”ื•ื“ืขื•ืช ื”ืœื•ื’ ืฉื‘ื•. ื•ืื– ื”ื’ื™ืขื” ื“ืจื™ืฉื” ื—ื“ืฉื” ืžื”ืœืงื•ื— ืฉืจืฆื” ืœืงื‘ืœ ืกื™ื ื•ืŸ ืฉืœ ื”ืœื•ื’ื™ื ืœืคื™ ืคืจืžื˜ืจื™ื ืฉืื™ื ื ื–ืžืŸ, ืœืžืฉืœ ืœืงื‘ืœ ืืช ื›ืœ ื”ื•ื“ืขื•ืช ื”ืœื•ื’ ืฉืงืฉื•ืจื•ืช ืœืžืฉืชืžืฉ ืขื ืžื–ื”ื” ืžืกื•ื™ื. ืขื›ืฉื™ื• ืื ื™ ื™ื•ื“ืข ืžื” ืืชื ื—ื•ืฉื‘ื™ื - ืคืฉื•ื˜ ืฉื™ืฉืžืจื• ื’ื ืื™ื ื“ืงืก ืขืœ ืžื–ื”ื™ ืžืฉืชืžืฉ ื‘ื˜ื‘ืœื” ื”ื–ืืช ืฉืœื”ื, ืื‘ืœ ื–ื” ืœื ืจื™ืืœื™ ื›ื™ ื”ื“ืจื™ืฉื” ื”ื™ืชื” ืœืืคืฉืจ ืกื™ื ื•ืŸ ื’ืžื™ืฉ ืœืคื™ ื›ืœ ืžื™ื ื™ ืฉื“ื•ืช ืื• ืžืกืคืจ ืฉื“ื•ืช ื™ื—ื“. ื•ื›ืืŸ ืื ื—ื ื• ืžื’ื™ืขื™ื ืœืžืฉืคื˜ ืฉื”ื“ื‘ืงืชื™. 99% ืžื”ืื ืฉื™ื, ื›ืฉืชื ืกื• ืœื”ืกื‘ื™ืจ ืœื”ื ืžื” ื–ื” ืคื™ืœื˜ืจ ื‘ืœื•ื ื™ืจื“ืžื• ื‘ืฉื™ืขื•ืจ ื‘ืžื—ืฉื‘ื” ืฉื–ื” ืœื ื—ืฉื•ื‘ ืœื›ืœื•ื. ื•ื–ื” ื ื›ื•ืŸ, ื‘ืืžืช ืจื•ื‘ ื”ื–ืžืŸ ืœื ืฆืจื™ืš ืคื™ืœื˜ืจ ื‘ืœื•ื, ืขื“ ืฉื›ืŸ ืฆืจื™ืš. ื•ืื ื™ ื™ื›ื•ืœ ืจืง ืœื“ืžื™ื™ืŸ ืืช ื”ื”ืขืจื›ื” ืฉืงื™ื‘ืœื” ืื•ืชื” ืžืชื›ื ืชืช ืื• ืžืชื›ื ืช ืฉื”ืฆื™ืขื• ืืช ื”ืจืขื™ื•ืŸ ื‘ Zendesk. ื™ื›ื•ืœ ืœื”ื™ื•ืช ืฉื‘ืขืชื™ื“ ื›ืœื™ ื‘ื™ื ื” ืžืœืื›ื•ืชื™ืช ื™ื”ื™ื• ืžืกืคื™ืง ื˜ื•ื‘ื™ื ื›ื“ื™ ืœื”ืฆื™ืข ืคื™ืชืจื•ื ื•ืช ืžื“ื•ื™ืงื™ื ืœื‘ืขื™ื•ืช ื›ืืœื”. ื›ืœ ืขื•ื“ ื–ื” ืœื ื”ืžืฆื‘ ื“ืจืš ื˜ื•ื‘ื” ืœื”ืชืงื“ื ื‘ืชื•ืจ ืžืชื›ื ืชื™ื ื”ื™ื ืœื”ื›ื™ืจ ื™ื•ืชืจ ื‘ืขื™ื•ืช ื•ื˜ื›ื ื™ืงื•ืช ืœืคืชื•ืจ ืื•ืชืŸ. ืžื‘ื ื™ ื ืชื•ื ื™ื ื™ื›ื•ืœื™ื ืœื”ื™ื•ืช ืžืฉืขืžืžื™ื ื•ืœื ืจืœื•ื•ื ื˜ื™ื, ืขื“ ืฉื™ื•ื ืื—ื“ ื›ืŸ ืฆืจื™ืš ืื•ืชื.

ToCode
1 420
ื“ืจื™ืฉื•ืช ืžืฉืจื” ื’ืžื™ืฉื•ืช ืื ื™ ืžื—ืคืฉ ืขื›ืฉื™ื• ืžืชื›ื ืช/ืช ืฉื™ืขื–ืจื• ืœื™ ื‘ืคื™ืชื•ื— ื•ื”ื“ื’ืฉ ื”ื•ื ืขืœ ื ื™ืกื™ื•ืŸ ื‘ืจื™ื™ืœืก (ืืชื ื›ืืœื”? ืžื›ื™ืจื™ื ื›ืืœื”? ืื ื›ืŸ ื“ื‘ืจื• ืื™ืชื™). ื‘ื›ืœ ืžืงืจื” ืฉืžืชื™ ืžื•ื“ืขื” ื‘ืœื™ื ืงื“ืื™ืŸ ื•ื›ืฆืคื•ื™ ืืคืฉืจ ืœื—ืœืง ืืช ื”ืชื’ื•ื‘ื•ืช ืฉื”ื’ื™ืขื• ืœืฉืœื•ืฉื” ืกื•ื’ื™ื - ืืœื” ืฉืžืชืื™ืžื™ื ื‘ื•ืœ ืœืชืคืงื™ื“, ืืœื” ืฉืžืžืฉ ืœื ืงืฉื•ืจื™ื, ื•ืืœื” ืฉื‘ื’ื“ื•ืœ ื™ืฉ ื”ืชืืžื” ืื‘ืœ ืžืฉื”ื• ื—ืกืจ ื‘ืคืจื•ืคื™ืœ ืฉืœื”ื. ืคื” ืื ื™ ืจื•ืฆื” ืœื“ื‘ืจ ืขืœ ื”ืงื‘ื•ืฆื” ื”ืฉืœื™ืฉื™ืช. ื›ืฉื™ืฉ ืžืฉืจื” ืฉืื ื—ื ื• ืจื•ืฆื™ื ื–ื” ื“ื™ ื ืคื•ืฅ ืฉื“ืจื™ืฉื•ืช ื”ืžืฉืจื” ืœื ืชื•ืืžื•ืช 100% ืืช ื”ื›ื™ืฉื•ืจื™ื ืฉืœื ื•. ืื•ืœื™ ื”ื ืžื—ืคืฉื™ื ื ื™ืกื™ื•ืŸ ื‘ื‘ืกื™ืก ื ืชื•ื ื™ื ืฉืœ ืžื™ื™ืงืจื•ืกื•ืคื˜ ื•ืื ื™ ืžื›ื™ืจ ืคื•ืกื˜ื’ืจืก. ืื•ืœื™ ื‘ืคืจื•ื™ืงื˜ ืจื™ืืงื˜ ืฉืœื”ื ืขื•ื‘ื“ื™ื ืขื Recoil ื•ืœื™ ื™ืฉ ื ื™ืกื™ื•ืŸ ืจืง ื‘ืจื™ื“ืืงืก. ืื•ืœื™ ื“ื•ืจืฉื™ื ื ื™ืกื™ื•ืŸ ื‘ืจื™ื™ืœืก 6 ื•ืื ื™ ืขื‘ื“ืชื™ ืขื ืจื™ื™ืœืก ืจืง ืขื“ ื’ื™ืจืกื” 4. ืืœื” ืื™ ืชืื™ืžื•ื™ื•ืช ืฉื”ืŸ ืœื ืงืจื™ื˜ื™ื•ืช, ืื‘ืœ ื›ืŸ ืฆืจื™ืš ืœื”ืชื™ื™ื—ืก ืืœื™ื”ืŸ ื›ืฉืื ื—ื ื• ืžื’ื™ืฉื™ื ืžื•ืขืžื“ื•ืช ื›ื“ื™ ืœืขื‘ื•ืจ ืžืงื‘ื•ืฆืช ื”"ืื•ืœื™" ืœืงื‘ื•ืฆืช ื”"ื”ืชืืžื” ื˜ื•ื‘ื”". ืืœื” ื”ื“ื‘ืจื™ื ืฉื”ื™ื™ืชื™ ืขื•ืฉื” ืœืคื™ ืกื“ืจ ื—ืฉื™ื‘ื•ืช (ื”ื˜ื•ื‘ ื‘ื™ื•ืชืจ ืœืžืขืœื”): 1. (ื”ื›ื™ ื˜ื•ื‘) - ืฆืจืคื• ืœื‘ืงืฉื” ืฉืœื›ื ืคืจื•ื™ืงื˜ ืฆื“ ืฉืขืฉื™ืชื ืฉืžืชืื™ื ืœื˜ื›ื ื•ืœื•ื’ื™ื” ื‘ื” ืžื’ื™ื™ืกื™ื (ืื™ืŸ ืœื›ื ืคืจื•ื™ืงื˜ ืฆื“ ื›ื–ื”? ืื•ืœื™ ื–ื” ื–ืžืŸ ื˜ื•ื‘ ืœื‘ื ื•ืช ืื•ืชื•). ื›ืฉืืคืฉืจ ืœืจืื•ืช ืงื•ื“ ื”ืจื‘ื” ืคื—ื•ืช ื—ืฉื•ื‘ ืœืกืคื•ืจ ืฉื ื•ืช ื ื™ืกื™ื•ืŸ. 2. ืฆืจืคื• ืœื‘ืงืฉื” ืžื›ืชื‘ ืžืœื•ื•ื” (ืื• ืกืชื ื”ื•ื“ืขื” ื‘ืื™ืžื™ื™ืœ) ืฉืžืกื‘ื™ืจ ืฉืืชื ืžื•ื“ืขื™ื ืœืคืขืจ ื•ืชืกื‘ื™ืจื• ืžื” ืืชื ืžืชื›ื ื ื™ื ืœืขืฉื•ืช ื›ื“ื™ ืœืกื’ื•ืจ ืื•ืชื•. ืื ืืคืฉืจ ืฆืจืคื• ืคืจื•ื™ืงื˜ ื‘ื˜ื›ื ื•ืœื•ื’ื™ื” ืฉื”ื™ื ืœื ื‘ื“ื™ื•ืง ืžื” ืฉืžื—ืคืฉื™ื ืื‘ืœ ืขื“ื™ื™ืŸ ืงืจื•ื‘ื”. 3. ืฆืจืคื• ืœื‘ืงืฉื” ืžื›ืชื‘ ืžืœื•ื•ื” ืฉืžืกื‘ื™ืจ ืœืžื” ืœื“ืขืชื›ื ื”ืคืขืจ ื‘ื™ืŸ ื”ืžื™ื•ืžื ื•ื™ื•ืช ืฉืœื›ื ืœื“ืจื™ืฉื•ืช ื”ืชืคืงื™ื“ ื‘ืขืฆื ืœื ื›ื–ื” ื’ื“ื•ืœ. ื”ื›ื™ ื—ืฉื•ื‘ ืœื”ืกืชื›ืœ ืขืœ ื”ืžื’ื™ื™ืกื™ื ื‘ืชื•ืจ ืื ืฉื™ื ืฉื‘ืืžืช ืจื•ืฆื™ื ืœืชืช ืœื›ื ืฆ'ืื ืก. ื‘ืžืงืจื™ื ืฉื™ืฉ ื”ืชืืžื” ืฉืœื ืžืกืคื™ืง ื‘ืจื•ืจื” ืžืงื•ืจื•ืช ื”ื—ื™ื™ื, ืชื ื• ืœืžื’ื™ื™ืกื™ื ืืช ื”ืžื™ื“ืข ืฉื”ื ืฆืจื™ื›ื™ื ื›ื“ื™ ืœื’ืฉืจ ืขืœ ื”ืคืขืจ.

ToCode
1 420
ื˜ื™ืค ืจืฉืชื•ืช - ืžืงืฉื™ื‘ื™ื ืœืคื•ืจื˜ 0 ืžื” ืืชื ืขื•ืฉื™ื ื›ืฉืืชื ืฆืจื™ื›ื™ื ืœื”ืขืœื•ืช ืฉืจืช ืœื‘ื“ื™ืงื•ืช ืื‘ืœ ืœื ื™ื•ื“ืขื™ื ื‘ืื™ื–ื” ืคื•ืจื˜ ืœื‘ื—ื•ืจ? ื‘ืžืงื•ื ืœื”ืกืชื‘ืš ื•ืœื—ืคืฉ ืชื ื• ืœืžืขืจื›ืช ื”ื”ืคืขืœื” ืœื”ื—ืœื™ื˜. ืคื•ืจื˜ 0 ื”ื•ื ืœื ืคื•ืจื˜ ื—ื•ืงื™ ื‘ืชืงืฉื•ืจืช TCP, ื•ืœื›ืŸ ื›ืฉืื ื—ื ื• ืžื‘ืงืฉื™ื ืžื”ืงื•ื“ ืœื”ืงืฉื™ื‘ ืœืคื•ืจื˜ 0 ืื ื—ื ื• ืฉื•ืœื—ื™ื ืื•ืชื• ืœื‘ืงืฉ ืื™ื–ืฉื”ื• ืคื•ืจื˜ ืคื ื•ื™ ืžืžืขืจื›ืช ื”ื”ืคืขืœื”. ื•ื–ื” ื ืคืœื ืœื‘ื“ื™ืงื•ืช. ืฉื™ืžื• ืœื‘ ืœืงื•ื“ ื”ื‘ื ื‘ node.js ืฉืžืขืœื” ืฉืจืช echo, ืžื ืกื” ืœื›ืชื•ื‘ ืืœื™ื• ื•ืžื•ื•ื“ื ืฉืงื™ื‘ืœ ื‘ื—ื–ืจื” ืืช ื”ืชืฉื•ื‘ื” ื”ื ื›ื•ื ื”:
const net = require('node:net');
const assert = require('node:assert');


async function main() {
  var server = net.createServer(function(socket) {
    socket.pipe(socket);
  });

  server.listen(0, '127.0.0.1');
  await new Promise((resolve, _reject) => server.on('listening', resolve));
  
  const clientSocket = net.createConnection(server.address().port);
  await new Promise((resolve, _reject) => clientSocket.on('connect', resolve));

  clientSocket.on('data', (data) => {
    const dataWritten = Buffer.from('hello world\n', 'utf8');
    const dataRead = data;

    assert(dataRead.equals(dataWritten));
    clientSocket.end();
    server.close();
  });

  clientSocket.write("hello world\n");
}

main();
ื”ืชื•ื›ื ื™ืช ืคื•ืชื—ืช ืฉืจืช ืขืœ ื”ืžื—ืฉื‘ ื”ืžืงื•ืžื™, ืžืชื—ื‘ืจืช ืืœื™ื•, ืฉื•ืœื—ืช ื”ื•ื“ืขืช ื˜ืงืกื˜ ื•ืžื•ื•ื“ืืช ืฉืงื™ื‘ืœื” ื‘ื—ื–ืจื” ื‘ื“ื™ื•ืง ืืช ืื•ืชื” ื”ื•ื“ืขื”. ืžื” ืฉืžืขื ื™ื™ืŸ ื›ืืŸ ื”ื•ื ืฉื•ืจืช ื” listen:
server.listen(0, '127.0.0.1');
ื‘ืžืงื•ื ืœื”ืชื—ื™ื™ื‘ ืขืœ ืคื•ืจื˜ ืื ื™ ื ื•ืชืŸ ืœืžื—ืฉื‘ ืœื‘ื—ื•ืจ, ื•ืื—ืจ ื›ืš ื‘ืฉื‘ื™ืœ ืœื”ืชื—ื‘ืจ ืืœื™ื• ืื ื™ ืจืง ืฆืจื™ืš ืœื”ืกืชื›ืœ ื‘ server ื•ืœืจืื•ืช ืžื” ื”ืคื•ืจื˜ ืฉื ื‘ื—ืจ.

ToCode
1 420
ืื™ืš ื ื•ืœื“ ื‘ืื’ (ืื•: ืขืœ ื”ื—ืฉื™ื‘ื•ืช ืฉืœ ื‘ื“ื™ืงื•ืช ื›ืฉืžืฉื ื™ื ืงื•ื“) ื ืชื‘ื•ื ืŸ ื‘ืงื•ื“ ื”ื‘ื ื‘ node.js:
import net from 'node:net';

const host = "localhost";
const port = 1234;

const socket = net.createConnection(port, host, () => {
  socket.write("hello\n");
  socket.end();
});

socket.on('error', () => {
  console.log(\Error connecting to ${host}:${port}\);
});
ื”ืงื•ื“ ืžื ืกื” ืœื”ืชื—ื‘ืจ ืœืคื•ืจื˜ 1234 ืขืœ ื”ืžื›ื•ื ื” ื”ืžืงื•ืžื™ืช, ืœืฉืœื•ื— ื”ื•ื“ืขื” hello ื•ืื– ืœืกื’ื•ืจ ืืช ื”ื—ื™ื‘ื•ืจ. ืื ื™ืฉ ืœื™ ืžื™ืฉื”ื• ืฉืžืงืฉื™ื‘ ืขืœ ื”ืคื•ืจื˜ ื”ื›ืœ ื™ืขื‘ื•ื“, ื•ืื ืืฃ ืื—ื“ ืœื ืžืงืฉื™ื‘ ื ื’ื™ืข ืœืื™ืจื•ืข error ื•ื”ื•ื“ืขืช ื”ืฉื’ื™ืื” ืชื•ื“ืคืก ืขืœ ื”ืžืกืš. ืขื“ ืคื” ื”ื›ืœ ื˜ื•ื‘. ืขื›ืฉื™ื• ื ื“ืžื™ื™ืŸ ื“ืจื™ืฉื” ื—ื“ืฉื” ืœืžืขืจื›ืช - ื™ืฉ ืœืืคืฉืจ ืœืงื‘ื•ืข ืืช ื”ืคื•ืจื˜ ืžื‘ื—ื•ืฅ ื‘ืืžืฆืขื•ืช ืžืฉืชื ื” ืกื‘ื™ื‘ื”. ืื ืœื ื”ื•ื’ื“ืจ ืขืจืš ื‘ืžืฉืชื ื” ื”ืกื‘ื™ื‘ื” ื ืฉืชืžืฉ ืขื“ื™ื™ืŸ ื‘ 1234 ื‘ืชื•ืจ ื‘ืจื™ืจืช ืžื—ื“ืœ. ื”ืงื•ื“ ื”ืžืขื•ื“ื›ืŸ ืขืฉื•ื™ ืœื”ื™ืจืื•ืช ื›ืš:
import net from 'node:net';

const host = "localhost";
const port = Number(process.env["PORT"]) || 1234;

const socket = net.createConnection(port, host, () => {
  socket.write("hello\n");
  socket.end();
});

socket.on('error', () => {
  console.log(\Error connecting to ${host}:${port}\);
});
ื ืจืื” ื˜ื•ื‘? ืชื—ืฉื‘ื• ืฉื•ื‘. ื‘ JavaScript ื”ืคื•ื ืงืฆื™ื” Number ืžื—ื–ื™ืจื” ืžืกืคืจ, ืื‘ืœ ืžืกืคืจ ื™ื›ื•ืœ ืœื”ื™ื•ืช ืžืื•ื“ ื’ื“ื•ืœ ืื• ืžืื•ื“ ืงื˜ืŸ ืื• ืืคื™ืœื• ื›ื–ื” ืฉืžื›ื™ืœ ื ืงื•ื“ื” ืขืฉืจื•ื ื™ืช. ื‘ืœื™ ืœืฉื™ื ืœื‘ ืื™ืคืฉืจื ื• ืœืžืขืจื›ืช ืœืงื‘ืœ ืžืกืคืจื™ ืคื•ืจื˜ ืœื ืชืงื ื™ื™ื, ืžื” ืฉื™ื’ืจื•ื ืœ createConnection ืœื”ื™ื›ืฉืœ ืœืคื ื™ ืฉืžื’ื™ืข ืœืื™ืจื•ืข error. ื–ื” ื ืจืื” ื›ื›ื”:
$ node demo.mjs
Error connecting to localhost:1234

$ PORT=8080 node demo.mjs
Error connecting to localhost:8080

$ PORT=abc node demo.mjs
Error connecting to localhost:1234

$ PORT=-1 node demo.mjs
node:internal/errors:496
    ErrorCaptureStackTrace(err);
    ^

RangeError [ERR_SOCKET_BAD_PORT]: Port should be >= 0 and < 65536. Received type number (-1).
    at new NodeError (node:internal/errors:405:5)
    at validatePort (node:internal/validators:409:11)
    at lookupAndConnect (node:net:1289:5)
    at Socket.connect (node:net:1246:5)
    at Object.connect (node:net:236:17)
    at file:///Users/ynonp/tmp/blog/nodebug/demo.mjs:6:20
    at ModuleJob.run (node:internal/modules/esm/module_job:217:25)
    at async ModuleLoader.import (node:internal/modules/esm/loader:308:24)
    at async loadESM (node:internal/process/esm_loader:42:7)
    at async handleMainPromise (node:internal/modules/run_main:66:12) {
  code: 'ERR_SOCKET_BAD_PORT'
}
ื‘ืฉืœื•ืฉ ื”ื“ื•ื’ืžืื•ืช ื”ืจืืฉื•ื ื•ืช ื›ืฉืื™ืŸ ืคื•ืจื˜ ืื• ื›ืฉื”ืคื•ืจื˜ ืžื›ื™ืœ ืขืจืš ืฉืื™ื ื• ืžืกืคืจ ื”ื›ืœ ื‘ืกื“ืจ ื•ืื ื—ื ื• ื ืฉืืจื™ื ืขื ื ื™ืกื™ื•ืŸ ื”ืชื—ื‘ืจื•ืช ื•ืื– ื›ื ื™ืกื” ืœืื™ืจื•ืข ื”ืฉื’ื™ืื”. ื”ื“ื•ื’ืžื” ื”ืื—ืจื•ื ื” ื™ืฆืจื” ืžืฆื‘ ื—ื“ืฉ ืฉื‘ื•ืจื— ืžืžืกืœื•ืœื™ ื”ืงื•ื“ ืฉื™ืฆืจื ื• ื•ื–ื•ืจืง ืฉื’ื™ืื” ืฉืœื ื˜ื™ืคืœื ื• ื‘ื”. ื”ืจื‘ื” ืคืขืžื™ื ืื ื—ื ื• ืžื“ื‘ืจื™ื ื‘ื‘ื“ื™ืงื•ืช ืขืœ Code Coverage ื‘ืชื•ืจ ืžื“ื“ ืฉืขื•ื–ืจ ืœื ื• ืœื”ื‘ื™ืŸ ืื ื‘ื“ืงื ื• ื›ืžื• ืฉืฆืจื™ืš ืืช ื”ืžืขืจื›ืช. ื›ื™ืกื•ื™ ืงื•ื“ ื˜ื•ื‘ ืื•ืžืจ ืฉื›ืœ ื”ื ืชื™ื‘ื™ื ื ื‘ื“ืงื•. ืื‘ืœ ื™ื•ืชืจ ื ื›ื•ืŸ ืœื”ืกืชื›ืœ ืขืœ "ื›ื™ืกื•ื™ ืงืœื˜", ื›ืœื•ืžืจ ื”ืื ื”ื‘ื“ื™ืงื•ืช ืฉืœื ื• ื›ื™ืกื• ืžืกืคื™ืง ืงืœื˜ื™ื ืฉื•ื ื™ื ืฉืžื™ื™ืฆื’ื™ื ืืช ื”ื”ืกืชืขืคื•ื™ื•ืช ืืœื™ื”ืŸ ื ื’ื™ืข. ื“ืจืš ืื—ืช ืœื”ืžืฆื™ื ืงืœื˜ื™ื ื˜ื•ื‘ื™ื ืœื‘ื“ื™ืงื” ื”ื™ื ืœื”ื™ืขื–ืจ ื‘ Chat GPT. ืืœื” ื”ืื•ืคืฆื™ื•ืช ืฉื”ื•ื ื ืชืŸ ื›ืฉื‘ื™ืงืฉืชื™ ืžืžื ื• ืขืจื›ื™ื ืืคืฉืจื™ื™ื ืœืžืฉืชื ื” PORT ื‘ืชื•ื›ื ื™ืช ื›ื“ื™ ืœื‘ื“ื•ืง ืฉื”ื›ืœ ืขื•ื‘ื“:
* Test with default port *
PORT=1234 node your_program.js

* Test with common ports *
PORT=80 node your_program.js
PORT=443 node your_program.js

* Test with invalid port numbers *
PORT=-1 node your_program.js
PORT=abc node your_program.js

* Test with a port already in use *
* (Make sure another program is already using the specified port) *
PORT=8080 node your_program.js

* Test with a custom port using environment variable *
PORT=5678 node your_program.js

ToCode - Estadรญsticas y analรญtica del canal de Telegram @tocodeil