여행 O


26

세계는 5 x 5 개의 셀 배열입니다. 그것은 모든면을 감싸고 있습니다. 그것은 다음과 같이 시각화 될 수 있습니다 ...

XXXXX
XXXXX
XXOXX
XXXXX
XXXXX

당신은 O입니다. 당신은 세계 여행을 좋아하고 다음 규칙에 따라 그렇게합니다 (C를 현재 날짜로하자).

  • 주요한 일, 당신이 그립다. 어제 시작한 곳으로 돌아갑니다.
  • 홀수 일, 당신은 향수병을 느낍니다. 가능하면 수평 계단 하나를 집에 더 가깝게 이동하고, 수직 계단 하나를 집에 더 가깝게 이동하십시오. 친밀감을 결정하기 위해 월드 랩핑을 무시하십시오.
  • 심지어 일, 당신은 모험을 느낀다. C / 2 단계 남쪽으로 이동하십시오.
  • 평방 일, 당신은 모험을 느낀다. 동쪽 벽으로 이동하십시오.
  • 피보나치 일, 세계는 하나의 행에 의해 남쪽으로 확장한다.
  • 삼각형 일, 세계는 하나의 열을 기준으로 동쪽으로 확장합니다.

위의 규칙 중 둘 이상이 동시에 적용되는 경우 나열된 순서대로 적용하십시오. 예를 들어, 이상한 날에는 먼저 어제 시작한 곳으로 돌아가서 한 걸음 더 집으로 이동하십시오.

당신은 (초기) 세계의 중심, 즉 북서쪽 모서리에서 인덱스가없는 위치 (2,2)에 산다. 첫날부터 여행을 시작합니다.

입력

단일 정수 N

산출

노스 웨스트 코너에서 0으로 인덱스 된 N 번째 날의 X 및 Y 좌표는 단일 공백으로 구분됩니다.

설명이있는 테스트 케이스

의 입력이 주어지면 3올바른 출력은 다음과 같습니다.

2 3

한 번에이 작업을 수행 할 수 있습니다. 1 일부터 다음 동작을 적용해야합니다.

  1. 홀수, 사각형, 피보나치 및 삼각형
  2. 프라임, 짝수 및 피보나치
  3. 프라임, 홀수, 피보나치 및 삼각형

시각적 인 형태로 :

     1 일 2 일 3 일
XXXXX XXXXXX XXXXXX XXXXXXX
XXXXX XXXXXX XXXXXX XXXXXXX
XXOXX-> XXXXOX-> XXXXXX-> XXXOXXX
XXXXX XXXXXX XXOXXX XXXXXXX
XXXXX XXXXXX XXXXXX XXXXXXX
           XXXXXX XXXXXX XXXXXXX
                       XXXXXX XXXXXXX
                                   XXXXXXX

추가 테스트 사례

씨의 마틴 있음 Büttner표준 용액 (하시기 바랍니다 주 출력 단 하나, 모든 이들의 좌표해야) :

Input:  1     2     3     4     5     6     7     8     9     10    11    12    13    14     15    16    17    18    19    20    21    22    23
Output: 4 2   2 3   3 2   6 4   2 2   2 5   2 2   2 6   7 5   7 0   6 4   6 0   5 3   5 10   4 9   9 6   3 8   3 6   2 7   2 6   2 5   2 4   2 4

이것은 코드 골프입니다. 최단 제출이 이깁니다.


6
나는 이것을 O로해야합니다!
kirbyfan64sos

답변:


4

Pyth, 157 (156) 153 바이트

