পাসওয়ার্ডটি সন্ধান করুন


12

একটি সাধারণ এন-ডিজিটের সংমিশ্রণ লকটিতে এন ঘোরানো ডিস্ক থাকে। প্রতিটি ডিস্কে 0-9 অঙ্কটি অঙ্কিত থাকে এবং এগুলি খোলার জন্য আপনাকে এগুলি সঠিক পাসওয়ার্ডে পরিণত করতে হবে। একথাও ঠিক যে, আপনি যদি পাসওয়ার্ড জানি না, আপনি সবচেয়ে 10 চেষ্টা করতে হবে এন সেটি আনলক করার আগে বার। এটি আকর্ষণীয় নয়।

সমন্বয় লক

সুতরাং আসুন মিশ্রণ লকের একটি বৈকল্পিক বিবেচনা করুন, এটি দূরত্ব-প্রকাশক লকটির নাম দিন।

একটি দূরত্ব-প্রকাশকারী লক খোলার প্রতিটি ব্যর্থ প্রয়াসে, এটি আনলক করার ন্যূনতম সংখ্যার চলাচলের প্রতিক্রিয়া জানায়।

এক আন্দোলন উদাহরণস্বরূপ তা থেকে 1 আন্দোলন প্রয়োজন, এক অবস্থান দ্বারা একটি ঘূর্ণন হিসাবে সংজ্ঞায়িত করা হয় 890থেকে 899, এবং থেকে 9 আন্দোলন 137করতে 952

চ্যালেঞ্জ

অজানা এর পাসওয়ার্ড সহ একটি দূরত্ব-প্রকাশকারী লক দেওয়া হয়েছে , প্রোগ্রামটি দীর্ঘতর হতে না দিয়ে, সর্বনিম্ন প্রচেষ্টার (গতিবিধি নয়) দিয়ে লকটি খোলার চেষ্টা করুন ।

বিধি ও বৃত্তি

  • আপনার একটি সম্পূর্ণ প্রোগ্রাম লিখতে হবে যা স্টিডিন এবং আউটপুট থেকে স্টডআউটে প্রবেশ করে। প্রোগ্রামটি নিম্নলিখিত হিসাবে ইনপুট / আউটপুট করা উচিত:
Start
    Input an integer N (number of digits) from stdin
    Do
        Output a line containing decimal string of length N (your attempt) to stdout
        Input an integer K (response of the lock) from stdin
    While K not equal 0
End
  • আপনার প্রোগ্রামটি এন = 200 পর্যন্ত পরিচালনা করতে হবে এবং যে কোনও ইনপুটটিতে 5 সেকেন্ডেরও কম চালানো উচিত।

  • আউটপুটে শীর্ষস্থানীয় শূন্যগুলি বাদ দেওয়া উচিত নয়।

  • প্রতি দৈর্ঘ্যের জন্য এগুলি 5 টি টেডডেটা, সুতরাং মোট টেস্টডেটার সংখ্যা 1000 টি The

  • চূড়ান্ত স্কোরটি হবে (সমস্ত টেস্টডেটায় অনুমানের মোট সংখ্যা) * এলএন (বাইটে কোডের দৈর্ঘ্য + 50)) সর্বনিম্ন স্কোর জয়। (এলএন প্রাকৃতিক লগ হয়)

  • আমি আপনার জন্য প্রোগ্রাম স্কোর করব। আপনি যদি জানতে চান যে আমি কীভাবে আপনার প্রোগ্রামটি স্কোর করব, বা আপনি নিজেরাই এটি স্কোর করতে চান তবে এই পোস্টে পূর্ববর্তী সম্পাদনাগুলি একবার দেখুন ।

  • এই চ্যালেঞ্জটি 2017/12/07 14:00 ইউটিসি-তে শেষ হবে। আমি তখন আমার সমাধান পোস্ট করব।

চলমান উদাহরণ

লাইনগুলি >ইনপুট প্রতিনিধিত্ব করে এবং অন্যরা প্রোগ্রাম আউটপুট উপস্থাপন করে।

আপনার মনে একটি পাসওয়ার্ড থাকতে পারে এবং এটি পরীক্ষা করার জন্য আপনার প্রোগ্রামের সাথে ইন্টারঅ্যাক্ট করতে পারেন।

> 3   # 3-digit lock. The hidden password is 746
000   # 1st guess (by program)
> 11  # response to the 1st guess
555   # 2nd guess
> 4   # ...
755
> 2
735
> 2
744
> 2
746   # finally the correct answer! The program attempts 6 times.
> 0   # this is not necessary

