সর্বোত্তম ইহুদি টোনায়েল কাটা অ্যালগরিদম কী?


118

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

আমাদের সম্ভাব্য ব্যবহারকারীর বেসের একটি বিশাল শতাংশ সম্ভবত ইহুদি হবে এবং স্পষ্টতই, অনুক্রমিক ক্রমে নখগুলি ( বা নখ ) ছাঁটাই না করার একটি traditionতিহ্য রয়েছে

এই traditionতিহ্যের যথাযথ প্রয়োগ সম্পর্কে মতভেদ রয়েছে বলে মনে হয়, তবে আমরা মনে করি যে নীচের নিয়মগুলি এমন লোকদের থাকার জন্য যথেষ্ট, যাদের ধর্মীয় অনুশীলনগুলি যাতে পায়ের আঙ্গুলগুলি কাটতে নিষেধ করে:

  • দুটি লাগোয়া নখের লাগোয়া টানা টানা কাটা উচিত নয়
  • বাম পায়ে কাটার ক্রমটি ডান পায়ের ক্রমটির সাথে মেলে না
  • পরপর দুটি রান কাটার ক্রম একই হওয়া উচিত নয়। সিকোয়েন্সগুলি সহজে অনুমানযোগ্য হওয়া উচিত নয়, তাই বিকল্প সিকোয়েন্সটিকে হার্ডকোডিংয়ের কাজ হয় না।

এইভাবে আমরা অঙ্গুলি সংখ্যা নির্ধারণ করার সিদ্ধান্ত নিয়েছি:

5 4 3 2 1  1 2 3 4 5
Left foot  Right foot

সমস্যাটি সমাধানের জন্য আমার কাছে লিখিত কোড রয়েছে, তবে ব্যবহৃত অ্যালগরিদমটি সাব-অনুকূল রয়েছে: আসলে, সবচেয়ে খারাপ ক্ষেত্রে পারফরম্যান্স হ'ল (∞) । এটি যেভাবে কাজ করে তা বোগোসর্টের সাথে তুলনীয় । এখানে ব্যবহৃত প্রকৃত কোডের সিউডোকোড সরলীকরণ:

function GenerateRandomSequence
   sequence = Array[5]
   foreach (item in sequence)
       item = RandomNumberBetween(1,5)
   return sequence

function GetToenailCuttingOrder
   while (true)
      sequence = GenerateRandomSequence()
      if (!AllItemsAreUnique(sequence))
         continue
      if (NoTwoAdjacentItemsHaveConsecutiveNumbers(sequence))
         return sequence

do
    leftFootSequence = GetToenailCuttingOrder()
    rightFootSequence = GetToenailCuttingOrder()
until (leftFootSequence != rightFootSequence &&
       leftFootSequence != leftFootSequenceFromLastRun &&
       rightFootSequence != rightFootSequenceFromLastRun)

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

আমি বুঝতে পারি যে বর্তমানে আমি এটিটি করছি তা অত্যন্ত ভয়ঙ্কর, তবে আরও ভাল উপায় নিয়ে আসতে আমার সমস্যা হচ্ছে। আপনারা কেউ কি আরও মার্জিত এবং পারফরম্যান্ট অ্যালগরিদম প্রস্তাব করতে পারেন?


28
এটি হোমওয়ার্ক সমস্যার মতো গন্ধযুক্ত। অন্যথায়, কেন কেবল ক্রমটি হার্ডকোড নয়?
মাইকেল ব্রাউন

24
আমি নখদ্বার কামড়ানোর কথা শুনেছি, তবে পায়ের নখ?
উড়ে

63
একটি পায়ের আঙ্গুলের কাটিয়া মেশিনের চিন্তাভাবনা বেশ ভয়ঙ্কর। আমি আশা করি এটি প্রকৃতপক্ষে হোমওয়ার্ক এবং ঘটনার অপেক্ষায় বেদনাদায়ক ট্র্যাজেডি নয়।
পিটার পুনরুদ্ধার করুন

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

41
আমি সত্যটি পছন্দ করি যে ইহুদি tradition
তিহ্য

উত্তর:


87

