Project Euler in XSLT


1 つの言語で解くよりいろんな言語で解いたほうが楽しそうということで Haskell 以外の言語でも解いてみることにしました。とりあえず XSLT で Haskell に追いつこうと頑張ります。ちなみに Haskell の方は現時点で 16 問目までできています。

XSLT のバージョンですが,さすがに 1.0 だと sequence が使えなくて面倒なので 2.0 を使用します。処理系には SAXON をしています。

ということで第 5 問までの回答です。名前空間の接頭辞は適当に補完してください。

Problem 1


	
	
	
		
			
				
					
						
						
					
				
				
					
						
						
					
				
			
		
		
			
		
	

Haskell だと 1 行でしたが XSLT だとごらんの有様です。

Problem 2

まずはフィボナッチ数列を生成する関数の定義です。


	
	
	
	
		
			
		
		
			
		
	

XSLT では配列のインデックスは 1 から始まるのでその流儀に従っています。

これを利用して問題を解きます。


	
	
	
	
		
			
				
					
						
						
					
				
				
					
						
						
					
				
			
		
		
			
		
	

Problem 3

素因数分解関数を作成します。 Haskell 版と違って素数配列は使わずに単純に分解しています。


	
	



	
	
	
	
		
			
		
		
			
		
		
			
		
	

これさえ書ければ本文は簡潔に解けます。


	

Problem 4

桁を分解する関数です。


	
	



	
	
	
		
			
		
		
			
		
	

floor で小数点以下を切り捨てているのが気持ち悪いのですが他に方法が見当たらないのでこうしています。


	
		
	
	



	
		
			
			
				
				
				
					
						
					
				
				
					
				
			
		
	
	



	
	
	
		
			
		
		
			
		
		
			
				
					
						
					
				
				
					
				
			
		
	

これがもし XSLT 1.0 だとしたら…。

Problem 5

2 数 , とその最大公約数 と最小公倍数 の間には以下の関係が成立します。

最大公約数 はユークリッドの互除法で求めることができるので,最小公倍数は で割ってやれば求められます。


	
	
	
		
			
		
		
			
		
	



	
	
	

あとはこれを再帰で回すだけです。


	
	
	
		
			
		
		
			
				
				
			
		
	

Haskell より大分長くなりましたが基本的な方針は一緒です。案外 XSLT でもいけるもんですね。