uz
Feedback
ToCode

ToCode

Kanalga Telegramโ€™da oโ€˜tish

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

Ko'proq ko'rsatish
1 420
Obunachilar
Ma'lumot yo'q24 soatlar
+27 kunlar
-230 kunlar
Postlar arxiv
ToCode
1 420
# ืงื•ื“ ืœืฉื™ืžื•ืฉ ื—ื•ื–ืจ ืื—ืช ื”ื‘ืขื™ื•ืช ืฉืื ื™ ืžื•ืฆื ื™ื•ืชืจ ืžื“ื™ ื‘ืžืขืจื›ื•ืช ื”ื™ื ื”ืืชื’ืจ ืฉืœ ืฉื™ืžื•ืฉ ื—ื•ื–ืจ ื‘ืงื•ื“, ื•ื–ื” ื”ื•ืœืš ื›ื›ื” - ืžืฆื“ ืื—ื“ ืื ื—ื ื• ืจื•ืฆื™ื ืœื›ืชื•ื‘ ืงื•ื“ ืฉืืคืฉืจ ื™ื”ื™ื” ืœื”ืฉืชืžืฉ ื‘ื• ืฉื•ื‘ ื•ืฉื•ื‘, ืื‘ืœ ืžืฆื“ ืฉื ื™ ืื ื—ื ื• (ื›ืจื’ืข) ืขืกื•ืงื™ื ืžื“ื™ ื‘ืฉื‘ื™ืœ ืœืขืฉื•ืช ืืช ื”ืขื‘ื•ื“ื” ื”ืงืฉื” ืฉืœ ืœื›ืชื•ื‘ ืงื•ื“ ืœืฉื™ืžื•ืฉ ื—ื•ื–ืจ. ื”ืชื•ืฆืื” ื”ื™ื ืงื•ื“ ืฉื ืจืื” ื›ืžื• ืงื•ื“ ืฉืžืชืื™ื ืœืฉื™ืžื•ืฉ ื—ื•ื–ืจ, ืื‘ืœ ื›ืฉืืชื” ื‘ื ืœื”ืฉืชืžืฉ ื‘ื• ื‘ืขื•ื“ ืžืงื•ื ืืชื” ืžื’ืœื” ืฉื™ืฉ ื™ื•ืชืจ ืžื“ื™ ืชืœื•ื™ื•ืช. ื‘ืžืงืจื” ื”ื˜ื•ื‘ ืชืคืกืช ืืช ื–ื” ื‘ื–ืžืŸ ื•ื›ืชื‘ืช ื”ื›ืœ ืžื—ื“ืฉ, ื‘ืžืงืจื” ื”ืจืข ืชืคืกืช ืืช ื–ื” ืžืื•ื—ืจ ืžื“ื™ ื•ืืชื” ืชืงื•ืข ื‘ื‘ื•ืฅ ืžื ืกื” ืœืืจื’ืŸ ืžื—ื“ืฉ ืืช ื”ืงื•ื“ "ืœืฉื™ืžื•ืฉ ื—ื•ื–ืจ" ื•ืฆืจื™ืš ืœืคืชื•ืจ ืขื›ืฉื™ื• ื‘ืื’ื™ื ื‘ืฉื ื™ ืคื™ืฆ'ืจื™ื ื‘ืžืงื•ื ืจืง ื‘ืคื™ืฆ'ืจ ื”ื—ื“ืฉ ืฉืืชื” ื‘ื•ื ื”. ื“ื•ื’ืžื”? ื‘ืฉืžื—ื”. ืงื—ื• ืงื•ื“ ืคื™ื™ืชื•ืŸ ืฉืขื•ืฉื” ื™ื•ืชืจ ืžื“ื™ ืขื‘ื•ื“ื” ืขืœ ืžืฉืคื˜:
import re

text = "one two three I want to see three four five I am alive"

# delete all spaces in sentences
text = re.sub(r'\s+', '', text)

# replace each letter by its ordinal value
text = [ord(c) for c in text]

# leave only values that are larger than what came before
new_text = [text[0]]
for value in text:
    if value > new_text[-1]:
        new_text.append(value)

text = new_text

print(sum(text))
ืœืงื•ื“ ื™ืฉ ืฉืœื•ืฉื” ื—ืœืงื™ื ืฉื‘ื ื•ื™ื™ื ืœืขื‘ื•ื“ ืื—ื“ ืื—ืจื™ ื”ืฉื ื™ ืขื ื”ืขืจื” ืฉืžืชืืจืช ืžื” ืขื•ืฉื” ื›ืœ ื—ืœืง. ืœื ื‘ื˜ื•ื— ืฉื›ื•ืœื ื ื›ื•ื ื™ื ืื‘ืœ ืœืคื—ื•ืช ื”ืงื•ื“ ืกื’ื•ืจ ื›ื•ืœื• ื‘ืื•ืชื• ืžืงื•ื, ื•ืืฃ ืื—ื“ ืœื ื™ื—ืœื•ื ืœื”ืฉืชืžืฉ ื‘ื• ื‘ืขื•ื“ ืžืงื•ื ื‘ืžืขืจื›ืช. ื‘ืžืงืจื” ื”ื’ืจื•ืข ื™ืฆื˜ืจื›ื• ืœืงืจื•ื ืืช ื”ืงื•ื“ ื•ืžืžืฉ ืœื”ืขืชื™ืง ืืช ื”ืฉื•ืจื•ืช ืฉืขื•ืฉื•ืช ืขื‘ื•ื“ื” ื“ื•ืžื”. ื’ื™ืจืกื” ืžืกื•ื›ื ืช ื™ื•ืชืจ ืฉืœ ื”ืงื•ื“ ื”ื–ื” ืขืฉื•ื™ื” ืœื”ื™ืจืื•ืช ื›ืš:
import re

def main():
    text = "one two three I want to see three four five I am alive"
    text = delete_all_spaces(text)
    text = change_to_ord_values(text)
    text = change_to_increasing(text)
    print_result(text)


def delete_all_spaces(text):
    # delete all spaces in sentences
    text = re.sub(r'\s+', '', text)
    return text

def change_to_ord_values(text):
    # replace each letter by its ordinal value
    text = [ord(c) for c in text]
    return text

def change_to_increasing(text):
    # leave only values that are larger than what came before
    new_text = [text[0]]
    for value in text:
        if value > new_text[-1]:
            new_text.append(value)

    text = new_text
    return text

def print_result(text):
    print(sum(text))


main()
ืื™ื–ื” ื™ื•ืคื™ ื ื›ื•ืŸ? ื”ื›ืœ ืžืกื•ื“ืจ ืขื›ืฉื™ื• ื‘ืคื•ื ืงืฆื™ื•ืช, ื›ืœ ืคื•ื ืงืฆื™ื” ืžืงื‘ืœืช ืืช ื”ืงืœื˜ ืฉืœื” ื•ืžื—ื–ื™ืจื” ืคืœื˜ ื•ื”ืชื•ื›ื ื™ืช ืžื—ื–ื™ืจื” ืืช ืื•ืชื” ืชื•ืฆืื”. ืขื›ืฉื™ื• ืื ื ืจืฆื” ืœื”ืฉืชืžืฉ ืจืง ื‘ื—ืœืง ืžื”ืงื•ื“ ืœืžืงื•ื ืื—ืจ ื ื•ื›ืœ - ื ื›ื•ืŸ? ืจื•ื‘ ื”ืกื™ื›ื•ื™ื™ื ืฉืœื. ื”ืคื•ื ืงืฆื™ื•ืช ืœื ืžืกืคื™ืง ื’ื ืจื™ื•ืช ื‘ืฉื‘ื™ืœ ืฉื™ื”ื™ื• ื™ืขื™ืœื•ืช ื‘ืžืงื•ื ืื—ืจ, ื›ืชื‘ืชื™ ืื•ืชืŸ ืคืฉื•ื˜ ื‘ื’ืœืœ ืฉื–ื” ืžื” ืฉื”ื™ื” ืœื™ ืžื•ืœ ื”ืขื™ื ื™ื™ื ื•ื”ื—ืœื•ืงื” ืฉืจื™ืจื•ืชื™ืช ืœื’ืžืจื™. ื”ืจื‘ื” ื™ื•ืชืจ ืกื‘ื™ืจ ืฉืžื™ืฉื”ื• ื™ื ืกื” ืœื”ืฉืชืžืฉ ื‘ืื—ืช ืžื”ืŸ, ื™ื‘ื™ืŸ ืฉืื™ืŸ ืœื• ื‘ื“ื™ื•ืง ืงืœื˜ ืžื”ืกื•ื’ ืฉื”ืคื•ื ืงืฆื™ื” ืฆืจื™ื›ื” ื•ืื– ื™ื™ืชืงืข ื‘ืืจื’ื•ืŸ ืžื—ื“ืฉ ืฉืœ ื”ืงื•ื“. ืื– ื›ืŸ ืื ื™ืฉ ืœื›ื ื–ืžืŸ ืœื›ืชื•ื‘ ืงื•ื“ ื’ื ืจื™, ื‘ืืจื›ื™ื˜ืงื˜ื•ืจื” ื ื›ื•ื ื” ืฉืงืœ ืœื”ืฉืชืžืฉ ื‘ื• ื‘ืขื•ื“ ืžืงื•ืžื•ืช ื•ืืชื ื™ื•ื“ืขื™ื ืœืชืืจ ืžืงื•ืžื•ืช ื ื•ืกืคื™ื ื‘ืžืขืจื›ืช ืฉื™ืฆื˜ืจื›ื• ืื•ืชื• - ืœื›ื• ืขืœ ื–ื” ื•ื›ืชื‘ื• ืืช ื”ืงื•ื“ ื”ื’ื ืจื™. ืื‘ืœ ืฉื•ื•ื” ืœื”ื™ื–ื”ืจ ืžืงื•ื“ ืฉืจืง ื ืจืื” ื’ื ืจื™, ื•ืฉื™ื™ืฉื‘ืจ ื‘ืฉื ื™ื” ืฉื ื ืกื” ืœืฉืœื‘ ืื•ืชื• ื‘ืขื•ื“ ืžืงื•ื.

