Java
Ruby
Python
C#
C言語

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

More than 1 year has passed since last update.

問題
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の多次元配列で最初の要素を加工して返したい
(tap/break等について)
http://qiita.com/cielavenir/items/3f209351b924e2615f5e

右手法によるシミュレーションを既存コードのコピペで終わらせた私のために、追加問題が出題された。

勿論シミュレーションでは追加問題は解けそうにない。

そこで、規則性を見つけて使うことが必要になる。

しかし、注意してコードを書かないと、細かいところでバグが混入することがある。

具体的には、先端の+1と終端の-1である。

私は後者には気づいたが、時間内に前者には気づけなかった。

チョコレートバーさんに撃墜していただきました。ありがとうございます。


hena28_fast.py

#!/usr/bin/env python

#http://qiita.com/Nabetani/items/23ebddb44f0234e7fb15
#http://nabetani.sakura.ne.jp/hena/ord28spirwa/

dir='ESWN'
if __name__=='__main__':
import sys,itertools
if sys.version_info[0]>=3: raw_input=input
try:
while True:
line=raw_input().rstrip().split(':')
n,e,s,w=[int(e) for e in line[0].split(',')]
l=[e,s,w,n]
days=int(line[1])+1
for i in itertools.count(0):
for j,e in enumerate([l[i%4]+(i%4==0),(i//4+1)*2,l[i%4]-(i%4==3)]):
if days-e<0:
print(dir[(i+j)%4])
break
days-=e
else:
continue
break
sys.stdout.flush()
except EOFError:
pass



hena28_fast.rb

#!/usr/bin/env ruby

#http://qiita.com/Nabetani/items/23ebddb44f0234e7fb15
#http://nabetani.sakura.ne.jp/hena/ord28spirwa/

dir='ESWN'
if __FILE__==$0
while gets
line=$_.chomp.split(':')
n,e,s,w=line[0].split(',').map(&:to_i)
l=[e,s,w,n]
days=line[1].to_i+1
(0..1/0.0).each{|i|
break unless [
l[i%4]+(i%4==0 ? 1 : 0),
(i/4+1)*2,
l[i%4]-(i%4==3 ? 1 : 0),
].each_with_index{|e,j|
if days-e<0
puts dir[(i+j)%4]
break
end
days-=e
}
}
STDOUT.flush
end
end



hena28_fast.c

// http://qiita.com/Nabetani/items/23ebddb44f0234e7fb15

// http://nabetani.sakura.ne.jp/hena/ord28spirwa/

#include <stdio.h>

int main(){
const char* dir="ESWN";
int n,e,s,w;
long long days;
for(;~scanf("%d,%d,%d,%d:%lld",&n,&e,&s,&w,&days);){
days+=1;
int l[]={e,s,w,n},i=0,j,f=1;
for(;f;i++){
int x[]={l[i%4]+(i%4==0),(i/4+1)*2,l[i%4]-(i%4==3)};
for(j=0;j<3;j++){
if(days-x[j]<0){
printf("%c\n",dir[(i+j)%4]);
f=0;
break;
}
days-=x[j];
}
}
fflush(stdout);
}
}



hena28_fast.cs

// http://qiita.com/Nabetani/items/23ebddb44f0234e7fb15

// http://nabetani.sakura.ne.jp/hena/ord28spirwa/

using System;
using System.Runtime.InteropServices;

class Hena28{
[DllImport("c", CallingConvention = CallingConvention.Cdecl)]
private static extern int scanf(string format, out int a, out int b, out int c, out int d, out long e);

static void Main(){
string dir="ESWN";
int n,e,s,w;
long days;
for(;scanf("%d,%d,%d,%d:%lld",out n,out e,out s,out w,out days)==5;){
days+=1;
int[] l=new int[]{e,s,w,n};
int f=1;
for(int i=0;f!=0;i++){
int[] x=new int[]{l[i%4]+(i%4==0 ? 1 : 0),(i/4+1)*2,l[i%4]-(i%4==3 ? 1 : 0)};
for(int j=0;j<3;j++){
if(days-x[j]<0){
Console.WriteLine(dir[(i+j)%4]);
f=0;
break;
}
days-=x[j];
}
}
Console.Out.Flush();
}
}
}



hena28_fast.java

// http://qiita.com/Nabetani/items/23ebddb44f0234e7fb15

// http://nabetani.sakura.ne.jp/hena/ord28spirwa/

import java.util.Scanner;
import java.util.regex.*;

class Main{
public static void main(String[]args){
Scanner cin=new Scanner(System.in);
String dir="ESWN";
for(;cin.hasNext();){
cin.findInLine("(\\d+),(\\d+),(\\d+),(\\d+):(\\d+)");
MatchResult match=cin.match();
cin.nextLine();
int[] l=new int[]{Integer.parseInt(match.group(2)),Integer.parseInt(match.group(3)),Integer.parseInt(match.group(4)),Integer.parseInt(match.group(1))};
long days=Long.parseLong(match.group(5))+1;
int i=0,j,f=1;
for(;f!=0;i++){
int[] x=new int[]{l[i%4]+(i%4==0 ? 1 : 0),(i/4+1)*2,l[i%4]-(i%4==3 ? 1 : 0)};
for(j=0;j<3;j++){
if(days-x[j]<0){
System.out.println(dir.charAt((i+j)%4));
f=0;
break;
}
days-=x[j];
}
}
System.out.flush();
}
}
}