LIOJ 標準輸入 & 輸出 懶人包

先參考 LidemyOJ (LIOJ) 首頁 ⇒ Home ⇒ 關於 OJ 的輸入與輸出

你會看到 Huli 老師的影片教學 & 模板 :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
var readline = require('readline');
var rl = readline.createInterface({
input: process.stdin
});

var lines = []

// 讀取到一行,先把這一行加進去 lines 陣列,最後再一起處理
rl.on('line', function (line) {
lines.push(line)
});

// 輸入結束,開始針對 lines 做處理
rl.on('close', function() {
solve(lines)
})

// 上面都不用管,只需要完成這個 function 就好,可以透過 lines[i] 拿取內容
function solve(lines) {

}

如何開始

有看到最後一行註解嗎🤣

上面都不用管,只需要完成這個 function 就好,可以透過 lines[i] 拿取內容

對,都不用管就對了

  1. 開一個資料夾 ( 這沒問題吧,用 CLI mk dir 也可以 )
  2. 然後再資料夾裡面點 右鍵 ⇒ Git Bash Here ( 就是在這個路徑開 Git Bash ),如下圖 :
  3. 再來使用 touch 創建兩個檔案 code.js ( 寫 code 用的 ) & input.txt ( 放輸入的存文字檔 )
  4. 把模板貼到 code.js ( 我使用 VS code ) 裡,如下圖 :

    注意 : lines 是一個 Array、裡面的元素是 String
  5. 把題目的輸入貼到 input.txt 裡 ( 以 LIOJ 1001 為例 ),如下圖 :

先看看 lines 是甚麼東東吧

  1. 先在模板裡加一行 conole.log(lines) ,如上圖的第 4 點,// debug 用 那邊,如果還不熟悉,就每一題都先加 conole.log(lines)
  2. 先再 git bash 輸入 bash ,之後才可以執行後面的命令,不要管為什麼
  3. 再來輸入 cat input.txt | node code.js ,使用 node 執行 code.js 檔 ( 這就是標準輸入的動作 ),如下圖 :

    原來這 94 lines
  4. 再來就是怎麼處理 lines 的問題啦
  5. 例如 : 可以用 let arr = lines[0].split(‘ ‘),注意要使用 lines[0] 喔,不能直接用 lines ,因為要記得 lines 是一個 Array
  6. 要使用就是 arr[0] ⇒ 1 ;arr[1] ⇒ 2 ,注意 : 此時的1, 2 ,其實是 String 型別喔
  7. 如果要使用 Number 型別,可以使用 Number(arr[0])

享受解題的樂趣吧

  1. 在本地解完 ( 跟題目的範例輸出一樣 ) 就可以丟到 LIOJ 上看看
  2. LIOJ 上也 AC ( accepted ) 後,就可以複製到 homework 了 ( 然後 進入 ESlint 的地獄 )
  3. 如果錯誤,建議 複製一份回本地端修改好 再重複上面兩個步驟,比較不會亂掉,這裡改改、那裏改改,然後就從零開始了 ( 就是我 )

這邊就不贅述,自己試試看囉,有問題不好意思問發問,
也可以 PM 我 👇

同場加映 : 我常用的處理 lines 的方法

  • 如果 input 是一行,但是很長 :

input.txt

1
1 1 2 3 5 8 13

code.js

1
2
3
4
5
6
function solve(lines) {
// 使用 split(' ') 注意要加空白喔 ' ',還是要看輸入的間隔而定,大多是空白間隔
let arr = lines[0].split(' ')
console.log(arr)
}
// ['1', '1', '2', '3', '5', '8', '13']
  • 如果 input 是一列,但是很多行 :

input.txt

1
2
3
4
5
6
7
0
0
2
4
8
16
32

code.js

1
2
3
4
5
6
7
8
9
function solve(lines) {
let arr = []
// 例如 : 前面的兩個 `0` 不要,就可以從 i = 2 開始跑
for (let i = 2; i < lines.length; i++) {
arr.push(lines[i])
}
console.log(arr)
}
// ['2', '4', '8', '16', '32']
  • 如果 input 很多列也很多行 :

input.txt

1
2
3
1 2 3
4 5 6
7 8 9

code.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function solve(lines) {
let arr = []
// 這個比較複雜一點,可以想一下,但其實就是上面兩種加起來XD
for (let i = 0; i < lines.length; i++) {
arr.push(lines[i].split(' '))
}
console.log(arr)
}
// [
// ['1', '2', '3']
// ['4', '5', '6']
// ['7', '8', '9']
// ]

// 這時候 arr 是一個二為陣列
// console.log(arr[0][0]) => 1
// 如果我要取得 5 這個數字
// 使用 console.log(arr[1][1]) 吧