好不容易從校內(nèi)某個(gè)ftp上下載到《2012》,木有字幕……強(qiáng)迫自己看下去,考一考自己的聽(tīng)力。發(fā)現(xiàn)除了罵人的語(yǔ)句,其他基本上一知半解,尤其是人物在討論文學(xué)/哲學(xué)/書(shū)籍等等文化相關(guān)的話(huà)題時(shí)??磥?lái)光看美劇,不看書(shū)籍了解一下西方文化還是不行啊……
只好乖乖去找字幕。Google和百度的第一頁(yè)都是垃圾網(wǎng)站,現(xiàn)在的SEO越來(lái)越淫蕩了……
好不容易下了個(gè)字幕。字幕質(zhì)量不錯(cuò),時(shí)間間隔還可以接受。不過(guò)有一個(gè)缺陷,他是單獨(dú)一個(gè)字幕,而我的DVD版《2012》是分成兩個(gè)鏡像的——也就是第二部分無(wú)法使用這個(gè)字幕了。Orz
我用的是QQ影音,試了試調(diào)整字幕的延遲,發(fā)現(xiàn)那個(gè)調(diào)整對(duì)話(huà)框超搞——有一個(gè)輸入框,但是里面的數(shù)字不是延遲/提前的時(shí)間,而是基數(shù),每按一次左/右方向鍵就增加這個(gè)數(shù)量的時(shí)間,而這個(gè)倍數(shù)卻是設(shè)定之后就看不到的。 最終使得我下決心動(dòng)手山寨一個(gè)時(shí)間軸修改器,是因?yàn)镼Q影音沒(méi)有為我保存字幕的延遲設(shè)定。
跑題太遠(yuǎn)了。打開(kāi)字幕文件,是純文本,Nice,省了Google的時(shí)間了。略過(guò)文件頭,有價(jià)值的地方是一行行這樣的東東:
Dialogue: 0,1:01:56.28,1:01:58.40,en,,0000,0000,0000,,We're safe!
Dialogue: 0,1:01:58.64,1:02:00.24,en,,0000,0000,0000,,We're fine!
Dialogue: 0,1:02:04.16,1:02:07.92,en,,0000,0000,0000,,Now that you have your\nmap, where we go?
Dialogue: 0,1:02:18.00,1:02:21.16,en,,0000,0000,0000,,We need a larger aircraft.
……
其中各個(gè)段由逗號(hào)隔開(kāi),各段的意義文件里也有寫(xiě):
Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text
一目了然啦。OK,其他不管,關(guān)注Start、End即可。Start和End也不用多猜,用分號(hào)隔開(kāi)的時(shí)分秒是也。接下來(lái)的工作就輕松了,直接貼代碼吧。。。

點(diǎn)擊這里查看代碼
1
// by lingol 2009.12.05
2
3
#include <iostream>
4
#include <string>
5
using namespace std;
6
7
// convert "1:01:56.28" into micro-seconds
8
size_t convert(const string& str_time);
9
10
// convert micro-seconds into "1:01:56.28" like string
11
string convert(size_t time);
12
13
int main()
14

{
15
string str;
16
while(1)
{
17
getline(cin, str);
18
if (str.find("Dialogue") == 0)
19
break;
20
cout << str << endl;
21
};
22
23
size_t pos = str.find(',') + 1;
24
const size_t base_time = convert(str.substr(pos, 10));
25
26
do
{
27
pos = str.find(',') + 1;
28
string tmp = str.substr(pos, 10);
29
size_t time = convert(tmp) - base_time;
30
tmp = convert(time);
31
str.replace(pos, 10, tmp);
32
33
pos = str.find(',', pos) + 1;
34
tmp = str.substr(pos, 10);
35
time = convert(tmp) - base_time;
36
tmp = convert(time);
37
str.replace(pos, 10, tmp);
38
39
cout << str << endl;
40
} while(getline(cin, str));
41
return 0;
42
}
43
44
// convert "1:01:56.28" into micro-seconds
45
size_t convert(const string& str_time)
46

{
47
size_t time = 0;
48
time += 3600 * (str_time[0] - '0');
49
time += 60 * (10*(str_time[2] - '0') + (str_time[3] - '0'));
50
time += 10*(str_time[5] - '0') + (str_time[6] - '0');
51
time *= 100;
52
time += 10*(str_time[8] - '0') + (str_time[9] - '0');
53
return time;
54
}
55
56
// convert micro-seconds into "1:01:56.28" like string
57
string convert(size_t time)
58

