অ্যান্ড্রয়েড লক প্যাটার্নটি বের করুন


26

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

অ্যান্ড্রয়েড নিদর্শনগুলি কীভাবে কাজ করে

নোডগুলির একটি 3x3 গ্রিডে প্যাটার্নগুলি আঁকা। কোনও প্যাটার্নে পর্দা থেকে আঙুলটি তোলা না করেই নোডগুলির একটি সিরিজ পরিদর্শন করা হয়। তারা যে নোডটি দেখেছেন তারা একটি প্রান্ত দ্বারা পূর্ববর্তী নোডের সাথে সংযুক্ত রয়েছে। মাথায় রাখতে হবে দুটি নিয়ম।

  • আপনি একাধিকবার কোনও একটি নোডে যেতে পারেন না

  • একটি প্রান্ত অপ্রত্যাশিত নোডের মধ্য দিয়ে যেতে পারে না

মনে রাখবেন, সাধারণত অসাধারণ অ্যান্ড্রয়েড লক সংমিশ্রণে সঞ্চালন করা খুব সাধারণ এবং খুব সাধারণ না হলেও নাইটের মতো চলাচল করা সম্ভব । অর্থাত্, একপাশ থেকে একটি অ-সংলগ্ন কোণে বা অন্য পথে অন্যদিকে যেতে পারে। এই ধরনের পদক্ষেপ নিযুক্ত করার নিদর্শনগুলির দুটি উদাহরণ এখানে রয়েছে:

এখানে এটির একটি অ্যানিমেটেড জিএফ দেওয়া হচ্ছে।

একটি প্যাটার্ন সমাধান

একটি সাধারণ প্যাটার্নটি এর মতো দেখতে পারে:

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

নিম্নলিখিত নিদর্শন বিবেচনা করুন:

অবিলম্বে দুটি স্বীকৃত সমাধান রয়েছে। উপরের বাম দিকে শুরু করা একটি:

এবং নীচের কেন্দ্রের একটি শুরু:

তবে যেহেতু একটি লাইন একবারে ইতিমধ্যে নির্বাচিত হয়ে গেলে একটি বিন্দু দিয়ে যাওয়ার অনুমতি দেওয়া হয় সেখানে উপরের মাঝখানে আরও একটি প্যাটার্ন শুরু হচ্ছে:

এই নির্দিষ্ট প্যাটার্নটিতে 3 টি সমাধান রয়েছে তবে নিদর্শনগুলির 1 থেকে 4 টির মধ্যে সমাধান হতে পারে [উদ্ধৃতি প্রয়োজন]

এখানে প্রত্যেকের কয়েকটি উদাহরণ দেওয়া হল:

1।

2।

3।

4।

ইনপুট / আউটপুট

কোনও নোডকে শূন্য থেকে নয়টি অন্তর্ভুক্ত, তাদের স্ট্রিং সমতা বা একটি থেকে i (বা A থেকে I) পর্যন্ত অক্ষর হিসাবে উপস্থাপন করা যেতে পারে। প্রতিটি নোডের অবশ্যই এই সেটগুলির মধ্যে একটির থেকে একটি অনন্য উপস্থাপনা থাকতে হবে।

নোড উপস্থাপনাযুক্ত অর্ডারযুক্ত ধারক দ্বারা একটি সমাধান উপস্থাপন করা হবে। নোডগুলি অবশ্যই সেগুলি ক্রমভাবে অর্ডার করতে হবে যেগুলি তারা মধ্য দিয়ে গেছে।

একটি প্যাটার্নটি জোড় নোডের একটি আনর্ডারড ধারক দ্বারা প্রতিনিধিত্ব করা হবে। প্রতিটি জুড়ি জোড়ায় দুটি পয়েন্টকে সংযোগ স্থাপন করে একটি প্রান্ত উপস্থাপন করে। প্যাটার্ন উপস্থাপনা অনন্য নয়।

আপনি স্ট্যান্ডার্ড ইনপুট পদ্ধতিগুলির মাধ্যমে ইনপুট হিসাবে একটি নিদর্শন উপস্থাপনা নেবেন এবং স্ট্যান্ডার্ড আউটপুট পদ্ধতির মাধ্যমে একই প্যাটার্ন তৈরি করে এমন সমস্ত সম্ভাব্য সমাধান আউটপুট পাবেন।

আপনি ধরে নিতে পারেন প্রতিটি ইনপুটটির কমপক্ষে একটি সমাধান হবে এবং কমপক্ষে 4 টি নোডকে সংযুক্ত করবে।

