হাউসডর্ফ দূরত্ব গণনা করুন


21

ভূমিকা

Hausdorff দূরত্ব একটি মেট্রিক স্থান দুটি সাব-সেট নির্বাচন মধ্যে পার্থক্য পরিমাপ। স্বজ্ঞাতভাবে, একটি মেট্রিক স্পেস একটি অন্তর্নির্মিত দূরত্ব ফাংশন সহ কিছু সেট; এই চ্যালেঞ্জে আমরা সাধারণ দূরত্ব সহ প্রাকৃতিক সংখ্যা ব্যবহার করব d(a, b) := abs(a - b)। দুটি খালি খালি সীমাবদ্ধ সেটগুলির মধ্যে হসডর্ফ দূরত্ব Aএবং এর Bদ্বারা দেওয়া হয়

max(max(min(d(a, b) for b in B) for a in A),
    max(min(d(a, b) for a in A) for b in B))

পাইথন জাতীয় স্বরলিপি। হাউসডর্ফ দূরত্বটি যে উপাদানটির Aজন্য নিকটতম উপাদানটির দূরত্ব Bসর্বাধিক এবং সেই উপাদানটির Bজন্য নিকটতম উপাদানটির দূরত্ব Aসর্বাধিক এবং তারপরে এই দূরত্বগুলির সর্বাধিক গ্রহণ করে গণনা করা যেতে পারে । অন্য কথায়, যদি Hausdorff দূরত্ব d, তারপর প্রতিটি উপাদান Aদুরুত্বে dকিছু উপাদান B, এবং তদ্বিপরীত।

ইনপুট

আপনার ইনপুটটি পূর্ণসংখ্যার একক তালিকা। এটিতে কেবলমাত্র উপাদান রয়েছে 0,1,2,3, যা তালিকার প্রদত্ত সূচকটি Aনা B, কেবল A, কেবল B, বা উভয় Aএবং এর উপাদান নয় কিনা তা নির্দেশ করে B। উদাহরণস্বরূপ, ইনপুটটির [0,1,1,0,2,3]অর্থ হ'ল A = {1,2,5}এবং B = {4,5}, যদি আমরা 0-ভিত্তিক সূচী ব্যবহার করি (যা আমাদের মেট্রিক্স অনুবাদ অবিসক্ত হিসাবে কোন পার্থক্য করে না)।

আউটপুট

আপনার আউটপুট মধ্যে Hausdorff দূরত্ব Aএবং B; উপরের উদাহরণে, এটি 3। যদি দুটি সেট খালি থাকে, তবে দূরত্বটি সংজ্ঞায়িত করা হয়নি, এবং আপনি ফিরে আসবেন -1

বিধি

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

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

[] -> -1
[0] -> -1
[0,1,0] -> -1
[2,0,0,2] -> -1
[0,1,2,3] -> 1
[0,3,3,0,0,0,0,3] -> 0
[1,0,0,1,0,0,1,3,1] -> 7
[1,0,0,0,0,3,0,0,0,0,2] -> 5
[0,1,1,3,1,3,2,1,1,3,0,3] -> 2
[2,2,2,1,2,0,3,1,3,1,0,3] -> 3
[1,3,0,2,0,2,2,1,0,3,2,1,1,2,2] -> 2
[1,0,1,1,2,0,1,2,3,1,0,0,0,1,2,0] -> 4

আপনার সমীকরণ, আমি বিশ্বাস করি যে এটা অনেক অতি দীর্ঘ, যেমন max(max(min(d(a, b) for b in B) for a in A))যথেষ্ট হওয়া উচিত। এটি হ'ল d(a,b)পরম মানটি দেয় এবং তাই উভয় সর্বোচ্চ ফাংশন প্রতিবার একই সংখ্যা ফেরত দেয়।
নাথান মেরিল

6
@ নাথানমিরিল এটি হতে পারে যে প্রতিটি উপাদানগুলির Aএকটির খুব কাছাকাছি Bঅবস্থান রয়েছে তবে এর Bথেকে খুব দূরের উপাদান রয়েছে A(উদাহরণস্বরূপ, যদি Aএটি একটি উপসেট হয় B)। সেক্ষেত্রে সংক্ষিপ্ত সূত্রটি ভুল।
জাগারব

উত্তর:


7

সিজেম, 53 52 46 38 37 বাইট

3,q~f{f&:L,{L=},}$~ff{-z}_z+::e<W+:e>

STDIN এ সিজ্যাম স্টাইলের অ্যারে হিসাবে ইনপুট নেয়:

