अंकों की दौड़


16

आपको एक प्रोग्राम या फ़ंक्शन लिखना चाहिए जो कि एक-अंक पॉजिटिव पूर्णांक और ट्रैक की लंबाई को इनपुट आउटपुट के रूप में शुरू करने का आदेश देता है या संख्याओं के अंतिम क्रम को वापस करता है।

इनपुट [5,1,2,6,7] and 14निम्नलिखित दौड़ को परिभाषित करता है:

--------------
76215 ->
--------------

दौड़ के नियम

  • ट्रैक चारों ओर घूमता है और अंक कई गोद में जा सकते हैं।
  • चरणों का क्रम चक्रीय है और प्रारंभिक स्थिति पर आधारित है। हमारे उदाहरण में 5 1 2 6 7 5 1 2 ...
  • एक ही स्थिति में एक से अधिक अंक नहीं हो सकते।
  • प्रत्येक अंक में digit_valueप्रति चरण सेल की गति होती है । एक अंक या अंकों के एक निरंतर ब्लॉक को ओवरटेक करना एक अतिरिक्त कदम है। यदि अंक के लिए आवश्यक गति नहीं है, तो यह अंक (ओं) के ब्लॉक से पहले बंद हो जाएगा। उदाहरण:

    [41   ] => [ 1 4 ]  4 overtakes 1
    
    [2 1  ] => [ 21  ]  2 can only move 1 as it can't move 3 to overtake 1
    
    [4 12 ] => [ 412 ]  4 can only move 1 as it can't move 5 to overtake 12     
    
    [   3 ] => [ 3   ]  3 starting a new lap
    
  • हर अंक को digit_valueखत्म होने से पहले ही चूक जाना पड़ता है । ट्रैक की आखिरी सेल बचे होने पर एक लैप पूरा हो जाता है। एक समाप्त अंक ट्रैक से हटा दिया जाता है।

  • ध्यान दें कि एक अंक एक कदम के माध्यम से कई बार अपनी प्रारंभिक स्थिति तक पहुंच सकता है और कई गोद को पूरा कर सकता है।

इनपुट

  • सूची की 1..9लंबाई, ट्रैक की लंबाई से अधिक, कम से कम एक तत्व और एकल पॉजिटिव पूर्णांक के साथ अलग-अंकों वाले सकारात्मक पूर्णांक ( ) की एक सूची।

उत्पादन

  • क्रम में अंकों की एक सूची वे किसी भी प्रारूप में समाप्त हो गए।

उदाहरण

इनपुट के लिए एक दृश्य चरण-दर-चरण उदाहरण starting_order = [5,9,2] and length = 6

295   | Start position
29   5| digit 5 moves
2  9 5| digit 9 moves, finishing lap #1
  29 5| digit 2 moves
 529  | digit 5 moves, finishing lap #1
 52  9| digit 9 moves, finishing lap #2
 5  29| digit 2 moves
   529| digit 5 moves
 9 52 | digit 9 moves, finishing laps #3 and #4
29 5  | digit 2 moves, finishing lap #1
29   5| digit 5 moves
2  9 5| digit 9 moves, finishing lap #5
  29 5| digit 2 moves
 529  | digit 5 moves, finishing lap #2
 52  9| digit 9 moves, finishing lap #6
 5  29| digit 2 moves
   529| digit 5 moves
 9 52 | digit 9 moves, finishing laps #7 and #8
 9 5  | digit 2 moves, finishing lap #2 --> remove 2 from the track
59    | digit 5 moves, finishing lap #3
5     | digit 9 moves, finishing lap #9 --> remove 9 from the track
     5| digit 5 moves
    5 | digit 5 moves, finishing lap #4
      | digit 5 moves, finishing lap #5 --> remove 5 from the track
------
Finish order: 2 9 5

प्रारूप में उदाहरण Input => Output

[3], 2  =>  [3]

[9, 5], 3  =>  [9, 5]

[5, 9, 2], 6  =>  [2, 9, 5]

[5, 9, 2], 10  =>  [5, 9, 2]

[5, 7, 8, 1, 2], 10  =>  [1, 5, 7, 8, 2]

[5, 1, 6, 8, 3, 2], 17  =>  [1, 6, 8, 2, 3, 5]

[1, 2, 3, 7, 8, 9], 15  =>  [1, 7, 8, 9, 2, 3]

[9, 8, 7, 3, 2, 1], 15  =>  [8, 7, 9, 1, 2, 3]

[1, 2, 3, 4, 5, 6, 7, 8, 9], 20  =>  [1, 2, 3, 4, 5, 6, 7, 8, 9]

[9, 8, 7, 6, 5, 4, 3, 2, 1], 20  =>  [8, 7, 5, 9, 6, 1, 2, 4, 3]

यह कोड-गोल्फ है इसलिए सबसे छोटी प्रविष्टि जीतती है।


संभवतः, इनपुट सरणी में डुप्लिकेट तत्व नहीं हो सकते हैं? यह उस तरह दिखता है, लेकिन मुझे वह शर्त स्पष्ट रूप से नहीं दिखती है।
एंड्रयू

@ और हां, कोई डुप्लिकेट अंक नहीं हो सकता। प्रश्न संपादित किया। धन्यवाद।
यादृच्छिक

टेस्ट केस # 6 (लंबाई = 17) के लिए मुझे थोड़ा अलग परिणाम मिलता है (अंतिम दो अंक उलट)। मैं सोच रहा था कि मेरी गलती कहाँ है। मेरे दौड़ लॉग है यह । क्या आप अपनी सहायता प्रदान कर सकते हैं, ताकि मैं अपनी गलती का पता लगा सकूं?
क्रिस्टियन लुपस्कू

