十字の壁がそそり立つ世界の中を君は螺旋状に歩く (規則性、VB/F#/Perl)


|問題|http://nabetani.sakura.ne.jp/hena/ord28spirwa/|
|:--|:--|
|シミュレーション (Python/Ruby/C++)|http://qiita.com/cielavenir/items/8c77a158136bd668a27b|
|規則性 (Python/Ruby/C/C#/Java)|http://qiita.com/cielavenir/items/a285b0cea4a26ff886b8|
|規則性 (D/Go/Swift/PHP/ **Vala** )|http://qiita.com/cielavenir/items/edb1daff9ea861a418ec|
|規則性 (VB/F#/Perl)|http://qiita.com/cielavenir/items/0c84af4049ab161f82c1|
|規則性 (PowerShell)|http://qiita.com/cielavenir/items/d9ef9f12068e99e888f2|
|規則性 ( **AIR-lang** )|http://qiita.com/cielavenir/items/d804f61412fb4f07ba06|
|規則性 (Crystal/Perl6)|http://qiita.com/cielavenir/items/13896a662b05da8b77a2|
|Rubyの多次元配列で最初の要素を加工して返したい<br>(tap/break等について)|http://qiita.com/cielavenir/items/3f209351b924e2615f5e|

縁起の悪い13言語になってしまいましたが、C++も合わせて14言語ということにしておいて下さい(未定)。
Perlはマッチ展開を初めて使いました。

```vbnet:hena28_fast.vb
' http://qiita.com/Nabetani/items/23ebddb44f0234e7fb15
' http://nabetani.sakura.ne.jp/hena/ord28spirwa/

imports System
imports System.Runtime.InteropServices

module Hena28
	<DllImport("c", CallingConvention := CallingConvention.Cdecl)>
	overloads shared function scanf(format as string, byref a as integer, byref b as integer, byref c as integer, byref d as integer, byref e as long) as integer
	end function

	sub Main()
		dim dir as string="ESWN"
		dim n,e,s,w as integer
		dim days as long
		while scanf("%d,%d,%d,%d:%lld",n,e,s,w,days)=5
			days+=1
			dim l as integer()=new integer(){e,s,w,n}
			dim f as boolean=true
			dim i as integer=0
			while f
				dim x as integer()=new integer(){l(i mod 4)+iif(i mod 4=0,1,0),(i\4+1)*2,l(i mod 4)-iif(i mod 4=3,1,0)}
				for j as integer=0 to 2
					if days-x(j)<0
						Console.WriteLine(dir((i+j) mod 4))
						f=false
						exit for
					end if
					days-=x(j)
				next
				i+=1
			end while
			Console.Out.Flush()
		end while
	end sub
end module
```

```fsharp:hena28_fast.fs
// http://qiita.com/Nabetani/items/23ebddb44f0234e7fb15
// http://nabetani.sakura.ne.jp/hena/ord28spirwa/

open System
open System.Runtime.InteropServices

module libc =
 [<DllImport("c", CallingConvention = CallingConvention.Cdecl)>]
 extern int scanf(string format, int& a, int& b, int& c, int& d, int64& e)

let dir="ESWN"
let mutable n=0
let mutable e=0
let mutable s=0
let mutable w=0
let mutable days:int64=0L
while libc.scanf("%d,%d,%d,%d:%lld",&n,&e,&s,&w,&days)=5 do
 days<-days+1L
 let l:int array=[|e;s;w;n|]
 let mutable f=true
 let mutable i=0
 while f do
  let x:int array=[|l.[i%4]+(if i%4=0 then 1 else 0);(i/4+1)*2;l.[i%4]-(if i%4=3 then 1 else 0)|]
  let mutable j=0
  while j<3 && days-int64(x.[j])>=0L do
   days<-days-int64(x.[j])
   j<-j+1
  if j<3 then
   Console.WriteLine(dir.[(i+j)%4])
   f<-false
  i<-i+1
 Console.Out.Flush()
```

```pl:hena28_fast.pl
#!/usr/bin/perl
# http://qiita.com/Nabetani/items/23ebddb44f0234e7fb15
# http://nabetani.sakura.ne.jp/hena/ord28spirwa/

use strict;
use warnings;
use feature 'say';
use IO::Handle;
STDOUT->autoflush(1);

my $dir="ESWN";
while(<>){
	my($n,$e,$s,$w,$days)=$_=~/^(\d+),(\d+),(\d+),(\d+):(\d+)$/;
	$days+=1;
	my @l=($e,$s,$w,$n);
	my $f=1;
	for(my $i=0;$f;$i++){
		my @x=($l[$i%4]+($i%4==0),($i/4<<1)+2,$l[$i%4]-($i%4==3));
		for(my $j=0;$j<3;$j++){
			if($days-$x[$j]<0){
				say substr($dir,($i+$j)%4,1);
				$f=0;
				last;
			}
			$days-=$x[$j];
		}
	}
}
```