নমুনা প্রোগ্রাম

সম্পাদনা: সম্ভবত উপরের ইনপুট / আউটপুট ফর্ম্যাটটি পরিষ্কার ছিল না। পাইথনে এখানে একটি নমুনা প্রোগ্রাম।

পাইথন, 369 বাইট, প্রচেষ্টার সংখ্যা = 1005973, স্কোর = 6073935

import sys

N = int(input()) # get the lock size

ans = ''
for i in range(N): # for each digit
    lst = []
    for j in range(10): # try all numbers
        print('0' * i + str(j) + '0' * (N - i - 1)) # make a guess
        result = int(input()) # receive the response
        lst.append(result)
    ans += str(lst.index(min(lst)))
print(ans) # output the final answer

ধন্যবাদ ইউনুস চ্যালেঞ্জ সরল জন্য।

উত্তর:


3

সি, 388 374 368 বাইট, মোট প্রচেষ্টা = 162751, স্কোর = 982280

char s[999];i;G;H;t;n;h;e;R(x){scanf("%d",x);}W(i,x,a){printf((i-n?0:4)+"%0*d%0*d\n",i,x,n-i,0);R(a);}S(k,i){if(!(t=e=k>4?s[i]=48:k<1?s[i]=53:!G?H=k,G=i:0)){for(;t++<n;)putchar(48|t==i|t==G);puts("");R(&t);t==h?W(G,e=1,&t):0;s[G]=t>h?53+H:53-H,s[i]=t>h^e?53+k:53-k;G=0;}}main(){R(&n);for(W(n,0,&h);i++<n;S(t-h+5>>1,i))W(i,5,&t);s[G]=53+H,puts(s+1),s[G]=53-H,puts(s+1);}

পিপিসিজিতে আপনাকে স্বাগতম! আপনি একটি দুর্দান্ত স্কোর পেয়েছেন 162751*ln(388+50)=989887
কলেরা সু

3

সি # (.নেট কোর) , 617 বাইট, মোট প্রচেষ্টা = 182255, স্কোর = 1185166

using System;namespace p{class C{static void Main(){var l=Console.ReadLine();int L=int.Parse(l);var g=new int[L];var p=n(g);for(int i=0;i<L;i++){g[i]=5;var d=n(g);var f=d-p;var s=f;switch(s){case 5:g[i]=0;d-=5;break;case-5:break;case 3:g[i]=1;d=n(g);f=d-p;if(f>0){g[i]=9;d-=2;}break;case 1:g[i]=2;d=n(g);f=d-p;if(f>0){g[i]=8;d-=4;}break;case-1:g[i]=3;d=n(g);f=d-p;if(f>0){g[i]=7;d-=4;}break;case-3:g[i]=4;d=n(g);f=d-p;if(f>-3){g[i]=6;d-=2;}break;}p=d;}n(g);}static int n(int[] g){foreach(var i in g){Console.Write(i);}Console.WriteLine();var s=Console.ReadLine();var d=int.Parse(s);if(d<1) Environment.Exit(0);return d;}}}

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

ব্যাখ্যা

এই প্রোগ্রামটি শুধুমাত্র একটি একক সহায়ক পদ্ধতি ব্যবহার করে:

static int newGuess(IEnumerable<int> guess)
        {
            foreach (var item in guess)
            {
                Console.Write(item);
            }
            Console.WriteLine();
            var distanceString = Console.ReadLine();
            var distance = int.Parse(distanceString);
            if (distance < 1) System.Environment.Exit(0);
            return distance;
        }

এটি স্ট্ডআউটে অনুমানটি লিখেছে, তারপরে স্ট্ডিন থেকে দূরত্বটি পড়বে। যদি অনুমানের সঠিক সংমিশ্রণ হয় তবে এটি তত্ক্ষণাত্ প্রোগ্রামটি শেষ করে। আমি এটাকে অনেক ডাকি। প্রাথমিক সেটআপটি পরবর্তী:

var lengthString = Console.ReadLine();
int length = int.Parse(l);
var guess = new int[length];
var prevDistance = newGuess(guess);

এটি সংমিশ্রণের দৈর্ঘ্য পায়, তারপরে সমস্ত 0 টি দিয়ে অনুমান করা শুরু করে। এরপরে, এটি প্রতিটি forলুপে প্রতিটি অঙ্কের মাধ্যমে পুনরাবৃত্তি করে ।

guess[i] = 5;
var distance = newGuess(guess);
var difference = distance - prevDistance;
var switchVar = difference;
switch (switchVar)

