2007年3月8日 星期四

CMClass: 微軟徵才試題 (完)

算錯篇: http://fourdollars.blogspot.com/2007/03/cmclass.html
算對篇: http://fourdollars.blogspot.com/2007/03/cmclass_08.html
這篇要來個總結... :P
原始的題目是
永源拿了兩個不同數字...
這兩個數字分別大於 1 ,也分別小於 50
永源只把這兩個數字的乘積告訴了亞譚 ...
永源再只把這兩個數字的和告訴了明歆 ...
永源問, 這兩個數字是什麼 ?

以下是亞譚和明歆的對話... (小強, 小毛, 小燕在旁坐陪)
亞譚: 我不知道這兩個數字是什麼!
明歆: 但我也還是不知道這兩個數字是什麼!
亞譚: 喔!那我知道那兩個數字是什麼了 !
明歆: 喔!那我也知道那兩個數字是什麼了 !
突然間 ....聰明的三位陪客同時也說: 我們也知道那兩個數字是什麼了 !
聰明的你, 告訴我....那兩個數字是什麼 ?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "set.h"

#define LOWER 2
#define UPPER 49

#define for_ij_do(A...) \
for (i = LOWER; i <= UPPER - 1; i++) \
for (j = i + 1; j <= UPPER; j++) \
do { A } while (0);

int main(int argc, char *argv[])
{
int i,j;

int m[UPPER * UPPER] = {0};
int a[UPPER + UPPER] = {0};

Set *setA = newSet();
Set *setB = newSet();

for_ij_do (
m[i * j]++;
);

for_ij_do (
if (m[i * j] >= 2)
appendSet(setA, newPair(i, j));
);
/* 亞譚: 我不知道這兩個數字是什麼!*/
/* setA->size == 638 */

for_ij_do (
if (findElement(setA, newPair(i, j)))
a[i + j]++;
);

for_ij_do (
if (a[i + j] >= 2 && findElement(setA, newPair(i, j)))
appendSet(setB, newPair(i, j));
);
/* 明歆: 但我也還是不知道這兩個數字是什麼!*/
/* setB->size == 629 */

memset(m, 0, sizeof(int) * UPPER * UPPER);

for_ij_do (
if (findElement(setB, newPair(i, j)))
m[i * j]++;
);

for_ij_do (
if (m[i * j] == 1 && findElement(setB, newPair(i, j)))
printf("%d %d\n", i, j);
);
/* 亞譚: 喔!那我知道那兩個數字是什麼了! */
/* 明歆: 喔!那我也知道那兩個數字是什麼了! */

destorySet(setB);
destorySet(setA);

return 0;
}
兩篇相關的討論
http://heaven.branda.to/~thinker/GinGin_CGI.py/show_id_doc/226
http://hoamon.blogspot.com/2007/03/cmclass.html
總算是想出來了... ^o^
Source Code 放在 http://fd.idv.tw/tux/CMClass.tar.bz2
因為不知道 C 上面有什麼 Set 的相關函式, 所以就自己硬幹一個簡易版出來... XD
另外... 為了把 Source Code 貼到 Blog 上, 用到了一段 command
cat main.c | sed -e 's/</\&lt;/g' | sed -e 's/>/\&gt;/' | less
如果有程式有辦法把 Source Code 轉成 HTML 外加彩色應該會很方便好用吧!?

CMClass: 微軟徵才試題 (續)

昨天的文章算錯答案了... :P
所以... 重寫一個程式... ^o^
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "set.h"

#define LOWER 2
#define UPPER 49

int main(int argc, char *argv[])
{
int i,j;

int m[UPPER * UPPER] = {0};
int a[UPPER + UPPER] = {0};

Set *setA = newSet();
Set *setB = newSet();
Set *setC = newSet();

Node *index = NULL;

for (i = LOWER; i <= UPPER - 1; i++)
for (j = i + 1; j <= UPPER; j++) {
m[i * j]++;
a[i + j]++;
}

for (i = LOWER; i <= UPPER - 1; i++)
for (j = i + 1; j <= UPPER; j++)
if (m[i * j] >= 2)
appendSet(setA, newPair(i, j));

memset(m, 0, sizeof(int) * UPPER * UPPER);
memset(a, 0, sizeof(int) * UPPER * 2);

for (i = LOWER; i <= UPPER - 1; i++)
for (j = i + 1; j <= UPPER; j++)
if (findElement(setA, newPair(i, j))) {
m[i * j]++;
a[i + j]++;
}

for (i = LOWER; i <= UPPER - 1; i++)
for (j = i + 1; j <= UPPER; j++)
if (a[i + j] >= 2 && findElement(setA, newPair(i, j)))
appendSet(setB, newPair(i, j));

memset(m, 0, sizeof(int) * UPPER * UPPER);
memset(a, 0, sizeof(int) * UPPER * 2);

for (i = LOWER; i <= UPPER - 1; i++)
for (j = i + 1; j <= UPPER; j++)
if (findElement(setB, newPair(i, j))) {
m[i * j]++;
a[i + j]++;
}

for (i = LOWER; i <= UPPER - 1; i++)
for (j = i + 1; j <= UPPER; j++)
if (m[i * j] == 1 && findElement(setB, newPair(i, j)))
appendSet(setC, newPair(i, j));

for (index = setC->head; index != NULL; index = index->next)
printf("%d %d\n", index->curr->x, index->curr->y);

destorySet(setA);
destorySet(setB);
destorySet(setC);

return 0;
}
完整的 Source Code 在 http://fd.idv.tw/tux/CMClass.tar.bz2
有興趣可以幫忙 debug ... :P

