寫程序得女友——日本OJ Paiza Online Hackathon小遊戲"戀愛SLG"題解
Prologue——"Get a girlfriend in Programming"
本文圖片較多,請謹慎食用~
今天早上某群友聊著聊著就說:「找什麼女朋友,和自己寫的代碼談戀愛多好」
群主( @KAAAsS ):「哎?有個網站真的可以!」
這個網站叫Paiza(拍砸) Online Hackathon,日本的一個在線測評網站,有點類似LeetCode。同時這個OJ也支持好多語言。這個網站(為了吸引人氣)做了個小遊戲叫"戀愛SLG",說是SLG其實是個換裝遊戲...有很多衣服和飾品都是沒有解鎖的,想要解鎖很簡單:不需要氪金,不需要肝,做幾道演算法題就通關!(蜜汁押韻)。題目都不難,但是由於題目描述全是日語的,而我...只能靠看動(li)漫(fan)和玩游(huang)戲(you)的經驗搭配Google Translate食用...在貼題解的同時我把題意也附上吧!
附上可以使用的語言列表:
話不多說,老婆我來啦!!!!
Trial
這裡可以體驗一下這個遊戲的玩法:
右邊四欄是可以選擇換掉的衣服 / 飾品 / 面部表情之類的東西,比如我們可以把瞳色換成紅色:
「哇,我**社保!」。按捺住激動的心情,開始解鎖所有姿勢...啊不,服飾吧!
第一層——面部 & 肩部飾品
1. つり目セット(這是啥...好像是眼角的外觀?)
ある正の整數 n が入力されます。n 回「Ann」と繋げて「AnnAnnAnnAnn......」と出力して下さい。
輸入:
3
輸出:
AnnAnnAnn
看樣例就能猜出來...輸入一個正整數 ,輸出 次 Ann
n = int(input())print(Ann * n)
第一道題就解決了...非常simple!於是
つり目セット Get!
2. 眼帯(中二病必備的那個眼罩)
題目描述:
あなたは、巻數が全 N 巻の古い本を集めています。古本屋に訪れたあなたは売られている各巻のうち買うべきなのは何巻かを知りたいです。
あなたの持っている巻のリストと、中古本屋で売られている巻のリストを入力として與えられたとき、あなたの買うべき巻のリストを出力してください。
題意: 給定兩個正整數集 , ,將在 中,但不在 中的整數升序輸出,如果答案為空,輸出None。
輸入:
第一行一個正整數 表示兩個集合中最大的數不大於
第二行一個正整數 ,接下來一行有 個數,表示 中包含的元素
第四行一個正整數 ,接下來一行有 個數,表示 中包含的元素
樣例輸入:
5
31 3 432 3 5
樣例輸出:
2 5
題解:
這也能算題么....用Python的話,set
有一個函數difference()
,可以直接解決問題....
_ = int(input())M = int(input())S1 = set([int(x) for x in input().split()])K = int(input())S2 = set([int(x) for x in input().split()])ans = sorted(S2.difference(S1))if ans: print(*ans)else: print(None)
3. 貓耳(四齋福利)
我!社保!!!
這個必須有!必須有啊!!!
-----咳咳咳,正經的分割線-----
題意:輸入一個由字元c, a, t構成的字元串,求字元串cat作為子串出現的次數。
(某同學:KMP!KMP!!
(另外一個同學: Sunday!Sunday!
數據規模:
<del>(呵,OIer(大大大霧</del>
直接上代碼吧...沒什麼好說的:
print(input().count(cat))
貓耳 Get!! (我知道你們已經按捺不住了(x:
我!社保!!!
4. 貓(Glavo(霧))
題意:輸入一個由c, a, t組成的字元串,輸出出現次數最少的,出現次數最多的次數減去c出現的次數 | 減去a出現的次數 | 減去t出現的次數
樣例見上圖,這題也就是個無腦模擬...做完事了:
ans = [0] * 3S = input()for i in S: if i == c: ans[0] += 1 elif i == a: ans[1] += 1 elif i == t: ans[2] += 1p = max(ans)q = min(ans)print(q)for i in ans: print(p - i)
Glavo, Get! 這個是趴在肩上的小貓咪OvO:
老夫的少女心啊....!!
第二層——髮型
1. ショートヘアセット(短髮?)
A....A+B Problem!!
ショートヘアセット, Get:
2. ロングヘアセット(長發?)
題意:有5個投票,每票是yes或no,輸出數量多的一方
a = {yes: 0, no: 0}for i in range(5): p = input() a[p] += 1print(yes if a[yes]>a[no] else no)
ロングヘアセット, Get:
<del>怎麼有點像LL里的俄羅斯老流氓</del>
3. ポニーテールセット(單馬尾)
題意:Count down...沒啥好說的:D
n = int(input())while n>=0: if n: print(n) else: print({}!!.format(n)) n -= 1
ポニーテールセット, Get:
4. ツインテールセット(傳說中的雙!馬!尾!)
我!社保!!!
題意:給定兩組藥劑(?)編號為1, 2,每組標有凈含量和價格,輸出單位質量更貴的一組的編號。
a1, a2 = map(int, input().split())b1, b2 = map(int, input().split())if a1 / a2 > b1 / b2: print(1)else: print(2)
ツインテールセット, Get! :
(有種愛抖露既視感....???
服裝(劃重點!)
1. セーラー服セット(水...水水....水手服!!!!)
我!社保!!!* 10086
題意: 看例子...嗯,就是用下劃線把所有詞連成一個字元串
n = int(input())a = []for i in range(n): a.append(input())print(_.join(a))
セーラー服セット, Get!:
prprprprprprprprprprprprpr,字幕都不打了,我就prpr!
2. カーディガンセット(棉服—應該也是制服!)
我!你懂吧!!
題意:階乘
from functools import reducen = int(input()) + 1print(reduce(lambda x, y: x * y, range(1, n)))
カーディガンセット, Get! :
嗚嗚嗚!!小姐姐真好看!!!美哭啦!
3. 縞ニーソセット(襪子)
(為了不暴露特殊癖好,我保持冷靜與沉默)
題意:輸入兩個正整數n和m,輸出長度為m的字元串,其中n次R與n次W交替出現。具體看題目的例子。
a = [R, W]i = 0n = int(input())m = int(input())while m: for j in range(n): if m: print(a[i], end=) m -= 1 i ^= 1
縞ニーソセット, Get:
我**舔....咳咳咳,沒什麼
4. メイド服セット(是的!你沒看錯!妹抖服!!!!)
我!社保!* 65536
題意:小A每天睡6個小時,每天早上7點起床。但是如果他前一天加班了,他就會多睡加班時間的1/3,他是個好孩子,不打算晚起,所以他要早睡!輸入他加班的分鐘數(保證是3的倍數),求他當天晚上開始睡覺的時間。
這題也算是個模擬,簡單就簡單在加班時長一定是3的倍數,這樣我們不需要去理會秒數的問題了。這裡只需要計算要早睡幾個小時,幾分鐘即可。注意處理小時數:用24小時制。如果小時 / 分鐘小於10,則在10位補0。
#include <iostream>using namespace std;int main(){ ios::sync_with_stdio(false); int N;cin>>N;int K; while(N--){ cin>>K; int rem = K / 3; int h = rem / 60; int m = rem % 60; if(m > 0) h += 1; int s = 1 - h + 24; int e = 0 - m + 60; if(s >= 24) s -= 24; if(e >= 60) e -= 60; if(s < 10) cout<<0<<s<<":"; else cout<<s<<":"; if(e < 10) cout<<0<<e<<"
"; else cout<<e<<"
"; } return 0;}
メイド服セット, Get!!!看來眾所欲之物,不易得也(其實也挺易的...
愛...愛麗絲??好可愛哇~(痴漢臉
Extra!SSR 特殊服飾!
這一部分明顯比上面的要難一些...因為有水著啊之類的*有趣*的衣服
1. めがね(眼睛)
<del>停停停.....我知道你們想說啥...</del>
題意:輸入兩個矩陣, 和 ,在 中找到能夠完全匹配 的Pattern,並輸出這個Pattern的左上角。如上圖,匹配到的Pattern左上角位置為(1, 0)。一個矩陣中,0表示白,1表示灰。
這個題數據規模相當小,所以暴力掃一遍就能得到答案了:
N=int(input())S=[list(map(int, input().split())) for i in range(N)]M=int(input())T=[list(map(int, input().split())) for i in range(M)]for y in range(N-M+1): for x in range(N-M+1): f = False for i in range(M): for j in range(M): if S[y+i][x+j] != T[i][j]: f = True break if f: break if not f: print(y,x) exit()
めがね, Get!:
(保持沉默是最好的)
2. サンタ服(聖誕老人服)
題意:輸入一個立方體的長,寬,高和操作次數。對於每一次操作, =0表示橫著切(沿著X切), =1表示豎著(沿著Y切)。求切完之後最小的一塊的體積。
這個題比之前就要複雜一點點,但是也不是非常難:只需要對兩種操作排個序,然後把橫著間距最小和縱著切間距最小的長度記下來,最後乘以Z即可。
X, Y, Z, N = [int(x) for x in input().split()]op = [[0, X], [0, Y]] # 先把整個塊看作切出來的..for i in range(N): di, ai = [int(x) for x in input().split()] op[di].append(ai)ans = [X, Y]for i in range(2): op[i].sort() for j in range(1, len(op[i])): ans[i] = min(ans[i], op[i][j] - op[i][j-1]) # 貪心print(ans[0] * ans[1] * Z)
サンタ服, Get!:
還是很好看的QwQ,萌我一臉血
最重量級的衣服!水著!!!
我!!!!社保!!!
題意:輸入正整數 ,求 的階乘的最右9位非零數是什麼,如果這9位有前綴0,那麼去掉前綴0輸出。簡單來說就是:求一個階乘去掉後綴0之後的後9位去掉前綴0之後的結果(有點拗口2333)。
這裡需要注意一點:在階乘過程中去掉後綴0再繼續計算對階乘最後去掉後綴0之後的非零位結果是沒有影響的。同理,去掉前面 位對 位之後是沒有影響的(第 為可能會受到進位的影響),因此我們可以每次階乘前去掉計算得到的後綴0然後對 取模,輸出時再對 取模即可。P.S:這裡的數據規模是 ,因此不會超時。這道題在
Last non-zero digits of a very large factorial這裡(上述鏈接)有一個推廣的版本,利用的Hamming Code解決的問題,感興趣的話大家可以自行閱讀。
#include <iostream>using namespace std;typedef long long ll;#define MOD 10000000000ll work(int p){ ll ans = 1; int i; while(p){ i = p--; while(i % 10 == 0) i /= 10; ans *= i; while(ans % 10 == 0){ ans /= 10; } ans %= MOD; } return ans;}int main(){ ios::sync_with_stdio(false); int N;cin>>N; ll ans = work(N); cout<<ans % 1000000000; return 0;}
水著, Get!(福利):
我!!!(猝
Epilogue
至此,所有的姿勢...啊不,服飾都解鎖啦!同時親密度也到了MAX!:
是的!!就是我!!可以愉悅地和我的老婆玩耍啦哈哈哈哈哈!
Get a Girlfriend in Programming!這是可以實現的!
推薦閱讀:
※沈向洋:You Are What You Write,大家都要看
※從零開始手敲次世代遊戲引擎(四十一)
※工作一個月的感受
※怎樣在多台Web伺服器上共享Session