অ্যারে ঝাঁপ দাও!


19

আসুন জিম অ্যারে নামক একটি প্লেয়ার গেম খেলি । খেলতে, আপনার কেবল পূর্ণসংখ্যার একটি অ্যারের প্রয়োজন, বলুন a। আপনি কিছু অবস্থান থেকে শুরু i, এবং প্রতিটি মোড়, আপনি একটি নতুন অবস্থান লাফিয়ে। পালা n,

  • nএমনকি যদি হয়, আপনি নিখুঁত অবস্থানে ঝাঁপ দাও a[i] mod length(a),
  • যদি nবিজোড় হয় তবে আপনি আপেক্ষিক অবস্থানে চলে যান (i + a[i]) mod length(a)

অ্যারে সূচক শূন্য থেকে শুরু হয়। আপনি প্রথম লাফটিকে টার্ন 0বা টার্ন হিসাবে গণনা করতে পারেন 1যা একটি ভিন্ন গেম দেয়। যেহেতু গেমের রাজ্য স্থান সীমাবদ্ধ (আপনার পদক্ষেপটি আপনার অবস্থান এবং টার্ন সংখ্যাটির সাম্য দ্বারা নির্ধারিত হয়), আপনি অবশ্যই অবশেষে এমনকি দৈর্ঘ্যের একটি লুপ প্রবেশ করবেন। loop(a, i, b)যখন প্রথম লাফটি টার্ন হিসাবে গণনা করা হয় তখন এই লুপটির দৈর্ঘ্য দ্বারা চিহ্নিত করুন b

ইনপুট

aসাথে গেমটি খেলতে পূর্ণসংখ্যার একটি দুর্দান্ত বিন্যাস ।

আউটপুট

সর্বাধিক সংখ্যা pযা কোনও অবস্থান থেকে শুরু করার সময় iএবং প্রথম পালাটিকে গণনা হিসাবে 0বা হিসাবে 1, আপনি শেষ পর্যন্ত দৈর্ঘ্যের একটি লুপ প্রবেশ করেন 2 * p। অন্য কথায়, আপনার আউটপুটটি সংখ্যা

max { loop(a, i, b)/2 : i in [0 .. length(a)-1], b in [0,1] }

বিধি

আপনি কোনও ফাংশন বা একটি সম্পূর্ণ প্রোগ্রাম দিতে পারেন। ক্ষুদ্রতম বাইট গণনা জয় এবং মানক লুফোলগুলি অনুমোদিত নয়।

পরীক্ষার মামলা

[0] -> 1
[-213] -> 1
[1,3,12,-1,7] -> 1
[2,3,5,7,9,11,13,17,19] -> 2
[-2,3,-5,7,-9,11,-13,17,-19,23,-27] -> 3
[0,2,5,4,-9,0,-1,1,-1,1,-6] -> 4

@ কুকাক 6767 হ্যাঁ, এটি পরবর্তী বিকল্প, যেমন মার্টিন বলেছিলেন।
Zgarb

আমি ধরে নিই যে সি এর চেয়ে আলাদা modহিসাবে সর্বদা ধনাত্মক ( -1 mod 5 == 4) হিসাবে সংজ্ঞায়িত হয় এটি কি কেস?
নটকি

@ নটকি হ্যাঁ, আমি একটি হাস্কেল-স্টাইল ব্যবহার করি mod, যা সর্বদা অবৈধ ফলাফল দেয়।
Zgarb

যদি শূন্য-সূচক মোড়গুলি ওয়ান-ইনডেক্সিং থেকে পৃথক ফলাফল দেয় তবে আমাদের ফলাফলটি কি আউটপুট আনা উচিত, বা যে কোনওটি কম হয়?
কেএসএফটি

@ MartinBüttner না, আমি ইন্ডেক্স সম্পর্কে জিজ্ঞাসা ছিল পালাক্রমে না অ্যারে।
কেএসএফটি

উত্তর:


6

পাইথ : 28 টি অক্ষর (পাইথন 2: 116 অক্ষর)

eSmhxtu+G%@Q+eG@QeGlQUQ]ddUQ

ব্যবহার:

এটি এখানে চেষ্টা করুন: পাইথ কম্পাইলার / নির্বাহক