আপনি কোনও বিধিনিষেধ ছাড়িয়ে সমস্ত সম্ভব টেনেল কাটার সিকোয়েন্স তৈরি করতে পারেন এবং তারপরে theর্ষা বিধি লঙ্ঘনকারী সমস্ত সিকোয়েন্সগুলি ফিল্টার আউট করতে পারেন। ভাগ্যক্রমে, মানুষের পায়ে প্রতি পাঁচটি পায়ের আঙ্গুল রয়েছে *, সুতরাং সেখানে রয়েছে মাত্র 5 টি! = 120 অবিরুদ্ধ সিকোয়েন্স।

পাইথনের উদাহরণ:

#seq is only valid when consecutive elements in the list differ by at least two.
def isValid(seq):
    for i in range(len(seq)-1):
        a = seq[i]
        b = seq[i+1]
        if abs(a-b) == 1:
            return False
    return True


from itertools import ifilter, permutations
validseqs = ifilter(isValid, permutations([1,2,3,4,5]))
for i in validseqs:
    print i

(1, 3, 5, 2, 4)
(1, 4, 2, 5, 3)
(2, 4, 1, 3, 5)
(2, 4, 1, 5, 3)
(2, 5, 3, 1, 4)
(3, 1, 4, 2, 5)
(3, 1, 5, 2, 4)
(3, 5, 1, 4, 2)
(3, 5, 2, 4, 1)
(4, 1, 3, 5, 2)
(4, 2, 5, 1, 3)
(4, 2, 5, 3, 1)
(5, 2, 4, 1, 3)
(5, 3, 1, 4, 2)

আপনার "একই অনুক্রমের পুনরাবৃত্তি না" নিয়মটি প্রয়োগ করতে, আপনি কেবল উপরের চারটি সিকোয়েন্সটি বেছে নিতে পারেন এবং সেগুলি পর্যায়ক্রমে ব্যবহার করতে পারেন। এখানে কেবল ধরা হচ্ছে আপনি যদি দুটি বড় পায়ের আঙ্গুলটিকে "পরপর" হিসাবে গণনা করেন তবে আপনি দুটি ক্রম বেছে নিতে পারবেন না যা শেষ হয় এবং যথাক্রমে 1 দিয়ে শুরু হয়।

* আপনি একটি নম্বর অফফিজারফুট ভেরিয়েবল বানাতে চাইতে পারেন, আপনার ক্লায়েন্টগুলির মধ্যে যদি কেউ আপনার প্রত্যাশার চেয়ে কম পায়ের আঙ্গুলগুলি দেখা দেয় তবে আপনি সহজেই পরে এটি পরিবর্তন করতে পারেন।


22
তুমি ঠিক বলছো! এমনকি আমি পলিট্যাক্টলি লোকদের কখনও বিবেচনা করি নি । এগুলি বাদ দেওয়া ভুল হবে।
পিটার ওলসন

1
কম পায়ের আঙ্গুলের মূলটি মূল অ্যালগোরিদম দ্বারা আবৃত থাকে (5 টি পায়ের আঙ্গুলের জন্য গ্রহণযোগ্য ক্রম 4 টি আঙ্গুলের জন্য গ্রহণযোগ্য)। এটি সেই পাগল অতিরিক্ত বৃদ্ধাঙ্গুলি যা সমস্যার সৃষ্টি করে;)
উড়ে যায়

4
খুব সুন্দর সমাধান! যদিও আমি "একই ক্রমের পুনরাবৃত্তি করব না" এর কাছে কিছুটা ভিন্ন different কেবল মেশিনটিকে মনে রাখবেন যে এটি কোন ক্রমটি শেষবার ব্যবহার করেছে এবং পরবর্তী এলোমেলো (তবে একই নয়) ব্যবহার করুন। এটি দ্বিতীয় পায়ের পাশাপাশি নতুন ক্লায়েন্টদের জন্যও কাজ করে এবং এটি 4 টি সিকোয়েন্সের সাথে স্টিক করার চেয়ে বেশি এলোমেলো।
জ্যাকব

3
একজনেরও অবদান থেকে অনুপস্থিত অঙ্গুলি বিবেচনা করা প্রয়োজন, যেমন 3 য় পায়ের আঙুল অনুপস্থিত। উদাহরণস্বরূপ, 3 য় পদাঙ্গুলি অপসারণের ফলে এখন 2 এবং 4 এর পায়ের আঙ্গুলকে অনুক্রমিক বলে বিবেচনা করা হয় This
সিডেসাক

