আমার টানেলিং অ্যারে পরীক্ষা করুন


18

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

চ্যালেঞ্জ

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

উদাহরণ

নিম্নলিখিত উদাহরণগুলি 0-সূচকযুক্ত:

[-1, -1, -1, 6, -1, -1, 3, -1, -1]  Truthy (position 3 points to position 6 and vice versa)
[1, 0]                              Truthy (position 0 points to position 1 and vice versa)
[0, 1]                              Falsey (positions 0 and 1 point to themselves)
[4, 2, 1, -1, 0, -1]                Truthy
[2, 3, 0, 1]                        Truthy
[1, 2, 0]                           Falsey (no circular tunnels allowed)
[-1, 2, -1]                         Falsey (tunnel without end)
[]                                  Truthy (no tunnels, that's OK)
[-1, -2, -3]                        Truthy (no tunnels, that's OK)
[1, 0, 3]                           Falsey (tunnel goes beyond limits)
[1]                                 Falsey (tunnel goes beyond limits)
[1, 0, 3, 7]                        Falsey (tunnel goes beyond limits)

এটি , তাই প্রতিটি ভাষার পক্ষে সংক্ষিপ্ততম কোডটি জয় পেতে পারে!


3
আমাদের কি জন্য ফিরে আসা উচিত [0]?
এনজিএন

1
এনএনজি-র প্রশ্নের সম্প্রসারণ, স্ব টানেলের অনুমতি রয়েছে? কি মামলা [0,1]এবং [0,-1,2]দিতে হবে?
dylnan

1
@ উদালন [0,1]উদাহরণগুলিতে রয়েছে। "যদি একটি ইতিবাচক নিজেই একটি সেল পয়েন্টে মান, যে একটি falsey" -এর
ngn

1
প্রস্তাবিত পরীক্ষা:[2,3,0,1]
ngn

1
@ জোনাথন অ্যালান টানেলের মানগুলি সম্ভাব্য অ্যারে অবস্থানের ইঙ্গিত দেয় এমন মান। যদি আপনার অ্যারে 0-সূচিযুক্ত হয় তবে 0 এর নীচে প্রতিটি মান একটি সুড়ঙ্গের মান নয়। যদি এটি 1-সূচকযুক্ত হয় তবে 1 এর নীচের প্রতিটি মান একটি সুড়ঙ্গের মান নয়।
চার্লি

উত্তর:


8

আর , 47 বাইট

function(v,a=v[v>0],b=sort(a))all(v[a]==b&a!=b)

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


নিবন্ধভুক্ত কোড এবং ব্যাখ্যা:

f=
function(v){          # v vector of tunnel indexes (1-based) or values <= 0

  a = v[v>0]          # get the tunnel positions

  b = sort(a)         # sort the tunnel positions ascending

  c1 = v[a]==b        # get the values of 'v' at positions 'a'
                      # and check if they're equal to the sorted positions 'b'
                      # (element-wise, returns a vector of TRUE/FALSE)

  c2 = a != b         # check if positions 'a' are different from sorted positions 'b' 
                      # (to exclude tunnels pointing to themselves, element-wise,
                      #  returns a vector of TRUE/FALSE)

  all(c1 & c2)        # if all logical conditions 'c1' and 'c2' are TRUE then
                      # returns TRUE otherwise FALSE
}

আমি এই উত্তরের জন্য একটি ব্যাখ্যা সত্যিই প্রশংসা করব। :-)
চার্লি

3
@ চার্লি: ব্যাখ্যা যুক্ত হয়েছে
ডিগএমএল


5

এপিএল (ডায়ালগ ইউনিকোড) , 19 24 বাইট

×/<∘≢⍨×≠∘⍳∘≢⍨×0∘>∨⊢=⊢⍳⍳⍨

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

উপজ্ঞ অজ্ঞাতনামা ল্যাম্বদা, সত্যের জন্য 1 এবং মিথ্যা বলে 0 প্রত্যাবর্তন করছে। টিআইও লিঙ্কটিতে পরীক্ষার ক্ষেত্রে আউটপুটটির একটি "পূর্বনির্ধারিত" সংস্করণ রয়েছে।

আনুমানিক একটি বাজিলিয়ন বাইট সংরক্ষণের জন্য @ngn এবং @ Adám এ সন্ধান করুন।

কিছু পরীক্ষার ক্ষেত্রে উত্তর ঠিক করার জন্য এবং এটিকে একটি ট্রেন বানানোর সহায়তার জন্য @ জিএনএনকে একটি অতিরিক্ত চিৎকার।

আপডেট করা উত্তরগুলি I ndex O⎕IO←0 সেট করে rigin কে 0 এ সেট করে।

কিভাবে:

×/<∘≢⍨×≠∘⍳∘≢⍨×0∘>∨⊢=⊢⍳⍳⍨  Prefix lambda, argument   4 2 1 ¯1 0 ¯1.
                       ⍳⍨  Index of (⍳)  in ⍵. ⍵⍳⍵  0 1 2 3 4 3
                     ⊢⍳    Index of that in  (returns the vector length if not found). 
                           ⍵⍳⍵⍳⍵  4 2 1 6 0 6
                  ⊢=       Compare that with ⍵. ⍵=⍵⍳⍵⍳⍵  1 1 1 0 1 0
                           This checks if positive indices tunnel back and forth correctly.
                          Logical OR with
              0∘>          0>⍵  0 0 0 1 0 11 1 1 0 1 0  1 1 1 1 1 1
                           Removes the zeroes generated by negative indices
             ×             Multiply that vector with
                          (using  as both arguments)
         ⍳∘≢               Generate the range [0..length(⍵)-1]
       ≠∘                  And do ⍵≠range; this checks if any          
                           element in  is tunneling to itself.
                           ⍵≠⍳≢⍵  4 2 1 ¯1 0 ¯10 1 2 3 4 5  1 1 1 1 1 1  
      ×                    Multiply that vector with
                          (using  as both arguments)
  <∘≢                       < length(⍵)  4 2 1 ¯1 0 ¯1 < 6  1 1 1 1 1 1
                           This checks if any index is out of bounds
×/                         Finally, multiply and reduce.
                           ×/1 1 1 1 1 1  1 (truthy)

আমি মনে করি এটি (1), (3 2 1), (5 4 3 2 1) এর জন্য কার্যকর হয় না।
nwellnhof

0<Think ×আমার মনে হয়
উরিল

4

জাভাস্ক্রিপ্ট (ES6), 35 বাইট

1 শাটগি ধন্যবাদ 1 বাইট সংরক্ষণ করা

a=>a.every((v,i)=>v<0|v!=i&a[v]==i)

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

মন্তব্য

a =>                // a[] = input array
  a.every((v, i) => // for each value v at position i in a[]:
    v < 0 |         //   force the test to succeed if v is negative (non-tunnel position)
    v != i &        //   make sure that this cell is not pointing to itself
    a[v] == i       //   check the other end of the tunnel
  )                 // end of every()

ভাল জিনিস আমি আমার জাপট সমাধানের একটি বন্দর পোস্ট করার আগে সমাধানগুলি পরীক্ষা করেছিলাম যা এটি প্রায় সমান। আপনি এটি দিয়ে একটি বাইট সংরক্ষণ করতে পারেন a=>a.every((v,i)=>v<0|v!=i&a[v]==i)
শেগি



3

পার্ল 6 , 36 বাইট

{!.grep:{2-set $++,$^v,.[$v]xx$v+1}}

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

বেসিক ধারণাটি সেটটিতে { i, a[i], a[a[i]] }প্রতিটি সূচকের iসাথে ঠিক দুটি স্বতন্ত্র উপাদান রয়েছে কিনা তা পরীক্ষা করা উচিত a[i] >= 0। যদি কোনও উপাদান নিজের দিকে নির্দেশ করে তবে সেটে কেবল একটি পৃথক উপাদান থাকে। অন্য প্রান্তটি যদি আবার নির্দেশ না করে iতবে সেটে তিনটি স্বতন্ত্র উপাদান রয়েছে। যদি a[i] < 0, xxগুণকটি শূন্য বা নেতিবাচক হয়, সুতরাং সেটটি { i, a[i] }দুটি পৃথক উপাদান সহ is


3

এমএটিএল , 19 18 বাইট

-1 বাইট লুইসকে ধন্যবাদ

n:G=GGG0>f))7M-|hs