প্রতিটি অঙ্কের জন্য, এটি 5 অনুমান করে, তারপরে পূর্ববর্তী অনুমানের পরে দূরত্বটি কীভাবে পরিবর্তিত হয়েছিল তার ভিত্তিতে পরবর্তী পদক্ষেপের বিষয়ে সিদ্ধান্ত নেয় (যেখানে সেই সংখ্যাটি 0 ছিল)।

case 5:
    guess[i] = 0;
    distance -= 5;
    break;

যদি দূরত্বটি 5 দ্বারা বৃদ্ধি পায়, তবে 0 সেই দূরত্বের জন্য সঠিক ছিল। সেই অঙ্কটি ০ এ ফিরে করুন the

case -5:
    break;

যদি দূরত্বটি 5 দ্বারা হ্রাস পায় তবে 5 হ'ল সঠিক সংখ্যা এবং আমরা তত্ক্ষণাত্ পরবর্তী অঙ্কে চলে যাই।

তারপরে জিনিসগুলি কৃপণ। আমার প্রাথমিক অনুমানগুলি ব্যবহার করা 5এবং 0এটির অর্থ হ'ল বাকি পার্থক্য সম্ভাবনাগুলির 3, 1, -1, -3সাথে প্রতিটি জন্য 2 টি সম্ভাবনা রয়েছে, যার পার্থক্য করতে 1 অতিরিক্ত অনুমানের প্রয়োজন। এই কেসগুলির প্রতিটি একই ধরণের রূপ নেয়

case 3:
    guess[i] = 1;
    distance = newGuess(guess);
    difference = distance - prevDistance;
    if (difference > 0)
    {
        guess[i] = 9;
        distance -= 2;
    }

কিছু সংখ্যক পরিবর্তন হয়, তবে মূলত আমরা দুটি সম্ভাবনার মধ্যে একটিতে চেষ্টা করে দেখি যে এই অঙ্কটির জন্য পরিবর্তনটি সঠিক ছিল কিনা। যদি এটি না হয়, তবে অন্য সংখ্যাটি সঠিক তাই আমরা সেই অঙ্কটি সেট করেছিলাম তবে ম্যানুয়ালি পার্থক্যটি সামঞ্জস্য করুন।

এই পদ্ধতির অর্থ হল আমাদের প্রাথমিক 0 এর দশকের জন্য কমপক্ষে 1 টি অনুমান, প্রতি অঙ্কের জন্য 2 টি অনুমান এবং তারপর শেষ সংখ্যাটি না পড়ে তা নিশ্চিত করার জন্য 1 টি চূড়ান্ত অনুমান করা উচিত।

যদিও এটি বগি হতে পারে, এটি ম্যানুয়ালি যাচাই করে চলেছে তবে এটির কোনও গ্যারান্টি নেই। বাগ খুঁজে পেয়েছে এবং কোলারা সুকে ধন্যবাদ স্কোয়াশ করেছে


আমি এটি পরীক্ষা করেছি এবং যখন উত্তর হবে তখন তা কার্যকর হয়নি 37। আউটপুটটি হ'ল 00, 50, 30, 75, 75(হ্যাঁ, দুটি 75)।
কোলেরা সু

প্রতিস্থাপন করা হচ্ছে <সঙ্গে >যে মধ্যে ifমধ্যে switchত্রুটি সংশোধন করা বলে মনে হয়। যদি আপনি এটি চান তবে আপনার স্কোর 182255*ln(617+50)=1185166
কোলেরা সু

পছন্দ করেছেন কোডটি সংক্ষিপ্ত করার সময় আমি অবশ্যই অনুসন্ধান / প্রতিস্থাপনের সাথে ভুল করেছি। আমি গল্ফযুক্ত কোডে ঠিক করেছি (ভার্জোজ সংস্করণটির সঠিক তুলনা ছিল)।
কামিল দ্রাকারী

2

পাইথন 2 এবং 3: 175 বাইট, মোট প্রচেষ্টা = 1005972, স্কোর = 5448445

এই প্রোগ্রামটিতে সিল লাগবে (লগ (এন)) * সংমিশ্রণে 10 টি প্রচেষ্টা বা প্রতিটি একক অঙ্কের জন্য 10 টি প্রচেষ্টা লাগে (সুতরাং, 33330 প্রচেষ্টা লাগে)।

N=int(input());o=0
def c(a):
 print("0"*(N-len(str(a)))+str(a))
 return int(input())
for j in range(N):m={c(i):i for i in reversed(range(0,10**(j+1),10**j))};o+=m[min(m)]
c(o)