@ w0lf यहां लॉग इन करें अंतर। आप 1 खत्म होने के बाद 6 के साथ बढ़ना छोड़ देते हैं जहां व्युत्पत्ति शुरू होती है। (ध्यान दें कि मेरे लॉग में ट्रैक से हटाए जाने से पहले अंक हैं और आपका नहीं।)
यादृच्छिक

जवाबों:


3

रूबी 229 236

यह एक ऐसा कार्य है जो दो मापदंडों को लेता है: अंकों का प्रतिनिधित्व करने वाला एक सरणी और ट्रैक की लंबाई का प्रतिनिधित्व करने वाला इंट। यह एक सरणी देता है, उस क्रम का प्रतिनिधित्व करता है जिसमें अंक दौड़ को पूरा करते हैं।

F=->d,l{
i=0
t=d.map{|x|[x,d.size-(i+=1)]}
r=[]
d.cycle.map{|n|
t==[]&&break
(c=t.find{|x,_|x==n})&&(s=n
w=c[1]
o=p
(a=(t-[c]).map{|_,p|p%l}
s-=1;w+=1
a&[w%l]==[]?(o=p;c[1]=w):o||s-=o=1)while s>0
c[1]>=n*l&&(t.delete c;r<<n))}
r}

इसे ऑनलाइन टेस्ट करें: http://ideone.com/KyX5Yu

संपादित करें: कुछ और चार्ट को बचाने के लिए कुछ तरकीबों का पता लगाया ।

Ungolfed संस्करण:

F=->digits,length{
  digit_positions = digits.map.with_index{|d,i|[d,digits.size-i-1] }

  result = []

  digits.cycle.map{|n|
    break if digit_positions==[]
    crt = digit_positions.find{|x,_|x==n}
    next unless crt

    steps_left = n
    pos = crt[1]
    taking_over = false

    while steps_left > 0
      other_pos = (digit_positions-[crt]).map{|_,p|p%length}

      steps_left-=1
      pos += 1

      if other_pos.include? (pos%length)
        steps_left -= 1 unless taking_over
        taking_over = true
      else
        taking_over = false
        crt[1] = pos
      end
    end

    if crt[1] >= n*length
      digit_positions.delete(crt)
      result<<n
    end
  }
  result
}

2

पायथन 2, 345 बाइट्स

बहुत बुरा यह @ w0lf की तुलना में कम नहीं है, लेकिन क्या है। (ध्यान दें कि बड़े इंडेंट टैब होते हैं, जो पोस्ट करते समय 4-स्पेस में बदल जाते हैं।)

def r(o,l):
 n=len(o);s,t,a,d=dict(zip(o,range(n)[::-1])),-1,{_:0 for _ in o},[]     
 while len(s):
    t+=1;g=o[t%n]
    if g in d:continue
    y,k=s[g],1;i=z=w=0
    for _ in[0]*g:
     i+=1;m=y+i;e,p=m%l,m/l
     if-~a[g]+w>=g<d>m>=l:a[g]+=1;del s[g];d+=[g];break
     if e in s.values()and e!=y:i-=k;k=0
     else:k,s[g],(w,z)=1,e,[(w,z),(z,p)][z<p]
    a[g]+=z
 print d

0

यहाँ मेरा जादुई कोडित कोड है

सी (457 430b)

int v(int*M,int m){
int i,n,c,d,e=32,f=48,u=0,g=10,h,k,r,l=m,j;char a,*b=&a,*B,V[m];
for (i=0;u<m*m*m;i=(++u%m),*B=*b=(u<=l)?*b:e,b=B=&a)
printf("%c%c",0*(V[i]=(u<l?u>=(r=l-sizeof(M)/4)?M[u-r]+f:e:V[i])),((((V[c=(((V[i]=u<l?e:V[i])-f)/10<u/m)?j>=0&h<i|((h=(j=strchr(V+((k=(m+(d=(i-(V[i]-f)%g+1)))%m)),e)-V)<0?(int)(strchr(V,e)-V):(int)j)>=k)*(k>i)?h:m :m])=((V[c]==e)?(*(b=V+i)+(d<0)*g):V[c])))-f)%11==0?(*(B=V+c)-f)%g+f:0);
getch();
}

नोट : इसमें और सुधार की जरूरत है ...

संपादित करें: कोड छोटा हो गया ... - sizeof (int) = 4, फ़ंक्शन = v, अभी भी करने के लिए कुछ चर की जगह बना हुआ है।


मेरी सी जंग लगी है, लेकिन उन कॉलों को sizeofऐसा लगता है कि उन्हें एक जादुई नंबर से बदला जा सकता है। शायद यह उतना पोर्टेबल नहीं होगा, लेकिन हे - यह कोड गोल्फ है।
DLosc

आपका कोड 453 लंबा लगता है, 457 नहीं। इसके अलावा, मुझे लगता है कि आप अनावश्यक व्हाट्सएप को हटाकर और फ़ंक्शन को छोटा नाम देकर इसे और छोटा कर सकते हैं।
क्रिस्टियन लुपस्कू

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

Iirc चर डिफ़ॉल्ट रूप से अंतर हैं। तो: v(int*M,int m){e=32;f=48;u=0;l=m;char a,... इसके अलावा, लगभग सभी व्हाट्सएप अनावश्यक है; ,V[m];for(i=0;... )printf(... );getch();}
wizzwizz4
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.