এটি অনলাইন চেষ্টা করুন! , শুধুমাত্র প্রথমটির জন্য, কারণ আমি জানি না যে এগুলি কীভাবে করা যায়!

দেয় 0যদি truthy, একটি নন-জিরো পূর্ণসংখ্যা যদি falsey যেমন। পরীক্ষা ক্ষেত্রে 6 দেয়4

দয়া করে মনে রাখবেন যে ম্যাটল্যাবের মতো, এমএটিএল 1-সূচকযুক্ত তাই 1 টি পরীক্ষার ক্ষেত্রে যুক্ত করা আবশ্যক!

এর আগে কোনও এশোলংয়ে কখনও গল্ফ করেনি, তাই পরামর্শটি ব্যাপকভাবে প্রাপ্ত হয়েছিল!

ব্যাখ্যা:

n:G=GGG0>f))7M-|hs
                        Implicit - input array
n                       Number of values in array
 :                      Make array 1:n
  G                     Push input
   =                    Equality
n:G=                    Makes non-zero array if any of the tunnels lead to themselves
    GGG                 Push input 3x
       0                Push literal 0
        >               Greater than
      G0>               Makes array of ones where input > 0
         f              Find - returns indeces of non-zero values
                        Implicit - copy this matrix to clipboard
          )             Indeces - returns array of positive integers in order from input
           )            Ditto - Note, implicit non-zero any above maximum
            7M          Paste from clipboard
              -         Subtract
    GGG0>f))7M-         Makes array of zeros if only two-ended tunnels evident
               |        Absolute value (otherwise eg. [3,4,2,1] -> '0')
                h       Horizontal concat (ie. joins check for self tunnels and wrong tunnels)
                 s      Sum; = 0 if truthy, integer otherwise                 

