獲取 UVa 測資 ( Get UVa test data )

聲明

注意!!! 因為我也不知道這樣是不是 UVa 允許的,所以本人只有教學,不負任何責任,請自行拿捏

介紹

有時候我在寫 UVa 題目的時候,明明題目給的測資與 UDebug 上的測資都過了,但 submit 之後卻都還是 Wrong Answer
於是乎我就一直很想把 UVa 的測資搞到手XD ,左思右想就想到了幾種方法 :

  1. 用遠端 ssh 連線。此方法的過程大略如下 :

    • 先將 UVa input 讀進程式
    • 再將 input 存成一個 file
    • 建立與自己電腦的 ssh 連線
    • 將檔案上傳到自己電腦
    • 關閉連線

    不過這個方法些問題就是 :

    • UVa 的測試環境可能沒有權限讓我建立一個檔案
    • 由於需要 create file,所以怕會讓程式 TLE,這樣可能還沒把檔案傳出去就先被終止掉了
  2. 用 email 傳。方法過程如下 :

    • 先將 UVa input 讀進程式
    • 準備 email 的 data
    • 將 email 傳出
    • 結束程式

    此方法也有一個問題 :
    因為要傳 email 你就必須先登入,之後才可以傳,所以你的 email 帳號密碼會需要記錄在你的 program source file 中
    可能會造成你的資料外洩,因此你需要準備一個不重要的 email 帳號。
    當然可能也有不須登入就可以傳 email 的方法,只是我不知道QQ,有知道的大大拜託請你告訴我,感恩~~

本文使用方法二,用 email 傳測資出來,不過成功機率並非 100%,下面會說明


用 eamil 將獲取的 UVA Data 傳出

首先,先來準備我們要 submit 的程式碼,這邊是用 python 寫的

crawing_data.py

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
#! Note that you shold open the "Let less secure apps access your account" from the following URL
#! https://www.google.com/settings/security/lesssecureapps

import smtplib
import sys
from smtplib import SMTP



From = '@gmail.com' # Your gmail account for sending email
Password = '' # Your gmail account password
To = '' # The e-mail address you want to send grabing data to


line = sys.stdin.read()

smtp_server = 'smtp.gmail.com'
smtp_port = 587

smtpObj = smtplib.SMTP(smtp_server, smtp_port)
smtpObj.starttls()
smtpObj.login(From,Password)
to = [To]
msg = line

smtpObj.sendmail(From, to, msg)
smtpObj.quit()

注意其中的 FromPasswordTo分別要填上你要登入的帳號你登入帳號的密碼你要寄到的信箱
要注意的是,py 檔名不要取名叫 “ email.py “,這樣會讓 python 找不到 smtplib,所以最好是取和 email 無關的名子

然後我們在 py 檔的目錄下創建一個 txt 檔,裡面可以打上任意的東西

然後我們再到 低安全性應用程式存取權 (Less secure app access) 頁面打開允許低安全應用存取

我們現在就來測試一下,Windows 就開啟 CMD 並把目錄轉移到 py 檔所在的地方,Linux 則是用 terminal
並利用 pipe 來模擬 UVa 輸入測資 python crawling_data.py < input.txt

然後我們打開 email 來看一下

耶收到了~


重頭戲

我們現在選擇一個 UVa 題目,我這邊選 UVa 10154 : Weights and Measures

選擇使用 python,將剛剛的 crawling_data.py 貼上去

然後再來就是等待啦~~
因為 python 在 UVa Judge System 中的 priority 好像很低,所以普遍都要等很久

燈愣~~ 收到啦 ~~


其他

還有一個要注意的點就是,因為這個帳號是我為了寫文章特地辦的,可能比較新吧
不然我用我舊有的帳號去做的時候,program 在登入我的 email 時會失敗
google 他會跳一個 剛剛有未知裝置要登入 blabla 之類的,然後他顯示在法國 … (意外收穫 UVa 總機在法國?!)
這個時候記得就要選是你本人,然後就一直試,也可以把 低安全性應用程式存取權 關掉試著 submit 一次
然後再打開 submit 一次,我那時候就是這樣用好的XD

然後你也可以試試其他不會這麼 安全 的 emaiil,可能 yahoo 等等
那要記得 py 檔裡面的 smtp_serversmtp_port 要記得更改
可以去找一下該 email 的 smpt 如何設定

最後最後
所以本人只有教學,不負任何責任,請自行拿捏,低調服用

0%