সংমিশ্রণ লক কাউন্টার


20

দৃশ্যটি হ'ল:

পিটার তার বন্ধু ব্রায়ানকে নিয়ে জিমে ছিলেন যখন ব্রায়ান হঠাৎ তাঁর ইনহেলারটির খুব প্রয়োজন হয়। ব্রায়ান মেঝেতে পড়ার আগে পিটারকে তার সংমিশ্রণ লকটিতে কোডটি জানানোর ব্যবস্থা করে।

পিতর যখন ব্রায়ানের লকারে গিয়ে দেখেন যে সূচকটি কী দেখিয়েছে, স্টিভি তাকে আটকান এবং তার মুখে মরিচের একটি পুরো ক্যান স্প্রে করে, এভাবে পিটারকে অন্ধ করে দেয়।

পিটারকে এখন লকটি না তাকিয়েই খোলার চেষ্টা করতে হবে। সে ডায়ালটি ডান দিকে ঘুরিয়ে দেওয়া শুরু করে, নম্বরগুলি পাস করার সময় সেগুলি গণনা করে। তারপরে, সঠিক সংখ্যায় ডায়ালটি বাম দিকে ঘুরিয়ে দেওয়া শুরু করে, এখনও গণনা করা হয় এবং অবশেষে এটিকে ডানদিকে পরিণত হয় যতক্ষণ না লকটি খোলে।


চ্যালেঞ্জ:

একটি ফাংশন / প্রোগ্রাম লিখুন যা দুটি ইনপুট নেয়, ব্রায়ানের সংমিশ্রণ এবং সূচক অবস্থান। পিটারকে যে সংখ্যা গণনা করতে হবে তার ফলাফল আউটপুট করুন।

নিয়মাবলী:

  • সংমিশ্রণ এবং সূচক অবস্থান পৃথক যুক্তি হতে হবে।
  • ইনপুট হয় কমান্ড প্রম্পট থেকে বা ফাংশন আর্গুমেন্ট হিসাবে হতে পারে।
  • আউটপুট অবশ্যই পর্দায় মুদ্রিত করতে হবে / অন্যথায় প্রদর্শিত হবে (ফাইল নয়)
  • অনুমান করুন যে শুরুর অবস্থানটি প্রথম সংখ্যার মতো নয় এবং সংমিশ্রণে সমস্ত তিনটি সংখ্যাই অনন্য
  • এটি নীচের ছবিতে সম্ভাব্য সংখ্যাসমূহ সহ লকটি দেখানো হয়েছে: 0-39।

নির্দেশাবলী:

নীচের লকটি খুলতে, আপনাকে নির্দেশাবলীর একটি সেট অনুসরণ করতে হবে:

  1. আপনার কোড অবশ্যই জেনে রাখা উচিত। এটি এখন (38, 16, 22) ধরে নিন)
  2. ডায়ালটি 3 বার ডানদিকে ঘুরুন (প্রারম্ভিক সংখ্যাটি তিনবার অতিক্রম করে), তারপরে যখন প্রথম সংখ্যাটি (38) সূচকটির সাথে একত্রিত হয় তখন থামুন
  3. প্রথম সংখ্যাটি অতিক্রম করে ডায়াল 1 পুরো বাঁকটি বাঁ দিকে ঘুরিয়ে আনুন এবং দ্বিতীয় নম্বর (16) সূচকটির সাথে লাইন করলেই থামুন।
  4. ডায়ালটি ডান দিকে ঘুরুন এবং যখন তৃতীয় নম্বর (22) সূচকটির সাথে লাইন করে
  5. লকটি নীচে টানুন

এখানে চিত্র বর্ণনা লিখুন

উদাহরণ:

Input
38 16 22
33  

Output
33  32  31  30  29  28  27  26  25  24  23  22  21  20  19  18  17  16  15  14  13  12  11  10   9   8   7   6   5   4   3   2   1   0  39  38  37  36  35  34  33  32  31  30  29  28  27  26  25  24  23  22  21  20  19  18  17  16  15  14  13  12  11  10   9   8   7   6   5   4   3   2   1   0  39  38  37  36  35  34  33  32  31  30  29  28  27  26  25  24  23  22  21  20  19  18  17  16  15  14  13  12  11  10   9   8   7   6   5   4   3   2   1   0  39  38  37  36  35  34  33  32  31  30  29  28  27  26  25  24  23  22  21  20  19  18  17  16  15  14  13  12  11  10   9   8   7   6   5   4   3   2   1   0  39  38  39   0   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18  19  20  21  22  23  24  25  26  27  28  29  30  31  32  33  34  35  36  37  38  39   0   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  15  14  13  12  11  10   9   8   7   6   5   4   3   2   1   0  39  38  37  36  35  34  33  32  31  30  29  28  27  26  25  24  23  22

স্ট্যান্ডার্ড কোড গল্ফ বিধি প্রযোজ্য।

পরে পোস্ট করা সলিউশনগুলি ডেনিসের উত্তরের চেয়ে কম হলে তারা জিততে পারে।


9
যদি সে গতিতে না পারে তবে ইনহেলারটি অর্থহীন হবে ... এইভাবে, আমার প্রোগ্রামটি হ'ল:function combination(code){alert("Help! Someone open this locker, the combination is "+code+"!")}
কনর ও'ব্রায়ান

2
@ সিওবি, বৈধ পয়েন্ট ... :-) তবে: ১. আমরা যে পিটার-ব্যক্তির কথা বলছি তা শেডের তীক্ষ্ণতম সরঞ্জাম নয়। ২. আপনি কারো কাছে কোডটি বলতে চাইবেন না। ৩. কে জানে, স্টিভির স্প্রে ছাড়ার অতিরিক্ত ক্যান ছিল ..?
স্টিভি গ্রিফিন