আমার ব্যাখ্যা কি খুব শব্দযুক্ত? আমি সম্পূর্ণ ওভারবোর্ড না করে এটিকে সুস্পষ্ট করতে চাই।
লুই

3

05 এ বি 1 , 16 15 14 বাইট

εèNQyNÊ*y0‹~}P

-১ বাইট @ ডোরিয়ানকে ধন্যবাদ ।

এটি অনলাইনে চেষ্টা করুন বা সমস্ত পরীক্ষার কেস যাচাই করুন

ব্যাখ্যা:

ε               # Map each value `y` of the (implicit) input-list to:
 è              #   If the current value indexed into the (implicit) input-list
  NQ            #   is equal to the index
       *        #   And
    yNÊ         #   If the current value is not equal to the current index
           ~    #  Or if:
        y0     #   The current value is negative
            }P  # After the map: check if everything is truthy
                # (after which the result is output implicitly)

আমার চেষ্টা ফিল্টার বাদে একই ছিল। আমি এটির উন্নতির কোনও উপায় দেখছি না।
এমিগিনা

1
14 বাইট । আপনি এর εসাথে বর্তমান মানটি চাপতে পারেন y। সুতরাং প্রয়োজন নেই ©, এবং প্রত্যেকে ®প্রতিস্থাপন করেছেনy
ডোরিয়ান

@ ডোরিয়ান আহ, অবশ্যই .. আমি উত্তরটি পোস্ট করার সময় উত্তরাধিকার সূত্রে এটি সম্ভব ছিল না, তবে আজকে যখন আমি আমার গল্ফ তৈরি করেছি তখন এটি সম্পর্কে চিন্তা করা উচিত ছিল। ধন্যবাদ! :)
কেভিন ক্রুইজসেন




2

হাস্কেল , 48 বাইট

(all=<< \u(x,y)->y<0||x/=y&&elem(y,x)u).zip[0..]

সমস্ত টেস্টকেস যাচাই করুন!

ব্যাখ্যা

কোডটি প্রথমে কিছুটা রহিত করা যাক। হিসাবে হিসাবে f =<< gএকই \x -> f (g x) x, কোড সমান

(\u->all(\(x,y)->y<0||x/=y&&elem(y,x)u)u).zip[0..]

যা কিছুটা পরিষ্কার হয়।

