Array Escape - ออกไปจากที่นั่น


32

วันหนึ่งคุณตื่นเท่านั้นที่จะพบว่าตัวเองติดอยู่ในอาเรย์ คุณพยายามที่จะเดินออกไปจากที่นั่นรับดัชนีหนึ่งครั้ง แต่ดูเหมือนว่ามีกฎอื่น ๆ :

อาเรย์นั้นเต็มไปด้วยจำนวนธรรมชาติ

  • หากคุณพบว่าตัวเองอยู่ในดัชนีnคุณไปที่ดัชนีarray[n]ยกเว้น:
  • หากคุณพบว่าตัวเองอยู่ในดัชนีnซึ่งเป็นจำนวนเฉพาะคุณทำarray[n]ตามขั้นตอน

ตัวอย่าง: คุณเริ่มต้นกับดัชนี4ในอาร์เรย์นี้ (ดัชนีเริ่มต้นคือ 0):

array = [1,4,5,6,8,10,14,15,2,2,4,5,7];
-----------------^ you are here

เนื่องจากค่าของฟิลด์ที่คุณอยู่คือ8คุณไปที่ดัชนี8เป็นขั้นตอนแรก 2เขตที่ดินคุณมีค่า จากนั้นคุณไปที่ดัชนี2เป็นขั้นตอนที่สองของคุณ ในฐานะที่2เป็นหมายเลขเฉพาะคุณจะย้อนกลับไป 5 ก้าวซึ่งเป็นขั้นตอนที่สามของคุณ เนื่องจากไม่มีดัชนี-3คุณจึงหลีกเลี่ยงอาร์เรย์ในขั้นตอนทั้งหมด 3 ขั้นตอน

งานของคุณคือ:

ในการเขียนโปรแกรมหรือฟังก์ชั่นซึ่งยอมรับอาร์เรย์และดัชนีเริ่มต้นเป็นพารามิเตอร์และส่งออกจำนวนขั้นตอนเพื่อหนีอาร์เรย์ ถ้าคุณไม่สามารถหลบหนีอาร์เรย์ (เช่น[2,0,2]กับการเริ่มต้นดัชนี2=> คุณอย่างต่อเนื่องไปจากดัชนี2การ0) การส่งออกมีมูลค่า falsy คุณอาจใช้การจัดทำดัชนีแบบอิงดัชนีหรือใช้ดัชนีแบบอิงศูนย์ แต่โปรดระบุว่าคุณใช้อะไร

กรณีทดสอบ

การป้อนข้อมูล: [2,5,6,8,1,2,3], 3

เอาท์พุท: 1

การป้อนข้อมูล: [2, 0, 2], 2

เอาท์พุท: false

อินพุต: [14,1,2,5,1,3,51,5,12,3,4,41,15,4,12,243,51,2,14,51,12,11], 5;

เอาท์พุท: 6

คำตอบที่สั้นที่สุดชนะ


7
ยินดีต้อนรับสู่ PPCG! นี่เป็นความท้าทายแรกที่ดี :) เราสามารถใช้การจัดทำดัชนีแบบ 1 เช่นกันได้หรือไม่? นอกจากนี้อาจเป็นการดีถ้ามีกรณีทดสอบเพิ่มอีกสองสามข้อ สำหรับความท้าทายในอนาคตคุณสามารถพิจารณาใช้แซนด์บ็อกซ์ซึ่งคุณสามารถรับข้อเสนอแนะจากชุมชนก่อนที่ความท้าทายจะเริ่มขึ้น
Martin Ender


1
@Martin Ender มันไม่เกี่ยวข้องกับคำถาม ... แต่ฉันในฐานะผู้ใช้มือถือพบว่ามันเป็นไปไม่ได้ที่จะใช้กล่องทราย ฉันควรทำอย่างไรหากได้รับคำติชมจากคำถามของฉันก่อนโพสต์คำถาม
user6245072