ToCode
1 420
# ื—ื“ืฉ ื‘ืืชืจ: ืชืขื•ื“ื•ืช ืกื™ื•ื ืงื•ืจืก ืฉืชื™ ื”ื•ื“ืขื•ืช ืžืฉืžื—ื•ืช ืœื”ื™ื•ื - ืงื•ื“ื ื›ืœ ืœืžื“ืชื™ ืื™ืš ืขื•ื‘ื“ื™ื ืขื PDF-ื™ื ื‘ Ruby, ื•ื“ื‘ืจ ืฉื ื™ ื”ื•ืกืคืชื™ ืœืืชืจ ืžื ื’ื ื•ืŸ ืฉืžืืคืฉืจ ืœื›ื ืœื”ื•ืจื™ื“ ืชืขื•ื“ื” ืื—ืจื™ ืฉืกื™ื™ืžืชื ืงื•ืจืก. ื•ืขื›ืฉื™ื• ื”ืคืจื˜ื™ื. ## ืื™ืš ืขื•ื‘ื“ื™ื ืขื PDF ื‘ Ruby ื‘ืฉื ื™ื ืฉื”ืืชืจ ื”ื–ื” ื‘ืื•ื•ื™ืจ ื”ืจื‘ื” ืื ืฉื™ื ืžื›ืœ ืžื™ื ื™ ืกื™ื‘ื•ืช ื‘ื™ืงืฉื• ืœืงื‘ืœ ืื™ื–ืฉื”ื• ืื™ืฉื•ืจ ืขืœ ืงื•ืจืกื™ื ืฉืกื™ื™ืžื• ืคื”. ืชืงื•ืคื” ืžืื•ื“ ืืจื•ื›ื” ืœื ืื”ื‘ืชื™ ืืช ื”ืจืขื™ื•ืŸ. ืชืขื•ื“ื•ืช ื ืจืื• ืœื™ (ื•ืขื“ื™ื™ืŸ ื ืจืื•ืช) ื›ืžื• ืฉืจื™ื“ ืžื™ื•ืฉืŸ ืžื”ืขื‘ืจ, ื›ืžื• ืžืฉื”ื• ืฉืฆืจื™ืš ื”ื™ื” ืœืขื‘ื•ืจ ืžื–ืžืŸ ืžื”ืขื•ืœื. ืœื™ืžื•ื“ ื”ื•ื ื”ื’ืžื•ืœ ืฉืœ ืขืฆืžื• ื•ืื ืžื™ืฉื”ื• ืจื•ืฆื” ืœื”ื•ื›ื™ื— ืžื™ื•ืžื ื•ืช ืื– ืชื™ืง ืขื‘ื•ื“ื•ืช ืื™ื›ื•ืชื™ ืฉื•ื•ื” ื™ื•ืชืจ ืžื›ืœ ืชืขื•ื“ื”. ื•ืขื ื›ืœ ื–ื” ืžืกืชื‘ืจ ืฉืขื“ื™ื™ืŸ ืื™ืฉื•ืจ ืžืกื•ื“ืจ ืฉืกื™ื™ืžืชื ืงื•ืจืก ืขื•ื–ืจ ืœื—ืœืง ืžื›ื ืœื”ืชืžื™ื“ ื‘ืงื•ืจืก ื•ืœืจืื•ืช ืืช ื›ืœ ื”ืฉื™ืขื•ืจื™ื, ื•ืขื•ื–ืจ ืœื—ืœืง ืžื”ืžืขืกื™ืงื™ื ืฉืœื›ื ืœื›ืกื•ืช ื‘ืฉืžื—ื” ืืช ืขืœื•ืช ื”ืงื•ืจืก. ื‘ืฉื‘ื™ืœ ืฉืชื™ ื”ืงื‘ื•ืฆื•ืช ื”ืืœื” ื”ื•ืกืคืชื™ ื”ื™ื•ื ืœืืชืจ ืงืฆืช ืงื•ื“ ืฉืขื™ืงืจื• ื‘ืงื˜ืข ื”ื‘ื:
class CertificatesController < ApplicationController
  def show
    @bundle = Bundle.find_by(slug: params[:b])
    authorize! :graduate, @bundle

    if current_user.name_on_certificate.blank? || current_user.certificate_gender.blank?
      return redirect_to(edit_user_registration, flash: t('notifications.missing_certificate_info'))
    end

    pdf = Prawn::Document.new
    pdf.font Rails.root.join('certificates', './Alef-Regular.ttf')
    pdf.bounding_box([140, 554], width: 300, height: 100) do
      pdf.text current_user.name_on_certificate, direction: :rtl, size: 24
    end
    pdf.bounding_box([80, 370], width: 500, height: 100) do
      pdf.text @bundle.name, size: 24
    end
    pdf.bounding_box([374, 242], width: 50, height: 100) do
      pdf.text @bundle.recommended_duration_in_hours, size: 16
    end

    # get the existing pdf
    template = CombinePDF.load Rails.root.join('certificates', "certificate_template_#{current_user.certificate_gender}.pdf")
    user = CombinePDF.parse pdf.render

    template.pages[0] << user.pages[0]

    send_data template.to_pdf, filename: "tocode_#{@bundle.slug}.pdf", type: "application/pdf"
  end
end
ื•ื›ืžื• ืฉืื ื™ ืื•ื”ื‘ ื‘ื•ืื• ื ืขืฉื” ืงืฆืช Code Review ื›ื“ื™ ืœืœืžื•ื“ ืงืฆืช ืขืœ ืจื•ื‘ื™ ื•ืขืœ ื” Trade Offs ื‘ืคื™ืชื•ื— ืคื™ืฆ'ืจื™ื: 1. ื“ื‘ืจ ืจืืฉื•ืŸ ืฉืื ื™ ืœื ืื•ื”ื‘ ื‘ืงื•ื“ ื–ื” ืฉื›ืœ ื”ืงื•ื“ ื›ืชื•ื‘ ื‘ืคื•ื ืงืฆื™ื” ืื—ืช ืืจื•ื›ื”. ื‘ืขื•ืœื ืžื•ืฉืœื ื”ื™ื™ืชื™ ืœื•ืงื— ืืช ื›ืœ ื”ื—ืœืง ื”ืžืจื›ื–ื™ ื•ืžื•ืฆื™ื ืื•ืชื• ืœืคื•ื ืงืฆื™ื” ืื—ืจืช ื‘ืงืœืืก ืื—ืจ. ื™ื•ื ืื—ื“ ื–ื” ื›ื ืจืื” ื™ืงืจื” ื‘ืกื‘ื‘ Refactoring ื›ืœืฉื”ื•, ืื‘ืœ ืื ื™ ื—ื•ืฉื‘ ืฉื‘ืงื•ื“ ืฉืื™ื ื• ืชืฉืชื™ืชื™ ื‘ืžืขืจื›ืช ืื™ืŸ ื‘ืขื™ื” ืœื”ืชื—ื™ืœ ืขื ืžืฉื”ื• ืฉืขื•ื‘ื“ ื•ืœื”ืชืงื“ื ืžืฉื. 2. ื”ื—ืœืง ื”ืจืืฉื•ืŸ ืฉืœ ื”ืคื•ื ืงืฆื™ื” ืžื•ืจื›ื‘ ืž-5 ื”ืฉื•ืจื•ืช ื”ืจืืฉื•ื ื•ืช. ื”ื•ื ื‘ื•ื“ืง ืฉืืชื ื™ื›ื•ืœื™ื ืœื™ื™ืฆืจ ืชืขื•ื“ื”, ื›ืœื•ืžืจ ืฉืกื™ื™ืžืชื ืืช ื”ืงื•ืจืก ื•ืฉืื ื™ ื™ื•ื“ืข ืื™ืš ืงื•ืจืื™ื ืœื›ื. ื”ืคื•ื ืงืฆื™ื” t ืฉืœ ืจื™ื™ืœืก ื”ื™ื ื”ื“ืจืš ืœื˜ืขื•ืŸ ื”ื•ื“ืขื” ืžืงื•ื‘ืฅ ืชืจื’ื•ื, ื•ื‘ืื•ืคืŸ ื›ืœืœื™ ื›ืœ ื”ื˜ืงืกื˜ื™ื ื‘ืืชืจ ืฉืžื•ืจื™ื ื‘ืงื•ื‘ืฅ ืชืจื’ื•ื ื‘ืฆื“ ื‘ืคื•ืจืžื˜ yml. 3. ื”ื—ืœืง ื”ืฉื ื™ ืฉืœ ื”ืคื•ื ืงืฆื™ื” ื™ื•ืฆืจ ืืช ื”ืชืขื•ื“ื” ื‘ืคื•ืจืžื˜ PDF ื‘ืขื–ืจืช ืฉืชื™ ืกืคืจื™ื•ืช: prawn ื• combine_pdf. ืฉืชื™ื”ืŸ ืœื ื”ื›ื™ ืžืชื•ื—ื–ืงื•ืช ืื‘ืœ ืขื•ื‘ื“ื•ืช. ื‘ืฉื‘ื™ืœ ืฉื”ืชืขื•ื“ื” ืชืฆื ื™ืคื” ื™ืฆืจืชื™ ืฉื ื™ ืงื‘ืฆื™ PDF ื‘ืชื•ืจ ืชื‘ื ื™ืช (ืื—ื“ ืœื‘ื ื™ื ืขื ื”ืžื™ืœื” "ื”ืฉืชืชืฃ" ื•ื”ืฉื ื™ื” ืœื‘ื ื•ืช ืขื ื”ืžื™ืœื” "ื”ืฉืชืชืคื”") ื•ืฉืžืจืชื™ ืื•ืชื ื‘ืชื™ืงื™ื™ืช ื”ืคืจื•ื™ืงื˜. ื‘ืงื•ื“ ืื ื™ ื ื•ืชืŸ ืœ prawn ืœื™ื™ืฆืจ PDF ื—ื“ืฉ ืจืง ืขื ื”ื—ืœืงื™ื ื”ื“ื™ื ืžื™ื™ื ื‘ืชืขื•ื“ื”, ื›ืœื•ืžืจ ืฉื ื”ืžืฉืชืžืฉ, ืฉื ื”ืงื•ืจืก ื•ื›ืžื” ืฉืขื•ืช ื”ืงื•ืจืก. ืื—ืจื™ ื–ื” ืื ื™ ืžืฉืชืžืฉ ื‘ combine_pdf ื›ื“ื™ ืœืฉืœื‘ ืืช ื”ื—ืœืงื™ื ื”ื“ื™ื ืžื™ื™ื ืขื ื”ืชื‘ื ื™ืช ื•ืœืงื‘ืœ ืงื•ื‘ืฅ ืชืขื•ื“ื” ืขื ื”ื ืชื•ื ื™ื. ืฉื•ื•ื” ืœืฉื™ื ืœื‘ ืฉื›ืœ ื”ืขื‘ื•ื“ื” ืžื‘ื•ืฆืขืช ื‘ื–ื™ื›ืจื•ืŸ ื‘ืœื™ ืงื‘ืฆื™ื ื–ืžื ื™ื™ื, ื•ื›ืš ืœื ืฆืจื™ืš ืœื”ืžืฆื™ื ืฉืžื•ืช ื•ืœื”ืชืžื•ื“ื“ ืขื ื”ืชื ื’ืฉื•ื™ื•ืช. 4. ื”ืฉื•ืจื” ื”ืื—ืจื•ื ื” ืฉื•ืœื—ืช ืืช ื”ืชืขื•ื“ื” ื—ื–ืจื” ืœื“ืคื“ืคืŸ. ## ืื™ืš ืœื”ื•ืจื™ื“ ืชืขื•ื“ื” ื‘ืงื•ืจืก ืฉืกื™ื™ืžืชื™ ืื ืืชื ืžื ื•ื™ื™ื ืœืืชืจ ื•ืจื•ืฆื™ื ืœืจืื•ืช ืื™ืš ื ืจืื™ืช ืชืขื•ื“ื”, ื›ืœ ืžื” ืฉืืชื ืฆืจื™ื›ื™ื ืœืขืฉื•ืช ื”ื•ื ืœืกื™ื™ื ืœืฆืคื•ืช ื‘ืื™ื–ืฉื”ื• ืงื•ืจืก (ืžืงื•ื•ื” ืฉื›ื‘ืจ ืขืฉื™ืชื ืืช ื–ื”), ื•ืื– ื‘ืžืกืš ืชื•ื›ืŸ ื”ืขื ื™ื™ื ื™ื ืฉืœ ื”ืงื•ืจืก ืชื•ืคื™ืข ืœื›ื ืชื™ื‘ื” ื—ื“ืฉื” ืžืฉืžืืœ ืœืจืฉื™ืžืช ื”ืฉื™ืขื•ืจื™ื ืขื ืืคืฉืจื•ืช ืœื”ื•ืจื™ื“ ืืช ื”ืชืขื•ื“ื”. ## ืชืงืœื•ืช? ืฉืืœื•ืช? ื“ื‘ืจื• ืื™ืชื™ ื•ื”ื›ื™ ื—ืฉื•ื‘ ืื ื”ื•ืจื“ืชื ืืช ื”ืชืขื•ื“ื” ืื• ืชืขื•ื“ื•ืช ืฉืœื›ื ื•ืขื“ื™ื™ืŸ ื™ืฉ ืœื›ื ืฉืืœื•ืช, ื”ืขืจื•ืช, ืชืงืœื•ืช ืื• ืžื—ืฉื‘ื•ืช ืขืœ ื”ืคื™ืฆ'ืจ ืฉืœื—ื• ืื™ืžื™ื™ืœ ืื• ื”ืฉืื™ืจื• ื”ื•ื“ืขื” ื‘ืืชืจ. ืืฉืžื— ืœืฉืžื•ืข ื•ืœื”ืžืฉื™ืš ืœืฉืคืจ ืืช ื”ืชืฉืชื™ืช.

