2016年4月10日星期日

Google Code Jam 2016 Qualification

今年的GCJ有一點小嘗試,在無時限的Qualification用不多人用過的Q來寫。

為了方便大家,這裏便是documentation。
http://code.kx.com/wiki/Main_Page


題目也不多說了,只集中寫一寫今次的一些學習。詳細要看題目的在這裏
https://code.google.com/codejam/contest/6254486/dashboard

Problem A

a:read0`:al.in;

f:{ distinct raze string x*1+til y };
g:{
  k:f[x;]each 1+til 100;
  ret:x*1+first where 10=count each k;
  $[null ret;"INSOMNIA";string ret]};
res:g each 1_"I"$a;

output:{"Case #",string[x],": "} each 1+til -1+count a;
`:al.out 0:output,'res

先簡介一下程式,大概便是先把input變成一個string list (a),再通過function f和g去處理input,最後兩行便是把output放入file中。


這題剛開始熱身,便假設n在100次以內必然會出現0-9起碼一次(其實可以證明的)。主要把每一個數字變成string,再串起來,加上distinct,來判斷是否有10個不同的數字(Function f)。

Problem B


a:read0`:bl.in;

f:{
  x:x where differ x;
  if["+"=last x;x:-1_x];
  string count x };

res:f each 1_a;

output:{"Case #",string[x],": "} each 1+til -1+count a;
`:bl.out 0:output,'res

這一題主要用了一個trick,去掉所有連續的+和-,以及最後一個+,便可根據剩下的string的長度來得出答案。特別一提Q中的x where differ x便可以做到去掉連續的效果,很簡潔。

Problem C


res:{"2",raze string ?[-15#0b vs x;22;11],"2"} each 1+til 500;
`:cl.out 0:(enlist "Case #1:"),(raze each string "2"=res),\:raze " ",'string 3+til 9

最喜歡要算是這題,利用了有連續的1在base n必會整除(n+1)。所以基本上做法是把長k的01 string,去掉頭尾的1,再分成(k-1)/2組,每組必然是11或00。然後根據10進位轉2進位的方法,用頭500個數的二進位來放進那些組中。

Q的轉二進位很容易,在0b vs x這句中做到,更可以因為vector conditional來一次過製造最終的組合(全都在第一行做了)。第二行只是給出指定的output format。

Problem D


a:read0`:dl.in;

pow:{show y;$[y;$[y mod 2;:pow[x;y-1]*x;:g*g:pow[x;y div 2]];:1]};

f:{
 c:"J"$" " vs x;
 n:c[0]; k:c[1]; s:c[2];
 if[s<try:1+(n-1)div k;:"IMPOSSIBLE"];
 id:(try;k)#til n;
 pp:pow[n;]each til k;
 " " sv string 1+sum each id*\:pp };

res:f each 1_a;
res

output:{"Case #",string[x],": "} each 1+til -1+count a;
`:dl.out 0:output,'res

這一題算最複雜。或者可以寫得更簡單,但大致上的原理是算出每一個generation所要取的位置,再乘以n的power,以得出最後要得的index。特別喜歡(try;k)#til n這一行,基本上它把0到n-1自動放進try x k的表格中,並自動wrap over。然後便可以用vector operation直接乘以n的power,加起來便是所需的index。





2016年2月19日星期五

淨土

有時候,地方的轉移的確可以讓一些情緒得到紓緩。幸好香港有這樣一個好地方,晚上的時候人不多,很適合去坐在海邊,吹著海風,在城市的繁囂中得到釋放。



可惜的是,這些都不長久 - 這個地方快要消失了。

世間很多解決事情的方法也一樣,並不長久。有些時情,要治本,惟有靠著那不變的盤石,就是天上的父神。

2016年1月25日星期一

寒冷.日出

香港史上其中最冷的一天,就在這突然的決定,走上太平山看日出了!




雖然這溫度顯示是4度,相信山頂或許只有2-3度!仍未結冰,但已經是二十年一遇了

2016年1月21日星期四

溝通日

看著同事升職,加人工,他們各自的道賀,甚至有人說過去一年就是在等今天。心中不禁有些感嘆,雖然看似高興,然而內心卻總滲透著一些不滿足。看見數年辛苦的成果,是一個頭銜。一年辛勤的工作,是一個數字上的補償。

哈哈,當然雖都會想發財,但即使發了財,又怎及得上與朋友真誠的聊天,談著大家的理想,討論大家喜歡的事情呢?

勾起不少的回憶,小時候玩過的小遊戲,那些圖像,那些概念,那些遊戲設計。喜歡的地方,值得再發展的元素,彷彿未動工已有完美的製成品。看似無關痛癢,但無形中給了我動力去努力實現腦中的東西。

先說說,後補上完成作。

2016年1月8日星期五

2016

有一點遺憾,竟然2015年沒有在這裏發佈文字。

踏入2016年,稍稍回望,還是充滿著恩典。有很多事情,沒有想過會這樣發生,而大部份都是比預期好,以成語來表達,便是「喜出望外」了。而數算著當中的事,有多少件在我控制範圍以內?沒有很多。若這樣看,似乎巧合還未夠形容,真的有一位時間安排極好的造物主才有能力讓這些事發生。

自己的改變,有時不容易察覺,但最近回想卻有一個。以前說過要做的事,70%是最終沒有做的。最近說過要做的事,70%是真的能實行出來的。樂觀的展望,2016年有很多事情想做,希望這小改變能維持吧!





受傷了 誰都會哭泣 哭完了 別否定過去
快樂的 美好的 都還在這裡 等著你

2014年5月5日星期一

正街‧轉變

一個晚上,突然看到這些變化,抓住那一刻的感覺,寫下來。


由沒有電梯,沒有地鐵。到現在,電梯建好了,地鐵也快要完工,這兒的面貌頓時變了。

一條大斜路,記得小時候每星期日都要走上來。很多次從第三街走上高街都抱怨,因為很辛苦,尤其天氣是三十多度,總好像沒完沒了。

高街和般咸道中間,則是數家小檔攤,當中不得不提賣蛋卷的,遠遠便被它的香味吸引,在兩條街中間,或許成為了走上去最大的動力。

更久以前,第三街和高街之間,是兩家大排檔。其中一家,一個男人長頭髮,一個女人短頭髮。我每一次經過都覺得很奇怪。

整條大斜路一望便是海,那時不少路人,尤其老人,望而生畏。

漸漸地,大排檔搬走了,承記水電又不在正街,第六巷又搬走,蛋卷的也去了第三街。取而代之便是cafe,西餐廳,日本城,和電梯。

晚上走上來,看見的,是數個外國人倚著欄杆聊著天,手上拿著一瓶啤酒。餐牌外寫的是英文,裝修黑漆漆的。不算很吵,但就是不同了。

一個文化的形成,一種回憶的構成,因著環境,消磨,重建。

2014年4月3日星期四

春雨

這數天都下著大雨,一方面有回春的感覺,另一方面又是一種清新。

大雨有著的,是豪邁、是激情。這些又彷彿和春天一般給人濕悶、呆滯的感覺不同,總帶著它一些獨特的氣派。

差不多整個三月都沒有陽光普照的一天,都是灰灰沉沉的。人生也有點兒像,認真去想,有多少日子真的可以整天保持著笑容,且是由心發出?然而,所經歷灰沉的日子,又真的都是灰沉嗎?我們不能在這種天氣仍感愉快嗎?

這一種的愉快,卻不是來自「希望在明天」之類的阿Q精神。而是學會欣賞身邊細微的事物,學會為每一件所遇到的事感恩。

鳥兒叫了,又是新的一天。