異星の電光掲示板


|問題|http://nabetani.sakura.ne.jp/hena/ord15elebubo/|
|:--|:--|
|Ruby/C++/Python/C|http://qiita.com/cielavenir/items/3d147bdeebcadcb4e3d9|
|Ruby(Golf,鍋谷さんのアルゴリズム復習)|http://qiita.com/cielavenir/items/732a3140efe3db571480|
|Swift|http://qiita.com/cielavenir/items/600e264d39c402b244c1

採点プログラムVer2を更新しました.
https://github.com/cielavenir/procon/commit/532bb24e1f91d44d0d2a41a2846368c578e9eef8

Ruby/C++/Python/C版を用意しました.
Pythonは2.7/3.3の両方で動作します.

[追記1]

* Pythonの入力を少しまともにしました.
* そのC++の記法ならCでも動くのではと指摘が有ったのでCを追加しました.

```rb:hena15.rb
#!/usr/bin/env ruby
#http://qiita.com/Nabetani/items/cba03c96d1ea55f6e861
#http://nabetani.sakura.ne.jp/hena/ord15elebubo/

STDOUT.sync=true
while gets
	s=''
	a=$_.chomp.split('/').map{|e|('%032b'%e.to_i(16)).chars.map{|f|f=='1'}}
	raise if a[0].size!=32||a[1].size!=32
	i=0
	while i<a[0].size
		if !a[0][i]&&!a[1][i]
			i+=1
		elsif a[0][i]&&a[1][i]
			if a[0][i+1]
				if a[0][i+2]
					s+='N'
					i+=3
				else
					s+='R'
					i+=2
				end
			elsif a[1][i+1]
				if a[1][i+2]
					s+='U'
					i+=3
				else
					s+='L'
					i+=2
				end
			end
		elsif a[0][i]
			if a[0][i+2]
				s+='T'
				i+=3
			else #if a[1][i+2]
				s+='Z'
				i+=3
			end
		else
			if a[0][i+2]
				s+='S'
				i+=3
			else
				s+='J'
				i+=2
			end
		end
	end
	puts s
end
```

```cpp:hena15.cpp
//http://qiita.com/Nabetani/items/cba03c96d1ea55f6e861
//http://nabetani.sakura.ne.jp/hena/ord15elebubo/
#include <iostream>
#include <string>
#include <vector>
using namespace std;

vector<unsigned int> split_int(string &str, const char *delim){
	vector<unsigned int> result;
	int cutAt;
	while( (cutAt = str.find_first_of(delim)) != str.npos ){
		if(cutAt > 0){
			result.push_back(strtoul(str.substr(0, cutAt).c_str(),NULL,16));
		}
		str = str.substr(cutAt + 1);
	}
	if(str.length() > 0){
		result.push_back(strtoul(str.c_str(),NULL,16));
	}
	return result;
}
int main(){
	string line;
	int i,j;
	for(;getline(cin,line);){
		string s;
		vector<unsigned int>v=split_int(line,"/");
		vector<vector<int> >a(2);
		for(i=0;i<2;i++){
			a[i].resize(34);
			for(j=0;j<32;j++)a[i][j]=(v[i]>>(31-j))&1;
		}
		for(i=0;i<32;){
			if(!a[0][i]&&!a[1][i]){
				i++;
			}else if(a[0][i]&&a[1][i]){
				if(a[0][i+1]){
					if(a[0][i+2]){
						s+='N';
						i+=3;
					}else{
						s+='R';
						i+=2;
					}
				}else if(a[1][i+1]){
					if(a[1][i+2]){
						s+='U';
						i+=3;
					}else{
						s+='L';
						i+=2;
					}
				}
			}else if(a[0][i]){
				if(a[0][i+2]){
					s+='T';
					i+=3;
				}else{ //if a[1][i+2]
					s+='Z';
					i+=3;
				}
			}else{
				if(a[0][i+2]){
					s+='S';
					i+=3;
				}else{
					s+='J';
					i+=2;
				}
			}
		}
		cout<<s<<endl;
	}
}
```

```py:hena15.py
#!/usr/bin/env python
#http://qiita.com/Nabetani/items/cba03c96d1ea55f6e861
#http://nabetani.sakura.ne.jp/hena/ord15elebubo/
import sys
if sys.version_info[0]>=3: raw_input=input

def solve(s):
	v=[int(x,16) for x in s.split('/')]
	a=[ [((v[i]>>(31-j))&1)>0 for j in range(32)]+[False]*2 for i in range(2) ]
	s=''
	i=0
	while i<32:
		if not a[0][i] and not a[1][i]:
			i+=1
		elif a[0][i] and a[1][i]:
			if a[0][i+1]:
				if a[0][i+2]:
					s+='N'
					i+=3
				else:
					s+='R'
					i+=2
			elif a[1][i+1]:
				if a[1][i+2]:
					s+='U'
					i+=3
				else:
					s+='L'
					i+=2
		elif a[0][i]:
			if a[0][i+2]:
				s+='T'
				i+=3
			else:
				s+='Z'
				i+=3
		else:
			if a[0][i+2]:
				s+='S'
				i+=3
			else:
				s+='J'
				i+=2
	print(s)
	sys.stdout.flush()

try:
	while True:
		s=raw_input()
		solve(s)
except EOFError:
	pass
```

```c:hena15.c
//http://qiita.com/Nabetani/items/cba03c96d1ea55f6e861
//http://nabetani.sakura.ne.jp/hena/ord15elebubo/
#include <stdio.h>
unsigned int v[2];
int a[2][34];
int main(){
	int i,j;
	for(;~scanf("%08x/%08x",v,v+1);){
		for(i=0;i<2;i++){
			for(j=0;j<32;j++)a[i][j]=(v[i]>>(31-j))&1;
		}
		for(i=0;i<32;){
			if(!a[0][i]&&!a[1][i]){
				i++;
			}else if(a[0][i]&&a[1][i]){
				if(a[0][i+1]){
					if(a[0][i+2]){
						putchar('N');
						i+=3;
					}else{
						putchar('R');
						i+=2;
					}
				}else if(a[1][i+1]){
					if(a[1][i+2]){
						putchar('U');
						i+=3;
					}else{
						putchar('L');
						i+=2;
					}
				}
			}else if(a[0][i]){
				if(a[0][i+2]){
					putchar('T');
					i+=3;
				}else{ //if a[1][i+2]
					putchar('Z');
					i+=3;
				}
			}else{
				if(a[0][i+2]){
					putchar('S');
					i+=3;
				}else{
					putchar('J');
					i+=2;
				}
			}
		}
		puts("");fflush(stdout);
	}
}
```