ToCode
1 420
# ืžื—ืงืจ ื•ืคื™ืชื•ื— ื‘ื›ืœ ื”ื—ื‘ืจื•ืช ืื•ื”ื‘ื™ื ืœืงืจื•ื ืœืžื—ืœืงืช ืชื•ื›ื ื” R&D, ืงื™ืฆื•ืจ ืฉืœ ืžื—ืงืจ ื•ืคื™ืชื•ื—. ื”ื ืจืง ืฉื›ื—ื• ืœื”ื’ื™ื“ ืœื ื• ืฉืฉื ื™ ื”ื“ื‘ืจื™ื ื”ืืœื” ืฉื•ื ื™ื ื•ื“ื•ืจืฉื™ื ื”ืชื ื”ืœื•ืช ืฉื•ื ื”: ืคื™ืชื•ื— ื–ื” ื”ื—ืœืง ืฉืื ื—ื ื• ื›ื•ืชื‘ื™ื ืคื™ืฆ'ืจื™ื ื•ืžืชืงื ื™ื ื‘ืื’ื™ื. ื”ืฆืœื—ื” ื‘ืคื™ืชื•ื— ืžื’ื™ืขื” ื›ืฉื›ื•ืชื‘ื™ื ืงื•ื“ ื™ืคื”, ื™ืฆื™ื‘ ื•ืžืชื•ืขื“. ื›ืฉื”ื‘ืื’ื™ื ื‘ืืžืช ืžืกืชื“ืจื™ื ื•ื›ืฉื”ืžืขืจื›ืช ื‘ืกื•ืฃ ื™ื•ื ืขื‘ื•ื“ื” ื ืจืื™ืช ื™ื•ืชืจ ื˜ื•ื‘ ืžืžื” ืฉื”ื™ืชื” ื›ืฉื”ืชื—ืœืช. ืžื—ืงืจ ื–ื” ื”ื—ืœืง ืฉืื ื—ื ื• ืœื•ืžื“ื™ื ื•ืžื’ืœื™ื ืฉื™ื˜ื•ืช ืขื‘ื•ื“ื” ื—ื“ืฉื•ืช. ืžื—ืงืจ ื™ื›ื•ืœ ืœื”ื™ื›ืฉืœ. ืžื—ืงืจ ื”ื•ื ืœื ืœื™ื ืืจื™ ื•ืœื ืžื“ื™ื“. ืžื—ืงืจ ื–ื” ืžื” ืฉืงื•ืจื” ื›ืฉื™ื•ืฉื‘ื™ื ืฉืœื•ืฉื” ื™ืžื™ื ืœื”ืจื™ื POC ืจืง ื‘ืฉื‘ื™ืœ ืœื’ืœื•ืช ืฉืžืฉื”ื• ืžืื•ื“ ื‘ืกื™ืกื™ ื‘ื”ืชื—ืœื” ื”ื™ื” ืฉื’ื•ื™ ื•ืฆืจื™ืš ืœืžื—ื•ืง ืืช ื”ื›ืœ. ื‘ืกื•ืฃ ื”ืžื—ืงืจ ื”ืžืขืจื›ืช ืชื”ื™ื” ื‘ืื•ืชื• ืžืฆื‘ ืื• ืืคื™ืœื• ื’ืจื•ืข ื™ื•ืชืจ. ืžื” ืฉื”ืฉืชืคืจ ื–ื” ื”ื™ื“ืข ืฉืœืš. ืคื™ืชื•ื— ื ื•ืชืŸ ื”ืจื’ืฉื” ื˜ื•ื‘ื” ื™ื•ืชืจ. ืžื—ืงืจ ื”ื•ื ื”ื“ืจืš ื”ื™ื—ื™ื“ื” ืงื“ื™ืžื”. ืืœ ืชื•ื•ืชืจื• ืขืœ ืืฃ ืื—ื“ ืžื”ื.

ToCode
1 420
# ื“ื• ืœืฉื•ื ื™ ื”ืžื•ื›ืจืช ื‘ื—ื ื•ืช ื”ื™ืจืงื•ืช ื‘ื‘ืจืฆืœื•ื ื” ื”ืกืชื›ืœื” ืขืœื™ื™ ื›ืื™ืœื• ื ื—ืชืชื™ ืžืื™ื–ื” ื›ื•ื›ื‘ ืื—ืจ - Cucmber? Que es eso? ื”ื™ื ืฉืืœื”, ื•ื”ื™ื” ื‘ืจื•ืจ ืœืืŸ ื”ื’ืขืชื™. ืœืžืจื•ืช ืฉื›ืœ ืฉืœื˜, ื›ืœ ื”ื•ื“ืขื”, ื›ืœ ืžื›ื•ื ืช ื›ืจื˜ื™ืกื™ื ื•ื›ืœ ื”ื™ื‘ื˜ ืื—ืจ ืฉืœ ื”ื—ื™ื™ื ื‘ืขื™ืจ ืžืชื ื”ืœ ื‘-3 ืฉืคื•ืช (ืื ื’ืœื™ืช, ืงื˜ืœืื ื™ืช ื•ืกืคืจื“ื™ืช), ื”ื—ื•ืœื™ื” ื”ื—ืœืฉื” ื”ื™ื ื”ืื ืฉื™ื ืฉื›ืžื• ื‘ื›ืœ ืžืงื•ื ืื•ื”ื‘ื™ื ืืช ืื–ื•ืจ ื”ื ื•ื—ื•ืช ืฉืœื”ื. ื•ืœืžื” ืฉื™ืชืืžืฆื•? ื”ืจื™ ื’ื ืคื” ื‘ืืจืฅ ืื ื—ื ื• ืคื•ื’ืฉื™ื ืืช ื”ืขืจื‘ื™ืช ื‘ื›ืœ ืฉืœื˜ ืจื—ื•ื‘, ืขืœ ื›ืœ ืื•ื˜ื•ื‘ื•ืก ื•ื‘ื›ืœ ื”ื•ื“ืขื” ืจืฉืžื™ืช, ื•ื‘ื›ืœ ื–ืืช ืžื™ ืฉืœื ืžื“ื‘ืจ ืžื”ื‘ื™ืช ืœื ื˜ื•ืจื— ืœืœืžื•ื“. ืื‘ืœ ื”ืคื•ืกื˜ ื”ื–ื” ืื™ื ื• ืขืœ ืฉืคื•ืช ืื• ืขืœ ื™ืจืงื•ืช, ืืœื ืขืœ ื”ื–ื“ืžื ื•ื™ื•ืช. ืขืœ ื”ื”ื–ื“ืžื ื•ืช ืœืœืžื•ื“ ืื ื’ืœื™ืช, ืฉื ืžืฆืืช ื‘ื›ืœ ืžืงื•ื ืกื‘ื™ื‘ืš ืื‘ืœ ื ืจืื™ืช ื‘ืœืชื™ ื ื™ืชื ืช ืœื”ืฉื’ื”. ืขืœ ื”ื”ื–ื“ืžื ื•ืช ืœืœืžื•ื“ ืฉืคืช ืชื›ื ื•ืช ื—ื“ืฉื” ืื• ื˜ื›ื ื™ืงื” ื—ื“ืฉื” ืืคื™ืœื• ื‘ืคืจื•ื™ืงื˜ ื”ื ื•ื›ื—ื™ ืฉืœืš, ืœืžืฉืœ ืขืœ ื™ื“ื™ ืฉื™ืœื•ื‘ git ืื• ื˜ื›ื ื•ืœื•ื’ื™ื•ืช ืขื ืŸ, ืฉืคืฉื•ื˜ ืœื ื ืจืื™ืช ืคืจืงื˜ื™ืช ืžืžื™ืœื™ื•ืŸ ืกื™ื‘ื•ืช. ืขื“ ืฉื™ื•ื ืื—ื“ ืžื—ืœื™ื˜ื™ื ืœื ืฆืœ ืื•ืชื”, ื•ืžื’ืœื™ื ืฉืื•ืชื• ื—ืœื•ื ื”ืงื™ืฃ ืื•ืชื ื• ื›ืœ ื”ื–ืžืŸ.