আপনি যদি ইচ্ছা করেন বা ভাষা নির্বাচনের দ্বারা বাধ্য হন তবে আপনি কোনও অর্ডারডের জায়গায় অর্ডারযুক্ত ধারকটি ব্যবহার করতে পারেন।

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

নিম্নলিখিত প্যাটার্নে সজ্জিত নোডগুলি সহ:

0 1 2
3 4 5
6 7 8

দিন {...}একটি unordered ধারক হতে পারে, [...]একটি আদেশ ধারক হতে, এবং (...)একজোড়া হও।

নিম্নলিখিত ইনপুট এবং ফলাফলগুলি মেলে উচিত

{(1,4),(3,5),(5,8)} -> {[1,4,3,5,8]}
{(1,4),(3,4),(5,4),(8,5)} -> {[1,4,3,5,8]}
{(0,4),(4,5),(5,8),(7,8)} -> {[0,4,5,8,7],[7,8,5,4,0]}
{(0,2),(2,4),(4,7)} -> {[0,1,2,4,7],[1,0,2,4,7],[7,4,2,1,0]}
{(0,2),(2,6),(6,8)} -> {[0,1,2,4,6,7,8],[1,0,2,4,6,7,8],[8,7,6,4,2,1,0],[7,8,6,4,2,1,0]}
{(2,3),(3,7),(7,8)} -> {[2,3,7,8],[8,7,3,2]}
{(0,7),(1,2),(1,4),(2,7)} -> {[0,7,2,1,4],[4,1,2,7,0]}
{(0,4),(0,7),(1,3),(2,6),(2,8),(3,4),(5,7)} -> {[1,3,4,0,7,5,8,2,6]}
{(1,3),(5,8)} -> {}

ছবি হিসাবে সমস্ত পরীক্ষার মামলার একটি ইমগুর অ্যালবাম এখানে পাওয়া যাবে । প্যাটার্নগুলি নীল সমাধানে লাল।

স্কোরিং

এটি কোড গল্ফ। সবচেয়ে কম বাইট জেতা


1
চমৎকার প্রশ্ন, আমি প্রায়শই ব্যক্তিগতভাবে একই বিস্মিত। :)
থ্রিএফএক্স

আপনি কি মস্তিষ্কের এই জবাব দিতে যাচ্ছেন? এখন এটি চিত্তাকর্ষক হবে। : পি
ডিজেএমসিএমহেম

কোন প্যাটার্নটি যা কেবলমাত্র এক উপায়ে সমাধান করা যেতে পারে? আমার মনে হয় তুচ্ছভাবে তীরগুলি বিপরীত করে আপনার কমপক্ষে 2 জন রয়েছে।
থ্রিএফএক্স

@ ডিজেএমসিমেহেম আমি চেষ্টা করব তবে আমি কোনও প্রতিশ্রুতি দিতে পারছি না
গম উইজার্ড

@ThreeFx চেষ্টা করুন এই নিজেকে জন্য। কারণ আপনি এমন কোনও নোডে থামতে পারবেন না যা ইতিমধ্যে পরিদর্শন করা হয়েছে তবে আপনি একটি নিদর্শন পেরিয়ে যেতে পারেন এটি দিকনির্দেশক করা যেতে পারে।
গম উইজার্ড

উত্তর:


3

পাইথন 2.7, 493 430 বাইট

exec("L=['012','345','678','036','147','258','048','246'];L+=[i[::-1]IL];S=sorted;F=lambda t:''.join(str(i)It)\ndef N(x):\n s=' '.join(F(S(i))Ix)\nIL:s=s.replace(i[::2],i[:2]+' '+i[1:])\n return S(set(s.split()))\ndef P(s):\n e=0\nIL:e|=-1<s.find(i[::2])<s.find(i[1])\n return[zip(s[:-1],s[1:]),L][e]\nx=N(input());print[F(i)I__import__('itertools').permutations({iI`x`if i.isdigit()})if x==N(P(F(i)))]".replace('I',' for i in '))

একক লাইন সংস্করণটি প্রোগ্রামটি exec("...".replace('I',' for i in '))এমনভাবে মুড়িয়ে দেয় যাতে সমস্ত ফর্ম-লুপ এবং জেনারেটর একটি একক দিয়ে সংক্ষিপ্ত করা যায় Iএবং আরও বেশি পঠনযোগ্য সংস্করণে 15 বাইট সংরক্ষণ করে:

L=['012','345','678','036','147','258','048','246'];L+=[i[::-1]for i in L]
S=sorted;F=lambda t:''.join(str(i)for i in t)
def N(x):
 s=' '.join(F(S(i))for i in x)
 for i in L:s=s.replace(i[::2],i[:2]+' '+i[1:])
 return S(set(s.split()))
