問題 | 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();
}
}
}