發表文章

排列組合問題

圖片
筆者最近在  brilliant.org  解 Reframing Problems for the AMC 時,看到有一個解題方法,筆者以自己理解的方式詮釋一次。 題目:有五顆相同的籃球要分給三個不同的隊伍,請問有幾種分法? 解法一「個別列出」 假設三個隊伍的名稱為A、B、C,在不考慮排列的情況下,有底下幾種分法(由大到小來 組合 ): 5 0 0 --> 組合一 4 1 0 --> 組合二 3 2 0 --> 組合三 3 1 1 --> 組合四 2 2 1 --> 組合五 加上 排列 後, 5 0 0 --> 組合一 ==> 3種排列方式 4 1 0 --> 組合二 ==> 6種排列方式 3 2 0 --> 組合三 ==> 6種排列方式 3 1 1 --> 組合四 ==> 3種排列方式 2 2 1 --> 組合五 ==> 3種排列方式 所以總共有 3 + 6 + 6 + 3 + 3 總分法。 解法二『轉換成組合問題』 這方法是將原本的排列組合問題變成排列問題,請先看下圖: 上圖中圓形代表球,長方形代表分割的地方,由上往下分別對應組合一、組合二、組合三、組合四、組合五。由此圖可以看出,原本的問題可以變成組合問題:【 從七個相同的東西選兩個出來,有幾種選法? 】答案就變成  \[\binom{7}{2} = 21\] 那原本的問題有沒有變得容易算出呢? 練習題 有十顆相同的糖果要分給四個不同的小朋友時,請問有幾種分法?  \[\binom{13}{3} = 286\] 參考資料: [1]  https://brilliant.org/practice/reframing-problems-for-the-amc/?p=6 若您覺得文章寫得不錯,請點選文章上的廣告,來支持小編,謝謝。 If you like this post, please click the ads on the blog or  buy me a coffee . Thank you very much.

程式設計師的斜桿人生

最近筆者在閱讀《 斜槓青年 》一書,想起很多的Programmer都會在自己的履歷上,用類似底下的文字敘述來描述自己所會的程式語言 C/C++/Java/Python 而  /  這個符號所使用的英文單字正好是Slash。 不過此書所說的斜槓意思可不只是這樣子而已,所以有些Programmer會這樣子寫: Web/OS/Alg/Driver/Game Software Developer 恩,會這些的Programmer是書上所提的斜槓人生嗎? 這還不是。 以AlphaGo的推手之一的 黃士傑 來說,他本身是台灣圍棋業餘六段,也就是說至少他的人生經歷可以寫成像這樣子: 程式設計師/圍棋業餘六段 OK,到這邊若還看不出來此書作者的意思,那請看底下引用《 斜槓青年 》的說明: 對於一個斜槓青年最重要的是:   不是身兼很多種賺錢的方式,而是擁有許多真正熱愛的事物。   透過不同管道,讓你的才華和機會超/展/開! 這樣子的思維(或者說是態度)對一個Programmer是很重要的,因為若沒有真正熱愛的事物,一個Programmer可能只是會把Programming當作一個賺錢的技能,這樣也沒什麼不好,畢竟生存壓力與熱愛的事物不見得能擺在天平上一起衡量。 好,容筆者修改一下《 斜槓青年 》的說明,變成 斜槓程式設計師 : 對於一個 程式設計師 最重要的是:   不是身兼很多種語言的技能,而是擁有許多真正可用的專案。   透過不同管道,讓你的 專業 和 履歷 超/透/明! 為什麼筆者要這麼說呢?隨著人工智慧與大數據的關係,公司的人資部的一些工作會被機器人所取代,例如自動化履歷篩選。而現在也有很多獵人頭會做媒合的事情,而這件事筆者相信未來會有自動化系統協助做這事,於是 獵人才機器人會在網路上尋找適合的人才 ,或許不是所有產業找人才都會是這樣子,但針對Programmer相關的工作,這個趨勢是很有可能的,屆時沒有將自己的專業與履歷公開的人,就少了一些 被動機會 。( 被動機會 變成 被動收入 是很多人的夢想。) 若您覺得文章寫得不錯,請點選文章上的廣告,來支持小編,謝謝。 If you like this post, please click the ads on the blog or  buy m...

當程式設計遇上國文造句

