[AUTOIT] Tool Auto Say Sorry

Xuất bản vào 3 tháng trước
Được xem 2977 lần



 

THÔNG TIN CHƯƠNG TRÌNH



Tên phiên bản Auto Say Sorry
Author opdo.vn
Loại phiên bản Tool - Open Source
Source AutoIT
Size ~ 1 Mb
Realease date 31 Dec 2015

 

Auto Say Sorry được tạo để giải quyết bài toán làm sao để tiết kiệm thời gian và công sức để tool tự động "thay lời muốn nói" 200 lần lời xin lỗi, và ý tưởng này cũng hình thành từ một bài báo mạng nói về một anh chàng bị người yêu bắt phải viết 200 lần lời xin lỗi khác nhau.

 


HƯỚNG DẪN SỬ DỤNG

1. HOT KEY

  • Ctrl + Shift + S : bắt đầu chạy auto
  • Ctrl + Shift + Q : ngưng auto

2. DỮ LIỆU VÀ QUY TẮT LIÊN KẾT TỪ

  • Bạn có thể thêm từ vào dữ liệu bằng cách click vào menu Dữ liệu -> Thêm từ
  • Bạn có thể thêm cột bằng cách click vào menu Dữ liệu -> Thêm cột
  • Tương tự với xoá từ và xoá cột
  • Quy tắc liên kết từ bằng cách chọn các từ trong mỗi cột rồi ghép lại thành câu theo thứ tự cột.

3. QUY ĐỊNH VÀ CHÍNH SÁCH SỬ DỤNG

  • Đây là tool open source. Không có cụ thể các quy định và chính sách sử dụng.
  • Tool được code bởi Vinh Phạm, khuyến khích để lại nguồn nếu bạn chia sẻ tool này đến một nơi khác. Cảm ơn ^^

 

HƯỚNG DẪN CODE

Mình có theo dõi tin mạng và có đọc được một bài viết rất dễ thương về một anh chàng bị cô người yêu bắt phải xin lỗi 200 lần với điều kiện cả 200 lần đó phải khác nhau.

Nói về mặt tình cảm và xã hội thì đơn thuần mình thấy cách xử lý của cô này rất dễ thương và việc dễ thương hơn nữa khi mà anh này chấp nhận hạ cái tôi của một đứa con trai để đáp ứng yêu sách của cô ấy.

Luận bàn chơi thôi chứ trở lại vấn đề, đó là dựa vào bài viết xã hội đó, mình suy nghĩ tới một ý tưởng tạo ra một giái pháp tiết kiệm thời gian cho anh ta. Vì vậy bài toán đặt ra là: làm sao để làm một chương trình viết dùm mình 200 lần xin lỗi mà câu từ không trùng nhau? Đó cũng là chủ đề chính của bài viết này ^^

Chúng ta cùng xem xét điều kiện của bài toán như sau:

  • Tự động viết >= 200 lần xin lỗi
  • Không được giống nhau ở mỗi lần

Bắt đầu lên ý tưởng, mình thấy rằng, các câu từ như: "mình xin lỗi bạn", "anh rất xin lỗi em", "anh xin lỗi bé",... đều mang một cấu trúc chung là:

  • Phần chủ ngữ: tôi, mình, anh, chồng, tớ,...
  • Phần động từ: xin lỗi, rất xin lỗi, ngàn lần xin lỗi, cúi đầu xin lỗi,...
  • Phần vị ngữ: bạn, em, bé, vợ, cậu,...

Như vậy mình chỉ cần làm một thuật toán mà có thể liệt kê các phần trên lại với nhau với điều kiện thứ tự liệt kê không được lặp lại để tạo nên các câu từ khác nhau.
Đầu tiên, để ghép nối các từ lại với nhau thành câu, mình sẽ lưu các từ trên vào một mảng hai chiều, trong đó chiều 1 sẽ tượng trưng cho thứ tự phần và chiều 2 sẽ tượng trưng cho thứ từ các từ trong phần.

$arr[thứ tự phần][thứ tự từ]

Như vậy, để tạo thành một câu ngẫu nhiên, chúng ta chỉ cần ghép nối các phần lại với nhau như sau:

$arr[1][random]&' '&$arr[2][random]&' '&$arr[3][random]

Nhưng có điều, chúng ta không tạo theo cách ngẫu nhiên được vì câu có thể trùng nhau, mà chúng ta phải tạo câu theo một quy tắc nào đó để tận dụng hết các từ trong phần để tạo nên những câu khác nhau.
Bạn cứ tạm suy nghĩ vài phút trước khi xem tiếp nhé ^^

Tiếp tục nhé, đầu tiên mình sẽ khai báo các mảng.

