ตรวจสอบอาร์เรย์อุโมงค์ของฉัน


18

ลองนึกภาพคุณมีอาร์เรย์ของจำนวนเต็มซึ่งมีค่าที่ไม่เป็นลบเป็นตัวชี้ไปยังตำแหน่งอื่นในอาร์เรย์เดียวกันเฉพาะค่าที่เป็นตัวแทนของอุโมงค์ดังนั้นถ้าค่าในตำแหน่ง A เป็นค่าบวกและชี้ไปที่ตำแหน่ง B ดังนั้นค่าในตำแหน่ง B จะต้องเป็นบวกและชี้ไปที่ตำแหน่ง A เพื่อแสดงปลายทั้งสองของอุโมงค์ ดังนั้น:

ท้าทาย

  • ให้อาเรย์ของจำนวนเต็มตรวจสอบว่าอาเรย์นั้นสอดคล้องกับข้อ จำกัด ในการเป็นอาเรย์อุโมงค์และคืนค่าสองค่าที่ชัดเจนและสอดคล้องกันสำหรับความจริงและเท็จ
  • ค่าในอาร์เรย์จะต่ำกว่าศูนย์สำหรับตำแหน่งที่ไม่ใช่ช่องสัญญาณและศูนย์หรือสูงกว่าสำหรับตำแหน่งช่องสัญญาณ หากอาร์เรย์ของคุณมีการจัดทำดัชนีไว้ 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]?
dylnan

1
@dylnan [0,1]อยู่ในตัวอย่าง "ถ้าบวกค่าในจุดมือถือตัวเองว่าเป็น falsey"
NGN

1
ทดสอบแนะนำ:[2,3,0,1]
NGN

1
@Jonathan ทั้งหมดค่าช่องสัญญาณเป็นค่าที่ระบุตำแหน่งอาเรย์ที่เป็นไปได้ ถ้าอาร์เรย์ของคุณถูกทำดัชนี 0 ค่าทุกค่าที่ต่ำกว่า 0 จะไม่ใช่ค่าช่องสัญญาณ ถ้ามันเป็นดัชนี 1 ค่าทุกค่าต่ำกว่า 1 ไม่ใช่ค่าช่องสัญญาณ
Charlie

คำตอบ:


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
}

ฉันขอขอบคุณคำอธิบายสำหรับคำตอบนี้จริงๆ :-)
Charlie

3
@Charlie: เพิ่มคำอธิบายแล้ว
digEmAll


5

APL (Dyalog Unicode) , 19 24 ไบต์

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

ลองออนไลน์!

คำนำหน้าแลมบ์ดานิรนามโดยส่งคืน 1 สำหรับความจริงและ 0 สำหรับความเท็จ ลิงก์ TIO มีเอาต์พุต "prettified" สำหรับกรณีทดสอบ

ตะโกนถึง @ngn และ @ Adámเพื่อประหยัดประมาณพันล้านไบต์

มีการตะโกนพิเศษไปที่ @ngn สำหรับความช่วยเหลือในการแก้ไขคำตอบสำหรับกรณีทดสอบและทำให้เป็นรถไฟ

คำตอบที่อัพเดตใช้⎕IO←0ตั้งค่าI 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<×ฉันคิดว่า
Uriel

4

JavaScript (ES6), 35 ไบต์

บันทึก 1 ไบต์ขอบคุณ @Shaggy

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)คุณสามารถบันทึกไบต์ด้วย
Shaggy



3

Perl 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] }ยังมีสององค์ประกอบที่แตกต่างกัน


3

MATL , 19 18 ไบต์

-1 ไบต์ขอบคุณLuis

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

ลองออนไลน์!สำหรับคนแรกเท่านั้นเพราะฉันไม่รู้วิธีที่จะทำทั้งหมด!

จะช่วยให้ 0ถ้าเป็นจำนวนเต็มไม่ใช่ศูนย์ถ้าเท็จเช่น สำหรับกรณีทดสอบ 6 4ให้

โปรดจำไว้ว่าเช่นเดียวกับ MATLAB MATLAB จะถูกจัดทำดัชนีเป็น 1 ดังนั้นจะต้องเพิ่ม 1 ในกรณีทดสอบ!

ไม่เคยเล่นกอล์ฟใน Esolang มาก่อนดังนั้นได้รับคำแนะนำอย่างมาก!

อธิบาย:

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                 

คำอธิบายของฉันเป็นคำเกินไปหรือไม่ ฉันต้องการทำให้ชัดเจนโดยไม่ต้องลงน้ำมากเกินไป
Lui

3

05AB1E , 16 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)

ความพยายามของฉันเหมือนกันยกเว้นกับตัวกรอง ฉันไม่เห็นวิธีที่จะปรับปรุงในเรื่องนี้
Emigna

1
14 ไบต์ คุณสามารถผลักดันมูลค่าปัจจุบันของกับε yดังนั้นไม่จำเป็น©และแต่ละคน®ถูกแทนที่ด้วยy
โดเรียน

@Dorian Ah แน่นอน .. นั่นเป็นไปไม่ได้ในมรดกเมื่อฉันโพสต์คำตอบนี้ แต่ควรจะคิดเกี่ยวกับมันเมื่อฉันทำกอล์ฟของฉันก่อนหน้านี้วันนี้ ขอบคุณ! :)
Kevin Cruijssen




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])ที่iดัชนี จากนั้นaเป็นอาร์เรย์ที่ถูกต้องและถ้าหากทุก(x, y)ในuกับy >= 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;}

ลองออนไลน์!

เครดิต


น่าจะเป็น 87 ไบต์ถ้าไม่ใช่เพราะดัชนีอันน่ารำคาญดังกล่าว คุณอาจเห็นบางสิ่งที่จะแก้ไขได้อย่างง่ายดายหรือไม่
Kevin Cruijssen

@KevinCruijssen ฉันสามารถดูวิธีการแก้ไขที่102 ไบต์ ยังไม่มีอะไรสั้นลง :(
Olivier Grégoire

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

สิ่งนี้ดูเหมือนจะไม่ใช่เรื่องท้าทายอย่างถ่าน ... :-)
Charlie

1

ปาสคาล (FPC) , 165 155 153 bytes

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;

ลองออนไลน์!

ฟังก์ชั่นที่สร้างขึ้นในครั้งนี้เพราะอินพุตเป็นอาร์เรย์ ผลตอบแทน1สำหรับความจริงและ0เพื่อความเท็จ


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

Pyth , 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

แก้ไข: ตระหนักว่าการต่อท้าย 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ของรายการ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]ตัวอย่าง ณ จุดนี้ 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<xในifสภาพ

งูหลาม (สิ่งอำนวยความสะดวก) ลัดวงจรถูกล่ามโซ่ความสัมพันธ์เช่นนี้ดังนั้นสำหรับตัวอย่างเช่นถ้าx>=len(a)แล้วผลตอบแทนการตรวจสอบFalseก่อนที่จะได้รับไปa[x](ซึ่งจะยกIndexError)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.