ToCode
1 420
# ื–ื” ื™ื™ืงื— ืจืง ื“ืงื” ื–ื” ื™ื™ืงื— ืจืง ื“ืงื”? ื‘ืืžืช? ื›ื•ืœืœ ื›ืชื™ื‘ืช ื”ื‘ื“ื™ืงื”? ื›ื•ืœืœ ื›ืชื™ื‘ืช ื”ืชื™ืขื•ื“ ืœืคื™ืฆ'ืจ? ื›ื•ืœืœ ื”ืจืฆืช ื”ื‘ื“ื™ืงื•ืช ื”ื™ืฉื ื•ืช ื•ืชื™ืงื•ืŸ ืื• ืžื—ื™ืงื” ืฉืœ ื‘ื“ื™ืงื•ืช ืœื ืจืœื•ื•ื ื˜ื™ื•ืช? ื›ื•ืœืœ ื ื™ืกื•ื— ื”ื•ื“ืขืช ืงื•ืžื™ื˜ ื˜ื•ื‘ื”? ื›ื•ืœืœ ื“ื—ื™ืคื” ืœืฉืจืช ื•ื”ืชืžื•ื“ื“ื•ืช ืขื ืงื•ื ืคืœื™ืงื˜ื™ื? ืชื™ืงื•ื ื™ื ืžื”ื™ืจื™ื ืฉืฉื•ื‘ืจื™ื 50 ื“ื‘ืจื™ื ืื—ืจื™ื ืœื ืžื•ืกื™ืคื™ื ื ืงื•ื“ื•ืช ืœืืฃ ืื—ื“. ืขื“ื™ืฃ ืœืงื—ืช ืื•ื•ื™ืจ ื•ืœื›ืชื•ื‘ ืืช ื”ืชื™ืงื•ืŸ ื‘ืฆื•ืจื” ื ื›ื•ื ื”. ื”ื—ืฆื™ ืฉืขื” ืฉืื•ืœื™ ื—ืกื›ืช ืขื›ืฉื™ื• ืชืขืœื” ื”ืจื‘ื” ื™ื•ืชืจ ื‘ืขื•ื“ ื—ื•ื“ืฉื™ื™ื.

ToCode
1 420
# ืขื“ื™ืคื” ืืจื›ื™ื˜ืงื˜ื•ืจื” ื˜ื•ื‘ื” ืขืœ ืžืขืงืฃ ื˜ื•ื‘ ืื– ื‘ืจื™ืืงื˜ ืขื•ื‘ื“ื™ื ืขืœ ืชื™ืขื•ื“ ื—ื“ืฉ ื•ืื—ืช ื”ื“ื•ื’ืžืื•ืช ืฉื ืชืคืกื” ืืช ื”ืขื™ืŸ ืฉืœ ืกื‘ืกื˜ื™ืืŸ ืงืจืœื•ืก ื•ื–ื›ืชื” ืœื›ื™ื ื•ื™ "ื”ืชื‘ื ื™ืช ื”ืžื›ื•ืขืจืช ื‘ื™ื•ืชืจ ื‘ืจื™ืืงื˜". ื–ื” ื”ืงื•ื“:
function CountLabel({ count }) {
  const [prevCount, setPrevCount] = useState(count);
  const [trend, setTrend] = useState(null);
  if (prevCount !== count) {
    setPrevCount(count);
    setTrend(count > prevCount ? 'increasing' : 'decreasing');
  }
  return (
    <>
      <h1>{count}</h1>
      {trend && <p>The count is {trend}</p>}
    </>
  );
}
ื”ืจืขื™ื•ืŸ ื”ื•ื ืฉื”ืงื•ืžืคื•ื ื ื˜ื” CountLabel ืžืงื‘ืœืช ืืช ื”ืขืจืš ืฉืœ count ืžื‘ื—ื•ืฅ ื•ืฆืจื™ื›ื” ืœื”ืฆื™ื’ ืžื’ืžื” - ื”ืื ื”ืขืจืš ื”ื ื•ื›ื—ื™ ื’ื“ื•ืœ ืื• ืงื˜ืŸ ืžื”ืขืจืš ื”ืงื•ื“ื. ื‘ืฉื‘ื™ืœ ื–ื” ื”ื™ื ืฉื•ืžืจืช ืืช ื”ืขืจืš ื”ืงื•ื“ื ื‘ State ื•ืื– ืื ื—ื ื• ืชืงื•ืขื™ื ื•ืฆืจื™ื›ื™ื ืœืขื“ื›ืŸ ืืช ื”ืกื˜ื™ื™ื˜ ื‘ืชื•ืš ื”ืงื•ื“ ื”ืจืืฉื™ ืฉืœ ืคื•ื ืงืฆื™ื™ืช CountLabel. ื’ื ื‘ืชื™ืขื•ื“ ืฉืœ ืจื™ืืงื˜ ืžื•ื“ื™ื ืฉื–ื• ืœื ืื•ืคืฆื™ื” ื˜ื•ื‘ื”, ืื‘ืœ ืฉื‘ืžืฆื‘ื™ื ืžืกื•ื™ืžื™ื ื”ื™ื ื”ื“ืจืš ื”ื™ื—ื™ื“ื” ืœืคืชื•ืจ ื‘ืขื™ื”. ื”ืงื•ื ื˜ืงืกื˜ ืœืกื™ืคื•ืจ ื”ื–ื” ื”ื•ื ืฉืขื“ ืขื›ืฉื™ื• ื”ื”ืžืœืฆื” ื”ื™ืชื” ืœื”ืฉืชืžืฉ ื‘ useEffect ื›ื“ื™ ืœืขื“ื›ืŸ ืžืฉืชื ื” ืกื˜ื™ื™ื˜ ื‘ืขืงื‘ื•ืช ืฉื™ื ื•ื™ ืฉืœ prop, ื•ืขื›ืฉื™ื• ื”ื ืžืžืœื™ืฆื™ื ืœื•ื•ืชืจ ืขืœ ื” useEffect ื•ืœืขื“ื›ืŸ ืืช ื”ืขืจืš ื™ืฉื™ืจื•ืช ื‘ืคื•ื ืงืฆื™ื” ื”ืจืืฉื™ืช. ื”ืืžืช ื”ื™ื ืฉืฉืชื™ ื”ืื•ืคืฆื™ื•ืช ืœื ื˜ื•ื‘ื•ืช, ื•ืฉืชื™ื”ืŸ ืžื”ื•ื•ืช ื‘ืกืš ื”ื›ืœ ืžืขืงืฃ ืขื‘ื•ืจ ืืจื›ื™ื˜ืงื˜ื•ืจื” ื’ืจื•ืขื”. ืคื™ืชืจื•ืŸ ื ื›ื•ืŸ ืœืฉืžื™ืจืช ืžื’ืžื” ื™ื”ื™ื” ืœืฉืžื•ืจ ืืช ื”ืžื’ืžื” ื™ื—ื“ ืขื ื”ืกื˜ื™ื™ื˜ ื”ืžืงื•ืจื™ - ื›ืœื•ืžืจ ืžื™ ืฉืžื—ื–ื™ืง ืืช count ื•ืื—ืจืื™ ืขืœ ืขื“ื›ื•ืŸ ืฉืœื• ื”ื•ื ื’ื ื–ื” ืฉืฆืจื™ืš ืœืฉืžื•ืจ ืืช ื”ืžื’ืžื”. ืฉืžื™ืจืช ื–ื™ื›ืจื•ืŸ ืฉืœ ื”ืขืจืš ื”ืงื•ื“ื ื”ื™ื ืชื›ื•ื ื” ืฉืœ ื”ืกื˜ื™ื™ื˜, ื‘ื“ื™ื•ืง ื›ืžื• ืฉืžื™ืจื” ืฉืœ ืžืฉืชื ื” ื”ืกื˜ื™ื™ื˜ ื‘ Local Storage ืื• ื›ืœ ืžื ื™ืคื•ืœืฆื™ื” ืื—ืจืช ืขืœ ื”ืขืจืš. ื•ื›ืš ืคื™ืชืจื•ืŸ ืขื Custom Hook ื”ื•ืœืš ืœื”ื™ื•ืช ื”ืจื‘ื” ื™ื•ืชืจ ืคืฉื•ื˜ ื•ื™ื•ืชืจ ื ื›ื•ืŸ ืžื”ื”ืฆืขื” ืฉืœ ืกื˜ื™ื™ื˜ ื ื•ืกืฃ ื‘ืงื•ืžืคื•ื ื ื˜ืช ื™ืœื“. ื–ื” ื ืจืื” ื›ื›ื”:
import { useState } from "react";

function useTrendedState(initialValue) {
  const [value, setValue] = useState(initialValue);
  const [prevValue, setPrevValue] = useState(initialValue);

  function setter(...args) {
    setPrevValue(value);
    return setValue(...args);
  }

  return [value, setter, prevValue];
}

function CountLabel({ count, prevCount }) {
  let trend;
  if (count < prevCount) {
    trend = "Decreasing";
  } else if (count > prevCount) {
    trend = "Increasing";
  } else {
    trend = "Stable";
  }

  return (
    <>
      <h1>{count}</h1>
      {trend && <p>The count is {trend}</p>}
    </>
  );
}

