のんびりしているエンジニアの日記

ソフトウェアなどのエンジニア的な何かを書きます。

【ネタ】アッカーマン関数によるプログラミング言語最速決定戦?

皆さんこんにちは
おげんきですか?私はげんきです。

本日は最速決定戦やります。いやはやC++がはええええとかいいつつ
他の言語どうだっけなんて思う常日頃です。

エントリー

6つの言語で行いました
C++,Java,PHP,Python,Ruby,Javascript

種目

アッカーマン関数の計算
x = 3, y = 9 (以下を参照ください)
計測方法はtimeコマンドを用いた実行方法です。

※アッカーマン関数とは
{ \displaystyle
\begin{eqnarray*}
 &Ack&(0, y) = y + 1 \\
 &Ack&(x+1, 0) = Ack(x, 1) \\
 &Ack&(x + 1, y + 1) = Ack(x, Ack(x+1, y))
\end{eqnarray*}
}

で構成される再帰的な関数です。

判定方法

timeで計測しました。

ソースコード

C++

#include <iostream>
using namespace std;

int ack(int m,int n){
	if(m == 0) return n + 1;
	else if(n == 0) return ack(m-1,1);
	else return ack(m-1,ack(m,n-1));
}

int main(void){
	int a = ack(3,9);
	cout << a << endl;
}

Java

class Ack{
	private int ack(int m,int n){
		if(m == 0) return n + 1;
		else if(n == 0) return ack(m-1,1);
		else return ack(m-1,ack(m,n-1));
	}
	public static void main(String args[]){
		Ack ack = new Ack();
		System.out.println(ack.ack(3,9));
	}
}

PHP

<?php
function ack($m,$n){
	if($m == 0){
		return $n + 1;
	}else if($n == 0){
		return ack($m-1,1);
	}else{
		return ack($m-1,ack($m,$n-1));
	}
}

echo ack(3,9);
?>

Python

import sys

def ack(m,n):
	if m == 0:
		return n + 1
	elif n == 0:
		return ack(m-1,1)
	else:
		return ack(m-1,ack(m,n-1))

if __name__ == '__main__':
	sys.setrecursionlimit(10000)
	print ack(3,9)

Ruby

def ack(m,n)
	if m == 0 then
		return n + 1
	elsif n == 0 then
		return ack(m-1,1)
	else
		return ack(m-1,ack(m,n-1))
	end
end

puts ack(3,9)

Javascript

function ack(m,n){
	if(m == 0) return n + 1;
	else if(n == 0) return ack(m-1,1);
	else return ack(m-1,ack(m,n-1));
}

console.log(ack(3,9));

結果

言語 user sys total
C++ 0.01 0.00 0.01
Java 0.12 0.02 0.14
Php 1.67 0.12 1.79
Python 2.66 0.14 2.80
Ruby 0.91 0.25 1.22
javascript 0.11 0.01 0.12

感想

最適化したC++はやはり早かった。
Javaもやっぱり早いね、次に来るのがjavascriptというのには少し驚いた。
ウェブで使われに使われまくるだけあってえらく早い、スクリプト言語なのに。

僕の大好きなPythonくんが遅すぎて泣きそう。

Ruby デバッガー binding.pry

皆さんこんにちは
お元気ですか。かきぴーって辛いですね。

さて、今日はRubyデバッグツールpryこと
binding.pry先生です。実行する時にデバッグモードへと変身を遂げます。

インストール

gem install pry

使い方

require "pry"

def add_method(a,b)
	return a + b
end

a = 100 + 20
b = 30 + 20
c = a / b
d = a * b

binding.pry

puts a ** b

これを実行すると以下のようになります。

From: /Users/Tereka/Programing/TestCode/Ruby/test_pry.rb @ line 12 :

     7: a = 100 + 20
     8: b = 30 + 20
     9: c = a / b
    10: d = a * b
    11: 
 => 12: binding.pry
    13: 
    14: puts a ** b

[1] pry(main)> 

さて、このpry(main)>に続くところにコマンドを打ち込んでいくわけです。

わからなくなればhelpと打てばおkです。

まずは変数の確認、変数は変数を打ち込むと実行できます。また、内部で計算もできます。

[1] pry(main)> a
=> 120
[2] pry(main)> a * b
=> 6000

現在のスコープから確認できるメソッドと変数

[5] pry(main)> ls
_  __  _dir_  _ex_  _file_  _in_  _out_  _pry_  a  b  c  d

メソッド探し

[1] pry(main)> find-method add_method
Object
Object#add_method

今回打ったメソッドの一覧

[3] pry(main)> hist
1: find-method add_method
2: help

メソッドを確認したい時

[4] pry(main)> show-source add_method

From: test_pry.rb @ line 3:
Owner: Object
Visibility: private
Number of lines: 3

def add_method(a,b)
	return a + b
end

これぐらいあれば十分でしょうか・・・?
自分も人に教えてもらってとても作業が効率化したので、みなさんもよければ使ってください。

Rubyの環境設定(rbenv,ruby)

皆さんこんにちは
お元気ですか。私は元気です。

さて、珍しくRubyについて

Rubyといえば、私は使い道一つしか思い浮かびません。
そう、RoRことRuby on railsです。

そんな、Rubyの設定をしてみましょう

rbenv

rbenvって?

Rubyのバージョンの切り替えに使います。開発チームによってはバージョンを古いまま或いは新しくすることがあるらしいので、容易に切り替えられるよう、rbenvを入れることをお薦めします。

install

brew install rbenv
echo 'if which rbenv > /dev/null; then eval "$(rbenv init -)"; fi' >> ~/.bash_profile
brew install ruby-build
brew install rbenv-gemset
brew install rbenv-gem-rehash

これで、インストールは終了です。

rbenvの使い方(Rubyのインストール)

rbenv --version
rbenv --list
rbenv install 2.0.0-p247
rbenv global 2.0.0-p247

好きなバージョンのインストールを行ってください。

Ruby

gem install bundler
gem install rails

パッケージはgemを利用してインストールすることができます。