1
@JerryJeremiah ทำไมคุณไม่ลองถอยหลัง 3 ก้าวล่ะ? คุณจะลงสู่ดัชนี 2 ถ้าคุณเริ่มต้นที่ 5 และย้อนกลับ 3 ก้าว
Michael Kunst

5
@ user902383 กำลังไปที่ดัชนี 2 ซึ่งเป็นจำนวนเฉพาะดังนั้นเราทำ 2 ขั้นตอนย้อนกลับและไปที่ดัชนี 0 ซึ่งไม่ได้เป็นอันดับแรก ค่าที่ดัชนี 0 คือ 2 ดังนั้นเราไปที่ดัชนี 2 ซึ่งสำคัญ ... ซ้ำ
edc65

คำตอบ:



9

Python ขนาด161 138 ไบต์

สินเชื่อสำหรับแฟกทอเรียล

g=lambda x:0**x or x*g(x-1)
f=lambda a,i,n=0,l=[]:(i<0)+(i>=len(a))and n or(0 if i in l else f(a,[a[i],i-a[i]][i and-g(i-1)%i],n+1,l+[i]))

ไอเดียมัน!

มันทำงานอย่างไร

ทฤษฎีบทของวิลสันใช้สำหรับการตรวจสอบเฉพาะ

การตรวจสอบห่วงโดยการจัดเก็บดัชนีเห็นอาร์เรย์ ( l) lและการตรวจสอบว่าดัชนีปัจจุบันอยู่ใน


6

Python ขนาด 107 ไบต์

import sympy
f=lambda a,i,n=0:0if n>len(a)else f(a,[a[i],i-a[i]][sympy.isprime(i)],n+1)if 0<=i<len(a)else n

การใช้งาน: f(list, start)อดีต:f([2,5,6,8,1,2,3], 3)

คืน0ค่าลูป (ตรวจพบเมื่อn > len(a))


5

Matlab, 138 ไบต์

นี่เป็นวิธีการที่ตรงไปตรงมาโดยใช้ดัชนี 1 รายการเนื่องจาก Matlab ใช้ดัชนี 1 รายการตามค่าเริ่มต้น ในการนับจำนวนขั้นตอนเราใช้การforนับลูปตั้งแต่ 1 ถึงอนันต์ (!) สำหรับกรณีที่เราไม่สามารถหลบหนีอาร์เรย์เราใช้เวกเตอร์vเพื่อติดตามรายการที่เราได้เยี่ยมชมแล้ว หากเราไปที่รายการสองครั้งเรารู้ว่าเราติดอยู่ในวงจรที่มองไม่เห็น หากต้องการดูการตรวจสอบว่าเราอยู่นอกอาร์เรย์หรือไม่เราใช้try/catchโครงสร้างซึ่งแยกข้อยกเว้นออกจากกัน

function r=f(a,i);v=a*0;v(i)=1;for k=1:Inf;if isprime(i);i=i-a(i);else;i=a(i);end;try;if v(i);r=0;break;end;v(i)=1;catch;r=k;break;end;end

5

05AB1E, 32 ไบต์

ï[U¯Xåi0,q}²gL<Xå_#X²XèXDˆpi-]¯g

คำอธิบาย

ï                                 # explicitly convert input to int
 [                            ]   # infinite loop
  U                               # store current index in X
   ¯Xåi0,q}                       # if we've already been at this index, print 0 and exit
           ²gL<Xå_#               # if we've escaped, break out of infinite loop
                   X²XèXDˆpi-     # else calculate new index
                               ¯g # print nr of indices traversed

ลองออนไลน์


4

JavaScript (ES6), 100

ดัชนีฐาน 0 หมายเหตุ: ฟังก์ชั่นนี้จะปรับเปลี่ยนอาร์เรย์อินพุต

(a,p)=>eval("for(s=0;1/(q=a[p]);++s,p=p>1&&p%i||p==2?p-q:q)for(a[p]=NaN,i=1;p%++i&&i*i<p;);q==q&&s")

น้อย golfed

