Du lịch O


26

Thế giới là một mảng năm của năm tế bào. Nó kết thúc tốt đẹp Nó có thể được hình dung như ...

XXXXX
XXXXX
XXOXX
XXXXX
XXXXX

Bạn là một O. Bạn thích đi du lịch khắp thế giới và bạn làm như vậy theo các quy tắc sau (gọi C là ngày hiện tại):

  • Vào những ngày đẹp trời, bạn cảm thấy luyến tiếc. Quay trở lại nơi bạn bắt đầu ngày hôm qua.
  • Vào những ngày lẻ , bạn cảm thấy nhớ nhà. Di chuyển một bước ngang gần nhà hơn, nếu có thể, và một bước dọc gần nhà hơn, nếu có thể. Bỏ qua gói thế giới cho mục đích xác định sự gần gũi.
  • Vào những ngày chẵn , bạn cảm thấy phiêu lưu. Di chuyển C / 2 bước về phía nam.
  • Vào những ngày vuông , bạn cảm thấy phiêu lưu. Di chuyển đến bức tường phía đông.
  • Vào những ngày Fibonacci , thế giới mở rộng về phía nam thêm một hàng.
  • Vào những ngày tam giác , thế giới mở rộng về phía đông bởi một cột.

Nếu hai hoặc nhiều quy tắc trên sẽ áp dụng cùng một lúc, hãy áp dụng chúng theo thứ tự được liệt kê. Ví dụ, vào một ngày đầu tiên kỳ lạ, đầu tiên hãy quay lại nơi bạn đã bắt đầu ngày hôm qua, và sau đó di chuyển một bước gần hơn đến nhà.

Bạn sống ở trung tâm của thế giới (ban đầu), tức là vị trí (2,2), không được lập chỉ mục từ góc Tây Bắc. Bạn bắt đầu cuộc hành trình của bạn ở đó vào ngày đầu tiên.

Đầu vào

Một số nguyên duy nhất, N.

Đầu ra

Tọa độ X và Y của bạn vào ngày thứ N, không được lập chỉ mục từ góc Tây Bắc, cách nhau bởi một khoảng trắng.

Test Case với giải thích

Cho một đầu vào của 3, đầu ra đúng là:

2 3

Chúng ta có thể làm việc thông qua một ngày tại một thời điểm. Bắt đầu từ ngày 1, chúng ta cần áp dụng các động tác sau:

  1. Tỷ lệ lẻ, hình vuông, hình chữ nhật và hình tam giác
  2. Prime, chẵn và Fibonacci
  3. Prime, lẻ, Fibonacci và tam giác

Ở dạng trực quan:

     Ngày 1 ngày 2 ngày 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

Các trường hợp kiểm tra bổ sung

Biếu không của giải pháp tham chiếu của Martin Büttner (xin lưu ý rằng bạn chỉ nên xuất một tọa độ duy nhất, không phải tất cả chúng):

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

Đây là mã golf. Bài nộp ngắn nhất sẽ thắng.


6
Tôi cần phải làm điều này trong O!
kirbyfan64sos

Câu trả lời:


4

Pyth, 157 156 153 byte

=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

Bạn có thể thử nó ở đây.

Đây là một vấn đề thú vị cho golf! Tôi vẫn đang quen với Pyth, nhưng đó là một ngôn ngữ thực sự tuyệt vời.


1
Chào mừng đến với Pyth! Một sân golf tôi thấy ngay lập tức: Nếu bạn muốn tạo một danh sách 2 yếu tố / bộ, hãy sử dụng ,- đó là những gì nó có.
isaacg

Có chỗ hơn cho golf này thoughout mã - (G%+H/N2b), (GH), (tZH).
isaacg

12

Haskell, 394 byte

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

Nó chắc chắn có thể được tối ưu hóa và sau khi nhanh chóng kiểm tra tính chính xác có vẻ như tôi đang nhận được kết quả khác với kết quả được đăng. Tôi sẽ quay lại và kiểm tra kỹ hơn mã của tôi khi tôi có nhiều thời gian hơn ^^

Nhân tiện vấn đề tốt đẹp!

EDIT: chỉnh sửa giải pháp của tôi có tính đến lời khuyên quý giá được đưa ra bởi Zgarb . Bây giờ nó hoạt động hoàn hảo!

EDIT2: nhờ nimi tôi đã làm cho mã thậm chí còn nhỏ hơn. Bây giờ tôi cũng đang thực hiện kiểm tra chẵn và lẻ trong một hàm thay vì hai mà tổng thể giảm số lượng từ 446 xuống 414 byte.

EDIT3: cải thiện hơn nữa từ 414 đến 400 byte. Cảm ơn nimi vì 2 byte khác, bạn đang bùng cháy! :)

EDIT4: 4 byte nữa bởi nimi :)


2
Chào mừng đến với PPCG! Một vài gợi ý nhanh: 0<1ngắn hơn otherwise0/=mod x ycó thể rút ngắn lại 0<mod x y. Ngoài ra, 1==mod(d)2odd d0==mod(d)2even d.
Zgarb

@Zgarb thủ thuật hay, tôi thực sự khá mới mẻ với toàn bộ điều golf mã này. Làm thế nào để 0<1thay vì otherwiselàm việc mặc dù?
basile-henry

1
Ngoài ra, tôi nghĩ rằng định nghĩa về số tam giác của bạn là sai (tôi cho rằng đó là trong hàm t), vì elem d[1..div(d*d-d)2]nó đúng với tất cả d > 2.
Zgarb

otherwisechỉ là một tên khác cho True.
Zgarb

Cảm ơn bạn rất nhiều, vâng, bạn đã đúng. Tôi đã cố gắng thực hiện các số tam giác quá nhanh ...
basile-henry

5

C, 425 396 byte

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);}

Có những phần này có thể được cải thiện, nhưng nó hoạt động cho các trường hợp thử nghiệm .


Giải trình

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

Perl 5, 284 byte

@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 byte, cộng 1 cho -Ecờ thay vì-e

Cùng một mã nhưng có nhiều khoảng trắng hơn, nhiều dấu ngoặc đơn hơn và tên biến dài hơn:

@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";

Tôi tự tin rằng điều này có thể được chơi golf hơn nữa.


2

Javascript, 361 359 byte

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}

Mã sử ​​dụng phân công hủy cấu trúc . Nó chỉ được hỗ trợ trong Firefox và Safari ngay bây giờ.

Giải trình

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}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.