圖片
底下是筆者最近在思考「不開機學程式設計  Teach Programming With Computer」所想到的主,就是來造句吧!含有幾個主題: 變數命名。 判斷敘述。 重複敘述。 判斷敘述加上重複敘述。 變數命名 變數命名 通常是找出一個 名詞 ,例如在班級裡學習的人通常是學生,於是可以用學生這個名詞來代表一個班級的一個(或多個)人。 變數命名可以使用這個句型: 「.........叫做......」 ,當然還有其他思考方針,例如這個變數的用途等。以這個句型為基礎時,可以思考底下的問題: 自己的爸爸又叫做「父親」以及什麼? 自己的媽媽又叫做「母親」以及什麼? 有四個輪子會動的東西叫做? 可以用來買東西是什麼玩意兒? 底下是說笑的,請勿當真。 「40年前,天天在教室裡打學生罵學生的人叫做老師。」 「現在,天天在教室裡被嗆聲的人叫做老師。」 此時就可以用 Scratch 裡的變數功能來做一些說明,並講解 變數是個類似容器 的觀念。請參考底下影片學習如何在Scratch使用變數。 或是筆者所錄製的影片:在Scratch中建立變數 判斷敘述 「如果......」 如果今天表現好,就會有糖吃耶! 如果今天下雨,就不用在室外上體育課! Scrach範例網址: https://scratch.mit.edu/projects/201559799/ 「如果...否則...」 如果今天下雨,就不用在室外上籃球;否則就在體育館上羽球。 如果邀請小花一起出去玩,就可以知道小花喜歡玩什麼;否則就得宅在家用FB聊天了。 Scrach範例網址: https://scratch.mit.edu/projects/201560395/ 重複敘述 同樣的事要做幾次呢?例如下面的句子 「罰寫100次。」 「掃教室一周。」 「玩遊戲一小時,連續三周。」 Scrach範例網址: https://scratch.mit.edu/projects/201560922/ 判斷敘述加上重複敘述 「如果...重複...次」 【如果...重複...次;否則重複...次】 如果這次三分球投不進,就在罰球線投球投十次。 Scrach範例網址: https://scratch.mit....

偷插電的資訊科學資訊理論單元的 Scratch 3 程式

教學部分請參考 偷插電的資訊科學資訊理論單元 。 此單元有兩個程式: 1. 猜數字遊戲(此為筆者所製作) 2. 珠璣妙算(MasterMind) 此專案是由 8-bit-orange  所分享的,原專案網址為  https://scratch.mit.edu/projects/31361740/ ,筆者只是加上中文操作說明。 操作說明: 點擊上方正方形改變顏色。 按下空白鍵檢查答案是否正確。 出現紅色圓形表示猜錯,綠色圓形表示猜對。 下方畫面的數字表示猜了幾次。 看看自己能在幾次內猜中。 若您覺得文章寫得不錯,請點選文章上的廣告,來支持小編,謝謝。 If you like this post, please click the ads on the blog or  buy me a coffee . Thank you very much.

建立聊天機器人:以Wit.ai為例(Building a Chatbot with Wit.ai)