(a,p)=>
{
  for(s = 0; 
      1/ (q = a[p]); 
      ++s)
  {
    a[p] = NaN; // mark visited position with NaN to detect loops
    for(i = 1; p % ++i && i*i < p;); // prime check
    p = p > 1 && p % i || p == 2 ? p-q : q;
  }
  return q==q && s // return false if landed on NaN as NaN != NaN
}

ทดสอบ

F=
(a,p)=>eval("for(s=0;1/(q=a[p]);++s,p=p>1&&p%i||p==2?p-q:q)for(a[p]=NaN,i=1;p%++i&&i*i<p;);q==q&&s")

;[
 [[2,5,6,8,1,2,3], 3, 1]
,[[2, 0, 2], 2, false]
,[[14,1,2,5,1,3,51,5,12,3,4,41,15,4,12,243,51,2,14,51,12,11], 5, 6]
].forEach(t=>{
  var [a,b,k]=t, i=a+' '+b,r=F(a,b)
  console.log(r==k?'OK':'KO',i+' -> '+r)
  
})  


4

JAVA, 229 218 ไบต์

Object e(int[]a,int b){Stack i=new Stack();int s=0;for(;!(a.length<b|b<0);s++){if(i.contains(b))return 1>2;i.add(b);b=p(b)>0?b-a[b]:a[b];}return s;}int p(int i){for(int j=2;j<i/2;j++)if(i%j<1)return 0;return i<2?0:1;}

ต้องขอบคุณเควินด้วย 11 ไบต์กัดฝุ่น


สิ่งที่ควรกอล์ฟมันลงบางอย่างเพิ่มเติม: Stack<Integer>i=new Stack<>();สามารถเปลี่ยนStack i=new Stack();และสามารถเปลี่ยนเป็นreturn 1==2; return 0>1;นอกจากนี้คุณอาจต้องการพูดถึงว่าเป็นJava 7แทนที่จะเป็น Java โดยทั่วไป
Kevin Cruijssen

@KevinCruijssen ฉันไม่แน่ใจว่ามันเป็นจุดที่จะพูดถึงว่ามันเป็นจาวา 7 โดยเฉพาะอย่างยิ่งตอนนี้การแก้ปัญหานี้เข้ากันได้กับรุ่นจาวาส่วนใหญ่
user902383

ใน Java 8 คุณสามารถใช้ lambdas ที่สั้นกว่า: a,b->{...}แทนObject e(int[]a,int b){...}ซึ่งเป็นเหตุผลที่ฉันพูดถึง Java 7 เป็นการส่วนตัวเพื่อให้คนรู้ว่าฉันไม่ได้ใช้ lambdas Java 8 แต่ขึ้นอยู่กับคุณ
Kevin Cruijssen

@KevinCruijssen ยุติธรรมพอเมื่อฉันใช้แลมด้าฉันกำลังระบุรุ่นจาวา แต่เมื่อโซลูชันใช้งานได้กับจาวา 7 มันมักจะทำงานร่วมกับจาวา 8 เช่นกันดังนั้นจึงไม่มีประโยชน์ที่จะเพิ่มเวอร์ชัน แต่คุณอาจจะถูกต้องฉันควรระบุรุ่นขั้นต่ำ
user902383

4

CJam, 44 ไบต์

คาดว่าindex arrayในกอง