export default function App() {
  const [count, setCount, prevCount] = useTrendedState(0);
  return (
    <>
      <button onClick={() => setCount(count + 1)}>Increment</button>
      <button onClick={() => setCount(count - 1)}>Decrement</button>
      <CountLabel count={count} prevCount={prevCount} />
    </>
  );
}
ืขืœ ื”ื“ืจืš ื”ืจื•ื•ื—ื ื• ืงื•ื“ ืžืคื•ืจืฉ ืฉืžื˜ืคืœ ื‘ืžืฆื‘ ืฉ count ืœื ื”ืฉืชื ื”. ื ื›ื•ืŸ ืฉื‘ื’ืœืœ ืฉื–ื” ืžืกืคืจื™ื ื•ื‘ื’ืœืœ ืฉ useState ืžืžื™ืœื ืœื ืขื•ืฉื” ื›ืœื•ื ื›ืฉื”ื•ื ื ืงืจื ืขื ื”ืขืจืš ืฉื›ื‘ืจ ืงื™ื™ื ืฉื ื”ืžืฆื‘ ื”ื–ื” ืœื ืืคืฉืจื™ ื‘ืงื•ื“ ื”ื ื•ื›ื—ื™, ืื‘ืœ ื‘ืžืฆื‘ื™ื ื™ื•ืชืจ ืžื•ืจื›ื‘ื™ื ื‘ื”ื—ืœื˜ ืืคืฉืจ ืœื“ืžื™ื™ืŸ ืžืฉืžืขื•ืช ืฉื•ื ื” ืœื–ื”ื•ืช ืฉื›ืŸ ื”ื™ืชื” ืžื™ื™ืฆืจืช ื‘ืื’ ื‘ื”ืฆืขื” ืฉื‘ืชื™ืขื•ื“ (ืœืžืฉืœ ื‘ืขื‘ื•ื“ื” ืขื ืžืขืจื›ื™ื ืื• ืื•ื‘ื™ืงื˜ื™ื). ื›ืŸ ืคืชื—ื™ ืžื™ืœื•ื˜ ื–ื” ื—ืฉื•ื‘, ื•ื›ืŸ ื˜ื•ื‘ ืฉื™ืฉ ืื•ืชื ื‘ืคืจื™ื™ืžื•ื•ืจืง, ืื‘ืœ ืื ื›ื‘ืจ ื‘ื•ื—ืจื™ื ืœืชืขื“ ืคืชื— ืžื™ืœื•ื˜ ื›ื–ื” ืขื“ื™ืฃ ืœื‘ื—ื•ืจ ื“ื•ื’ืžื” ืฉื‘ืืžืช ื“ื•ืจืฉืช ืื•ืชื•. ื•ืœื, ืื ื™ ืœื ื™ื›ื•ืœ ืœื—ืฉื•ื‘ ืขืœ ื›ื–ืืช ื“ื•ื’ืžื”.

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

ToCode
1 420
sys.argv = sys.argv[:1]
    unittest.main()
    sys.exit(0)


print("Hello world")

# part 1
print(f"2 * 2 = {two_by_two()}")

<<<<<<< HEAD
=======
# part 2
print(f"3 * 3 = {three_by_three()}")



>>>>>>> ae4ea11 (add tests)
ื–ืืช ื”ื”ื“ืคืกื” ื‘ืฉื•ืจื” ื”ืื—ืจื•ื ื” - ืื ื™ ืžื•ื—ืง ืื•ืชื” ื•ืžืžืฉื™ืš ืืช ื”ืจื™ื‘ื™ื™ืก:
$ git add .
$ git rebase --continue

[detached HEAD 82f6008] add tests
 1 file changed, 13 insertions(+)
Successfully rebased and updated detached HEAD.
ื ืขื‘ื™ืจ ืืช main ืœืžืงื•ื ื”ื—ื“ืฉ ืฉืœื• ื•ื ืงื‘ืœ:
$ git branch -f main HEAD
$ git switch main
$ git log --oneline --graph

* 82f6008 (HEAD -> main) add tests
* 3e0d862 add generic method
* 05df720 add script docs
* 5161eec fixed print statement
* c299ef3 add print statement
* 6adbc5b initial commit
ืขื›ืฉื™ื• ื”ื”ื™ืกื˜ื•ืจื™ื” ื ืจืื™ืช ื”ืจื‘ื” ื™ื•ืชืจ ื˜ื•ื‘, ื‘ืœื™ ืฉื•ื ื–ื›ืจ ืœืขื ืฃ ืฉืžื•ื–ื’. ืื ื‘ืขืชื™ื“ ื ืจืฆื” ืœื—ื–ื•ืจ ืืœื™ื•, ืœื”ื•ืกื™ืฃ ืขื•ื“ ืงื•ืžื™ื˜ื™ื ื•ืœืžื–ื’ ืœื ืชื”ื™ื” ืขื ื–ื” ืฉื•ื ื‘ืขื™ื”. ื”ืขื ื™ื™ืŸ ื”ื™ื—ื™ื“ ื”ื•ื ืฉืื ืขืฉื™ืชื push ืœืžืื’ืจ ืœืคื ื™ ื”ืจื™ื‘ื™ื™ืก, ืชืฆื˜ืจื›ื• ืœื“ื—ื•ืฃ ื’ื™ืจืกื” ืžืขื•ื“ื›ื ืช ื•ืœื“ืจื•ืก ืืช ืžื” ืฉืฉื™ืชืคืชื, ื•ื–ื” ื™ื›ื•ืœ ืœืกื‘ืš ืื ืฉื™ื ืื—ืจื™ื ืฉืขื•ื‘ื“ื™ื ืืชื›ื ืขืœ ื”ืคืจื•ื™ืงื˜ ื•ืื•ืœื™ ื›ื‘ืจ ื”ืฉืชืžืฉื• ื‘ื’ื™ืจืกื” ืฉืฉื™ืชืคืชื.

ToCode
1 420
print(f"2 * 2 = {two_by_two()}")

<<<<<<< HEAD
# part 2
print(f"3 * 3 = {three_by_three()}")



=======
>>>>>>> parent of 91cdcd3 (fixed conflicts)
ืื ื™ ืจื•ืื” ื‘ืงื•ื‘ืฅ ืฉื”ืงื˜ืขื™ื ื”ืžืกื•ืžื ื™ื ื”ื ื‘ืืžืช ืืœื” ืฉืžืชืื™ืžื™ื ืœืงื•ื“ ืฉื ื›ื ืก ืžื”ื‘ืจืื ืฅ ืฉืื ื™ ืจื•ืฆื” ืœืžื—ื•ืง, ืžืฉืื™ืจ ืจืง ืืช ื” HEAD ื•ืžืกื™ื™ื ืขื ื”ืกืงืจื™ืคื˜ ื”ื‘ื:
import unittest, sys

class TestMultMethod(unittest.TestCase):
    def test_mul_positives(self):
        self.assertEqual(6, mul(2, 3))

##
# This script does all kinds of nice things
# to help children learn math
#
def two_by_two():
    return mul(2, 2)

def mul(x, y):
    return x * y

# run self test with --test
if len(sys.argv) > 1 and sys.argv[1] == "--test":
    sys.argv = sys.argv[:1]
    unittest.main()
    sys.exit(0)


print("Hello world")

# part 1
print(f"2 * 2 = {two_by_two()}")
ื•ืžืกื™ื™ื ืืช ื” revert ืขื:
$ git add demo.py
$ git revert --continue
$ git log --oneline --graph

* 492cb53 (HEAD -> main) Revert printing 3 by 3
* ae4ea11 add tests
* 5ad40d1 add generic method
*   91cdcd3 fixed conflicts
|\
| * 6a8ccb0 add comments
| * 71b3207 fixed syntax
| * b2cc15b first try
* | 05df720 add script docs
|/
* 5161eec fixed print statement
* c299ef3 add print statement
* 6adbc5b initial commit
ื”ืงื•ื“ ื—ื–ืจ ืœืžืฆื‘ื• ืœืคื ื™ ื”ืžื™ื–ื•ื’, ื”ืžื™ื–ื•ื’ ืžื•ืคื™ืข ื‘ื”ื™ืกื˜ื•ืจื™ื” ื•ื’ื ื”ื‘ื™ื˜ื•ืœ ืฉืœื• ื•ืจืง ืฆืจื™ืš ืœื–ื›ื•ืจ ืœืขื•ืœื ืœื ืœื”ื•ืกื™ืฃ ืงื•ืžื™ื˜ ืขื ืชื™ืงื•ืŸ ืื—ืจื™ ืงื•ืžื™ื˜ 6a8ccb0, ื›ืœื•ืžืจ ืœืขื ืฃ ื”ืฉื‘ื•ืจ, ื‘ื’ืœืœ ืฉืื™ ืืคืฉืจ ืœืžื–ื’ ืžื—ื“ืฉ ืžืฉื”ื• ืฉื›ื‘ืจ ืžื™ื–ื’ื ื•. ื›ืŸ ืืคืฉืจ ื™ื”ื™ื” ืœืขืฉื•ืช rebase ืœืฉืœื•ืฉืช ื”ืงื•ืžื™ื˜ื™ื ื”ื‘ืขื™ื™ืชื™ื™ื ื•ืื– ืœืžื–ื’ ืืช ื”ื’ื™ืจืกื” ื”ื—ื“ืฉื” ื”ืžืจื•ื‘ืกืช ืฉืœื”ื. ## ืื™ืš ืœื‘ื˜ืœ ืืช ื”ืžื™ื–ื•ื’ ืขื rebase ื“ืจืš ืื—ืจืช ืœื’ืฉืช ืœืื•ืชื” ื‘ืขื™ื”, ืื ืœื ื“ื—ืคืชื ืขื“ื™ื™ืŸ ืืช ื”ืžืื’ืจ, ื”ื™ื ืœืขืฉื•ืช rebase ืœืงื•ืžื™ื˜ื™ื ae4ea11 ื• 5ad40d1 ื›ืš ืฉืื•ืชื• ื”ืงื•ื“ ืฉื™ืฉ ื‘ื”ื "ื™ื•ืœื‘ืฉ" ืขืœ ืงื•ืžื™ื˜ 05df720 ืฉื”ื™ื” ืœืคื ื™ ื”ืžื™ื–ื•ื’. ื–ื” ื ืจืื” ื›ื›ื”:
$ git rebase --onto 05df720 91cdcd3 ae4ea11
ื™ืฉ ืคื” 3 ืžืกืคืจื™ ืงื•ืžื™ื˜ื™ื: 1. ื”ืจืืฉื•ืŸ ื”ื•ื ื”ืงื•ืžื™ื˜ ืฉืžืžื ื• ืื ื—ื ื• ืจื•ืฆื™ื ืœื”ืžืฉื™ืš (ื‘ื“ื™ื•ืง ืœืคื ื™ ื”ืžื™ื–ื•ื’ ื”ื‘ืขื™ื™ืชื™) 2. ื”ืฉื ื™ ื”ื•ื ืงื•ืžื™ื˜ ื”ืžื™ื–ื•ื’ (ื”ืงื•ืžื™ื˜ ื”ืื—ืจื•ืŸ ืฉืื ื—ื ื• ืจื•ืฆื™ื ืœืžื—ื•ืง) 3. ื”ืฉืœื™ืฉื™ ื”ื•ื ื”ืงื•ืžื™ื˜ ื”ืื—ืจื•ืŸ ื‘ืคืจื•ื™ืงื˜ (ื”ืงื•ืžื™ื˜ ืืœื™ื• ืื ื—ื ื• ืจื•ืฆื™ื ืœื”ื’ื™ืข). ืืคืฉืจ ืœื”ืฉืชืžืฉ ื‘ืฉื main ื‘ืžืงื•ื ืžืกืคืจ ืงื•ืžื™ื˜ ื›ืืŸ. ื”ืชื•ืฆืื” ื”ื™ื ื›ืžื•ื‘ืŸ ืงื•ื ืคืœื™ืงื˜ ืื‘ืœ ื–ื” ืฆืคื•ื™:
Auto-merging demo.py
CONFLICT (content): Merge conflict in demo.py
error: could not apply 5ad40d1... add generic method
hint: Resolve all conflicts manually, mark them as resolved with
hint: "git add/rm <conflicted_files>", then run "git rebase --continue".
hint: You can instead skip this commit: run "git rebase --skip".
hint: To abort and get back to the state before "git rebase", run "git rebase --abort".
Could not apply 5ad40d1... add generic method
ื”ืงื•ื“ ืขื ื”ืงื•ื ืคืœื™ืงื˜ ืžืกื•ืžืŸ ื”ื•ื:
##
# This script does all kinds of nice things
# to help children learn math
#
<<<<<<< HEAD
=======
def three_by_three():
    return mul(3, 3)