[0 1 2 3]

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

ব্যাখ্যা

প্রথমত, আমরা দুটি এবং এ এবং বি সেট দুটি পেতে ইনপুটটি পার্স করব:

3,q~f{f&:L,{L=},}$~
3,                  "Push [0 1 2]. 1 is for A, 2 is for B, and 0 we can luckily ignore
                     as we'll see later.";
  q~                "Read and evaluate the input.";
    f{          }   "Map this block onto the [0 1 2] array, copying in the input for
                     each iteration.";
      f&:L          "Take the bitwise AND with each element of the input and store the
                     result in L.";
          ,{  },    "Get the length N, and filter the range [0 .. N-1] by evaluating
                     the block for each element.";
            L=      "Check if the bitwise AND at that index yielded something non-zero.
                     This gives an empty array for 0, A for 1 and B for 2.";
                 $  "Sort the three arrays. This has two important effects: a) it moves
                     the empty array resulting from 0 to the front, and b) if only one
                     of A and B is empty, it moves the non-empty one to the end.";
                  ~ "Unwrap the array, dumping all three sets on the stack.";

এবং এখন আমরা নিখুঁত পার্থক্য খুঁজে পাই এবং মিনিটের সর্বাধিকটি নির্বাচন করি:

ff{-z}_z+::e<W+:e>
ff{-z}             "Turn A and B into a matrix of absolute differences.";
      _z           "Duplicate and transpose.";
        +          "Add the two together, so I've got one row of distances for
                    each element in either A or B.";
         ::e<      "Find the minimum of each row.";
             W+    "Add a -1 in case one set was empty.";
               :e> "Get the overall maximum.";

নোট করুন যে আমরা খালি অ্যারেটিকে 0স্ট্যাকের নীচে সর্বদা ফলাফলের ফলাফলটি রেখেছি , কিন্তু খালি অ্যারেগুলি আউটপুটটিতে কোনও অবদান রাখে না।


5

সিজেম, 57 56 52 বাইট

আমি মনে করি এটি কিছুটা গল্ফ করা যেতে পারে তবে এখানে যায়:

q~ee_{W=2%},\{W=1>},]0ff=_W%]{~ff-{:z$1<~}%W+$W=}/e>

ইনপুট সিজেএম স্টাইলযুক্ত তালিকার মতো চলে।

[1 0 0 0 0 3 0 0 0 0 2]

5

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

কোডটি দুটি ভাগে বিভক্ত:

তালিকাগুলিতে ইনপুটটি পার্স করা Aএবং B:

q~ee_{W=2%},\{W=1>},]0ff=_W%]
q~                               "Eval the input array";
  ee                             "Enumerate and prepend index with each element. For ex:
                                  [5 3 6]ee gives [[0 5] [1 3] [2 6]]";
    _{W=2%},                     "Make a copy and filter out elements with value 1 or 3";
            \{W=1>},             "On the original, filter elements with value 2 or 3";
                    ]            "Wrap stack in an array. Stack right now contains
                                  enumerated A and B in an array";
                     0ff=        "Get the index of the enumerated arrays. Stack is [A B]";
                         _W%     "Make a copy and swap order. Stack is now [A B] [B A]";
                            ]    "Wrap this in an array";

দুই জোড়া প্রয়োজন ক্রিয়া করা Aএবং B:

{~ff-{:z$1<~}%W+$W=}/e>
{                  }/            "Run this loop for both the pairs, [A B] and [B A]"
 ~ff-                            "Unwrap [A B] and take difference of every pair";
     {      }%                   "For each row in the matrix difference";
      :z$                        "abs each term and then sort";
         1<~                     "Take only the first element of the array";
              W+                 "Add -1 to compensate for an empty array";
                $W=              "Take max";
                     e>          "Take max of the two maximums";

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


5

লুয়া, 235 বাইট

অবশ্যই বিজয়ী নয়, তবে একটি মজার চ্যালেঞ্জ।

