Seyahat Eden O


26

Dünya beşe beş hücre dizisidir. Her taraftan sarar. Gibi görselleştirilebilir ...

XXXXX
XXXXX
XXOXX
XXXXX
XXXXX

Siz bir O. Siz dünyayı gezmeyi seviyorsunuz ve bunu aşağıdaki kurallara göre yapıyorsunuz (C, şu anki gün olsun):

  • Açık asal günleri Bir nostaljik hissediyorum. Dün başladığın yere dön.
  • On küsur gün, sen yurdunu hissediyorum. Mümkünse yatay bir adımı eve, mümkünse eve bir adım daha yaklaştırın. Yakınlığı belirlemek amacıyla dünya sargısını göz ardı edin.
  • Açık hatta günler, maceracı hissediyorum. C / 2 adımlarını güneye doğru hareket ettirin.
  • On kare günlerde, maceracı hissediyorum. Doğu duvarına git.
  • On Fibonacci gün dünya bir satırla güneye genişletir.
  • Açık üçgen günlerde dünya tek sütuna göre doğuya doğru genişler.

Yukarıdaki kurallardan iki veya daha fazlası aynı anda geçerliyse, bunları belirtilen sıraya göre uygulayın. Örneğin, garip bir ana günde, önce dün başladığınız yere geri dönün ve ardından eve bir adım daha yaklaşın.

(İlk) dünyanın merkezinde, yani kuzeybatı köşesinden sıfır dizinli (2,2) pozisyonunda yaşarsınız. Yolculuğunuza ilk gün başlarsınız.

Giriş

Tek bir tamsayı, N.

Çıktı

X ve Y'niz Ninci günde, Kuzeybatı köşesinden sıfır dizine eklenmiş ve tek bir boşlukla koordine edilir.

Açıklamalı Test Davası

Bir giriş verildiğinde 3, doğru çıktı:

2 3

Her seferinde bir gün bu konuda çalışabiliriz. 1. günden başlayarak aşağıdaki hareketleri uygulamamız gerekir:

  1. Tek, kare, Fibonacci ve üçgen
  2. Başbakan, hatta ve Fibonacci
  3. Başbakan, garip, Fibonacci ve üçgen

Görsel olarak:

     1. Gün 2. Gün 3. Gün
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

Ek Test Durumları

Nezaket Martin Büttner 'ın referans solüsyonu (lütfen not çıkış yalnızca tek, hepsi koordine gerektiğini):

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

Bu kod golfü. En kısa gönderim kazanır.


6
Bunu O'da yapmam gerekiyor!
kirbyfan64sos

Yanıtlar:


4

Pyth, 157 156 153 bayt

=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

Burada deneyebilirsiniz.

Bu golf için eğlenceli bir problemdi! Hala Pyth'a alışıyorum ama bu gerçekten harika bir dil.


1
Pyth'a Hoşgeldiniz! Hemen bir golf görüyorum: Eğer 2 element list / tuple yapmak istiyorsanız, kullanın ,- bunun için var.
isaacg

Kod thoughout bu golf için daha yer vardır - (G%+H/N2b), (GH), (tZH).
isaacg

12

Haskell, 394 bayt

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

Kesinlikle en iyi duruma getirilebilir ve ayrıca doğruluğu kontrol ettikten sonra hızlıca görünenden farklı sonuçlar alıyorum gibi görünüyor. Daha fazla zamanım olduğunda geri döneceğim ve kodumu daha ayrıntılı kontrol edeceğim ^^

Bu arada güzel bir sorun!

EDIT: Çözümümü Zgarb'ın verdiği değerli tavsiyeyi dikkate alarak düzenledi . Şimdi mükemmel çalışıyor!

EDIT2: nimi sayesinde kodu daha da küçük yaptım. Şimdi ayrıca, iki yerine bir işlevde eşit ve tek kontroller yapıyorum, bu da toplam sayısını 446'dan 414 bayta düşürüyor.

EDIT3: 414'ten 400 bayta daha da geliştirildi. Başka bir 2 bayt için teşekkürler nimi , yanıyorsun ! :)

EDIT4: nimi :) tarafından 4 bayt daha fazla


2
PPCG'ye Hoşgeldiniz! Hızlı İpuçları bir çift: 0<1kısadır otherwiseve 0/=mod x ykısaltılmış olabilir 0<mod x y. Ayrıca, 1==mod(d)2bir odd dve 0==mod(d)2bir even d.
Zgarb

@ Zgarb güzel hileci, bu kod golf şeyinde gerçekten oldukça yeniyim. İş 0<1yerine nasıl otherwiseolsa?
basile-henry

1
Ayrıca, üçgensel sayıların tanımının yanlış olduğunu düşünüyorum (bunun fonksiyonda olduğunu farz ediyorum t), çünkü elem d[1..div(d*d-d)2]herkes için doğru d > 2.
Zgarb

otherwisesadece başka bir isim True.
Zgarb

Çok teşekkür ederim, evet haklısın çok hızlı üçgen sayılar yapmaya çalıştım ...
basile-henry

5

C, 425 396 bayt

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

Bunun geliştirilebilecek kısımları var, ancak test durumları için işe yarıyor .


açıklama

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 bayt

@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 bayt, artı -Ebayrak yerine 1-e

Aynı kod ancak daha fazla boşluk, daha fazla parantez ve daha uzun değişken adları ile:

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

Bunun daha fazla golf oynayabileceğine eminim.


2

Javascript, 361 359 bayt

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}

Kod, Yıkıcı atamayı kullanır . Şu anda yalnızca Firefox ve Safari’de destekleniyor.

açıklama

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}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.