圖片
現在有很多的工具可以用來建立簡易的聊天機器人,例如 Smooch 、 Compose.ai 、 ChattyPeople 、 Octane Ai 、 Telegram 、 BotKit 、 ManyChat 、 Chatisfy 、 Meokay 、 FlowXO 、 Chatfuel 等,有這麼多的工具可以用,那要怎麼選擇呢?  25 Chatbot Platforms: A Comparative Table  這篇文章也許可以提供一些想法。OK,本文將以 Wit.ai 來建立一個簡易的聊天機器人。 首先登入 Wit.ai 網站,筆者是使用Facebook帳號登入: 輸入帳戶基本資料後,按下 Go down the rabbit hole 按鈕來同意使用條款: 點選Settings來更改App的語言: 設定好App資訊後,按下 Change App Details 按鈕: 點選Understanding建立例句,這邊需要多建立幾個例句來分辨詢問『天氣』的意圖: 繼續增加例句,下圖中的數字說明: 1. 輸入使用者可能會用的句子。 2. 選擇 intent (為什麼要選擇 intent,請自行查看 https://wit.ai/docs )。 3. 選擇『天氣』,此為剛剛造出來的選項。 4. 按下 Validate 按鈕。 重複上面1~4的步驟建立出如下的例句: 接著要使用 Wit.ai 所提供的API服務,切換到Settings,輸入對話內容後,複製 curl \ ....的文字,或是按下複製按鈕來複製。 接下來的動作需要用到 curl 這隻程式,在Linux上有這個,筆者是在Windows系統上使用 git for windows 所附的bash功能。回傳的文字編碼方式是Unicode,可以使用這個網址: https://r12a.github.io/apps/conversion/  來做轉換,於是得到下面的結果。 上圖的藍色箭頭所指的是使用者輸入的文字,剛好在剛剛建立的例句裡,黃色箭頭所指就是 Wit.ai 回應的訊息【天氣】,此回應的訊息代表使用者有想詢問【天氣】的意圖( intent )。 下一步 讀者可以使用底下幾種方式整合...

Otto機器人動作之程式碼分析(Otto Source Code Understanding Part I)

圖片
本文會將以 OTTO_BT.ino 與 Otto函式庫 的程式碼,針對跳舞動作的程式碼做說明,例子會以抖右腳(ShakeRightLeg)。 首先要把以C++語言寫好的函式庫(Otto.h)定義改引用進來 這樣子OTTO_BT主程式就會知道有函式庫需要納進來處理,於是Arduino IDE的編譯器(Compiler ==> 先當成翻譯機,會將C/C++語言翻譯成Nano板子看得懂的語言)會知道要對Otto.cpp做翻譯的動作。 接著看看主程式對Otto中對Otto腳位的說明,可以看出程式用了servo這個陣列來儲存nano腳位(依序為腳位2、3、4、5)的清單,此servo陣列型態是Oscillator,Oscillator也是在Otto程式庫中針對伺服馬達做操作的程式庫,此處不談Oscillator的細節(但Oscillator和左右轉與走動有關)。 有了對應表後,還得讓OTTO_BT主程式知道有Otto機器人的程式庫(積木)可以用,這邊透過底下的程式碼可以做到。 Otto Otto;  //This is Otto! 這一行告訴程式,有一個名叫Otto的變數,這邊可先想成有一個機器人在程式裡,要告訴此機器人的腳在哪裡,就是用Otto.init()函式: Otto.init(PIN_YL,PIN_YR,PIN_RL,PIN_RR,true); 這一行就會設定servo陣列清單(從0開始編號)的順序 清單編號為0為YL的腳位 ==> 也就是 Nano 腳位 2 清單編號為1為YR的腳位 ==> 也就是 Nano 腳位 3 清單編號為2為RL的腳位 ==> 也就是 Nano 腳位 4 清單編號為3為RR的腳位 ==> 也就是 Nano 腳位 5 接著找OTTO_BT主程式中的 shakeLeg 部分:     case 17: //M 17 500        Otto.shakeLeg(1,T,1);       break;     case 18: //M 18 500        Otto.shakeLeg(1,T,...

國中生的電腦課程設計

在思考如何設計國中生的電腦課程中,想起某位友人曾向我提及「虛體加實體」,也就是軟體與硬體兼施,讓學生們能動手DIY,於此我在整理一下我所蒐集到的資料。 軟體部分,有些人可能直接想到用Scratch教程式設計,但用Scratch當起頭真的適合嗎?個人覺得先讓學生玩一些軟體,讓學生了解軟體可以做什麼事之後,再來 玩 Scratch會比較好。此外 若有例子說明軟體如何解決生活上的問題就更好了 。同時請學生們思考自己日常生活中有什麼地方可以改進的( 先不考慮需不需要用到軟體來協助 ),並且記錄下來,開始思索有什麼方法可以解決問題。 硬體部分,可以使用Arduino相關的開發版,例如Uno、Nano並搭配麵包板、杜邦線以及簡易的電子材料(如LED、按鈕、電阻等)。或選擇像是Difi這種整合的開發板。 至於要入門程式語言的話,先以玩遊戲的方式讓學生們有興趣,個人推薦不用登入的正體中文網頁遊戲,例如: 一小時玩程式: http://hocintw.thealliance.org.tw/ Codecombat: https://codecombat.com/ Blocky Games: https://blockly-games.appspot.com/ CodeMonkey: https://www.playcodemonkey.com/ =========以上是去年的想法========= 筆者今年有不一樣的想法,原因如下(這是雲林縣的情況,其他縣市可能不一樣): 有些學生從國小三年級就在學校接觸電腦了。 也有學生上國中後才開始接觸電腦。 學生家中環境很早讓小孩開始接觸。 這三點整理出一個疑問點:「要有電腦才能學習電腦相關的知識嗎?」 答案是不用! 理由如下: 在電腦還未普及時,也是有很多人在上電腦科學相關的課程。 有推廣「 不插電的電腦科學 」的前輩們。 Code.org 有不錯的 不插電教材 。 有 開源的程式桌遊 。 一堂不需要電腦的程式設計課 。 所以擔任電腦課程的教師們,也許可以試著使用不插電的教材安排幾堂不用電腦的電腦課。 參考資料 [1] Maker 和 Hacker 該如何選擇開發板呢? [2] 五個網頁遊戲,讓你進入迷人的程式世界 [3] 玩知名遊戲學寫程式! Code.or...