=Z=b5aYA,2 2FNtUhQI&!tPN<1NA@Y_2)Iq*2/N2NA,G%+H/N2b)EL-+b<b2<2bAyM,GH)J@N2Iq/NJJA,tZH)=TU2W<hTNIqNeT=hbBE=TX_T1sT))=J0W!<NJIqN/*JhJ2=hZBE=hJ))aY(GH;jd,GH

여기서 시도해 볼 수 있습니다.

이것은 골프에 재미있는 문제였습니다! 나는 여전히 Pyth에 익숙해 져 있지만 정말 훌륭한 언어입니다.


1
Pyth에 오신 것을 환영합니다! 내가 지금 본 골프 하나 : 2 요소 목록 / 튜플을 만들고 싶다면 사용하십시오 ,-그것이 거기에 있습니다.
isaacg

코드 thoughout이 골프의 장소가있다 - (G%+H/N2b), (GH), (tZH).
isaacg

12

하스켈, 394 바이트

z=0<1
p d y c|all((0<).mod d)[2..d-1]=y|z=c
g x=x-signum(x-2)
e d(x,y)h|odd d=(g x,g y)|z=(x,mod(y+div d 2)h)
s d c@(_,y)w|d==(floor$sqrt$fromIntegral d)^2=(w-1,y)|z=c
f d a b m|b>d=m|b==d=(+1)<$>m|z=f d b(a+b)m
d%m@(w,h)|elem d[div(n*n-n)2|n<-[1..d+1]]=(w+1,h)|z=m
i=fst.c
j=snd.c
c d|d<1=((2,2),(5,5))|z=(s d(e d(p d(i$d-2)$i$d-1)$snd$j$d-1)$fst$j$d-1,d%(f d 1 1$j$d-1))
main=readLn>>=print.i

정확하게 최적화 될 수 있으며 정확성을 신속하게 확인한 후 게시 된 것과 다른 결과가 나타납니다.. 시간이 더 있으면 돌아와서 더 철저하게 코드를 확인할 것입니다 ^^

그런데 좋은 문제!

편집 : Zgarb가 제공 한 소중한 조언을 고려하여 솔루션을 편집 했습니다 . 이제 완벽하게 작동합니다!

EDIT2 : nimi 덕분에 코드를 더 작게 만들었습니다. 또한 두 함수 대신 한 함수에서 짝수 및 홀수 검사를 수행하여 전체적으로 카운트를 446 바이트에서 414 바이트로 줄입니다.

EDIT3 : 414 바이트에서 400 바이트로 더욱 향상되었습니다. 감사합니다 nimi 다른 2 바이트, 당신은 불에있어! :)

EDIT4 : 4 개 이상의 바이트 nimi :)


2
PPCG에 오신 것을 환영합니다! 빠른 힌트 몇 : 0<1보다 짧은 otherwise, 그리고 0/=mod x y단축 할 수있다 0<mod x y. 또한, 1==mod(d)2이다 odd d하고 0==mod(d)2있다 even d.
Zgarb

@ Zgarb 좋은 트릭, 나는이 전체 코드 골프 일에 실제로 아주 새로운입니다. 어떻게 0<1대신에 otherwise불구하고 사용할 수 있습니까?
basile-henry

1
또한, 나는 삼각형 숫자의 당신의 정의는 (I 함수에서 그의를 믿고있어 잘못된 생각 t때문에) elem d[1..div(d*d-d)2]모든 사실이다 d > 2.
Zgarb

otherwise에 대한 또 다른 이름입니다 True.
Zgarb

... 당신이 바로 내가 너무 빨리 삼각형 번호를하려고 노력하고 그래, 정말 감사합니다
실레 - 헨리

5

C, 425 396 바이트

typedef struct{int x,y,b,r}c;S,p,n;s(d){return(S=sqrt(d))*S==d;}c m(d){if(!d)return(c){2,2,4,4};c q,l=m(d-1);for(p=1,n=d;--n;p=p*n*n%d);if(p&&d>1)q=m(d-2),l.x=q.x,l.y=q.y;if(d%2)l.x-=l.x>2?1:l.x<2?-1:0,l.y-=l.y>2?1:l.y<2?-1:0;else l.y+=d/2,l.y=l.y>l.b?l.y-l.b-1:l.y;if(s(d))l.x=l.r;if(s(5*d*d+4)||s(5*d*d-4))l.b++;if(s(8*d+1))l.r++;return l;}main(i){scanf("%d",&i);printf("%d %d",m(i).x,m(i).y);}

이것에는 개선 될 수있는 부분이 있지만 테스트 사례에서 작동합니다 .


설명

typedef struct {
    int x,y,b,r
} c; //c will hold the information for each day

//determines if a number is a perfect square
S,p,n;
s(d) {
    return (S=sqrt(d))*S==d;
}

c m(d) {
    if(!d)
        return (c){2,2,4,4}; //returns the initial information if the day is 0

    c q,l=m(d-1); //gets the information for the previous day
    for (p=1,n=d;--n;p=p*n*n%d); //tests if the number is prime

    if (p&&d>1)
        q=m(d-2),l.x=q.x,l.y=q.y; //changes the position to what it was at the end of the day 2 days ago if the day is prime
    if (d%2)
        l.x-=l.x>2?1:l.x<2?-1:0,l.y-=l.y>2?1:l.y<2?-1:0; //moves the position towards (2,2) if the day is odd
    else
        l.y+=d/2,l.y=l.y>l.b?l.y-l.b-1:l.y; //moves down if the day is even
    if (s(d))
        l.x=l.r; //moves east if the day is a perfect square
    if (s(5*d*d+4)||s(5*d*d-4))
        l.b++; //expands world down if the day is a fibonacci number
    if (s(8*d+1))
        l.r++; //expands world right if the day is a triangular number
    return l;
}

main(i) {
    scanf("%d",&i);
    printf("%d %d",m(i).x,m(i).y);
}

3

펄 5, 284 바이트

@s=([2,2]);@n=(2,2);@f=(0,1);$w=$h=5;for(1..<>){$f[$_+1]=$f[$_]+$f[$_-1];$t[$_]=$_*($_+1)/2;$s[$_]=[@n];@n=@{$s[$_-1]}if(1 x$_)!~/^1$|^(11+?)\1+$/;($_%2)&&($n[0]-=($n[0]<=>2),$n[1]-=($n[1]<=>2))or$n[1]=($n[1]+$_/2)%$h;$n[0]=$w-1if(int sqrt$_)**2==$_;$h++if$_~~@f;$w++if$_~~@t}say"@n"

283 바이트 + -E플래그 대신 1-e

코드는 동일하지만 공백, 괄호 및 변수 이름이 더 깁니다.

@start=([2,2]);
@now=(2,2);
@fibonacci=(0,1);
$width = ($height=5);
for my $iterator (1 .. <>) {
  $fibonacci[$iterator+1] = $fibonacci[$iterator] + $fibonacci[$iterator-1];
  $triangular[$iterator] = $iterator * ($iterator+1) / 2;
  $start[$iterator] = [@now];
  @now = @{ $start[$iterator-1] } if ((1 x $iterator) !~ /^1$|^(11+?)\1+$/); # prime
  $now[0] -= ($now[0] <=> 2) , $now[1] -= ($now[1] <=> 2) if ($iterator % 2 != 0); # odd
  $now[1] = ($now[1] + $iterator / 2) % $height if ($iterator % 2 == 0); # even
  $now[0] = $width - 1 if ((int sqrt $iterator) ** 2 == $iterator); # square
  $height ++ if $iterator ~~ @fibonacci;
  $width ++ if $iterator ~~ @triangular;
}
say "@now";

나는 이것이 더 골프를 칠 수 있다고 확신합니다.


2

자바 스크립트, 361 359 바이트

N=>{for(c=1,x=y=v=w=j=k=2,h=z=5;c<=N;c++,j=v,k=w,v=x,w=y){m=Math;p=(n,c)=>n%c!=0?c>=n-1?1:p(n,++c):0;[x,y]=c==2||p(c,2)&&c!=1?[j,k]:[x,y];p=x=>x+(x<2?1:x>2?-1:0);c%2?[x,y]=[p(x),p(y)]:y+=c/2;m.sqrt(c)==~~m.sqrt(c)?x=z-1:0;f=(n,c,d)=>d<c?0:d==c?1:f(c,n+c,d);f(1,2,c)||c==1?h++:0;t=(n,c)=>n*++n/2==c?1:--n*n/2>c?0:t(++n,c);t(1,c)?z++:0;x%=z;y%=h}return x+" "+y}

코드는 Destructuring 할당을 사용 합니다 . 현재 Firefox 및 Safari에서만 지원됩니다.

설명

N=>{
// C => the day, x,y => position, v,w => position at the start of the day, 
// j,k => position of yesterday
for(c=1,x=y=v=w=j=k=2,h=z=5;c<=N;c++,j=v,k=w,v=x,w=y){
    m=Math;

    // Prime Function for C > 2. Recursive call to save a loop.
    p=(n,c)=>n%c!=0?c>=n-1?1:p(n,++c):0;
    // Assign x and y to yesterday
    [x,y]=c==2||p(c,2)&&c!=1?[j,k]:[x,y];

    // Function to move closer to home
    p=x=>x+(x<2?1:x>2?-1:0);
    c%2?[x,y]=[p(x),p(y)]:y+=c/2;

    // Square check
    m.sqrt(c)==~~m.sqrt(c)?x=z-1:0;

    // Fibonnacci function for C > 1
    f=(n,c,d)=>d<c?0:d==c?1:f(c,n+c,d);
    f(1,2,c)||c==1?h++:0;

    // Triangle function
    t=(n,c)=>n*++n/2==c?1:--n*n/2>c?0:t(++n,c);
    t(1,c)?z++:0;

    // Stay in bounds
    x%=z;y%=h
}
// Output
return x+" "+y}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.