(\u ->                                  -- given u, return
    all (\(x, y) ->                     -- whether for all elements (x, y) of u
            y < 0 ||                    -- either y < 0, or
            x /= y && elem (y, x) u     -- (x /= y) and ((y, x) is in u)
        )
    u
) . zip [0..]                           -- given the array a (implicitly via point-free style),
                                        -- return the array augmented with indices (it's the u above)

এই সমাধান একটি সহজ পর্যবেক্ষণ উপর ভিত্তি করে: দিন aইনপুট অ্যারের, এবং হতে uযুগলের তালিকা (i, a[i])যেখানে iএকটি সূচক। তারপর aএকটি বৈধ অ্যারে যদি এবং কেবল যে জন্য যদি (x, y)uসঙ্গে y >= 0জুটি (y, x)জন্যে uহিসাবে ভাল।


2

জাভা (জেডিকে) , 89 বাইট

a->{int l=a.length,i=l;for(;i-->0;)i=a[i]<1||a[i]<l&&a[i]!=i&a[a[i]]==i?i:-2;return-2<i;}

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

ক্রেডিট


That p বাইট হতে পারত যদি তা সেই সমস্যাযুক্ত সূচিপত্র অফ আউটবাউন্ডসেক্সপশন না হয়। সহজেই কিছু ঠিক করার জন্য আপনি দেখতে পাচ্ছেন?
কেভিন ক্রুইজসেন

@ কেভিন ক্রুজসেন আমি 102 বাইটের জন্য এটি ঠিক করতে কিভাবে দেখতে পারি । এখনও ছোট কিছু নয় :(
অলিভিয়ার গ্রাওগায়ার

1
-3 বাইট - rএখান থেকে সমতুল্য লুপটি বাদ এবং
বিচ্ছেদ

1

কাঠকয়লা , 22 বাইট

¬Φθ∨⁼ικ¬∨‹ι⁰∧‹ιLθ⁼κ§θι

এটি অনলাইন চেষ্টা করুন! লিঙ্কটি কোডটির ভার্জোজ সংস্করণ। -সত্যবাদীর ফলাফল এবং মিথ্যাচারের জন্য কিছুই নয়। দ্রষ্টব্য: একটি খালি অ্যারে ইনপুট করা চারকোল ক্র্যাশ করে বলে মনে হচ্ছে তবে আপাতত আপনি পরিবর্তে একটি স্থান প্রবেশ করতে পারেন যা যথেষ্ট পরিমাণে কাছে। ব্যাখ্যা:

  θ                     Input array
 Φ                      Filter elements
     ι                  Current value
    ⁼                   Equals
      κ                 Current index
   ∨                    Or
       ¬                Not
          ι             Current value
         ‹ ⁰            Is less than zero
        ∨               Or
              ι         Current value
             ‹          Is less than
               L        Length of
                θ       Input array
            ∧           And
                  κ     Current index
                 ⁼      Equals
                   §θι  Indexed value
¬                       Logical Not (i.e. is result empty)
                        Implicitly print

এটি খুব চারকোলেবল চ্যালেঞ্জ বলে মনে হচ্ছে না ... :-)
চার্লি

1

পাস্কাল (এফপিসি) , 165 155 153 বাইট

function f(a:array of int32):byte;var i:int32;begin f:=1;for i:=0to length(a)-1do if a[i]>-1then if(a[i]=i)or(a[i]>length(a))or(a[a[i]]<>i)then f:=0;end;

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

ইনপুট অ্যারে হওয়ায় এবার ফাংশনটি তৈরি করুন। রিটার্নস 1truthy এবং 0falsey জন্য।


1

পরিষ্কার , 60 বাইট

import StdEnv
@l=and[v<0||l%(v,v)==[i]&&v<>i\\v<-l&i<-[0..]]

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

পরিষ্কার , 142 বাইট

অত্যধিক জটিল দৈত্য সংস্করণ:

import StdEnv,Data.List,Data.Maybe
$l=and[?i(mapMaybe((!?)l)j)j\\i<-l&j<-map((!?)l)l|i>=0]with?a(Just(Just c))(Just b)=a==c&&b<>c;?_ _ _=False

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

ব্যাখ্যা:

$ l                           // function $ of `l` is
 = and [                      // true when all elements are true
  ?                           // apply ? to
   i                          // the element `i` of `l`
   (mapMaybe                  // and the result of attempting to
    ((!?)l)                   // try gettting an element from `l`
    j)                        // at the potentially invalid index `j`
   j                          // and `j` itself, which may not exist
  \\ i <- l                   // for every element `i` in `l`
  & j <- map                  // and every potential `j` in
    ((!?)l)                   // `l` trying to be indexed by
    l                         // every element in `l`
  | i >= 0                    // where `i` is greater than zero
 ]
with
 ? a (Just (Just c)) (Just b) // function ? when all the arguments exist
  = a==c && b<>c              // `a` equals `c` and not `b`
  ;
 ? _ _ _ = False              // for all other arguments, ? is false


1

পাইথ , 17 16 বাইট

.A.e|>0b&nbkq@Qb

এটি এখানে অনলাইনে চেষ্টা করুন , বা এখানে সমস্ত পরীক্ষার কেস একবারে যাচাই করুন

.A.e|>0b&nbkq@QbkQ   Implicit: Q=eval(input())
                     Trailing k, Q inferred
  .e             Q   Map the input with b=element, k=index, using:
     >0b               0>b
    |                  OR (
         nbk           b != k
        &              AND
            q@Qbk      Q[b] == k)
.A                   Check if all elements are truthy

সম্পাদনা: অনুধাবন করা হয়েছে যে পিছনের পিটিও অপ্রয়োজনীয়





0

গণিত, 42 বাইট

#=={}||(a=0@@#)[[#]]=!=a&&a[[#]][[#]]===a&

খাঁটি ফাংশন। ইনপুট এবং রিটার্ন হিসাবে Trueবা Falseআউটপুট হিসাবে সংখ্যার 1-ইনডেক্সযুক্ত তালিকা নেয় । মাত্র 1 টি চক্রের অস্তিত্ব নেই এবং সমস্ত চক্র 2-চক্রের 0মানচিত্রগুলি নিশ্চিত করে সুরঙ্গগুলি অনুসরণ করে 0। (এটি কোনও ধরণের ক্ষেত্রে ব্যর্থ হয় কিনা তা আমি পুরোপুরি নিশ্চিত নই, তবে উদাহরণের জন্য এটি সঠিক ফলাফল দেয়))


