トンネリングアレイを確認する


18

整数の配列があり、その負でない値が同じ配列内の他の位置へのポインターであり、それらの値がトンネルを表すことだけを想像してください。したがって、位置Aの値が正で位置Bを指している場合、トンネルの両端を表すには、Bも正で、位置Aを指している必要があります。そう:

チャレンジ

  • 整数の配列が与えられた場合、その配列がトンネリング配列であるという制限に準拠しているかどうかを確認し、trueyとfalseyに対して2つの異なる一貫した値を返します。
  • 配列内の値は、トンネル以外の位置ではゼロ未満、トンネル位置ではゼロ以上になります。配列が1インデックスの場合、ゼロ値は非トンネル位置を表します。トンネル以外の値をチェックする必要はありません。
  • セルの正の値が自分自身を指している場合、それは偽です。AがBを指し、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]ですか?
ngn

1
ngnの質問を拡張すると、自己トンネルは許可されますか?どのような場合[0,1][0,-1,2]か?
ディルナン

1
@dylnan [0,1]は例にあります。「セルの正の値が自分自身を指している場合、それは偽です」
ngn

1
推奨テスト:[2,3,0,1]
ngn

1
@JonathanAllanトンネル値は、可能な配列位置を示す値です。配列のインデックスが0の場合、0未満のすべての値はトンネル値で​​はありません。1インデックスの場合、1未満のすべての値はトンネル値で​​はありません。
チャーリー

回答:


8

R、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
@チャーリー:説明を追加
-digEmAll


5

APL(Dyalog Unicode)19 24バイト

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

オンラインでお試しください!

匿名ラムダのプレフィックス。真偽の場合は1、偽の場合は0を返します。TIOリンクには、テストケースの「プリティファイド」バージョンの出力が含まれています。

約1億バイトを節約するための@ngnと@Adámへのコメント。

いくつかのテストケースの回答を修正し、それをトレインにするのに役立つ@ngnへの追加のコメント。

更新された回答はを使用し⎕IO←0I ndex Oを設定します 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<×私は思う
ウリエル

4

JavaScript(ES6)、35バイト

@Shaggyのおかげで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()

Japtソリューションの移植版を投稿する前にソリューションを確認しましたが、これはほぼ同じです。でバイトを保存できますa=>a.every((v,i)=>v<0|v!=i&a[v]==i)
シャギー



3

Perl 6、36バイト

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

オンラインでお試しください!

基本的な考え方は、セットがかどうかを確認することである{ i, a[i], a[a[i]] }各インデックスのちょうど二つの異なる要素が含まiとしますa[i] >= 0。要素がそれ自体を指す場合、セットには1つの個別の要素のみが含まれます。反対側がを指していない場合、iセットには3つの異なる要素が含まれています。の場合a[i] < 0xx係数はゼロまたは負であるため、セットは{ i, a[i] }であり、2つの異なる要素もあります。


3

MATL19 18バイト

ルイスのおかげで-1バイト

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

オンラインでお試しください!、最初の1つだけのために、私はそれらのすべてを行う方法がわからないので!

与え0truthy場合はゼロ以外の整数は、例えば、falsey場合は、。テストケース6の場合4

MATLABと同様に、MATLは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

05AB1E16 15 14バイト

εèNQyNÊ*y0‹~}P

-1バイトのおかげで @Dorianの

オンラインで試すか、、すべてのテストケースを確認してください

説明:

ε               # 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
Dorian

@Dorian Ah、もちろん..この回答を投稿したとき、それはレガシーでは不可能でしたが、今日早くゴルフをしたときに考えるべきでした。ありがとう!:)
ケビンクルーッセン




2

Haskell、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])ia(x, y)uy >= 0(y, x)u


2

Java(JDK)、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;}

オンラインでお試しください!

クレジット


その厄介なIndexOutOfBoundsExceptionがなかった場合、87バイトでした。たぶんあなたはそれを簡単に修正するものを見ますか?
ケビンクルーッセン

@KevinCruijssen 102バイトでそれを修正する方法を見ることができます。まだ短いものはありません:
オリビエグレゴワール

1
-3バイト -省略rしてここに
-AlexRacer

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

クリーン、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

Pyth17 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

編集:末尾のkも不要であることに気づいた





0

Mathematica、42バイト

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

純粋な機能。番号の1インデックス付きリストを入力として受け取り、出力としてTrueまたは返しFalseます。トンネルをたどるだけで、に0マップされ0、1サイクルが存在せず、すべてのサイクルが2サイクルになります。(これがエッジケースで失敗するかどうかは完全にはわかりませんが、例では正しい結果が得られます。)


0

この答えは機能しません。ここでは、説明のみを目的としています。

この回答は、(現在)投稿されたすべてのテストケースに合格します。ただし、[1, 2]またはなどの他の有効な入力では失敗します(エラーが発生します)[1, 0, 3, 7]

どのように合格し[1, 0, 3]、失敗し[1, 0, 3, 7]ますか?まあ、それはあなたが期待するように、リストを進めます。xリストの要素を読み取るときaxがより小さいかどうかを最初にチェックし、そうであればlen(a)すぐに返しますFalse。だから、正しく返すFalse[1, 0, 3]ため、3以下ではありませんlen(a)

しかし、それxがそのチェックに合格すると仮定すると、コードはさらに他のチェックを実行し、特定の時点でを評価しa[a[x]]ます。我々はすでに評価することを保証しましたa[x]OKになります...しかし、ないa[a[x]]に解決され、a[7]ときxである3[1, 0, 3, 7]例。この時点で、PythonはをIndexError返すのではなくを発生させFalseます。

完全を期すために、ここに答えがあります。

Python 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<xif条件。

Pythonは(便利なことに)このように連鎖関係を短絡するので、例えば、もしそうならx>=len(a)、チェックは到達Falseする前に戻りますa[x](そうでなければを発生させますIndexError)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.