はじめに
この記事はメモ帳でAtCoderに参加する人を応援するべく作成した記事です。
エディタ使えば良いのに…と思う場合はまだこちら側の人間では無いと思うのでエディタで快適なコーディングをした方が良いでしょう。
なお、この記事ではJavaでのコーディングを想定しています。
事前準備
javaをローカルで実行するにはJDKをインストールする必要があります。以下のサイトにアクセスしてインストールしましょう。
正直、インストーラが全部指示してくれるだろうし細かいことは省略します。
Oracle社製だと環境変数も設定してくれたような気がします。気がするだけなので間違ってたらすみません…。
※よくわからない方は以下のサイトを参照してみると良いかもしれません。
これ以降はJavaをコマンドプロンプト(PowerShell)でコンパイル、実行でき、メモ帳は初期の文字コードであるUTF-8で書いてあるものとします。
※もしUTF-8じゃないなら-encoding UTF-8
の部分を-encoding [文字コード]
にしていただければと思います。なお、ANSIならjavac Main.java
のみでコンパイルできます。
事前準備が出来ているか確認
PowerShellかコマンドプロンプトでjavac -version
、java -version
を打ち込んでちゃんと返ってくるか確認してみてください。
> javac -version
javac 1.8.0_302
上記のように返ってくるはずです。
次に、デスクトップでもどこでも良いんでSample.javaというファイルを作成してください(Sample.java.txtみたいにならないように注意)。
コードはなんでも良いので以下のコードをコピーしていただいても構いません。
class Sample{
public static void main(String[] args){
System.out.println("Hello!");
}
}
あとはPowerShellかコマンドプロンプト上でコードを作成したファイルがあるディレクトリに移動してjavac Sample.java
とjava Sample
を実行してみましょう。「Hello!」と返ってくれば大丈夫です!
クイックコンパイル用バッチファイル
コマンドプロンプトでコンパイルして実行して…ってやるのが煩わしく感じる人もいるでしょう。そんな人は以下のバッチファイルを作ってみてはいかがでしょう。
rem 文字コードはANSI
@echo off
FOR /F "usebackq" %%i IN (`dir /b "*.java"`) DO set Filename=%%i
rem コンパイル実行
javac -encoding UTF-8 %Filename%
java Main
rem 実行出来た?
IF %errorlevel% geq 1 (
echo.
echo 何らかのエラーが発生しました。
)
rem EndSequence
echo.
echo 終了します
pause
exit
このバッチファイルは同ディレクトリ内の名前の順で一番最後のjavaファイルをコンパイル、実行します(クラス名はMain)。したがって、A.javaを作ってACを取った後にB.javaを作ればわざわざA.javaを移動する必要がありません。
※ちなみに、Pythonで行ないたい場合は「FOR~」から「java Main」までの行を消してPython Main.py
とすれば良いですし、C++の場合は「FOR~」の行の「.java」を「.cpp」に、「javac~」をg++ Main.cpp
に、java Main
をa.exe
にすれば実行出来るかと思います。
実際に実行してみましょう。以下のような状態を想定しています。
↓ディレクトリ内
class Main{
public static void main(String[] args){
System.out.println("これはA.javaです!");
}
}
class Main{
public static void main(String[] args){
System.out.println("これはB.javaです!");
}
}
↓バッチファイルを実行してみるとこんな感じになります。
これはB.javaです!
終了します
続行するには何かキーを押してください . . .
java Main
をjava Main < test.txt
にすればtest.txtに入っている情報を標準入力として実行してくれます。まぁまぁ便利です。
テスト用ps1ファイル
テストケースを試したいとき、人為的にコーナーケースを作っても良いが、とりあえず数ケース試せば良いかな、という場合があるでしょう。さすがに答えはわからないですが、ランダムケースを作るだけならPowerShellを用いて作れます。
今回は010 - Factorialを題材にして行ないます。
[String]$problem = Read-Host "どの問題ですか?" #A~Exなどを入力(powerShellに大文字小文字の区別はない)
javac -encoding UTF-8 $($problem+".java") #問題に合ったコードのファイルをコンパイル
"" #見栄え上の改行
New-Item test.txt -Force | Out-Null #テストケース保存用ファイル
#テストケース生成用関数(問題に応じて書き換える必要あり)
function MakeTest{
param([long]$num,[long]$limit)
Write-Host "------以下入力------"
for([long]$i=0;$i-lt$num;$i++){
$n = Get-Random -Maximum $limit -Minimum 1
Write-Output $n
Add-Content test.txt $n
}
Write-Host "--------------------"
}
#今回はNを一つ、1≦N≦20で
MakeTest 1 20
"" #見栄え上の改行
Write-Host "------以下出力------"
cat test.txt | java Main #標準入力にtest.txtを渡して実行
Write-Host "--------------------"
"" #見栄え上の改行
A.javaにACが取れるであろうコードを記述しましょう。
import java.util.Scanner;
class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
long ans = 1;
int N = sc.nextInt();
for(int i=2;i<=N;i++){
ans*=i;
}
System.out.println(ans);
}
}
※Python、C++は上記のバッチファイルと同様に書き換えれば実行出来るかと思います
PowerShellは初期状態だと実行出来ません(実行ポリシーの関係上)。
したがって、バッチファイルから間接的に実行してやりましょう。
@echo off
FOR /F "usebackq" %%i IN (`dir /b "*.ps1"`) DO set Filename=%%i
powershell -ExecutionPolicy Bypass -File "%Filename%"
pause
正直私はバッチファイルのコードをいまいちわかってません。ただ、このコードでは一時的に実行ポリシーを緩くしているだけなので、セキュリティ上は問題ないかと思います。
A.java、PS1用.bat、Test.ps1を同じディレクトリに入れて、Ps1用.batを実行してみると以下のように挙動します。
どの問題ですか?: a↲
------以下入力------
10
--------------------
------以下出力------
3628800
--------------------
続行するには何かキーを押してください . . .
上手く動作してますね。
テストケースの入力値が多い時には見辛くてあまり向いてませんが、AHCの長期コンの時にはこんな感じでテストすると楽なのではないでしょうか。
ちなみに、「a」と打ち込んでるのに大文字表記のA.javaが呼び出されているのは何故?となるかもしれませんが、PowerShellでは大文字小文字を区別していないのでこのような動作になります。もちろん「A」と打ち込んでいただいても大丈夫かと思います。
なお、出力がいっぱいある場合はコマンドプロンプト上で以下のように書いて実行すると良いかもしれません。
java -encoding UTF-8 Main < test.txt > result.txt
こうすることでresult.txtに出力されるので、わざわざAHCのビジュアライザに張り付けるために出力をマウスを使ってコピーして・・・ということはしなくて済みます(result.txtを開いてCtrl+AとCtrl+Cで全部コピーできるので)。
もちろん、< test.txt
の部分を省いて自分でコマンドプロンプト上に入力することでも実行できるので、そこら辺はご自分の楽な方を。
おわりに
少ない紹介になってしまって申し訳ないですが、みなさんのメモ帳コーディングがより良くなることを願っております。