{
59
string str = "0:00:00.00";
60
str[9] = '0' + (time % 10);
61
time /= 10;
62
str[8] = '0' + (time % 10);
63
time /= 10;
64
65
size_t t = time % 60;
66
time /= 60;
67
str[6] = '0' + (t % 10);
68
t /= 10;
69
str[5] = '0' + (t % 10);
70
71
t = time % 60;
72
str[3] = '0' + (t % 10);
73
t /= 10;
74
str[2] = '0' + (t % 10);
75
76
str[0] = '0' + time / 60;
77
78
return str;
79
}
上面的代碼是把所有字幕的開(kāi)始結(jié)束時(shí)間減去第一個(gè)字幕的開(kāi)始時(shí)間,也就是把時(shí)間軸提前到0啦。把原來(lái)那個(gè)文件的文件頭拷過(guò)來(lái),第二部的字幕也拷過(guò)來(lái),一坨新鮮熱辣的字幕就出來(lái)咯。用硬編碼的c++做這個(gè)還真是秒殺啊~。有同學(xué)問(wèn)了,第二部開(kāi)始到人物說(shuō)話(huà)有十幾秒延遲啊,如果我不想提前到0,而是提前到例如說(shuō)12秒,怎么辦捏?有個(gè)比較hack的辦法,在第一條字幕之前增加一個(gè)無(wú)用字幕,把他的時(shí)間設(shè)置得前一點(diǎn),再在生成的字幕去掉它,嘿嘿,嘿嘿
Dialogue: 0,1:01:44.28,1:01:58.40,en,,0000,0000,0000,,We're safe!
Dialogue: 0,1:01:56.28,1:01:58.40,en,,0000,0000,0000,,We're safe!
Dialogue: 0,1:01:58.64,1:02:00.24,en,,0000,0000,0000,,We're fine!
……
posted @
2009-12-05 01:59 lingol 閱讀(1476) |
評(píng)論 (0) |
編輯 收藏
前幾日google 發(fā)布了一個(gè)語(yǔ)言Go,那時(shí)還在宿舍修養(yǎng)中,大概瀏覽一下就丟在一邊了。
昨日下班之后,閑得蛋痛,隊(duì)試一試Go。想不到
官方網(wǎng)站竟然被墻了,不由得感嘆GFW的速度效率無(wú)比偉大強(qiáng)悍……
今晚手賤,再次打開(kāi)
http://golang.org,不想又可以訪問(wèn)了。GFW還真是充滿(mǎn)神秘感啊。
看了一看,估計(jì)一個(gè)晚上是看不完的了,頁(yè)面基本上是純HTML,整個(gè)網(wǎng)站下載來(lái)備著吧,說(shuō)不定什么時(shí)候又上不了。
我印象中wget是可以整站下載的,搜一搜,第一篇就是……
wget 加上參數(shù)之后,即可成為相當(dāng)強(qiáng)大的下載工具。
wget -r -p -np -k http://golang.org
-r, --recursive specify recursive download.(指定遞歸下載)
-k, --convert-links make links in downloaded HTML point to local files.(將下載的HTML頁(yè)面中的鏈接轉(zhuǎn)換為本地鏈接)
-p, --page-requisites get all images, etc. needed to display HTML page.(下載所有的圖片等頁(yè)面顯示所需的內(nèi)容)
-np, --no-parent don't ascend to the parent directory.
posted @
2009-11-17 00:47 lingol 閱讀(2945) |
評(píng)論 (1) |
編輯 收藏
參考自http://www.ycrc.com.cn/qinghua/18/text/chapter4/section1/1.htm
標(biāo)準(zhǔn)式的化簡(jiǎn)步驟
如果一個(gè)合適公式的所有量詞均非否定的出現(xiàn)在公式的前部,而且所有的量詞的
約束范圍均是整個(gè)公式,則稱(chēng)這樣的合適公式為前束范式。任何一個(gè)合適公式,
都可以等價(jià)地轉(zhuǎn)化為一個(gè)前束范式。消去前束范式中所有的存在量詞后得到的
合適公式,稱(chēng)為S范式,這一過(guò)程稱(chēng)作skolem化。S范式與它的原式不一定等價(jià),
但在不可滿(mǎn)足性方面,二者是等價(jià)的。也就是說(shuō),如果原式是不可滿(mǎn)足的,
則其對(duì)應(yīng)的S范式也一定是不可滿(mǎn)足的。反之亦成立。
(1)消蘊(yùn)涵符
(2)移動(dòng)否定符
如果公式中的否定符"~"不只是作用于原子公式,則要利用摩根定律對(duì)公式進(jìn)行變換,
使得否定符只作用于原子公式。
如果否定作用于量詞的話(huà),可以用量詞轉(zhuǎn)換律將量詞提到否定的作用域之外。
(3)變量換名
(4)量詞左移
將所有的量詞移到公式的左邊,但不改變?cè)瓉?lái)各量詞的排列順序。
這也是為什么在第三步要進(jìn)行變量改名的原因,否則就不能進(jìn)行這種移動(dòng)。
(5)消去存在量詞(skolem化)
按照這樣的原則將公式中的存在量詞消去:設(shè)E是前束范式中的一個(gè)存在量詞,
如果在它的前面沒(méi)有出現(xiàn)全稱(chēng)量詞,則所約束的變量x,全部用一個(gè)新的常量
(未在公式中出現(xiàn)過(guò))代替;如果E前面有全稱(chēng)量詞,則所約束的變量x,
全部用一個(gè)新的(未在公式出現(xiàn)過(guò)的)函數(shù)(稱(chēng)為skolem函數(shù))代替,該函數(shù)的
變量是哪些在前面的全稱(chēng)量詞所約束的變量。然后將存在量詞E消去。
(6)化為合取范式
利用結(jié)合律、分配律等,可以把S范式的母式轉(zhuǎn)化為合取范式。
A(x)∨(B(x)∧C(x)) ≡ (A(x)∨B(x))∧(A(x)∨C(x))
(7)隱去全稱(chēng)量詞
經(jīng)過(guò)前6步變換以后,所有的變量都是受全稱(chēng)量詞約束,所以可以將全稱(chēng)量詞隱去,
默認(rèn)所有的變量是受全稱(chēng)量詞約束的。
(8)表示為子句集
在隱去全稱(chēng)量詞以后,用","號(hào)代替公式中的"∧",并用"{"和"}"括起來(lái),就得到了
原合適公式的子句集。
(9)變量換名
對(duì)子句集中的變量再次進(jìn)行換名替換,使得不同的子句中的變量使用不同的名字。
最簡(jiǎn)單的方法是采用加下標(biāo)的方法。注意:在有些書(shū)中并不要求對(duì)子句集中的變量
進(jìn)行換名替換,如果是這樣的話(huà),你必須很清楚,不同子句中的變量,即便是同名的,
也可以代表不同的變量。在后邊將要介紹的歸結(jié)法中,你會(huì)發(fā)現(xiàn),如果不進(jìn)行換名,
很容易出現(xiàn)錯(cuò)誤。因此建議大家對(duì)變量進(jìn)行換名。由于每一個(gè)子句都對(duì)應(yīng)一個(gè)不同的
合取元,變量都由全稱(chēng)量詞量化,因而實(shí)質(zhì)上兩個(gè)子句的變量之間不存在任何關(guān)系,
這里的變量換名不影響公式的真值。
---------------------------------------------------
Skolem化并不影響原合適公式的永假特性
---------------------------------------------------
posted @
2009-08-05 09:56 lingol 閱讀(3940) |
評(píng)論 (1) |
編輯 收藏
最近用Java做一個(gè)regex等價(jià)判斷的東東,發(fā)現(xiàn)垃圾回收真的很強(qiáng)大,資源重用輕輕易易就實(shí)現(xiàn)了。C++加上右值引用和move構(gòu)造函數(shù)能夠提高資源重用,但是可以預(yù)見(jiàn)要一些idiom才能用好,又帶入了新的復(fù)雜性。
.
..
...
忍不住show一下,誰(shuí)能夠?qū)崿F(xiàn)一個(gè)算法,在4秒內(nèi)給出能夠區(qū)分這兩個(gè)正則表達(dá)式的字符串:
(a|b)*b(a|b)(a|b)(a|b)(a|b)(a|b)(a|b)(a|b)(a|b)(a|b)(a|b)
(a|b)*a(a|b)(a|b)(a|b)(a|b)(a|b)(a|b)(a|b)(a|b)(a|b)(a|b)
要知道識(shí)別倒數(shù)第n個(gè)字符是a的正則表達(dá)式,其DFA至少有2^n個(gè)狀態(tài)(見(jiàn)龍書(shū)第二版英文版P164)。
當(dāng)時(shí)愣是沒(méi)做出來(lái),當(dāng)時(shí)也想到要用到素?cái)?shù)模的特殊性質(zhì)來(lái)做,但是數(shù)論忘得差不多了,在那里呆坐了20分鐘就是想不起來(lái),唉唉……
這里看起來(lái)比較小,點(diǎn)擊一下放大來(lái)看吧
定義:
項(xiàng)由下列規(guī)則形成
(1) 個(gè)體常量和個(gè)體變量是項(xiàng)。
(2) 若f是n元個(gè)體函數(shù)且 t1, t2, … tn 是項(xiàng),則 f(t1, t2, … tn) 也是項(xiàng)。
(3) 所有項(xiàng)都只由(1) (2) 生成。
定義:
原子公式若 P(x1, x2, … xn)是n元謂詞, t1, t2, … tn是項(xiàng),則稱(chēng) P(t1, t2, … tn)為謂詞邏輯的原子公式。
定義:
合式公式
1.原子公式是wff;
2.若A是wff,則(~A)也是;
3.若A、B是wff,且在A、B中同時(shí)出現(xiàn)的個(gè)體變量同為約束或同為自由,則A∧B、A∨B、A→B、A
«B也是wff;
4.若A是wff,x在A中是自由的,則
"x(A)、
$x(A)也是wff;
5.只有有限次使用上述四條規(guī)則形成的才是wff。
可得其文法如下:
Formula -> Formula → Formula | Formula « Formula
| Formula ∧ Formula | Formula ∨ Formula | ~Formula
| "Variable(Formula) | $Variable(Formula)
| Relation
Relation -> RelationSym(TermList)
RelationSym -> Constant
TermList -> Term(,Term)*
Term -> Function
| Variable
| Constant
Function -> FunctionSym(TermList)
FunctionSym -> [a-b]+
Variable -> [a-b]+
Constant -> [A-Z][a-zA-Z]*
posted @
2009-05-28 11:13 lingol 閱讀(1720) |
評(píng)論 (5) |
編輯 收藏