2
এক পায়ে মাত্র 2 টি পায়ের আঙ্গুলের লোকদের কী হবে? তাদের পায়ের নখ কাটা অনুমতি দেওয়া হয়?
matiasg

26

এখানে আপনার সীমাবদ্ধতার একটি সীমাবদ্ধ সংখ্যা রয়েছে।

  1. Perm 1,2,3,4,5} এর সমস্ত অনুমতি তৈরি করুন} এখানে রয়েছে মাত্র 120।
  2. প্রয়োজনীয়গুলি পূরণ করে না এমনগুলি প্রত্যাখ্যান করুন এবং অবশিষ্ট সেটটি স্থায়ীভাবে সংরক্ষণ করুন।
  3. এলোমেলোভাবে দুটি পৃথক ক্রম চয়ন করুন। আপনি গতবার কোনটি ব্যবহার করেছেন তা মনে রাখবেন।

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


20

আসলে, আমি আপনার মূল অ্যালগরিদম সেরা পছন্দ করি।

যেহেতু 120 এর মধ্যে 14 ক্রমশক্তি কাজ করে, 120 এর মধ্যে 106 কাজ করে না। সুতরাং প্রতিটি চেকের ব্যর্থ হওয়ার সম্ভাবনা রয়েছে 106/120।

তার মানে ব্যর্থতার প্রত্যাশিত সংখ্যাটি হ'ল:

1*(106/120) + 2*(106/120)^2 + 3*(106/120)^3 + ...

এই অসীম সিরিজটি যোগ করতে খুব বেশি কঠিন নয়:

S       = 1*x + 2*x^2 + 3*x^3 + ...

এক্স দ্বারা গুণ:

x*S     =       1*x^2 + 2*x^3 + ...

বিয়োগ:

S - x*S = x + x^2 + x^3 + ...

আবার এক্স দিয়ে গুণ করে আবার বিয়োগ করুন:

x*S - x^2*S = x^2 + x^3 + ...
S - 2*x*S + x^2S = x
S*(1-x)^2 = x
S = x/(1-x)^2

এক্স = 106/120, এস = 64.9 থেকে

সুতরাং, আপনার লুপের জন্য কেবলমাত্র 65 টি পুনরাবৃত্তি প্রয়োজন সমাধান অনুসন্ধানের জন্য ।

বলুন, এক হাজার পুনরাবৃত্তি হওয়ার সম্ভাবনা কী?

ভাল, কোনও একক পুনরাবৃত্তি ব্যর্থ হওয়ার সম্ভাবনা 104/120, সুতরাং 1000 পুনরাবৃত্তির ব্যর্থতার সম্ভাবনা (104/120) ^ 1000, যা 10 ^ (- 63) এর মতো কিছু। অর্থাৎ, আপনি কখনই এটি আপনার জীবদ্দশায় ঘটতে দেখবেন না, এবং সম্ভবত মহাবিশ্বের জীবদ্দশায় তা ঘটবে না।

কোনও প্রাক্পম্পিউটেড টেবিল নেই, বিভিন্ন সংখ্যক আঙ্গুল / পায়ের আঙুল / হাত / পায়ের সাথে সহজে অভিযোজন, বিভিন্ন রোলসেটে সহজে অভিযোজন ... কী পছন্দ হয় না? ক্ষতিকারক ক্ষয় এক দুর্দান্ত জিনিস।

[হালনাগাদ]

ওফস, আমি মূল সূত্রটি ভুল পেয়েছি ... যেহেতু আমার সম্ভাবনাগুলি 1: :-) এর সমষ্টি হয় না

ব্যর্থতার প্রত্যাশিত সংখ্যার জন্য সঠিক অভিব্যক্তি হ'ল:

0*(14/120) + 1*(106/120)*(14/120) + 2*(106/120)^2*(14/120) + ...

(উদাহরণস্বরূপ, ঠিক দুটি ব্যর্থতা পেতে, আপনার সাফল্যের পরে দুটি ব্যর্থতা প্রয়োজন Two দুটি ব্যর্থতার সম্ভাবনা থাকে (106/120) ^ 2; একটি সাফল্যের সম্ভাবনা থাকে (14/120); ওজন পেতে একসাথে এগুলিকে গুণান "2" শব্দটি।)