1
হ্যাঁ সঠিক. স্টিভির গোলমরিচ স্প্রে এক অসীম ক্যান আছে, তাই না? হাহা: 3
কনর ও'ব্রায়েন

আমরা কি বিকল্প আলগোরিদিমগুলি ব্যবহার করতে পারি যা এখনও সেই লকটি খোলে?
59

1
পিটার মার্শাল আর্ট শিখতে হবে। (এবং ব্রায়ান ধসে যখন জিমের কোনও কোচ নেই কেন? বাজেট কাটছে ?;)
kirbyfan64sos

উত্তর:


3

সিজেম, 52 39 বাইট

q~[3X0].{@40,m<1$({(+W%}&:T*T@#)T<)}e_p

সিজেএম ইন্টারপ্রেটারে এটি অনলাইনে চেষ্টা করুন ।

কিভাবে এটা কাজ করে

q~      e# Read and evaluate all input. This pushes the initial position
        e# as an integer and the combination as an array.
[3X0]   e# Push [3 1 0]. This encodes the respective numbers of full turns
.{      e# For each number in the combination (N) and the corresponding 
        e# number of full turns (F):
  @     e#   Rotate the initial position on top of the stack.
  40,m< e#   Push [0 ... 39] and rotate it that many units to the left.
        e#   For position P, this pushes [P P+1 ... 39 0 ... P-2 P-1].
  1$(   e#   Copy F and subtract 1.
  {     e#   If the result is non-zero:
    (+  e#     Rotate the array of length 40 one unit to the left.
    W%  e#     Reverse it.
  }&    e#   For position P, this pushes [P P-1 ... 0 39 ... P+2 P+1].
  :T*   e#   Save in T and repeat the array F.
  T@    e#   Push T. Rotate N on top of the stack.
  #)    e#   Find the index of N in T and add 1 to it.
  T<    e#   Keep that many elements from the beginning of T.
  )     e#   Pop the last element of the result (N).
}       e# N is the new initial position.
e_p     e# Flatten the resulting array and print it.

1

গ্রোভী, 189 175 বাইট

ধরুন সূচকটি আরগ 0 হিসাবে এবং কম্বলটি কমান্ড লাইনে আরজি 1, আরগ 2, এবং আরজি 3 হিসাবে পাস করা হয়েছে ...

i=(args[0]as int)+1
r={i--;i=i<0?39:i;print"$i "}
l={i=++i%40;print"$i "} 
M={j,c->while(i!=j as int){c()}}
120.times{r()}
M(args[1],r)
40.times{l()}
M(args[2],l)
M(args[3],r)

1

পার্ল 5 , 129 + 1 (-a) = 130 বাইট

sub c{$f=pop;do{say$f;$f+=$_[0];$f=$f==-1?39:$f==40?0:$f}while$f-$_[1]}$p=3;c(2*!$p-1,@F[$_,$p]),$p=$_ for 3,3,3,0,0,1,2;say$F[2]

এটি অনলাইন চেষ্টা করুন!

কিভাবে?

sub c{                       # Takes 3 parameters: increment, ending position, starting position
  $f=pop;                    # first place to start counting
  do{
    say$f;                   # output current position
    $f+=$_[0];               # move position
    $f=$f==-1?39:$f==40?0:$f # roll over when passing zero
  }while$f-$_[1]             # stop when ending positition reached
}

# @F gets defined by the -a command line option
# @F holds the combination followed by the starting position

$p=3;                       # starting position is in array index 3, this variable will track the array index of
                            # the current position on the dial

c(2*!$p-1,@F[$_,$p]),$p=$_  # call the movement function (c), setting direction to the left (1) or right (-1) as needed
                            # based on the array index of the previous position (go left when moving from array index 0)
for 3,3,3,0,0,1,2;          # list of the array index of the next position

say$F[2]                    # output final position

1

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

এতক্ষণ লাগছে। তবে প্রচুর বাঁকও চলছে।

def f(l,s):
 r=lambda a,b,c=1:range(a,b,c)
 a=r(39,l[0],-1);b=r(l[0],-1,-1)
 c=r(l[1],l[2]-1,-1)if l[2]<l[1]else r(l[1],-1,-1);c.extend(r(39,l[2]-1,-1))
 return'  '.join(`x`for x in sum([r(s,-1,-1),a,b,a,b,a,b,r(39,l[0],-1),r(l[0],40),r(0,40),r(0,l[1]+1),c],[]))

এটি অনলাইন চেষ্টা করুন!

আমি মনে করি আমি আমার শেষ লাইনে কিছু অংশ আরও ভালভাবে সংহত করতে পারি তবে আমি এখনও গল্ফ কোডে নতুন এবং আমি কীভাবে এই তালিকা সমন্বয়টি সংক্ষিপ্ত উপায়ে সামলাতে জানি না।

এর উন্নতি সম্পর্কে কোন ধারণা?


0

হাস্কেল , 135 112 বাইট

s!t=[s..39]++[0..mod(t-1)40]
s#t=[s,s-1..0]++[39,38..mod(t+1)40]
(a%b)c s=[s#s,s#s,s#s,s#a,a!a,a!b,b#c,[c]]>>=id

এটি অনলাইন চেষ্টা করুন!

লাইকোনি ধন্যবাদ 23 বাইট সংরক্ষণ করা


পরিবর্তে l s t=ইনফিক্স অপারেটর ঘোষণা করে আপনি ঘোষণাগুলি হ্রাস করতে পারেন s#t=। এছাড়া আরো দুই আর্গুমেন্ট জন্য কাজ করে: (a%b)c s=
লাইকনি

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