>>>>>>> 5ad40d1 (add generic method)

def two_by_two():
    return mul(2, 2)

def mul(x, y):
    return x * y

print("Hello world")

# part 1
print(f"2 * 2 = {two_by_two()}")
ืื ื™ ืžื•ื—ืง ืืช ื”ืคื•ื ืงืฆื™ื” ื”ืžื™ื•ืชืจืช ื›ื“ื™ ืœืชืงืŸ ืืช ื”ืงื•ื ืคืœื™ืงื˜ ื•ืžืžืฉื™ืš ื‘ืจื™ื‘ื™ื™ืก, ืจืง ื‘ืฉื‘ื™ืœ ืœืงื‘ืœ ืงื•ื ืคืœื™ืงื˜ ื ื•ืกืฃ:
$ git add .
$ git rebase --continue

Auto-merging demo.py
CONFLICT (content): Merge conflict in demo.py
error: could not apply ae4ea11... add tests
hint: Resolve all conflicts manually, mark them as resolved with
hint: "git add/rm <conflicted_files>", then run "git rebase --continue".
hint: You can instead skip this commit: run "git rebase --skip".
hint: To abort and get back to the state before "git rebase", run "git rebase --abort".
Could not apply ae4ea11... add tests
ื”ืงื•ื“ ืขื›ืฉื™ื• ืขื ื”ืงื•ื ืคืœื™ืงื˜ ืžืกื•ืžืŸ ื”ื•ื:
import unittest, sys

class TestMultMethod(unittest.TestCase):
    def test_mul_positives(self):
        self.assertEqual(6, mul(2, 3))

##
# This script does all kinds of nice things
# to help children learn math
#
def two_by_two():
    return mul(2, 2)

def mul(x, y):
    return x * y

# run self test with --test
if len(sys.argv) > 1 and sys.argv[1] == "--test":

ToCode
1 420
# ืื™ืš ืœื‘ื˜ืœ ืžื™ื–ื•ื’ ืฉืœ ืขื ืฃ ื™ืฉืŸ ื‘ git ื‘ืขื‘ื•ื“ื” ืขื ื’ื™ื˜ ืื ื—ื ื• ืื•ื”ื‘ื™ื ืœื‘ื ื•ืช ื›ืœ ืคื™ืฆ'ืจ ื‘ืขื ืฃ ืžืฉืœื• ื•ืจืง ืื—ืจื™ ืฉื‘ื“ืงื ื• ื•ื”ื›ืœ ืขื•ื‘ื“ ืœืžื–ื’ ืœืชื•ืš main (ื–ืืช ืœื ื”ื“ืจืš ื”ื™ื—ื™ื“ื” ืœืขื‘ื•ื“, ืื‘ืœ ื”ื™ื ืžืกืคื™ืง ืคื•ืคื•ืœืจื™ืช ื›ื“ื™ ืœื”ื™ื—ืฉื‘ ืœืžื™ื™ื ืกื˜ืจื™ื). ื‘ืขื™ื” ืฉื—ื•ื–ืจืช ืœื ืคืขื ื‘ืฉื™ื˜ืช ืขื‘ื•ื“ื” ื›ื–ื• ื”ื™ื ื”ืฆื•ืจืš ืœื‘ื˜ืœ ืžื™ื–ื•ื’ ืฉืœ ืขื ืฃ, ืœืžืฉืœ ื›ื™ ืื—ืจื™ ืฉืžื™ื–ื’ื ื• ื•ื”ืขืœื™ื ื• ืœืคืจื•ื“ืงืฉืŸ ืคืชืื•ื ื’ื™ืœื™ื ื• ืืช ื”ื‘ืื’ ื”ื”ื•ื ืฉืคืกืคืกื ื• ื‘ื‘ื“ื™ืงื•ืช. ## ืžืื’ืจ ืœื“ื•ื’ืžื” ื‘ืฉื‘ื™ืœ ื”ื“ื•ื’ืžื” ื‘ื ื™ืชื™ ืžืื’ืจ ืžืกืงืจื™ืคื˜ ืคื™ื™ืชื•ืŸ ืฉื”ืœื•ื’ ืฉืœื• ื ืจืื” ื›ื›ื”:
* ae4ea11 (HEAD -> main) add tests
* 5ad40d1 add generic method
*   91cdcd3 fixed conflicts
|\
| * 6a8ccb0 add comments
| * 71b3207 fixed syntax
| * b2cc15b first try
* | 05df720 add script docs
|/
* 5161eec fixed print statement
* c299ef3 add print statement
* 6adbc5b initial commit
ืืคืฉืจ ืœืจืื•ืช ืืช ื”ืขื ืฃ ื”ืžืžื•ื–ื’ ื‘ื™ืŸ ื”ืงื•ืžื™ื˜ add comments ืœืงื•ืžื™ื˜ first try. ื”ืืžืช ื”ื™ื ืฉื™ืฉ ืขื•ื“ ื›ืžื” ืขื ืคื™ื ืฉืžื•ื–ื’ื• ืคื ื™ืžื”, ืื‘ืœ ืจืง ื‘ืขื ืฃ ื”ื–ื” ื”ื™ื• ืงื•ื ืคืœื™ืงื˜ื™ื ื•ืœื›ืŸ ื ื•ืฆืจ ืฉื Merge Commit (ื–ื” ืงื•ืžื™ื˜ ืžืกืคืจ 91cdcd3). ืฉืืจ ื”ืžื™ื–ื•ื’ื™ื ืขื‘ืจื• ื—ืœืง ืขื Fast Forward. ื‘ื ื•ืกืฃ ืื—ืจื™ ื›ืœ ืžื™ื–ื•ื’ ื’ื ืžื—ืงืชื™ ืืช ืฉื ื”ืขื ืฃ. ื‘ืžืื’ืจ ื™ืฉ ืจืง ืกืงืจื™ืคื˜ ืคื™ื™ืชื•ืŸ ื™ื—ื™ื“ ื‘ืงื•ื‘ืฅ demo.py ื•ื–ื” ื”ืชื•ื›ืŸ ืฉืœื•:
import unittest, sys

class TestMultMethod(unittest.TestCase):
    def test_mul_positives(self):
        self.assertEqual(6, mul(2, 3))

##
# This script does all kinds of nice things
# to help children learn math
#
def three_by_three():
    return mul(3, 3)

def two_by_two():
    return mul(2, 2)

def mul(x, y):
    return x * y

# run self test with --test
if len(sys.argv) > 1 and sys.argv[1] == "--test":
    sys.argv = sys.argv[:1]
    unittest.main()
    sys.exit(0)


print("Hello world")

# part 1
print(f"2 * 2 = {two_by_two()}")

# part 2
print(f"3 * 3 = {three_by_three()}")
ื•ื”ืงื•ืžื™ื˜ื™ื ืฉืื ื™ ืจื•ืฆื” ืœื‘ื˜ืœ ื”ื ืืœื” ืฉื”ื•ืกื™ืคื• ืืช ื”ืคื™ืฆ'ืจ ืฉืœ "ื”ื“ืคืกืช 3 ื›ืคื•ืœ 3", ื”ืคื™ืฆ'ืจ ื”ื–ื” ืžื•ืจื›ื‘ ืžื”ืคื•ื ืงืฆื™ื” three_by_three ื•ืžื”ื•ื“ืขืช ื”ื”ื“ืคืกื” ื‘ืฉื•ืจื” ื”ืื—ืจื•ื ื” ืฉืœ ื”ืกืงืจื™ืคื˜. ืžืื– ืฉื™ื ื•ื™ ื–ื” ื”ื™ื• ืขื•ื“ ืฉื™ื ื•ื™ื™ื ืฉื ื’ืขื• ื‘ื›ืœ ื”ืžืงื•ืžื•ืช ื‘ืกืงืจื™ืคื˜ ื•ืœื›ืŸ ืฆืคื•ื™ื™ื ืงื•ื ืคืœื™ืงื˜ื™ื. ## ืื™ืš ืœื‘ื˜ืœ ืืช ื”ืžื™ื–ื•ื’ ืขื revert ื“ืจืš ืื—ืช ืœื‘ื˜ืœ ืืช ื”ืžื™ื–ื•ื’ ื”ื™ื ืคืงื•ื“ืช revert. ืื‘ืœ ื™ืฉ ืขื ื–ื” ืฉืชื™ ื‘ืขื™ื•ืช: 1. ืจื™ื•ื•ืจื˜ ื”ื™ื ืคืงื•ื“ื” ืžืื•ื“ ืจื’ื™ืฉื” ืœืฉื™ื ื•ื™ื™ื ืฉืงืจื• ืื—ืจื™ ื”ืžื™ื–ื•ื’, ื•ืœื›ืŸ ื›ื›ืœ ืฉืขื‘ืจื• ื‘ืžืื’ืจ ื™ื•ืชืจ ืฉื™ื ื•ื™ื™ื ืื—ืจื™ ื”ืงื•ืžื™ื˜ ืฉืืชื ืจื•ืฆื™ื ืœื‘ื˜ืœ, ื›ืš ื” revert ื™ื”ื™ื” ืคื—ื•ืช ืืžื™ืŸ. ืจื™ื•ื•ืจื˜ ื‘ืขืฆื ืžื™ื™ืฆืจ ืงื•ืžื™ื˜ ื—ื“ืฉ ืฉืžื•ื—ืง ืืช ื”ืงื•ื“ ืฉื”ืงื•ืžื™ื˜ ื”ื‘ืขื™ื™ืชื™ ื”ื›ื ื™ืก. 2. ืื ืื™ ืคืขื ื‘ืขืชื™ื“ ืชืจืฆื• ืœืžื–ื’ ืžื—ื“ืฉ ืืช ื”ืขื ืฃ (ืœืžืฉืœ ื›ื™ ืชืžืฆืื• ืืช ื”ื‘ืขื™ื” ื•ืชืชืงื ื• ืื•ืชื”), ื’ื™ื˜ ืœื ื™ืžื–ื’ ืžื—ื“ืฉ ืืช ื”ืงื•ืžื™ื˜ื™ื ืฉื›ื‘ืจ "ืžื•ื–ื’ื•" ื•"ืจื•ื‘ืจื˜ื•" (reverted), ื›ื™ ื” revert ืœื ืžืฉื ื” ื“ื‘ืจื™ื ื‘ื”ื™ืกื˜ื•ืจื™ื” ืืœื ื”ื•ื ื‘ืกืš ื”ื›ืœ ืงื•ืžื™ื˜ ื—ื“ืฉ. ื–ื” ืื•ืžืจ ืฉืื ื ื™ืงื— ืืช ื”ื“ืจืš ื”ื–ืืช ื•ื‘ืขืชื™ื“ ื ืจืฆื” ืœืชืงืŸ ืžืฉื”ื• ื‘ืขื ืฃ ืฉื›ื‘ืจ ืžื•ื–ื’ ื ืฆื˜ืจืš ืœืขืฉื•ืช rebase ืœื›ืœ ื”ืงื•ืžื™ื˜ื™ื ื‘ืื•ืชื• ืขื ืฃ - ื›ืœื•ืžืจ ืœืงื•ืžื™ื˜ื™ื 6a8ccb0, 71b3207 ื• b2cc15b - ื›ื™ ืื—ืจืช ืฉืœื•ืฉืชื ืœื ื™ืžื•ื–ื’ื• ืžื—ื“ืฉ ืœืขื•ืœื. ื‘ื›ืœ ืžืงืจื” ื•ืื ืืชื ืžื•ื›ื ื™ื ืœื•ื•ืชืจ ืขืœ ืžื™ื–ื•ื’ ืขืชื™ื“ื™ ื‘ื•ืื• ื ืชืงื“ื. ืื ื™ ืžื–ื›ื™ืจ ืฉื”ืจื™ืคื• ื”ื•ื:
$ git log

