द ट्रैवलिंग ओ


26

दुनिया पांच से पांच कोशिकाओं की एक सरणी है। यह सभी तरफ से लपेटता है। इसकी कल्पना की जा सकती है ...

XXXXX
XXXXX
XXOXX
XXXXX
XXXXX

आप एक ओ हैं। आप दुनिया की यात्रा करना पसंद करते हैं, और आप निम्नलिखित नियमों के अनुसार ऐसा करते हैं (चलो सी वर्तमान दिन हो):

  • पर प्रधानमंत्री दिनों, तुम उदासीन लग रहा है। जहाँ से आपने कल शुरू किया था वहाँ वापस लौटें।
  • पर अजीब दिनों, तुम घर की याद लग रहा है। यदि संभव हो तो घर के करीब एक क्षैतिज कदम और संभव हो तो एक ऊर्ध्वाधर कदम घर के करीब ले जाएं। निकटता का निर्धारण करने के उद्देश्य से दुनिया को लपेटने पर ध्यान न दें।
  • पर भी दिन, आप रोमांच महसूस करता हूँ। C / 2 कदम दक्षिण की ओर ले जाएं।
  • पर वर्ग दिनों, तुम साहसी लग रहा है। पूर्व की दीवार की ओर चलें।
  • पर फाइबोनैचि दिन, दुनिया एक पंक्ति से दक्षिण की ओर बढ़ती है।
  • पर त्रिकोणीय दिन, दुनिया एक स्तंभ से पूर्व की ओर बढ़ती है।

यदि उपरोक्त दो या अधिक नियम एक ही समय में लागू होते हैं, तो उन्हें सूचीबद्ध क्रम में लागू करें। उदाहरण के लिए, एक विषम प्राइम डे पर, पहले जहां आप कल शुरू हुए थे, वहां वापस लौटें और फिर एक कदम घर के करीब जाएं।

आप (प्रारंभिक) दुनिया के केंद्र में रहते हैं, अर्थात स्थिति (2,2), उत्तर-पश्चिमी कोने से शून्य-अनुक्रमित है। आप एक दिन वहां अपनी यात्रा शुरू करते हैं।

इनपुट

एक एकल पूर्णांक, एन।

उत्पादन

आपका X और Y, Nth दिन पर समन्वय करते हैं, नॉर्थवेस्ट कोने से शून्य-अनुक्रमित, एक ही स्थान से अलग हो जाता है।

स्पष्टीकरण के साथ टेस्ट केस

के इनपुट को देखते हुए 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

अतिरिक्त परीक्षण मामले

मार्टिन ब्यूटनर के संदर्भ समाधान के सौजन्य से (कृपया ध्यान दें कि आपको केवल एक ही निर्देशांक का उत्पादन करना चाहिए, उन सभी का नहीं):

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
मुझे ओ में ऐसा करने की आवश्यकता है!
kirbyfan64sos

जवाबों:


4

पायथ, 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

आप इसे यहाँ आज़मा सकते हैं।

यह गोल्फ के लिए एक मजेदार समस्या थी! मुझे अभी भी पाइथ की आदत है, लेकिन यह एक बहुत अच्छी भाषा है।


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

यह निश्चित रूप से अनुकूलित किया जा सकता है और शुद्धता के लिए जल्दी से जाँच के बाद भी ऐसा लगता है कि मैं एक पोस्ट की तुलना में अलग परिणाम प्राप्त कर रहा हूं। जब मेरे पास अधिक समय होगा तो मैं वापस आऊंगा और अधिक बार अपना कोड देखूंगा

वैसे अच्छी समस्या है!

संपादित करें: मेरे समाधान को ज़र्गब द्वारा दी गई अनमोल सलाह को ध्यान में रखते हुए संपादित किया गया । यह अब पूरी तरह से काम करता है!

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 अच्छी चाल, मैं इस पूरे कोड गोल्फ चीज़ पर वास्तव में बहुत नया हूं। हालांकि काम के 0<1बजाय कैसे करता है otherwise?
बेसिल-हेनरी

1
इसके अलावा, मुझे लगता है कि त्रिकोणीय संख्याओं की आपकी परिभाषा गलत है (मैं मान रहा हूं कि फ़ंक्शन में है t), चूंकि elem d[1..div(d*d-d)2]सभी के लिए सच है d > 2
जर्गर्ब

otherwiseके लिए सिर्फ एक और नाम है True
जर्गर्ब

आपको बहुत बहुत धन्यवाद, हाँ आप सही मैं बहुत तेजी से त्रिकोणीय संख्या करने की कोशिश की कर रहे हैं ...
Basile-हेनरी

5

सी, 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}

कोड विनाशकारी असाइनमेंट का उपयोग करता है । यह अभी फ़ायरफ़ॉक्स और सफारी में समर्थित है।

व्याख्या

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}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.