Dim $a[4][4]
$a[0][0] = 3 ; số lượng phần
$a[1][0] = 2 ; số lượng từ phần 1
$a[2][0] = 2 ; số lượng từ phần 2
$a[3][0] = 2 ; số lượng từ phần 3
; PHẦN 1
$a[1][1] = 'anh'
$a[1][2] = 'mình'
; PHẦN 2
$a[2][1] = 'xin lỗi'
$a[2][2] = 'rất xin lỗi'
; PHẦN 3
$a[3][1] = 'em'
$a[3][2] = 'vợ'

Mình sẽ lên ý tưởng là: mình sẽ cho chạy 3 vòng lặp, xuất từ các ký tự trong mảng theo thứ tự phần.

Local $string = ''
for $i = 1 to $a[1][0]
    $string = $a[1][$i] & ' '
    for $t = 1 to $a[2][0]
        Local $string2 = ''
        $string2 = $string&$a[2][$t] & ' '
        for $k = 1 to $a[3][0]
            ConsoleWrite($string2&' '&$a[3][$k]&@CRLF)
        Next
    Next
Next

Nhưng sẽ có vấn đề xảy ra, đó là chúng ta giải quyết được vấn đề khi chúng ta giả dụ tình huống là 3 phần, lỡ rằng người dùng nhập 4 phần, 5 phần hoặc n phần thì sẽ như thế nào?
Chúng ta phải giải quyết vấn đề một cách tổng thể là liệt kê các chuỗi ký tự theo một trật tự nhất định (chứ không phải xáo trộn) và mình có 2 cách giải quyết, về cơ bản và nâng cao.
Cách cơ bản, ý tưởng của mình sẽ duyệt từ phần 1 tới phần n, xuất từng từ của các phần theo một thứ tự cho tới khi không còn thứ tự nào nữa.

Dim $n[10]
for $i = 0 to $a[0][0]
    $n[$i] = $a[$i][0]
Next
While 1
    ConsoleWrite(@CRLF)
    Local $string = ''
    for $i = 1 to $n[0]
        $j =  $n[$i]
        $string &= $a[$i][$j]&' '
        if $i = $n[0] Then
            $n[$i] -= 1
            for $k = $i to 2 step -1
                if $n[$k] = 0 Then
                    $n[$k] = $a[$k][0]
                    $n[$k-1] -= 1
                EndIf
            Next
        EndIf
    Next
    ConsoleWrite($string&@CRLF)
    if $n[1] < 1 then ExitLoop
WEnd

Cách nâng cao hơn, mình sử dụng theo ý tưởng đệ quy và chỉ cần gọi hàm ra là xong ^^. Về đệ quy thì tương lai mình sẽ viết 1 chuyên mục riêng để các bạn hiểu rõ hơn về phần này.

Func _XinLoi($x = 1,$string = '')
    if $x >= $n[0] Then
        for $i = 1 to $n[$x]
            ConsoleWrite($string&' '&$a[$x][$i]&@CRLF)
        Next
    Else
        for $i = 1 to $n[$x]
            $newstring = $string&$a[$x][$i]&' '
            _XinLoi($x+1,$newstring)
        Next
    EndIf
EndFunc

Tổng số câu = Tích của tổng phần tử các phần

Ví dụ bài toán trên, với code trên thì tôi có:

Tổng số câu = 2 (tổng phần tử phần 1) * 2 (tổng phần tử phần 2) * 2 (tổng phần tử phần 3) 

Vậy để đạt 200 câu và với tình huống này, mình tạo 4 phần (phần ngôi xưng bản thân, phần động từ xin lỗi, phần ngôi xưng đối tượng và phần cảm thán)

  • Phần 1 (5 phần tử): anh, tôi, tớ, chồng, mình
  • Phần 2 (8 phần tử): xin lỗi, rất xin lỗi, vô cùng xin lỗi, thực sự xin lỗi, cúi đầu xin lỗi, dập gối xin lỗi, ngàn lần xin lỗi, trăm lần xin lỗi
  • Phần 3 (5 phần tử): em, vợ, cậu, cưng, bé
  • Phần 4 (4 phần tử): nha, nhiều, mà, yêu

Vậy tổng số câu tôi có là: 5*8*5*4 = 800 câu, vượt 4 lần chỉ tiêu người ấy đề ra ^^
Thế là giải quyết xong vấn đề tổng thể của bài toán ^^. Tuy nhiên vẫn còn một số vấn đề liên quan tới ngôi xưng chẳng hạn, mình để lại cho các bạn thảo luận và giải quyết ^^
Nếu bạn nào có cách giải khác hay, mong các bạn chia sẻ ở mục comment bên dưới.


Các bài viết tương tự


COMMENT

0 bình luận

    Chưa có bình luận, hãy là người bình luận đầu tiên


Giới thiệu
Avatar của tui <3

Biệt danh trong giới giang hồ là Ộp Do, cuồng màu xanh, yêu màu tím, thích mặc đồ đen. Có niềm đam mê với những dòng code vô tận, ngoài ra còn thích kinh doanh, đào tạo các kiểu 😂

/imopdo
tui@opdo.vn
Hashtag
Top