* ae4ea11 (HEAD -> main) add tests
* 5ad40d1 add generic method
*   91cdcd3 fixed conflicts
|\
| * 6a8ccb0 add comments
| * 71b3207 fixed syntax
| * b2cc15b first try
* | 05df720 add script docs
|/
* 5161eec fixed print statement
* c299ef3 add print statement
* 6adbc5b initial commit
ื‘ื’ืœืœ ืฉื”ืžื™ื–ื•ื’ ื‘ื•ืฆืข ื‘ Merge Commit ืื ื™ ื™ื›ื•ืœ ืœื™ื™ืฆืจ (ื ื•, ืœื ืกื•ืช ืœื™ื™ืฆืจ) ืืช ืงื•ื“ ื”ื”ื™ืคื•ืš ื™ืฉื™ืจื•ืช ืžืื•ืชื• merge commit. ื‘ื’ืœืœ ืฉื–ื” merge commit ืื ื™ ืฆืจื™ืš ืœืฆื™ื™ืŸ ืื™ื–ื• ืจื’ืœ ืฉืœื• ืžื™ื™ืฆื’ืช ืืช ื”ืขื ืฃ ื”ืจืืฉื™, ื›ืœื•ืžืจ ื–ื” ืฉื”ืงื•ื“ ืžื•ื–ื’ ืืœื™ื•. ื”ืžื™ืกืคื•ืจ ืžืชื—ื™ืœ ืž-1 ื•ืœื›ืŸ ืืฆืœื™ ื”ืžืกืคืจ ื”ื•ื 1:
$ git revert 91cdcd3 -m 1
ื”ืชื•ืฆืื” ื”ื™ื ื›ืžื•ื‘ืŸ ืงื•ื ืคืœื™ืงื˜ ืื‘ืœ ืืคืฉืจ ืœื—ื™ื•ืช ืขื ื–ื”. ื›ื›ื” ื ืจืื” ื”ืงื•ื‘ืฅ ืขื ื”ืงื•ื ืคืœื™ืงื˜:
import unittest, sys

class TestMultMethod(unittest.TestCase):
    def test_mul_positives(self):
        self.assertEqual(6, mul(2, 3))

##
# This script does all kinds of nice things
# to help children learn math
#
<<<<<<< HEAD
def three_by_three():
    return mul(3, 3)
=======
>>>>>>> parent of 91cdcd3 (fixed conflicts)

def two_by_two():
    return mul(2, 2)

def mul(x, y):
    return x * y

# run self test with --test
if len(sys.argv) > 1 and sys.argv[1] == "--test":
    sys.argv = sys.argv[:1]
    unittest.main()
    sys.exit(0)


print("Hello world")

# part 1

ToCode
1 420
Direction::Left => "<",
            Direction::Right => ">",
        });
        for snake_pos in self.board.snake.iter().skip(1) {
            printer.print(snake_pos, "X");
        }        

        printer.print(self.board.apple, "O");
    }

    fn on_event(&mut self, event: Event) -> EventResult {
        match event {
            Event::Key(key) => {
                self.direction = match key {
                    Key::Down => Direction::Down,
                    Key::Up => Direction::Up,
                    Key::Left => Direction::Left,
                    Key::Right => Direction::Right,
                    _ => self.direction,
                };
                self.step();
            }
            _ => (),
        }
        EventResult::Ignored
    }

    fn required_size(&mut self, _: Vec2) -> Vec2 {
        self.board.size.map_x(|x| 2 * x)
    }
}


fn main() {
    // Creates the cursive root - required for every application.
    let mut siv = cursive::default();

    let game = GameView::new();
    let tx = siv.cb_sink().clone();

    thread::spawn(|| {
        loop {
            thread::sleep(Duration::from_millis(500));
            game.step();
        }
    });

    thread::spawn(move || {
        // game.board.step(Direction::Up);
        loop {
            thread::sleep(Duration::from_millis(500));
            tx.send(Box::new(|si| {
                si.call_on_name("game", |view: &mut GameView|  {
                    let still_alive = view.step();
                    if !still_alive {
                        panic!("You lose");
                    }
                }).unwrap();
            })).unwrap();
        }
    });

    siv.add_layer(game.with_name("game"));
    
    siv.set_fps(24);
    // Starts the event loop.
    siv.run();
}
ืื•ืชื• ืชื•ื›ืœื• ืœืžืฆื•ื ื’ื ื‘ืžืื’ืจ ื”ื’ื™ื˜ื”ืื‘ ืฉืœ ื”ืกื™ื“ืจื” ื‘ืงื™ืฉื•ืจ: https://github.com/ynonp/rust-8-days/tree/main/day7%20-%20snake%20gui/snake ## ืชืจื’ื™ืœื™ื ืœื”ืจื—ื‘ื” 1. ื›ืจื’ืข ื”ืžืฉื—ืง ืงืฆืช ืžืฉืขืžื ื›ื™ ืœื ืžืฉื ื” ื›ืžื” ืชืคื•ื—ื™ื ื ืื›ืœ ื”ืžื”ื™ืจื•ืช ืชื™ืฉืืจ ื–ื”ื” (step ื ืงืจืืช ืคืขื ื‘ื—ืฆื™ ืฉื ื™ื”). ืชื—ื™ืœื” ืขื“ื›ื ื• ืืช ื”ืงื•ื“ ื›ืš ืฉื™ืกืคื•ืจ ื•ื™ืฆื™ื’ ื ืงื•ื“ื•ืช. 2. ืื—ืจื™ ืฉื™ืฉ ืœื›ื ื ืงื•ื“ื•ืช ืขื“ื›ื ื• ืืช ื”ืงื•ื“ ื›ื“ื™ ืฉื›ื›ืœ ืฉื™ืฉ ื™ื•ืชืจ ื ืงื•ื“ื•ืช ืžื”ื™ืจื•ืช ื”ืžืฉื—ืง ืชื’ื“ืœ. 3. ื”ื•ืกื™ืคื• ืืคืฉืจื•ืช ื™ืฆื™ืื” ื‘ืืžืฆืข - ืœื—ื™ืฆื” ืขืœ ื›ืคืชื•ืจ q ืžืกื™ื™ืžืช ืืช ื”ืžืฉื—ืง. 4. ื”ื•ืกื™ืคื• ืžืกืš Game Over ืื—ืจื™ ืฉื”ื ื—ืฉ ืžืชื ื’ืฉ ื‘ืงื™ืจ ืื• ื‘ืขืฆืžื•. ืืชื ื›ืจื’ื™ืœ ืžื•ื–ืžื ื™ื ืœืคืจืกื ืืช ื”ืคื™ืชืจื•ื ื•ืช ืฉืœื›ื ื›ืืŸ (ืื• ืœื™ื ืงื™ื ืœืคื™ืชืจื•ื ื•ืช ืื ืชื‘ื—ืจื• ืœื”ืขืœื•ืช ืื•ืชื ืœื’ื™ื˜ื”ืื‘) ื•ืื ื—ื ื• ื ื™ืคืจื“ ืžื”ื ื—ืฉ ื•ืžื—ืจ ื ืžืฉื™ืš ืœื“ื‘ืจ ืขืœ ืจืืกื˜ ื•ื”ืื™ื ื˜ืจื ื˜.