:G\{_G,,&{G=_L#)0{_L+:L;_mp3T?-F}?}L,?}:F~o@

ลองออนไลน์!

คำตอบ CJam แรกของฉันดังนั้นทำไมมันจึงน่ากลัวและจำเป็น ...

:G\{_G,,&{G=_L#)0{_L+:L;_mp3T?-F}?}L,?}:F~o@
:G                                              Store the array as G
  \                                             Put the index first
   {                                  }:F~      The recursive F function
     G,,                                        Generate a 0..length(G) sequence
    _   &                            ?          Check that the index is contained
         {                        }             If so, then...
          G=                                    Get the value at the index
            _L#)                 ?              If the value is in L (`-1)` gives `0` which is falsy)
                0                               Return 0 (infinite loop)
                 {              }               Otherwise...
                  _L+:L;                        Store the value we're accessing in L (infinite loop check)
                        _mp3T?-                 Remove 3 if the number is prime
                               F                Then recursively call F
                                   L,           We escaped! Return the size of "L" (number of steps)
                                          o     Print the top value of the stack
                                           @    Tries to swap 3 elements, which will error out

(ก็ถือว่าโอเคที่จะผิดพลาดหลังจากผลลัพธ์ที่ถูกต้องตามที่พิมพ์ซึ่งเป็นสิ่งที่โปรแกรมที่นี่)


3

C, 121 ไบต์

ฟังก์ชั่นfยอมรับอาเรย์, ดัชนีเริ่มต้น (ตาม 0) และจำนวนองค์ประกอบในอาเรย์เนื่องจากไม่มีวิธีการทดสอบจุดจบของอาเรย์ใน C (อย่างน้อยฉันก็ไม่รู้)

p(n,i,z){return--i?p(n,i,z*i*i%n):z%n;}c;f(a,i,n)int*a;{return i<0||i/n?c:c++>n?0:i&&p(i,i,1)?f(a,i-a[i],n):f(a,a[i],n);}

ลองใช้กับideone!

หมายเหตุ: function p(n)ทดสอบว่าnดีหรือไม่ดี เครดิตสำหรับสิ่งนี้จะไปที่ @Lynn และคำตอบของเขาสำหรับหมายเลขนี้สำคัญหรือไม่?


1
@raznagul ไร้สาระคุณไม่สามารถกำหนดความยาวของอาร์เรย์พารามิเตอร์อินพุตได้ ดูคำตอบ 2 ในคำถามเดียวกัน
edc65

@ edc65: ขออภัยฉันควรอ่านเกินคำตอบแรก
raznagul

@ Jasmes - ในการเขียนโค้ดฟังก์ชันควรจะสามารถเรียกหลาย ๆ ครั้งเพื่อให้ได้ผลลัพธ์เดียวกัน รหัสของคุณต้องการรีเซ็ตcเพื่อเรียกใช้ฟังก์ชันอีกครั้ง
owacoder

3

JavaScript, 121 132 ไบต์

p=n=>t=i=>n%i&&n>i?t(i+1):(0<n&&n<=i?1:0),c=-1,a=>r=s=>(++c,0<=s&&s<a.length?(p(s)(2)?r(s-a[s]):0||([a[s],s]=[0,a[s]])[1]?r(s):0):c)

f=(p=n=>t=i=>n%i&&n>i?t(i+1):(0<n&&n<=i?1:0),c=-1,a=>r=s=>(++c,0<=s&&s<a.length?(p(s)(2)?r(s-a[s]):0||([a[s],s]=[0,a[s]])[1]?r(s):0):c));

let test_data = [[[1,4,5,6,8,10,14,15,2,2,4,5,7],4],
                 [[2,5,6,8,1,2,3],3],
                 [[2,0,2],2],
                 [[14,1,2,5,1,3,51,5,12,3,4,41,15,4,12,243,51,2,14,51,12,11],5]];
for (test of test_data) {
    c = -1;
    console.log(f(test[0])(test[1]));
}

แก้ไข 1: อ๊ะพลาดบิตเกี่ยวกับการส่งกลับจำนวนขั้นตอน แก้ไขมาในไม่ช้า

แก้ไข 2: แก้ไขแล้ว


3

แร็กเก็ต, 183 156 ไบต์

น่าจะเป็นจำนวนไบต์ที่สามารถเล่นกอล์ฟได้ต่อไป แต่สำหรับฉัน :)

(require math)(define(e l i[v'()][g length])(cond[(memq i v)#f][(not(< -1 i(g l)))(g v)][else(e l((λ(a)(if(prime? i)(- i a)a))(list-ref l i))(cons i v))]))

โมดูลที่สมบูรณ์พร้อมชุดทดสอบที่มีฟังก์ชั่นทำความสะอาด:

#lang racket

(require math)

(define (e l i [v'()] [g length])
  (cond
    [(memq i v) #f]
    [(not (< -1 i (g l))) (g v)]
    [else (e l
             ((λ (a) (if (prime? i)
                         (- i a)
                         a))
              (list-ref l i))
             (cons i v))]))

(module+ test
  (require rackunit)
  (define escape-tests
    '((((2 5 6 8 1 2 3) 3) . 1)
      (((2 0 2) 2) . #f)
      (((14 1 2 5 1 3 51 5 12 3 4 41 15 4 12 243 51 2 14 51 12 11) 5) . 6)))
  (for ([t escape-tests])
    (check-equal? (apply e (car t)) (cdr t) (~a t))))

เรียกใช้เหมือนกัน raco test e.rkt

ความรุ่งโรจน์ที่สำคัญสำหรับ @cat ค้นพบprime?ฟังก์ชั่นที่ไม่มีเอกสารฟังก์ชั่น


2

Java, 163 160 ไบต์

boolean p(int n){for(int i=2;i<n;)if(n%i++==0)return 0>1;return 1>0;}
int f(int[]a,int n){return n<0||n>=a.length?1:p(n)?n<a[n]?1:1+f(a,a[n-a[n]]):1+f(a,a[n]);}

p(n) สำหรับการทดสอบที่สำคัญ f(a,n)สำหรับฟังก์ชั่นการหลบหนี การใช้งาน:

public static void main(String[] args) {
    int[] array = {14,1,2,5,1,3,51,5,12,3,4,41,15,4,12,243,51,2,14,51,12,11};
    System.out.println(f(array, 5));
}

เวอร์ชันที่ไม่ถูกปรับแต่ง:

static boolean isPrime(int n) {
    for (int i = 2; i < n; i++) {
        if (n % i == 0) {
            return false;
        }
    }
    return true;
}

static int escape(int[] array, int n) {
    if (n < 0 || n >= array.length) {
        return 1;
    } else if (isPrime(n)) {
        if (n < array[n]) {
            return 1;
        } else {
            return 1 + escape(array, array[n - array[n]]);
        }
    } else {
        return 1 + escape(array, array[n]);
    }
}

1

Perl 6 , 85 ไบต์

->\n,\a{{.[+a].defined??0!!+$_}(lazy n,{.is-prime??$_- a[$_]!!a[$_]}...^!(0 <=* <a))}

คำอธิบาย:

lazy n, { .is-prime ?? $_ - a[$_] !! a[$_] } ...^ !(0 <= * < a)

นี่เป็นลำดับที่ขี้เกียจของดัชนีที่สำรวจตามกฎ หากดัชนีเกินขอบเขตขอบเขตของอินพุตในที่สุด!(0 <= * < a)เงื่อนไข) ลำดับนั้นจะเป็นแบบ จำกัด มิฉะนั้นดัชนีจะวนรอบไม่สิ้นสุด

ลำดับนั้นจะถูกป้อนไปยังฟังก์ชันที่ไม่ระบุตัวตนภายใน:

{ .[+a].defined ?? 0 !! +$_ }

หากมีการกำหนดลำดับที่ดัชนีที่กำหนดโดยขนาดของอาร์เรย์อาร์เรย์นั้นจะต้องเข้าสู่วัฏจักรไม่สิ้นสุดดังนั้นจึง0ส่งคืน มิฉะนั้นขนาดของลำดับ+$_จะถูกส่งกลับ


1

Perl 5 , 107 + 1 ( -a) = 108 ไบต์

for($i=<>;!$k{$i}++&&$i>=0&&$i<@F;$s++){$f=0|sqrt$i||2;1while$i%$f--;$i=$f?$F[$i]:$i-$F[$i]}say$k{$i}<2&&$s

ลองออนไลน์!

รายการที่เป็น 0 ส่งคืนค่าเท็จ (ว่าง) หากรายการไม่สามารถหลีกเลี่ยงได้

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