發表文章

目前顯示的是 1月, 2020的文章

簡易 Python 問答機器人(Simple Python QA Robot)

圖片
若您覺得文章寫得不錯,請點選網誌上的廣告,來支持小編,謝謝。 本篇文章會以一個 簡易問答機器人 來了解底下的 Python 相關知識:變數、字串、函數、字典、if/if else/if elif else 判斷式、for 迴圈。 聊天機器人程式架構 儲存問題與答案的 quiz 串列。 兩個主要函數:sendMsg 函數、readMsg 函數。 變數(Variables) 底下用非很精準的解釋,畢竟變數和容器還是不一樣的觀念 變數可看成容器,而容器有很多種,例如罐子、紙箱、寶特瓶、水桶、背包、鉛筆盒等。 但若是有30個人都帶著一模一樣的罐子容器時,那要怎麼辨別這個罐子是誰的啊?! 所以就給這些罐子一個獨一無二的名稱!開始來命名囉! 「豬頭 罐子 」、「空 罐子 」、「軟 罐子 」、「硬 罐子 」、「無敵 罐子 」、「我的 罐子 」、「你的 罐子 」、「不說話 罐子 」、「機器人 罐子 」、「腳 罐子 」、「黑 罐子 」、「紅 罐子 」 可以亂命名嗎?!好像不給個規則會產生一些怪怪的名稱。在程式語言裡,變數是有命名規則的,大多的程式語言通常會有底下兩個規則: 第一個字 必須是英文字母(大小寫字母皆可)或是底線字元「_」 , 不可以是數字或其他符號 。 第一個字 之後的其他字必須是英文字母(大小寫字母皆可)、底線字元「_」或是數字 , 不可以使用其他符號 。 而 Python 提供的容器( Data Types )有底下幾種: 文字容器(Text Type):字串(string)。 數字容器(Numeric Types):整數(int)、浮點數(float)、複數(complex)。 序列容器(Sequence Types):串列(list)、元組(tuple)、range( 小編不知道要如何翻成中文 )。 映射容器(Mapping Type):字典(dict)。 集合容器(Set Types):可變集合(set)、不可變集合(frozenset)。 布林容器(Boolean Type):布林(bool)。 二元容器(Binary Types):位元組(bytes)、位元組陣列(bytearray)、memoryview( 小編不知道要如何翻成中文 )。。 Python 變數的使用方式如下:...

APCS 實作題 10610 第2題交錯字串參考解法

圖片
若您覺得文章寫得不錯,請點選文章上的廣告,來支持小編,謝謝。 此題在高中生程式解題系統的題號為: c462: apcs 交錯字串 (Alternating Strings) 。 ============底下文字取自 官方的試題文件 ============ 問題描述  一個字串如果全由大寫英文字母組成,我們稱為大寫字串;如果全由小寫字母組成則稱為小寫字串。字串的長度是它所包含字母的個數,在本題中,字串均由大小寫英文字母組成。假設 k 是一個自然數,一個字串被稱為「k-交錯字串」,如果它是由長度為 k 的大寫字串與長度為 k 的小寫字串交錯串接組成。 舉例來說,「StRiNg」是一個 1-交錯字串,因為它是一個大寫一個小寫交替出現;而「heLLow」是一個 2-交錯字串,因為它是兩個小寫接兩個大寫再接兩個小寫。但不管 k 是多少,「aBBaaa」、「BaBaBB」、「aaaAAbbCCCC」都不是 k-交錯字串。 本題的目標是對於給定 k 值,在一個輸入字串找出最長一段連續子字串滿足 k-交錯字串的要求。例如 k=2 且輸入「aBBaaa」,最長的 k-交錯字串是「BBaa」,長度為 4。又如 k=1 且輸入「BaBaBB」,最長的 k-交錯字串是「BaBaB」,長度為 5。 ============以上文字取自 官方的試題文件 ============ 解法如下: 變數 cg 記錄目前交錯字串長度。 變數 g 紀錄最大交錯字串長度。 變數 ck 紀錄目前字母case累積次數。 變數 preL 紀錄上一個字母的case是大寫u、小寫 l、未知n。 變數 curL 紀錄目前字母的case是大寫u、小寫 l、未知n。 將題目輸入的 k 值分成兩種情況來處理,這是因為筆者的解法在處理 k = 1 與 k > 1 這兩種情況時,剛好是相反的。 k = 1 時,當發生大小寫轉換(preL != curL)時,cg 就加 1;否則  cg 設為 1。 g 設為 max(g, cg)。 k > 1 時,請參考底下圖片: 當發生大小寫轉換(preL != curL)時,目前字母case累積次數 ck 會有三種...