ইনপুট / আউটপুট কার্যকারিতা সম্পর্কে আমাকে সহায়তা করার জন্য কোলেরা সুকে প্রচুর ধন্যবাদ।

চ্যালেঞ্জের পাইথন সংস্করণ ( ওপি দ্বারা সংশোধিত) )।

আমি পাইথনের ভিতরে লক কোডের একটি সংস্করণ লিখেছিলাম। আপনি পাইথনের (আমার মতো) সমাধান করতে চাইলে আপনি এগিয়ে যেতে পারেন এবং ব্যবহার করতে পারেন। পাইথন 2 এবং 3-এ নিম্নলিখিতটি কাজ করে It আপনি যে শ্রেণীর বিরুদ্ধে পরীক্ষা করতে পারেন সে হিসাবে লকটি প্রয়োগ করার জন্য এটি আরও অনেক জ্ঞান অর্জন করেছিল এবং আমি ইনপুটগুলি অনুমান করার জন্য একটি জেনারেটর ফাংশন তৈরি করার সিদ্ধান্ত নিয়েছিলাম।

import sys

class Lock:
    def __init__(self, number):
        self.lock = str(number)
    def l(self): #lengthOfNumber
        return len(self.lock)
    def c(self, guess): #check a guess
        guess = str(guess)
        guess = "0" * (len(self.lock) - len(guess)) + guess
        difference = 0
        for i in range(len(self.lock)):
            d1 = abs(int(self.lock[i]) - int(guess[i]))
            d2 = 10 - d1
            difference += d1 if d1 < d2 else d2
        return difference

def masterLock():
    testdata = ["000","555","755","735","744","746"]
    for answer in testdata:
        yield Lock(answer)

class LockIO:
    def __init__(self):
        self.lock = int(input())
    def l(self):
        return self.lock
    def c(self, guess):
        guess = str(guess)
        guess = "0" * (self.lock - len(guess)) + guess
        print(guess)
        sys.stdout.flush()
        return int(input())

for l in masterLock():
    # Write your code here that tries to guess it
    #   When you're done testing you can unindent your code,
    #   replace "for l in masterLock():" with "l = LockIO()"
    #   and submit the code.
    # 
    # Examples:
    #  l.l()      # returns the length of the lock
    #  l.c("952") # returns the distance to the lock
    #  l.c(952)   #  number also works
    pass

প্রথমে দুঃখিত যে আমি LockIOক্লাসটি ভুল লিখেছিলাম । আমি একটি সম্পাদনা অনুরোধ প্রেরণ করেছি। দ্বিতীয়ত, আমি মনে করি আপনি স্কোরিং মানদণ্ডটি ভুলভাবে পড়েছেন। স্কোরটি জেনারেটর দ্বারা উত্পাদিত টেস্টডেটা দ্বারা গণনা করা হয়, উদাহরণ নয় (আমি আপনার প্রোগ্রামটি কার্যকর করেছি এবং মোট সংখ্যা 1005972) is প্রাকৃতিক লগও অনুপস্থিত। তৃতীয়ত, আমি উল্লেখ করেছি যে আপনাকে একটি সম্পূর্ণ প্রোগ্রাম সরবরাহ করতে হবে, সুতরাং LockIOআপনার বাইট গণনাতেও অংশটি অন্তর্ভুক্ত করা উচিত । অতিরিক্তভাবে, আপনাকে চূড়ান্ত ফলাফল আউটপুট করতে হবে এবং এটিও স্কোরের মধ্যে গণনা করা হয়।
কোলেরা সু

@ কোলেরাসু এখানে "ক্লাস লকআইও" সম্পর্কিত কীভাবে? এছাড়াও পাইথন কোডের দ্বিতীয় ব্লকটি কীসের জন্য ব্যবহৃত হয়?
ব্যবহারকারী 202729

@ user202729 Lockএবং masterLockএটি কেবল পরীক্ষার সুবিধার জন্য। LockIOএটি আসলে আপনার জমা দিতে হবে, কারণ এটি প্রয়োজনীয় I / O ফর্ম্যাটটি ব্যবহার করে।
কোলেরা সু

@nfnneil আমি প্রধান পোস্টে একটি নমুনা প্রোগ্রাম যুক্ত করেছি। আমি আপনার রেফারেন্সের জন্য একটি সম্পাদনা অনুরোধ প্রেরণ করেছি।
কোলেরা সু

@ কলেরাশু আমি ঘুমিয়ে পড়ার সময় বুঝতে পারলাম আপনি কী বোঝাতে চেয়েছিলেন এবং মানুষকে ধন্যবাদ জানাই। এটি একটি ভাল চ্যালেঞ্জ ছিল।
নিল

