0%

Link

https://zerojudge.tw/ShowProblem?problemid=c294

Code


#include <bits/stdc++.h>
using namespace std;

int main() {
    int x[3];
    for(int i=0;i<3;i++)cin >> x[i];
    sort(x,x+3);

    for(int i=0;i<3;i++){
        cout << x[i] << " \n"[i==2];
    }
    if(x[0]+x[1] <= x[2]) {
        cout << "No" << endl;
    } else if(x[0]*x[0] + x[1]*x[1] < x[2]*x[2]){
        cout << "Obtuse" << endl;
    }else if(x[0]*x[0] + x[1]*x[1] == x[2]*x[2]){
        cout << "Right" << endl;
    }else if(x[0]*x[0] + x[1]*x[1] > x[2]*x[2]){
        cout << "Acute" << endl;
    }
    return 0;
}

待補

題解

這題跟留社考時的翻轉螢幕很像
要把陣列轉啊轉,原本要使用 vector 卻不熟 vector的二維陣列
後來回來用了陣列。

其實這題比較難的地方在於陣列其中的關係,只要找到以後寫成兩個function,再依照順序呼叫即可。
陣列的N,M要注意一下旋轉時要交換。

Hack

  • 行尾不空白 特別的寫法 @chyyen

    for(int i=0;i<n;i++)
        for(int j=0;j<m;j++)
            cout << a[i][j] << " \n"[j==m-1];
  • 神奇的Vector寫法 @chyyen

    vector<vector<int>> a(n, vector<int>(m));
        for(auto &i:a)
            for(auto &j:i)
                cin >> j; 

    心得

  • 要記得把題目看好,他要回推,不是照著解

  • 不要害怕會超時或有太多顧慮,寫就對了

  • 心平氣和地把輸入輸出寫出來,推出其中的關係(在多維陣列轉換時尤其重要)

Code

#include <bits/stdc++.h>
using namespace std;

int A[100][100];
int B[100][100];
int N,M;

void flip(){
    for(int i=0;i<N;i++)
        for(int j=0;j<M;j++)
            B[i][j] = A[i][j];

    for(int i=0;i<N;i++){
        for(int j=0;j<M;j++){
            A[i][j] = B[N-i-1][j];
        }
    }
}

void rotate(){
    for(int i=0;i<N;i++)
        for(int j=0;j<M;j++)
            B[i][j] = A[i][j];

    for(int i=0;i<M;i++){
        for(int j=0;j<N;j++) {
            A[i][j] = B[j][M-i-1];
        }
    }
}

int main() {

    int K;
    while(cin >> N >> M >> K){
        for(int i=0;i<N;i++){
            for(int j=0;j<M;j++){
                cin >> A[i][j];
            }
        }

        vector<int >op;

        for(int i=0;i<K;i++) {
            int k;
            cin >> k;
            op.emplace_back(k);
        }
        reverse(op.begin(), op.end());
        for(auto k : op){
            if(k==0){
                rotate();
                swap(N, M);
            }else{
                flip();
            }

            // *************** //
            /*cout << "**************" << endl;
            cout << N << " " << M << endl;

            for(int m=0;m<N;m++){
                for(int n=0;n<M;n++){
                    cout << A[m][n] << (n==M-1?"":" ");
                }
                cout << endl;
            }*/
            // *************** //
        }

        cout << N << " " << M << endl;

        for(int i=0;i<N;i++){
            for(int j=0;j<M;j++){
                cout << A[i][j] << (j==M-1?"":" ");
            }
            cout << endl;
        }

    }



    return 0;
}

APCS 歷屆考古題

☐ (☐) for [ ] and ☑

日期 題目 考點 題解 狀態
201603 pA 成績指標 迴圈、陣列 x
201603 pB 矩陣轉換 迴圈、二維陣列、輸出 x
201610 pA 三角形辨別 條件判斷 x
201610 pB 最大和 迴圈、思考 x
202101 pB 流量計算 迴圈、思考 x

緣起

在AIS3期末專題的時候我在我們這組中的報告做了一個小小的加解密程式
還蠻神奇的,兩天內就把程式+網站都做出來了

Ethical Hacking, 任何惡意攻擊行為皆是非法的

介紹

  我們大部分的時間都在討論病毒,剛好我們這組測試到的是一隻勒索病毒,我就想到說:如果勒索病毒的金鑰是透過網路傳遞出去,那在中間不就可以攔截了嗎?

  雖然我們沒有實際做過這個測試,但我們反其道而行,或許透過另一種方式可以讓金鑰傳輸過程更好,解決被盜取金鑰的困擾。

  著手實行後,我們先規劃了一下整個軟體的流程,原本的程式是藉由產生隨機的AES金鑰進行加密,但這個隨機的金鑰仍有可能被攔截,因此我想出了一個好辦法:RSA,我們將RSA的Public Key儲存於客戶端,並將Private Key 收好在Server端,如此一來客戶端在傳送AES金鑰前,必須先透過Public Key 加密,這樣即使受到攔截也無法將原本的資料取出,接下來透過Private Key解出 原本的金鑰儲存在 Server中,當使用者要拿取的時候就只需要提供UUID就能拿回解密檔。

  這個工具的主要目的是為了讓企業傳輸檔案更安全,可以傳輸加密過後的檔案給對方,再讓對方透過解密金鑰安全的把它解開來,不過這種工具,一旦被駭客拿來利用,三兩下就可以製作出一個十分厲害的勒索軟體,可見得製作這些Maleware的成本也不高,不論是時間成本也好,還是技術難度上,真的不會說要有多強大的技術或砸多少時間進去才做得出來,因此我們認為在惡意軟體製作如此容易的情況下,網路攻擊的頻率顯然是會持續上升啦