APCS 實作題 10603 第2題小群體參考解法

圖片
若您覺得文章寫得不錯,請點選文章上的廣告,來支持小編,謝謝。 此題在高中生程式解題系統的題號為: c291: APCS 2017-0304-2小群體 。 題目簡短說明如下: 好友的關係會形成一些小群體。例如 N=10,好友編號如下, 0 的好友是 4,4 的好友是 6,6 的好友是 8,8 的好友是 5,5 的好友是 0,所以 0、4、6、8、和 5 就形成了一個小群體。另外,1 的好友是 7 而且 7 的好友是 1,所以 1 和7 形成另一個小群體,同理,3 和 9 是一個小群體,而 2 的好友是自己,因此他自己是一個小群體。總而言之,在這個例子裡有 4 個小群體:{0,4,6,8,5}、{1,7}、{3,9}、{2}。 延伸:輸出各小群體內每個人的編號,例如上述例子為{0,4,6,8,5}、{1,7}、{2}、{3,9}。 解法一:用陣列 用兩個陣列,一個(f [50000])用來記錄自己的好友是誰,一個(g[50000])用來記錄有沒有加入到群體裡。 尚未組成群體: 群體編號為 1: 群體編號為 2: 群體編號為 3: 群體編號為 4: C 程式碼: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 #include <stdio.h> int main ( void ) { int n; while (scanf( "%d" , & n) == 1 ) { int f[ 50000 ]; // 自己的好友是誰 char g[ 50000 ] = { 0 }; // 有無加入群體 for ( int i = 0 ; i < n; i ++ ) scanf( "%d" , & f[i]); int grpCnt = 0 ; // 紀錄有幾個群體 int nxt = 0 ;...

(非官方整理題目) APCS 實作題 10901 第1題「猜拳模擬」參考解法

圖片
若您覺得文章寫得不錯,請點選網誌上的廣告,來支持小編,謝謝。 ======底下文字取自  https://hackmd.io/@joylintp/APCS20200105  ====== pA 猜拳 有一個機器人跟真人玩  N N  次猜拳, 真人在第 i i 輪出的拳為  y i y i , 機器人第一次會出的拳為  F F ,接下來出拳的方式如下: 如果前兩輪真人出的拳皆相同,則電腦這輪會出可以打敗前兩輪的拳; 否則,電腦會出與前一輪真人一樣的拳。 請輸出第  k k  輪時會分出勝負,或  N N  輪雙方都平手。 $\輸入格式: F N y 1   y 2   . . .   y N y 1   y 2   . . .   y N 輸出格式: c 1   c 2   . . .   c k   : c 1   c 2   . . .   c k   :   Drew at round N / Won at round k / Lost at round k 範圍: F , y i , c i ∈ { 0 , 2 , 5 } F , y i , c i ∈ { 0 , 2 , 5 }  ( 0 指石頭, 2 指剪刀, 5 指布) N ≤ 10 N ≤ 10 範例測資: Input 1: 0 4 2 5 0 2 Output 1: 0 : Won at round 1 Input 2: 2 2 2 0 Output 2: 2 2 : Lost at round 2 Input 3: 5 4 5 5 0 0 Output 3: 5 5 2 : Lost at round 3 Input 4: 5 6 5 5 2 2 0 0 Output 4: 5 5 2 2 0 0 : Drew at round 6 子題: (20%)  N = 1 N = 1 (20%)  N = 2 ,...