এটি ইনপুট হিসাবে পূর্ণসংখ্যার একটি তালিকা প্রত্যাশা করে [0,2,5,4,-9,0,-1,1,-1,1,-6]

ব্যাখ্যা:

আমি ফাংশনটির একটি গুরুত্বপূর্ণ সম্পত্তি লক্ষ্য করেছি loop: প্রত্যেকের iজন্য একটি আছে j, যাতে loop(a,i,0) == loop(a,j,1)এবং বিপরীতে। অতএব আমরা কেবল মান গনা প্রয়োজন loop(a,i,b)জন্য b=0

প্রুফ: যদি একটি চক্র i -> j -> k -> ... -> z -> iহয় b = 0তবে তার j -> k -> ... -> z -> i -> jসাথে চক্রটি বিদ্যমান b = 1

সুতরাং একটি সাধারণ স্ক্রিপ্ট নিম্নলিখিত পদ্ধতিতে কাজ করতে পারে। সর্বোপরি Iterate iএবং iপুনরাবৃত্তাকারী কম্পিউটিং দ্বারা পৌঁছানোর চেষ্টা করুন i = a[(i + a[i]) mod len(a)] mod len(a)। যেহেতু এই গণনাটি একটি চক্রের বাইরে চলে যেতে পারে i, তাই আমরা len(a)পদক্ষেপগুলি পরে গণনা বাতিল করি । তারপরে আমরা সর্বাধিক চক্রটি মুদ্রণ করি।

একটি পাইথন 2 এই (যেমন বাস্তবায়ন সৌন্দর্য 125 অক্ষর }:

a=input();A=len(a);m=[]
for i in range(A):
 j=i
 for c in range(A):
  j=a[(j+a[j])%A]%A
  if i==j:m+=[c+1];break
print max(m)

পাইথ বাস্তবায়নের জন্য আমি কিছুটা ভিন্ন পদ্ধতির ব্যবহার করেছি। প্রত্যেকের জন্য iআমি অবস্থানের তালিকাটি গণনা করি iএবং এই তালিকায় সন্ধান করি।