連結

Project Github 心情好就幫忙 Star 一下吧

緣起

  剛知道有SSH Tunnel這個東西,頓時就興奮了,以往在用VPN的時候,其實大都是為了穿透防火牆進到內網,使用或維護內網的Service,很少會為了使用VPN的外網ip而用(有啦,當要下載學術論文的時候)
SSH Tunnel真的是一個好東西,保證用了就可以將VPN丟在一旁了

教學

若要使用SSH Tunnel,我的做法是在 ~/.ssh/config 加入一小段程式
以我們社部的其中一台電腦為例,我要在本機連到他的RDP,就可以加入下面這樣:

Host RDP
        HostName  <ip>
        User <username>
        LocalForward  13390 192.168.4.222:3389

接下來要記得連上那個host喔

ssh <username>@<ip>

其實還有另外一個方法是用SSH的Command

ssh -L localhost:<port>:<remote>:<remote_port> <username>@<ip>

For example:

ssh -L localhost:13390:192.168.4.222:3389 <username>@<ip>

接下來在Remote Desktop Manager 裡面的Host改成 localhost port 改為 13390 就可以連到了
超神奇的吧~

結語

SSH Tunnel 真的很方便,讓我都不用為了使用內網Service連上VPN,讓網速慢到想哭

介紹

Public Alias Name Service
一直以來十分不解為什麼域名需要錢錢,突發起想想到了這個服務
藉由別名蓋掉原始名稱(當然,已註冊的以Internet DNS為主)
然後服務一個免費的註冊系統,藉此達到域名平民化的成果

架構

目前是用.json來儲存所有域名資訊,當然,這個真的十分不切實際,每次搜尋域名都得讀入這麼多資訊的話那根本就是災難
以後可能會架設一個DNS Server就跟現今查詢DNS一樣,不需要額外的程式碼為了配合這個服務
當然,你可能會想說這太理想了,對,這真的太理想化了,這需要大規模的使用才能達到目的,而那些大的瀏覽器廠牌肯定不會這麼做的。
因此我們先從自己做起,自己能操控到的部分就盡量使用,在所有 Hsuan Design 開發的
App ,Cotpear 的 Service,只要與網址有關的,都盡量適配本服務,如果有其他廠商願意配合這個理想,也歡迎找我們聊聊。

內容

目前 dns.json 是存放在學生超前線的公開repo中,等日後有空,再將整個專案搬移到別的Server 上,並製作管理介面。
Github

介紹

「學生超前線」 是面向學生的免費App,目前也沒有打算加上廣告
強大的功能與先進的技術,絕對值得你下載
適用全亞洲的高中生,大陸高考生、台灣學測生,你必備的一款App

設計理念

給身在最前線的學生擁有超前線的視野與能力。

內容介紹

§ 瀏覽器功能

  1. 獨創 「浮動選單」 看網頁遇到不會的單字能立即查詢
  2. 獨創 「短連結」 透過類DNS(與 PANS 完美搭配)的方式,將原本很長的連結轉為較短的連結
    ex: 54.gsat -> https://www.sean.taipei/gsat
  3. 加快、減速,自動偵測網頁中影片,補課最方便
  4. 搜尋任何關鍵字、網址,就跟一般的瀏覽器一樣~
  5. 自動完成功能與Chrome一樣方便,輸入關鍵詞就會推薦
  6. 上一頁、下一頁,瀏覽器基本功能都涵蓋
  7. 歷史紀錄,瀏覽過什麼都幫你記錄
  8. 無痕模式,瀏覽紀錄變不見

§快速連結

整理國內網站,學生查詢最方便
教育網站、升學網站、教育新聞,各種學生需要的連結都在這裡

§超計時

學生超前線製作的計時器讓你讀書能更有效率
讀書時只要打開計時器就會幫你記錄讀書的時間
表格也會顯示你這個月讀了多少書

§倒計時

  1. 倒數計時器,重要日子記起來幫你倒數
  2. 自訂倒數功能,將自己重要的日子記起來
  3. Market Place 讓你可以快速新增別人已經設好倒數的日子

§帳號管理

  1. 基本登入、註冊功能
  2. 邀請連結,可以邀請他人獲得獎勵
  3. 獎勵代幣,應用程式內代幣機制獎勵用戶

§繪圖

  1. 離線繪圖,即使沒有網路也能用

§設定

  1. 客製化背景圖,讓App更加符合你的style
  2. 自定義搜尋引擎,任何搜尋引擎都適用
  3. 小更新版本,透過App即可達成
  4. 一鍵恢復預設值,設定壞了就靠他

§OpenSource

用戶可以參與更新、新增平台資料
在Github上發Pull Request

Downloads

宣傳圖片
Google Play立即下載
Google Play 和 Google Play 標誌均為 Google LLC 的商標。

介紹

tmux是一個時常使用到的工具,透過他可以在背景跑程式。

Tmux

列出所有視窗

tmux ls

進入某個視窗 (attach target)

tmux a -t <id>

進入上個使用的視窗 (attach)

tmux a

在視窗中,切換到下一個 (next)
Ctrl + b , 再按 n

在視窗中,切換到上一個 (previous)
Ctrl + b , 再按 p

在視窗中,切換到特定 (attach)
Ctrl + b , 再按
e.g. Ctrl + b , 再按 3

在視窗中,新增視窗 (create)
Ctrl + b , 再按 c

在視窗中,離開 (detach)
Ctrl + b , 再按 d