A={}B={}c={}d={}m=math p=m.min q=m.max u=unpack for k=1,#arg do for h=0,1 do if
arg[k]/2^h%2>=1 then A[#A+1]=k for i=1,#B do l=m.abs(B[i]-k)d[i]=p(d[i]or
l,l)c[#A]=p(c[#A]or l,l)end end A,B=B,A c,d=d,c end end
print(q(q(-1,u(c)),u(d)))

ইনপুট এর মতো কাজ করে:

lua hausdorff.lua <space-separated-sequence>

... এবং এখানে একটি পরীক্ষা স্ক্রিপ্ট রয়েছে:

local testcase = arg[1] or 'hausdorff.lua'
print('testing '..testcase)
local function run(args) 
    return function(expected)
        local result = tonumber(
            io.popen('lua.exe '..testcase..' '..args):read'*a':match'%S+')
        print(args..' -> '..expected..' :: '..result)
        assert(result == expected,
            ("for input %q expected %s but got %s"):format(
                args, expected, result))
    end
end
run''(-1)
run'0'(-1)
run'0 1 0'(-1)
run'2 0 0 2'(-1)
run'0 1 2 3'(1)
run'0 3 3 0 0 0 0 3'(0)
run'1 0 0 1 0 0 1 3 1'(7)
run'1 0 0 0 0 3 0 0 0 0 2'(5)
run'0 1 1 3 1 3 2 1 1 3 0 3'(2)
run'2 2 2 1 2 0 3 1 3 1 0 3'(3)
run'1 3 0 2 0 2 2 1 0 3 2 1 1 2 2'(2)
run'1 0 1 1 2 0 1 2 3 1 0 0 0 1 2 0'(4)

... উৎপন্ন ...

testing hausdorff.lua
 -> -1 :: -1
0 -> -1 :: -1
0 1 0 -> -1 :: -1
2 0 0 2 -> -1 :: -1
0 1 2 3 -> 1 :: 1
0 3 3 0 0 0 0 3 -> 0 :: 0
1 0 0 1 0 0 1 3 1 -> 7 :: 7
1 0 0 0 0 3 0 0 0 0 2 -> 5 :: 5
0 1 1 3 1 3 2 1 1 3 0 3 -> 2 :: 2
2 2 2 1 2 0 3 1 3 1 0 3 -> 3 :: 3
1 3 0 2 0 2 2 1 0 3 2 1 1 2 2 -> 2 :: 2
1 0 1 1 2 0 1 2 3 1 0 0 0 1 2 0 -> 4 :: 4

4

পাইথ, 43 40 39 38 বাইট

J+m0yQQLq3.|Fb?eS.e&Yfy:J-kT+hkT0JyJ_1

আমার অ্যালগরিদম সরাসরি ইনপুট স্ট্রিংয়ে পরিচালনা করে এবং কখনই এই সংখ্যাগুলিকে রূপান্তর করে না। এটি শুধুমাত্র একবারে সর্বনিম্ন এবং সর্বনিম্ন একবার গণনা করে।

একটি বাইট বাঁচানোর জন্য @ আইস্যাচকে ধন্যবাদ Thanks

এটি অনলাইনে ব্যবহার করে দেখুন: পাইথ সংকলক / নির্বাহক

ব্যাখ্যা:

প্রথমে আমি ইনপুটটির সামনে প্রচুর জিরো .োকাব।

          implicit: Q = input()
    yQ    powerset(Q)
  m0yQ    map each element of the powerset to 0 (creates 2^Q zeros, I said lots)
 +    Q   zeros + Q
J         assign to J

তারপরে আমি একটি সহায়ক ফাংশন সংজ্ঞায়িত করি y, যা কোনও তালিকার সূচকগুলি (ইনপুটটির মতো) দুটি সেট এ এবং বিজিতে উপস্থিত হয় কিনা y([0, 1, 0, 0, 1, 1]) = Falseতা বলে y([0, 1, 0, 2]) = y([3]) = True

Lq3.|Fb
L          define a function y(b), which returns _
   .|Fb       fold b by bitwise or
 q3            == 3

তারপরে আমি প্রথমে পরীক্ষা করে দেখি রেজাল্ট কিনা -1

?...yJ_1   print ... if numbers appear in both sets (`yJ`) else -1   

আকর্ষণীয় জিনিস এখন:

  .e              J    map each pair k,Y in enumerate(J) to:
    &Y                   Y and ... (acts as 0 if Y == 0 else ...)
      f          0       find the first number T >= 0, where:
       y                    indices appear in both sets in the substring
        :J-kT+hkT           J[k-T:k+T+1]
eS                     sort and take last element (maximum)

লক্ষ্য করুন, আমি সর্বদা একটি সংখ্যাটি খুঁজে পাব T, কারণ আমি ইতিমধ্যে জানি যে তালিকাতে উভয় সেটে সূচকগুলি উপস্থিত রয়েছে length(Q)। সংখ্যাটি সর্বাধিক । জিরো সন্নিবেশ করানোর কারণও এটি। যদি কমপক্ষে length(Q)শূন্যগুলি sertedোকানো থাকে k-Tতবে সর্বদা থাকে >= 0, যা তালিকাগুলির জন্য স্লাইসিংয়ের জন্য প্রয়োজনীয়। তাহলে আমি 2^length(Q)শূন্যের পরিবর্তে শূন্যগুলি do োকাব কেন length(Q)? পরীক্ষার ক্ষেত্রে []আমার কমপক্ষে 1 শূন্য দরকার, অন্যথায় yJত্রুটি ফিরে আসবে।


><Cabহিসাবে একই :Cba
isaacg

পরীক্ষার
কেসগুলিতে

3

গণিত, 88 বাইট

Max[Min/@#,Min/@Thread@#,-1]/.∞->-1&@Outer[Abs[#-#2]&,p=Position;p[#,1|3],p[#,2|3],1]&

1
খুব সুন্দর উত্তর। হাউসডর্ফ দূরত্বের আরও সাধারণ সন্ধানের জন্য, এমন একটি ব্যবহার করতে পারে m=MaxValue;Max[m[RegionDistance[#[[1]],s],s\[Element]#[[2]]]/.m[__]->-1&/@{#,Reverse@c}]& যা এর পরে বহুমাত্রিক বস্তুগুলিতে প্রয়োগ করা যেতে পারে%@{Sphere[],Line[{{1,1,0},{3,3,3}}]}
কেলি লোডার

3

হাস্কেল, 145 126 124 বাইট

s t x=[e|(e,i)<-zip[0..]x,t i]
d#e=maximum[minimum[abs$i-j|j<-e]|i<-d]
[]%_= -1
_%[]= -1
d%e=max(d#e)$e#d
f x=s(>1)x%s odd x

পরীক্ষা রান:

*Main> map f [[], [0], [0,1,0], [2,0,0,2], [0,1,2,3],
              [0,3,3,0,0,0,0,3], [1,0,0,1,0,0,1,3,1],
              [1,0,0,0,0,3,0,0,0,0,2], [0,1,1,3,1,3,2,1,1,3,0,3],
              [2,2,2,1,2,0,3,1,3,1,0,3],
              [1,3,0,2,0,2,2,1,0,3,2,1,1,2,2],
              [1,0,1,1,2,0,1,2,3,1,0,0,0,1,2,0]]

[-1,-1,-1,-1,1,0,7,5,2,3,2,4]

sএকটি প্রাকটিক্যাল tএবং ইনপুট তালিকা অনুযায়ী প্রাকৃতিক সংখ্যাগুলি ফিল্টার করে x#এটা পরামিতি সর্বোচ্চ দূরত্ব হিসাব dএবং e%খালি সেট A অথবা B ক্যাচ বা চূড়ান্ত সর্বাধিক লাগে d#eএবং e#dfপ্রধান ফাংশন যা %সেট এ এবং বি সহ কল করে

সম্পাদনা করুন: @ জগারব সংরক্ষণের জন্য প্রচুর বাইট পেয়েছে; @ ali0sha আর একটি ২. ধন্যবাদ!


mod 2অপ্রয়োজনীয় বলে মনে হয়। আপনি সংজ্ঞা aএবং bস্পষ্টভাবে না থেকে উপকার পেতে পারেন ।
জাগারব

আপনি এতে 2 বাইট বাঁচাতে পারবেন []%_= -1- তবে আপনি আমার প্রয়াসকে এই দিকে হটিয়ে দিয়েছেন :)
আলেকজান্ডার-ব্রেট

3

পার্ল, 56 55

জন্য +2 যোগ করা হয়েছে -lp

ইনপুট তালিকাটি ফাঁকা ছাড়াই স্টিডিনে দেওয়া উচিত, যেমন:

echo 1011201231000120 | perl -lp hausdorf.pl

hausdorf.pl:

s%%$z=$_&=$p|=$'|P.$p;$q+=!!y/12/3/%eg;$_=$z=~3?$q:-1

ইনপুট তালিকার উপাদানগুলির মধ্যে স্পেস সমর্থন করার $qজন্য 2 স্ট্রোকের জন্য ব্যয় করে কেবল ফাইন দ্বারা 2 কে ভাগ করুন


2

পাইথন 2, 124

এটি স্পষ্টতই suboptimal বোধ করে। আচ্ছা ভালো.

lambda a,E=enumerate:-min([1]+[~l*(n<3)for i,n in E(a)for l,_ in E(a)if{0}|set(n*a+n/3*[5])>{0,n}>=set(a[max(i-l,0):i-~l])])

1

এপিএল (49)

{(⊂⍬)∊∆←(↓2 2⊤⍵)/¨⊂⍳⍴⍵:¯1⋄⌈/{⌈/⌊/⍵}¨(+,⍉¨)|∘.-/∆}

Testcases:

      ({(⊂⍬)∊∆←(↓2 2⊤⍵)/¨⊂⍳⍴⍵:¯1⋄⌈/{⌈/⌊/⍵}¨(+,⍉¨)|∘.-/∆} ¨ testcases) ,⍨ '→',⍨ ↑ ⍕¨testcases
                               → ¯1
0                              → ¯1
0 1 0                          → ¯1
2 0 0 2                        → ¯1
0 1 2 3                        →  1
0 3 3 0 0 0 0 3                →  0
1 0 0 1 0 0 1 3 1              →  7
1 0 0 0 0 3 0 0 0 0 2          →  5
0 1 1 3 1 3 2 1 1 3 0 3        →  2
2 2 2 1 2 0 3 1 3 1 0 3        →  3
1 3 0 2 0 2 2 1 0 3 2 1 1 2 2  →  2
1 0 1 1 2 0 1 2 3 1 0 0 0 1 2 0→  4

ব্যাখ্যা:

  • ⍳⍴⍵: ইনপুট তালিকার দৈর্ঘ্য 1 থেকে সংখ্যার একটি তালিকা পান
  • ↓2 2⊤⍵: ইনপুট তালিকার প্রতিটি মানের জন্য, প্রথম বাইট এবং দ্বিতীয় বাইট পান
  • ∆←(... )/⊂⍳⍴⍵: উভয় বাইটের তালিকার জন্য, সম্পর্কিত মানগুলি থেকে নির্বাচন করুন ⍳⍴⍵। এই সঞ্চয় করুন
  • (⊂⍬)∊∆... :¯1: এই তালিকায় যদি খালি তালিকা থাকে তবে ফিরে আসুন -1। অন্যথায়:

  • |∘.-/∆: একটি ম্যাট্রিক্স প্রদান করে প্রতিটি জোড় মানের মধ্যে পরম পার্থক্য পান

  • (+,⍉¨): একটি ঘোরানো এবং সেই ম্যাট্রিক্সের একটি নন-ঘোরানো অনুলিপি পান
  • {⌈/⌊/⍵}: উভয় ম্যাট্রিকের জন্য, সর্বনিম্ন সারি সর্বাধিক পান
  • ⌈/: তারপরে সর্বাধিক এটি পান

@ অপ্টিমাইজার: আমি কোনওভাবে পূর্ববর্তী সংস্করণ থেকে পরীক্ষার আউটপুটটি অনুলিপি করতে সক্ষম হয়েছি যার একটি বাগ রয়েছে। কোডটি নিজেই সঠিক ছিল এবং এখনও রয়েছে। আপনি যদি আমাকে বিশ্বাস না করেন তবে এখানে চেষ্টা করুন । (দ্রষ্টব্য যে ,Xএটিকে স্কেলারের থেকে আলাদা করার জন্য আপনাকে একটি এক-উপাদান তালিকা দিতে হবে X))
মেরিনাস

আহ আমি দেখি. কোনও অনলাইন সংকলক এবং পরীক্ষায় না যেতে আমার অলসতা ..
অপ্টিমাইজার

1

পার্ল, 189 176 157 বি

এখন আরও 500% রাজ্য রয়েছে।

use List::Util qw'max min';@I=<>;sub f{$n=($n%2)+1;map{$I[$_]&$n?$_:()}0..$#I}sub i{@t=f;max map{$b=$_;min map{abs$_-$b}@t}f}$r=max i,i;print defined$r?$r:-1

সহজপাঠ্য:

use List::Util qw'max min';
@I=<>;
sub f {
    $n = ($n%2) + 1;
    map { $I[$_] & $n ? $_ : () } 0..$#I
}
sub i {
    @t = f;
    max map {
        $b = $_;
        min map { abs $_ - $b } @t
    } f
}
$r = max i,i;
print defined $r ? $r : -1

ব্যবহারের উদাহরণ:

ইনপুট

0
1
2
3

perl golf.pl < input


0

ক্লোজার, 167 বাইট

#(let[P apply F(fn[I](filter(fn[i](I(% i)))(range(count %))))A(F #{1 3})B(F #{2 3})d(fn[X Y](P min(for[x X](P max(for[y Y](P -(sort[x y])))))))](-(min(d A B)(d B A))))

একটি ছোট উপায় থাকতে হবে ... আছে?

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