0

এই উত্তর কাজ করে না। এখানে কেবল উদাহরণের উদ্দেশ্যে।

এই উত্তরটি (বর্তমানে) পোস্ট করা পরীক্ষার সমস্ত ক্ষেত্রে পাস করে। তবে এটি অন্যান্য বৈধ ইনপুট যেমন ব্যর্থ (ত্রুটি উত্থাপন করে) [1, 2]বা[1, 0, 3, 7]

কিভাবে এটি পাস [1, 0, 3]এবং ব্যর্থ হতে পারে [1, 0, 3, 7]? ঠিক আছে, তালিকার মাধ্যমে এটি এগিয়ে চলেছে ঠিক যেমনটি আপনি প্রত্যাশা করতেন। যখন এটি xতালিকার কোনও উপাদান পড়ে a, এটি প্রথমে xতার চেয়ে কম কিনা তা যাচাই করে len(a)এবং Falseযদি তা হয় তবে তাৎক্ষণিকভাবে ফিরে আসে । তাই এটি সঠিকভাবে ফেরৎ Falseউপর [1, 0, 3], কারণ 3চেয়ে কম নয়len(a)

তবে ধরে নিই যে xসেই চেকটি কেটে গেছে, কোডটি পরে আরও কিছু চেক করবে এবং একটি নির্দিষ্ট সময়ে এটি মূল্যায়ন করার জন্য ঘটবে a[a[x]]। আমরা ইতিমধ্যে নিশ্চিত করেছি যে মূল্যায়নের a[x]ঠিক আছে ... কিন্তু হবে না a[a[x]], যা সমাধান করা a[7]যখন xহয় 3মধ্যে[1, 0, 3, 7] উদাহরণ। এই সময়ে পাইথন IndexErrorফিরে আসার চেয়ে একটি উত্থাপন করে False

সম্পূর্ণতার জন্য, উত্তর এখানে।

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

lambda a:all(x<len(a)>-1<a[x]!=x==a[a[x]]for x in a if-1<x)

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

আমি করতে চেয়েছিলাম x<len(a)and-1<a[x]..., তবে অবশ্যই len(a)সর্বদা >-1তাই উপরেরটি সমান। এই চেক 5 শৃঙ্খলিত সম্পর্কের মোট আছে ( <, >, <, !=, এবং ==), প্লাস একটি পৃথক চেক -1<xমধ্যে ifশর্ত।

পাইথন (স্বাচ্ছন্দ্যে) শর্ট সার্কিটগুলি এরকম সম্পর্কের শৃঙ্খলাবদ্ধ, সুতরাং উদাহরণস্বরূপ যদি x>=len(a)চেকটি Falseএটির আগে ফিরে আসে a[x](যা অন্যথায় উত্থাপন করবে IndexError)।

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