無理ゲー実習攻略・Fortran、Perl、Ruby、Javaの裏技
C言語以外全く触れたことのない学生にCのコードをFortran、Perl、Ruby、Javaで再実装させるというマジキチな実習がありました。
どう考えても無理ゲーです、本当にありがとうございました。
無理ゲーな理由はこの表を見ればなんとなく分かっていただけるのではないでしょうか。
C | Fortran | Perl | Ruby | Java | |
関数の定義 | 必要 | 必要 | 不要 | 不要 | 必要 |
繰り返し | for | do~end do | for | for Integer.upto Integer.times |
for |
標準出力に出力 | printf | print write |
puts |
System.out.println System.out.print |
|
べき乗 | pow | ** | ** | ** | Math.pow |
C言語の決まりに縛られてるといくらインターネットでやり方を調べようにも調べられないという難しさ。
ちなみにC言語のソースはこちら
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
#include <stdio.h> #include <math.h> int main(void) { int i, j; for (i = -5; i < 6; i++) { for (j = 0; j < pow(i, 2.); j++) printf(" "); printf("*\n"); } return 0; } |
改行をするかしないかで難易度を地味にあげているのがお分かりでしょうか。
Fortranのprint
やRubyのputs
は自動で改行するので改行なしで出力するには別の関数が必要です。
ちなみに真面目にやるなら
(言語名) hello world
でググってコードをコピペ(言語名) 変数 整数
でググってC同様に変数i
とj
を宣言(言語名) 繰り返し
でググってC同様にループをするコードを書く(言語名) 画面出力
でググってC同様に文字を標準出力に出力するコードを書く- 必要ならばコンパイルして終了
ですね。
これができれば英文のエラーが出てもパニックにならない人なら誰でもできます。
言語ごとの難易度は
Fortran > Ruby > Java > Perl
らしいですが、個人的には
Fortran > Java > Ruby > Perl
ですかね。
JavaはCと構文が似ているけれどクラス定義とか名前空間とかがややこしいはずです。
超簡単な攻略法
そんな無理ゲーですが、実は超簡単な攻略法があります。
それは簡単、Cで書かれたコードを再実装できないならそのまま使えばいいのです。
ね?簡単でしょう?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
program main character :: cmd*500 cmd = "echo ' & #include <stdio.h>\n & #include <math.h>\n & int main(void) & { & int i, j; & for (i = -5; i < 6; i++) { & for (j = 0; j < pow(i, 2.); j++) & printf("" ""); & printf(""*\\n""); & } & return 0; & }' | gcc -xc -lm -o main - && ./main" call system(cmd) end program main |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
my $cmd =<<'EOS'; echo '#include <stdio.h> #include <math.h> int main(void) { int i, j; for (i = -5; i < 6; i++) { for (j = 0; j < pow(i, 2.); j++) printf(" "); printf("*\\n"); } return 0; }' | gcc -xc -lm -o main - && ./main EOS system($cmd); |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
require "open3" code = <<'EOS' #include <stdio.h> #include <math.h> int main(void) { int i, j; for (i = -5; i < 6; i++) { for (j = 0; j < pow(i, 2.); j++) printf(" "); printf("*\n"); } return 0; } EOS print Open3.capture3("gcc -xc -lm -o main - && ./main", :stdin_data=>code).first |
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 28 29 30 31 32 33 34 |
import java.io.*; class Main { public static void main(String args[]) { String[] cmd = { "bash", "-c", "echo '#include <stdio.h>\n" + "#include <math.h>\n" + "int main(void)" + "{" + " int i, j;" + " for (i = -5; i < 6; i++) {" + " for (j = 0; j < pow(i, 2.); j++)" + " printf(\" \");" + " printf(\"*\\n\");" + " }" + " return 0;" + "}' | gcc -xc -lm -o main - && ./main"}; try { ProcessBuilder pbuilder = new ProcessBuilder(cmd); Process process = pbuilder.start(); String line; BufferedReader stdoutReader = new BufferedReader(new InputStreamReader(process.getInputStream())); while ((line = stdoutReader.readLine()) != null) System.out.println(line); stdoutReader.close(); } catch (IOException e) { } } } |
このように外部コマンドを呼び出し、コンパイルして実行するだけ!
なお、普通にやったほうが簡単な模様