def P(s):
 e=0
 for i in L:e|=-1<s.find(i[::2])<s.find(i[1])
 return[zip(s[:-1],s[1:]),L][e]
x=N(input())
print[F(i)for i in __import__('itertools').permutations({i for i in`x`if i.isdigit()})if x==N(P(F(i)))]

প্রোগ্রামটি দেখানো পদ্ধতিতে (যেমন {(1,4),(3,4),(5,4),(8,5)}) অথবা স্ট্রিংয়ের তালিকা হিসাবে (উদাহরণস্বরূপ ['14','34','54','85']) (বা অন্য পাইথন বন্ধুত্বপূর্ণ ফর্ম্যাটে) ইনপুট নেয় এবং স্ট্রিংগুলির তালিকা হিসাবে আউটপুট ফেরত দেয়। সুতরাং আমরা প্রযুক্তিগতভাবে আদেশযুক্ত পাত্রে একটি আদেশযুক্ত ধারক আছে।

ফাংশনটি Nএকটি প্যাটার্নকে স্বাভাবিক করে তোলে যাতে দুটি নিদর্শন সহজেই তুলনা করা যায়। সাধারণীকরণটি জোড়গুলি ডোনোটিং করে প্রান্তগুলি সাজায় (সুতরাং '02'পরিবর্তে '20') ডাবল প্রান্তগুলি প্রসারিত করতে স্ট্রিং প্রতিস্থাপন ব্যবহার করুন (উদাহরণস্বরূপ '02'হয়ে ওঠে '01 12'), নকলগুলি সরানোর জন্য প্রান্তগুলিকে একটি সেটে বিভক্ত করে এবং ফলাফলটি সাজান।

ফাংশনটি Fইনটস / স্ট্রিংগুলিকে স্ট্রিংয়ের টিপলকে সমতল করে, যাতে আমরা বিভিন্ন উপায়ে উত্পাদিত পাথগুলিকে স্বাভাবিক করতে পারি।

তালিকায় Lস্ক্রিনের সমস্ত লাইন রয়েছে।

তারপরে আমরা সমস্ত সংখ্যার প্রতিটি ক্রমিকাকে স্বাভাবিকীকরণের প্যাটার্নে নিয়ে যাই এবং একটি বৈধ পাথ গণনা করি বা Lযদি অবৈধ (যা কখনই আসল পাথের মতো জোড়ের তালিকায় স্বাভাবিক হয় না), অথবা জোড়ার ক্ষেত্রে অর্ডার নোডগুলি পরিদর্শন করা জোড়াগুলির একটি তালিকা। যদি এটি একই ধাঁচে স্বাভাবিক হয় তবে আমাদের একটি বৈধ সমাধান রয়েছে এবং এটি চূড়ান্ত তালিকায় অন্তর্ভুক্ত করুন।

প্রধান চেক বিন্যাস যাচাই করতে যেমন একটি স্ট্রিং প্রয়োজন sহয় -1<s.find(i[::2])<s.find(i[1])যা লাইন দিয়ে একটি ত্রুটি সনাক্ত i। রেখার সাথে উদাহরণস্বরূপ '210'কোডটি একটি ত্রুটি সনাক্ত করে যদি '20'ঘটে থাকে (যেমন এটি সূচক -1 এর চেয়ে বড়) এবং এর '1'পরে ঘটে। আমাদের ১ টি ঘটছে না তা নিয়ে চিন্তা করার দরকার নেই কারণ 1 যখন ইনপুটটিতে ছিল না তখন সাধারণ প্যাটার্নে প্রদর্শিত হবে।


উল্লেখ্য: আমি প্রতিস্থাপন জানেন str(i)for i in t সঙ্গে map(str,t) এবং {i for i in`x`if i.isdigit()} সঙ্গে set('012345678')&set(`x`) মূল কোড খাটো করা, কিন্তু এই এখনও সামান্য আর যে স্থলে হবে I


2
Falseহতে পারে 1<0এবং সেখানে একটি অকেজো সাদা জায়গা আছে F(i) for। +1 টি।
ইয়াতসি

@TuukkaX ধন্যবাদ, আমি তোমার মুখে করতলযুক্ত যখন আমি দেখলাম বাম Falseহবে।
লিনাস

['012','345','678','036','147','258','048','246']'012 345 678 036 147 258 048 246'.split()'-1 বাইট জন্য হতে পারে ।
মিঃ এক্সকোডার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.