LoginSignup
4
4

More than 5 years have passed since last update.

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

Last updated at Posted at 2015-02-08
問題 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();
        }
    }
}
4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4