2007年3月7日 星期三

CMClass: 微軟徵才試題

從 http://heaven.branda.to/~thinker/GinGin_CGI.py/show_id_doc/226 看到的題目
我的解答是 3 跟 4 (這不是正確答案喔!請看意見)
求解的程式在這裡

#include <stdio.h>

int main(int argc, char *argv[])
{
int i, j;
int a[100] = {0};
int m[2500] = {0};

for (i = 2; i < 50; i++) {
for (j = i; j < 50; j++) {
a[i+j]++;
m[i*j]++;
}
}

for (i = 2; i < 50; i++) {
for (j = i; j < 50; j++) {
if (a[i+j] == 2 && m[i*j] == 2) printf("%d %d\n", i, j);
}
}

return 0;
}

從以前就很喜歡寫程式來解數學問題... ^_^

2007年2月15日 星期四

Google Toolbar 3.0.20070201

再一次的... XD
在使用 Firefox 中的 [附加元件] -> [尋找更新] 後
完全看不到可以更新的資訊 (因為主版本號碼的不同嗎?)
http://toolbar.google.com/intl/zh-TW/
新增了一些有趣的功能,例如:

1.書籤
無論在 IE 還是 Firefox 上使用的都是同樣的書籤
有 tag 的功能,使用感覺比 Google Sync 還要好用
(Google Sync 可以移除掉了... :P)

2.Google 文件
要在 [設定] -> [選項] 中打開
反正就是讓網頁上的 .doc .xls .rtf .ods .odt .csv .sxw 檔案都用 Google 文件來開啟

更詳細的說明在 http://www.google.com/support/firefox/bin/static.py?page=features.html&v=3&hl=zh_TW 上

2007年2月8日 星期四

Gmail 開放收取外部信件的服務

不過目前沒有支援正體中文
必須先換成英文語系來做設定
從 http://www.chunmin.com/archives/49/2/ 看來的消息~ :P

2007年2月6日 星期二

rpm: Query all installed packages.

在 Redhat/Fedora/SuSE 上查詢所有已經安裝的套件
可以使用
rpm -qa

如果想要查詢套件名稱含有某關鍵字的則可以使用
rpm -qa | grep kernel

或者是
rpm -qa '*kernel*'

自己習慣上都是使用
rpm -qa | grep kernel
(鍵盤比較好敲)
不過
rpm -qa '*kernel*'
似乎應該比較快速(就程式執行的速度來看)
於是就做了一個小實驗
$ for ((i=0;i<3;i++)); do time echo $(rpm -qa '*kernel*'); done
kernel-devel-2.6.19-1.2895.fc6 kernel-headers-2.6.19-1.2895.fc6 kernel-2.6.19-1.2895.fc6

real 0m2.856s
user 0m2.640s
sys 0m0.149s
kernel-devel-2.6.19-1.2895.fc6 kernel-headers-2.6.19-1.2895.fc6 kernel-2.6.19-1.2895.fc6

real 0m2.854s
user 0m2.656s
sys 0m0.138s
kernel-devel-2.6.19-1.2895.fc6 kernel-headers-2.6.19-1.2895.fc6 kernel-2.6.19-1.2895.fc6

real 0m2.858s
user 0m2.631s
sys 0m0.141s
$ for ((i=0;i<3;i++)); do time echo $(rpm -qa | grep kernel); done
kernel-devel-2.6.19-1.2895.fc6 kernel-headers-2.6.19-1.2895.fc6 kernel-2.6.19-1.2895.fc6

real 0m3.246s
user 0m2.738s
sys 0m0.448s
kernel-devel-2.6.19-1.2895.fc6 kernel-headers-2.6.19-1.2895.fc6 kernel-2.6.19-1.2895.fc6

real 0m3.381s
user 0m2.727s
sys 0m0.570s
kernel-devel-2.6.19-1.2895.fc6 kernel-headers-2.6.19-1.2895.fc6 kernel-2.6.19-1.2895.fc6

real 0m3.311s
user 0m2.705s
sys 0m0.546s
果然經過 pipeline 的方法比較慢~ :)

Yahoo! Widget: Radio_Tuner_Taiwan v1.2

最近因為 Hinet Radio 改變了一些設計
於是原本的 Radio_Tuner_Taiwan v1.2 突然不能只用
可是也沒看到有人在修理
所以就自己來修~ :P

作法如下:
1. 解開原本的 Radio_Tuner_Taiwan v1.2
2. 編輯其中的 widFunction.js
i. 把所有的 player.jsp 取代成 player_ff.jsp
ii. 把 function getLiveURL 代換成
function getLiveURL(theURL){
var url=new URL();
url.location=theURL;
var contents=url.fetch(); //("mmsurl=([^\;]+)\"", "g");
var liveURLRE=new RegExp("setMovieFile\\\(\\\"([^\;]+?)\"", "g");
liveURL=liveURLRE.exec(contents);
url.location=liveURL[1];
contents=url.fetch();
liveURLRE=new RegExp("href=\\\"([^\;]+?)\"", "g");
liveURL=liveURLRE.exec(contents);
stationURL=liveURL[1];
}
再用 Widget Converter 把它包回成 Yahoo! Widget 就可以用了~~~ Happy Hack! ^o^