সুতরাং আমার এস (1-x) (অর্থাত, 14/120) এর একটি ফ্যাক্টর দ্বারা বন্ধ রয়েছে। ব্যর্থতার আসল প্রত্যাশিত সংখ্যাটি মাত্র x / (1-x) = 106/14 = 7.57। সুতরাং এটির জন্য এটি কেবল 8-9 পুনরাবৃত্তি লাগে কোনও সমাধান (7.5 ব্যর্থতা এবং এক সাফল্য) পেতে এটি পেতে ।

আমার মনে হয় "1000 ব্যর্থতা" মামলার জন্য আমার গণিত এখনও সঠিক।


1
বাক্সের বাইরে চিন্তা করতে এবং সমস্যাটি দেখার জন্য আলাদা উপায় দেওয়ার জন্য +1।
স্পষ্টত

9

সুস্পষ্ট: কাজ করে এমন একটি আদেশ এবং হার্ড কোড এটি সন্ধান করুন। তবে আমি মনে করি না আপনি এটি করতে চান।

আপনি যেভাবে এটি করছেন তার চেয়ে আপনি আরও বেশ ভাল জেনেট তৈরি করতে পারেন। আপনাকে প্রত্যাখ্যানের নমুনা দেওয়ার দরকার নেই। প্রাথমিকভাবে বাছাই করা ক্রিয়াকলাপে (1, 2, .. 5) ফিশার ইয়েটসের শ্যাফেল ব্যবহার করুন এবং আপনার এলোমেলোভাবে ক্রয় ছাড়তে হবে। http://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle

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


2

এখানে সত্যিই নতুন কিছু নয়, কেভিন ইতিমধ্যে পোস্ট করেছেন একই সমাধান, তবে এটি কীভাবে কার্যকরী ভাষায় অনুবাদ করে তা দেখতে আমি আকর্ষণীয় মনে করি। এই ক্ষেত্রে, গাণিতিক :

Extract[#,Position[Times @@ (Abs@#-1)&/@ Differences/@ #, Except@0, 1][[2 ;;]]]  
         &@ Permutations@Range@5

কিছু ব্যাখ্যা:

Permutations@Range@5 Calculates all permutations of {1, 2, 3, 4, 5}

Differences          Calculate the differences between adjacent elements
                     (we wish to discard all lists containing +1 or -1)

Times @@ (Abs@#-1)   Abs turns the -1s into +1s, and then to zeros by subtracting
                     one, then TIMES multiplies all elements, giving zero when 
                     the original result of "Differences" contained a +1 or a -1

Position ... Except@0 Returns the position of the non zero results

Extract              Returns the original elements according to the calculated 
                     positions

চূড়ান্ত ফলাফল:

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

সম্পাদন করা

বা, ব্যাখ্যা করা আরও কঠিন তবে সংক্ষিপ্ত:

Reap[ Table[ If[Times @@ (Abs@Differences@i - 1) != 0, Sow@i],
           {i, Permutations@Range@5}]][[2, 1]]

0

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

14 সন্ধানের জন্য অ্যালগোরিদমের জাভাস্ক্রিপ্ট বাস্তবায়ন:

function swap (a, i, j) {
  var temp = a[i]
  a[i]=a[j]
  a[j]=temp
}

function permute (b, n, a) {
  if (n==4) {
    b.push(a.slice(0)) //copy array
  }
  else {
    for (var i = n; i < 5; i++) {
      swap(a,n,i)
      permute(b, n+1, a)
      swap(a,n,i)
    }
  }
}

var a = [1,2,3,4,5]
var b = []
var c = []

permute(b,0,a)

for (var i = 1; i < b.length-1; i++) {
  var good = true
  for (var j = 0; j < b[i].length; j++) {
    if (Math.abs(b[i][j-1]-b[i][j]) < 2 || Math.abs(b[i][j]-b[i][j+1]) < 2) {
      good = false
    }
  }
  if (good) c.push(b[i].join(''))
}

console.log(c)

সম্পাদনা: ক্রমগুলি এলোমেলোভাবে উত্পন্ন করতে হবে যে নতুন প্রয়োজনীয়তা সহজেই পূরণ করা যায় না। আপনি সম্ভবত সর্বোত্তমভাবে যা করতে পারেন তা হল সিউডোরেন্ডোমালি সেগুলি উত্পন্ন করা, যা সময়ের আগে তাদের কঠোর কোডিং করার মতোই নির্বিচারবাদী এবং তাই কারও কুসংস্কারকে সন্তুষ্ট করা উচিত নয়।

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