2

আর , 277 বাইট (স্কোর = 1175356) 258 বাইট, মোট চেষ্টা = 202999, স্কোর = 1163205

f=file("stdin","r")
w=function(b=1,A=X){cat(A,"\n",sep="");if(b){b=scan(f,n=1)};b}
M=0:9
s1=c(-5,-3,-1,1,3,5,3,1,-1,-3)
s2=s1+rep(c(1,-1),,,5)
L=w(1,"")
X=S=rep(0,L)
v0=w()
for(i in 1:L){X[i]=5
v1=v0-w()
X[i]=4
v2=v0-w()
S[i]=M[s1==v1&s2==v2]
X=0*S}
b=w(0,S)

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

ওপেন অনুরোধ অনুযায়ী স্টিডিন-স্টডআউট সংস্করণ, কোনও বয়লারপ্লেট নেই। একটি প্রাথমিক বাগ ঠিক করার জন্য কোলেরা সুকে ধন্যবাদ। এটি মন্তব্যগুলির মধ্যে একটিটির তুলনায় সামান্য সংক্ষিপ্ত সংস্করণ।


টিআইওর মধ্যে পরীক্ষার একটি ব্যাচ চালানোর জন্য টিআইও জমা দেওয়ার নীচে

আর , 189 বাইট

M=0:9
s1=c(-5,-3,-1,1,3,5,3,1,-1,-3)
s2=c(-4,-2,0,2,4,4,2,0,-2,-4)
f=function(L){S=rep(0,L)
v0=v(S)
X=S
for(i in c(1:L)){X[i]=5
v1=v0-v(X)
X[i]=4
v2=v0-v(X)
S[i]=M[s1==v1&s2==v2]
X[i]=0}
S}

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

আসুন প্রাথমিক অনুমান হিসাবে শূন্যগুলির একটি ভেক্টর বিবেচনা করি। আসুন V কে বর্তমান অনুমান এবং সমাধানের মধ্যে দূরত্ব বলি। প্রতিটি অবস্থানের জন্য আপনাকে কেবলমাত্র ভি এর পরিবর্তনগুলি পরীক্ষা করতে হবে যখন আপনি 0 এবং 5 এর সাথে প্রতিস্থাপন করেন 4 বাস্তবে, 0 দিয়ে 5 পরিবর্তন করার মধ্যে পার্থক্যগুলি আমার ভেক্টর এস 1-এ তালিকাভুক্ত করা হয়েছে। 4 এর সাথে 0 পরিবর্তনের মধ্যে পার্থক্যগুলি আমার ভেক্টর এস 2 তে তালিকাভুক্ত রয়েছে। আপনি দেখতে পাচ্ছেন যে এই দুটি ভেক্টর অনন্যভাবে সমাধানের অঙ্কগুলি ম্যাপ করুন।

মোট পরীক্ষার সংখ্যা এইভাবে 3 * এল 2 * এল + 1, যেখানে এল কোডের দৈর্ঘ্য: সমস্ত শূন্যগুলির বিরুদ্ধে প্রাথমিক চেক, তারপরে প্রতিটি অঙ্কের জন্য দুটি চেক, একটি 5 এর বিপরীতে এবং 4 এর বিপরীতে একটি।

কামিল দ্রাকারীর জমা দিয়ে অনুষঙ্গ 3 থেকে একটি ফ্যাক্টর 2 তে উন্নতি হয়েছিল।

টিআইও জমা দেওয়ার বাকি অংশটি আর এর জন্য বয়লারপ্লেট টিআইও জমা দেওয়ার চলমান সময় এবং এল = 1 ... 200, 5 এর সাথে প্রতিটি 1000 টি ক্রিয়াকলাপের এল এর প্রতিটি মানের প্রতিলিপি প্রদর্শন করে c


Error in scan(n = 1) : scan() expected 'a real', got 'S=rep(0,L)'এক্সিকিউট করার সময় আমি পাই ।
কোলেরা সু

1
মনে হয় এটি scan(file=file("stdin"),n=1)কাজ করে। এই প্রোগ্রামটি (আপনার মতো একই, কেবলমাত্র I / O সংশোধন করা হয়েছে) একটি স্কোর পাবেন 202999*ln(277+50)=1175356
কলেরা সু

@ কলেরাশু, আমি হয়ত কিছু মিস করেছি, তবে আমি ভেবেছিলাম202999*ln(258+50) != 202999*ln(277+50)
NofP

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