eSmhxtu+G%@Q+eG@QeGlQUQ]ddUQ  
  m                       UQ    for each d in [0, ..., len(input)-1] compute a
      u                ]d         list G (using reduce), 
                                  which is first initialized with G = [d]
                     UQ           for each H in [0, ..., len(input)-1]:
       +G                            append to G the value
         %@Q+eG@QeGlQ                   input[G[-1] +input[G[-1]] % len(input)
                                        (notice that list lookups in pyth work with modular wrapping)
     t                            remove the first value (which is d)
    x                    d        and find the index of d in this shortend list
                                  (it's -1, if d is not in the list)
   h                              add 1
eS                              print the maximum (end of sorted list)  

সম্পাদনা করুন: পাইথন 2: 116 টি অক্ষর

@ গর্বিত হাস্কেলারের সমাধানটি আমার পাইথন সমাধানের চেয়ে আমি কয়েকটি চরিত্রের চেয়ে ছোট ছিল, সুতরাং আমি এটি কিছুটা ছোট করতে চাইছিলাম।

a=input();A=len(a);l=lambda j,i,c:c<=A and(c*(i==j)or l(a[(j+a[j])%A]%A,i,c+1));print max(l(i,i,0)for i in range(A))

পার্থক্যটি হ'ল, আমি সংখ্যাটি পুনরাবৃত্তির পরিবর্তে পুনরাবৃত্তভাবে গণনা করি।


8

পাইথন - 157

a=input()
z=len(a)
b=[]
for i in range(z):
    s,c,t=[],"",0
    while(c in s[:-1])-1:j=(i*t+a[i])%z;c=`t`+`i`;s+=[c];t^=1
    b+=[len(s)-s.index(c)-1]
print max(b)/2

1
আপনি যদি len(a)কোনও ভেরিয়েবল রাখেন এবং সেই পরিবর্তনশীলটির len(a)নামের সাথে সমস্তগুলি প্রতিস্থাপন করেন তবে আপনি কিছু অক্ষর সংরক্ষণ করতে পারেন।
ProgramFOX

1
কিছু ধারণা: t+=1;t%=2-> t^=1এবং if t: j=(j+a[j])%z else: j=a[j]%z->j=(t*j+a[j])%z
ভেক্টরাইজড

1
ইনডেন্ট করতে শুধুমাত্র একটি স্থান ব্যবহার করুন। এখানে 9 টি অক্ষর সাশ্রয় করে।
পূর্কাকুডারী

1
অন্য ধারণা: while c not in s[:-1]:হতে পারে while(c in s[:-1])-1:
পূর্কাকুডারী

1
এবং আরও একটি। আপনি ব্যবহার করতে হবে না j, এই লুপ বিষয়বস্তু নির্ধারণ range(z)করার iপরিবর্তে এটি বৃদ্ধিশীল করুন। শুধু প্রতিস্থাপন jসঙ্গে i4 সংরক্ষণ অক্ষর।
পুরক্কা কুডারী

5

হাস্কেল, 120 105

f s|t<-l s=maximum[g$drop t$iterate(\i->s!!mod(i+s!!mod i t)t)i|i<-s]
g(x:s)=l$0:fst(span(/=x)o)
l=length

এটি প্রতিটি শুরুর পয়েন্টের জন্য একটি অসীম তালিকা উত্পন্ন করে (গল্ফের কারণে আমরা সমস্ত সূচিগুলির পরিবর্তে সমস্ত মানকে পুনরাবৃত্তি করি যা সমতুল্য)। তারপর এটি প্রতিটি তালিকা (চক্র দৈর্ঘ্য চক্র হিসাব xsহয় xs % [])।

এটি চক্র সম্পর্কে @ জাকুবেসের পর্যবেক্ষণ ব্যবহার করে। কারণ এটি একবারে 2 ধাপে ধাপে ধাপে ধাপে ধাপে ফেলা হয়, শেষে আমাদের 2 দিয়ে ভাগ করার দরকার নেই।

সম্পাদনা : এখন nপ্রথম উপাদানটির সাথে একটি চক্র থাকার গ্যারান্টি দেওয়ার জন্য @ এমথভিউমার্কের কৌশলটি প্রথম উপাদানগুলি বাদ দেওয়ার কৌশল ব্যবহার করে । যাইহোক, আমি তার অ্যালগরিদমকে 112চরিত্রগুলিতে গল্ফ করতে পেরেছি :

l=length
o(x:y)=1+l(takeWhile(/=x)y)
j a|n<-l a=maximum$map(o.drop n.iterate(\i->mod(a!!mod(i+a!!i)n)n))[0..n-1]

2

হাস্কেল - ১৩৯ টি অক্ষর

l=length
o(x:y)=1+l(takeWhile(/=x)y)
j a=maximum$map(o.drop n.iterate(b!!))[0..n-1]
 where b=zipWith(\x y->mod(a!!mod(x+y)n)n)a[0..];n=l a

উদাহরণ:

λ: j [0]
1

λ: j [-213]
1

λ: j [1,3,12,-1,7]
1

λ: j [2,3,5,7,9,11,13,17,19]
2

λ: j [-2,3,-5,7,-9,11,-13,17,-19,23,-27]
3

λ: j [0,2,5,4,-9,0,-1,1,-1,1,-6]
4

এটি @ জাকুবের পর্যবেক্ষণ ব্যবহার করে যে আপনার পুনরাবৃত্তি প্রতি 2 পদক্ষেপ সম্পাদন করার সময়, কেবলমাত্র অর্ধেকের শুরু মানগুলি পরীক্ষা করতে হবে।


আপনি whereআগেরটি স্কোয়াশ করতে পারেন ]। এছাড়াও, আপনি কি এর cycle l!!iপরিবর্তে ব্যবহার করার চেষ্টা করেছিলেন l!!mod n(length l)?
গর্বিত হাস্কেলর

এছাড়াও, আপনি ইনলাইন করতে পারেন bএবং |n<-l aএটি মুছে ফেলার জন্য কোনও প্যাটার্ন গার্ড ব্যবহার করতে পারেন where
গর্বিত হাস্কেল্লার 3'15

2

পাইথন, 160

l=lambda a,b,c,d:(b,c)in d and len(d)-d.index((b,c))or l(a,(a[b]+[0,b][c])%len(a),~c,d+[(b,c)])
j=lambda a:max(l(a,b,c,[])for b in range(len(a))for c in(0,1))/2

উত্তরের জন্য কাজ j
রিকার্সিভ ফাংশন lপ্রদত্ত অ্যারে, শুরু এবং প্রথম টার্নের জন্য লুপের দৈর্ঘ্য প্রদান করে এবং ফাংশনটি jসর্বাধিক সন্ধান করে।


আমি মনে করি আপনি a এর সাথে j সংজ্ঞা দিয়ে কিছু অক্ষর সংরক্ষণ করতে পারেন lambda
কেএসএফটি

1

গণিত, 189 162 161 বাইট

যদি বেনামী ফাংশনগুলির অনুমতি দেওয়া হয় - 161 বাইট:

Max[l=Length;Table[b={};n=p;i=s-1;e:={i,n~Mod~2};While[b~Count~e<2,b~AppendTo~e;h=#[[i+1]];i=If[EvenQ@n++,h,i+h]~Mod~l@#];l@b-b~Position~e+1,{s,l@#},{p,0,1}]/4]&

অন্যথায় - 163 বাইট:

f=Max[l=Length;Table[b={};n=p;i=s-1;e:={i,n~Mod~2};While[b~Count~e<2,b~AppendTo~e;h=#[[i+1]];i=If[EvenQ@n++,h,i+h]~Mod~l@#];l@b-b~Position~e+1,{s,l@#},{p,0,1}]/4]&

সমস্ত পরীক্ষার ক্ষেত্রে এটি চালানো:

f /@ {
  {0},
  {-213},
  {1, 3, 12, -1, 7},
  {2, 3, 5, 7, 9, 11, 13, 17, 19},
  {-2, 3, -5, 7, -9, 11, -13, 17, -19, 23, -27},
  {0, 2, 5, 4, -9, 0, -1, 1, -1, 1, -6}
}

ফলাফল স্বরূপ:

{1, 1, 1, 2, 3, 4}

পাইথন 2, 202 বাইট

def l(a,n,i):
 b=[]
 while not[i,n]in b:b.append([i,n]);i=(a[i]if n<1 else i+a[i])%len(a);n+=1;n%=2
 return len(b)-b.index([i,n])
def f(a):print max([l(a,n,i) for n in[0,1]for i in range(len(a))])/2

ডেমো

এটি আমার গণিতের উত্তরের একটি বন্দর।


এটি আমার সাথে খুব মিল দেখাচ্ছে। আমার প্রথমে এক (দুটি দ্বারা বিভক্ত হওয়ার আগে) বন্ধ ছিল। আমি এখনও নিশ্চিত না কেন, তবে আমি বিভাজনের আগে কেবল একটি বিয়োগ করেছি।
কেএসএফটি

আমি ম্যাথমেটিকাকে জানি না, তাই আমি আসলে আরও বেশি সাহায্য করতে পারি না।
কেএসএফটি

@ জগারব ওহ! ভাল যে সবকিছু ব্যাখ্যা করে। আমি এটা ভাবিনি। ধন্যবাদ!
kukac67

For3 টি আর্গুমেন্ট সহ সাধারণত ছোট হয় While(যেহেতু আপনি সামনে একটি সেমিকোলনে সংরক্ষণ করতে পারেন For)।
মার্টিন এন্ডার

1

গাণিতিক, 113 112 অক্ষর

l=Length;m=MapIndexed;f=Max[l/@ConnectedComponents@Graph@m[Tr@#2->#&,Part@@Thread@Mod[#+{Tr@#2,1}&~m~#,l@#,1]]]&

উদাহরণ:

f /@ {
  {0},
  {-213},
  {1, 3, 12, -1, 7},
  {2, 3, 5, 7, 9, 11, 13, 17, 19},
  {-2, 3, -5, 7, -9, 11, -13, 17, -19, 23, -27},
  {0, 2, 5, 4, -9, 0, -1, 1, -1, 1, -6}
}

{1, 1, 1, 2, 3, 4}


1

82 হয়

ised '@1{0,2,5,4,-9,0,-1,1,-1,1,-6};@2{1};' '@{4 5}{(@3{:$1_x++x*@2{1-$2}:}2*#$1)::[#$1]};{1+?{:@5{$3::$5}=$4:}@::[2*#$1]_0}/2'

প্রথম যুক্তি দৈর্ঘ্যে গণনা করে না (অ্যারে আরম্ভকরণ $1এবং এর মধ্যে bসূচনা $2- "গেম" নির্বাচন করুন)।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.