ToCode
1 420
ืื—ืจื™ ืฉื ืฆื™ื’ ืืช ื” View ืื ืžืฉืชืžืฉ ื™ืœื—ืฅ ืขืœ ื›ืคืชื•ืจ ืื•ื˜ื•ืžื˜ื™ืช cursive ื™ื™ื›ื ืก ืœืคื•ื ืงืฆื™ื” on_event ื•ื™ื™ืชืŸ ืœื ื• ื”ื–ื“ืžื ื•ืช ืœื˜ืคืœ ื‘ืœื—ื™ืฆื”. ืื‘ืœ ื‘ืžืฉื—ืง ืกื ื™ื™ืง ื™ืฉ ืขื•ื“ ื“ื‘ืจ ืฉืฆืจื™ืš ืœืขืฉื•ืช - ืœื”ื–ื™ื– ืืช ื”ื ื—ืฉ. ื•ืืช ื–ื” ืื ื—ื ื• ืฆืจื™ื›ื™ื ืœืขืฉื•ืช ืœืคื™ ืฉืขื•ืŸ, ื‘ืœื™ ืงืฉืจ ืœืื™ืจื•ืขื™ื ืฉืงืจื• ืื• ืœื. ื‘ืคืจื™ื™ืžื•ื•ืจืงื™ื ืจื‘ื™ื ืื—ืจื™ื ื™ืฉ ื“ืจืš ืœื”ื’ื“ื™ืจ ืื™ืจื•ืข timeout ืขืœ View, ื•ื›ืš ืœื”ืจื™ืฅ ืงื•ื“ ื›ืœ X ืฉื ื™ื•ืช. ื‘ cursive ืœื ืžืฆืืชื™ ื“ืจืš ืœื”ืคืขื™ืœ ืฉืขื•ืŸ ื‘ืจืงืข ืฉื™ืคืขื™ืœ ืื™ืจื•ืข, ื•ืœื›ืŸ ื”ืจืขื™ื•ืŸ ื”ืฉื ื™ ืฉืœื™ ื”ื™ื” ืœื”ืจื™ืฅ Thread ื‘ืจืงืข, ืฉื›ืœ ื—ืฆื™ ืฉื ื™ื” ื™ืคืขื™ืœ ืืช ื”ืคื•ื ืงืฆื™ื” step ืฉืœ Game. ื–ื” ื”ืชื‘ืจืจ ื›ื”ืจื‘ื” ื™ื•ืชืจ ืžืกื•ื‘ืš ืžืžื” ืฉืงื™ื•ื•ื™ืชื™ ื‘ื’ืœืœ ืžื•ื“ืœ ื”ื‘ืขืœื•ืช ืฉืœ Rust. ื”ื‘ืœื•ืง ื”ืจืืฉื•ืŸ ืฉืื ื™ ืจื•ืฆื” ืœื”ื“ื‘ื™ืง ื”ื•ื ื”ืžื™ืžื•ืฉ ืฉืœ GameView, ืฉื›ื•ืœืœ ืืช ื”ืคื•ื ืงืฆื™ื” step:
impl GameView {
    pub fn new() -> Self {
        return GameView {
            board: game::Game::new(),
            direction: Direction::Down,
        };
    }

    pub fn step(&mut self) -> bool {
        return self.board.step(self.direction);
    }
}
ื‘ืขืฆื ื‘ื ื•ืกืฃ ืœื›ืœ ืžื” ืฉื›ื‘ืจ ืกื™ืคืจืชื™ ืขืœ ื” View ืฉืœื™, ื”ื•ืกืคืชื™ ืœื• ืขื›ืฉื™ื• ืขื•ื“ ืฉืชื™ ืคื•ื ืงืฆื™ื•ืช - ื”ืคื•ื ืงืฆื™ื” new ืฉื™ื•ืฆืจืช GameView ื—ื“ืฉ, ื•ื”ืคื•ื ืงืฆื™ื” step ืฉืžืคืขื™ืœื” ืืช ื”ืคื•ื ืงืฆื™ื” step ืฉืœ ื”ืžืฉื—ืง ืฉืžื•ืฆืžื“ ืœ View. ื‘ืงื•ื“ ื” main ืื ื™ ื›ื•ืชื‘:
let mut siv = cursive::default();

let game = GameView::new();
let tx = siv.cb_sink().clone();

thread::spawn(move || {
    // game.board.step(Direction::Up);
    loop {
        thread::sleep(Duration::from_millis(500));
        tx.send(Box::new(|si| {
            si.call_on_name("game", |view: &mut GameView|  {
                let still_alive = view.step();
                if !still_alive {
                    panic!("You lose");
                }
            }).unwrap();
        })).unwrap();
    }
});
ื‘ืจื•ืจ ืœืžื” ืื ื™ ืžืคืขื™ืœ Thread ื—ื“ืฉ ื›ื“ื™ ืฉื™ืจื•ืฅ ื‘ืจืงืข (ืขืฉื™ื ื• ืžืฉื”ื• ื“ื•ืžื” ื‘ื“ื•ื’ืžืช ื”ืชืงืฉื•ืจืช), ืื‘ืœ ืฉื™ืžื• ืœื‘ ืฉืื ื™ ืœื ื™ื›ื•ืœ ืžืชื•ืš ื” Closure ืฉืœ ื” Thread ืœืงืจื•ื ืœ game.step ืกืชื ื›ืš. ื›ืœื•ืžืจ ืงื•ื“ ื›ื–ื” ืœื ื”ื™ื” ืžืชืงืžืคืœ:
thread::spawn(|| {
    loop {
        thread::sleep(Duration::from_millis(500));
        game.step();
    }
});
ื‘ื’ื“ื•ืœ ื‘ื’ืœืœ ืฉืืฃ ืื—ื“ ืœื ื™ื›ื•ืœ ืœื”ื‘ื˜ื™ื— ืœ Rust ืฉ game ื™ื™ืฉืืจ ื—ื™ ื›ืœ ื–ืžืŸ ืฉื” Thread ื ืฉืืจ ื—ื™ (ืื•ืœื™ ื–ื” ืžืฉืชื ื” ืคื ื™ืžื™ ืฉืœ ื”ืคื•ื ืงืฆื™ื”), ืื– ืจืืกื˜ ืฆืจื™ืš ืœื”ืขื‘ื™ืจ ืืช ื”ื‘ืขืœื•ืช ืขืœ game ืœืชื•ืš ื” Closure, ืื‘ืœ ืื ื”ื•ื ื™ืขืฉื” ืืช ื–ื” ืœื ื ื•ื›ืœ ืœื”ืฉืชืžืฉ ื‘ game ืžื—ื•ืฅ ืœ Closure. ื‘ืžืœื™ื ืื—ืจื•ืช ืœืžืจื•ืช ืฉืื ื—ื ื• ื™ื•ื“ืขื™ื ืฉื” Thread ื”ืžืฉื ื™ ื•ื”ืจืืฉื™ ื™ื™ืฉืืจื• ื—ื™ื™ื ืœืื•ืชื• ืžืฉืš ื–ืžืŸ, ืจืืกื˜ ืœื ื™ื•ื“ืข ืืช ื–ื” ื•ืœื›ืŸ ื“ื•ืจืฉ ืฉื ื‘ื—ืจ ืžื™ ืžืฉื ื™ื”ื ื™ื ื”ืœ ืืช Game. ื•ื–ืืช ื‘ื—ื™ืจื” ืฉืื™ืŸ ืœื™ ืื™ืš ืœืขืฉื•ืช. ื•ื–ื” ืžื‘ื™ื ืื•ืชื™ ืœื’ื™ืจืกื” ื”ืงืฆืช ื™ื•ืชืจ ืžืกื•ืจื‘ืœืช ืฉืœ ื”ืงื•ื“ ืฉืžื˜ืจืชื” ืœื”ืฉืื™ืจ ืืช game ื‘ื‘ืขืœื•ืช ื”ืชื”ืœื™ื›ื•ืŸ ื”ืจืืฉื™, ื•ืœื”ืคืขื™ืœ ืืช ื”ืคื•ื ืงืฆื™ื” step ื‘ืืžืฆืขื•ืช ืฉืœื™ื—ืช ื”ื•ื“ืขื” ืžื” Thread ื”ืžืฉื ื™. ื”ืคื•ื ืงืฆื™ื” siv.cb_sink ืฉืœ ืกืคืจื™ื™ืช cursive ืžื™ื™ืฆืจืช ืฆื™ื ื•ืจ ืชืงืฉื•ืจืช ืื™ืชื• ืื ื™ ื™ื›ื•ืœ ืœืฉืœื•ื— ื”ื•ื“ืขื•ืช ืžืชื”ืœื™ื›ื•ื ื™ ืจืงืข ืœื™ื™ืฉื•ื ื”ืจืืฉื™, ื”ืคืงื•ื“ื” send ืฉืœ ืฆื™ื ื•ืจ ื”ืชืงืฉื•ืจืช ืฉื•ืœื—ืช ืืช ื”ื”ื•ื“ืขื” ื•ืชื•ื›ืŸ ื”ื”ื•ื“ืขื” ื”ื•ื Closure ื‘ืขืฆืžื• ืฉืžืงื‘ืœ Reference ืฉืœ ืื•ื‘ื™ืงื˜ ื” siv ื”ืจืืฉื™. ืžืชื•ืš ื” Reference ืื ื™ ืžืคืขื™ืœ ืืช call_on_name ื›ื“ื™ ืœืงื‘ืœ Reference ืœ Game View, ื•ื“ืจื›ื• ืื ื™ ืžืคืขื™ืœ ืืช step, ื›ืœ ื–ื” ื‘ืœื™ ืฉืืฃ ืื—ื“ ื™ื™ืงื— ื‘ืขืœื•ืช ืขืœ ืฉื•ื ื“ื‘ืจ. ืื ื™ ืงื•ืจื ืœืงื•ื“ ื›ื–ื” "ืžืก ืจืืกื˜", ื›ื™ ืื ื™ ืขื•ื‘ื“ ื™ื•ืชืจ ืงืฉื” ืจืง ื‘ืฉื‘ื™ืœ ืœื”ืชืื™ื ืœืฉื™ื˜ืช ื”ืขื‘ื•ื“ื” ืฉืœ ืจืืกื˜. ืœืื•ืจืš ื–ืžืŸ ื ืฆื˜ืจืš ืœื”ื—ืœื™ื˜ ืื ื”ืขืจืš ืฉืœ ืจืืกื˜ - ื›ืœื•ืžืจ ืชื•ื›ื ื™ื•ืช ื‘ื˜ื•ื—ื•ืช ื™ื•ืชืจ - ืฉื•ื•ื” ืืช ื”ืžื—ื™ืจ. ืื ื ืกื›ื ืืช ื›ืœ ืงื˜ืขื™ ื”ืงื•ื“ ืžื”ืคื•ืกื˜ ื•ืขื•ื“ ืงืฆืช ืงื˜ืขื™ื ืฉืœ ื—ื™ื‘ื•ืจื™ื ื ื’ื™ืข ืœืชื•ื›ืŸ ื”ืžืœื ืฉืœ main.rs:
use cursive::{
    event::{Event, EventResult, Key},    
    view::{Nameable},    
    Printer, Vec2,
};
use game::{Direction};
use std::{thread};
use std::time::Duration;
mod game;

struct GameView {
    // Actual board, unknown to the player.
    board: game::Game,
    direction: Direction,
}

impl GameView {
    pub fn new() -> Self {
        return GameView {
            board: game::Game::new(),
            direction: Direction::Down,
        };
    }

    pub fn step(&mut self) -> bool {
        return self.board.step(self.direction);
    }
}

impl cursive::view::View for GameView {
    fn draw(&self, printer: &Printer) {
        printer.print(self.board.snake.front().unwrap(), match self.direction {
            Direction::Up => "^",
            Direction::Down => "V",