ค้นหาตำแหน่งที่มีจำนวนมากที่สุด n อยู่ห่างจาก n


29

ภาคต่อของคำถามนี้

งาน

รับอาร์เรย์ของจำนวนเต็มบวกหาองค์ประกอบที่ใหญ่ที่สุด kซึ่ง:

มีอยู่บางระยะจำนวนเต็มบวกnเพื่อให้องค์ประกอบในอาร์เรย์อยู่n  ตำแหน่งไปทางซ้ายหรือทางขวาจากkเท่ากับn

อาร์เรย์รับประกันว่าจะมีองค์ประกอบอย่างน้อยหนึ่งองค์ประกอบที่ตรงตามเงื่อนไขนี้

รหัสที่สั้นที่สุด (เป็นไบต์) ชนะ คุณสามารถเลือกรูปแบบ I / O ใดก็ได้ที่คุณต้องการ

ตัวอย่าง

รับอินพุต

[4, 6, 7, 9, 3, 6, 5, 7, 2]

ค่าที่มีสิทธิ์คือ:

  • The 4เนื่องจากมี7ตำแหน่งอยู่ 7 ตำแหน่งทางด้านขวา
  • ครั้งแรก6เนื่องจากมี3ตำแหน่งอยู่ 3 ตำแหน่งทางด้านขวา
  • The 3เนื่องจากมี4ตำแหน่งอยู่ 4 ตำแหน่งทางด้านซ้าย
  • The 5เนื่องจากมี2ตำแหน่งอยู่ 2 ตำแหน่งทางด้านขวา
  • ที่สอง7เนื่องจากมี3ตำแหน่งอยู่ 3 ตำแหน่งทางด้านซ้าย

7ค่าเหล่านี้ที่ใหญ่ที่สุดคือ

กรณีทดสอบ

[1, 13] → 13
[2, 9, 8, 3, 72, 2] → 8
[5, 28, 14, 5, 6, 3, 4, 7] → 14
[1, 3, 5, 15, 4, 1, 2, 6, 7, 7] → 7
[5, 1, 3, 5, 2, 5, 5, 8, 5, 1, 5, 1, 2, 3] → 5
[5, 12, 2, 5, 4, 7, 3, 3, 6, 2, 10, 5, 5, 5, 4, 1, 8, 5] → 10

อีกสองกรณี (แม้ว่าจะซ้ำซ้อนเล็กน้อย) ในตัวอย่าง: 6 รายการแรก (อีกครั้ง) เนื่องจากมีตำแหน่ง 5 ห้าตำแหน่งที่ถูกต้อง หรือวินาทีที่สอง (อีกครั้ง) เนื่องจากมีตำแหน่งหกถึงหกตำแหน่ง
Jonathan Allan

1. ในโทรศัพท์ของฉันชื่อดูเหมือนจะ "ค้นหาตำแหน่งหมายเลขที่ใหญ่ที่สุดจาก" 2. เงื่อนไขที่ระบุคือมีบางอย่างเช่นk (คุณสมบัติที่ไม่ขึ้นอยู่กับ k) มันจะต้องผิดอย่างแน่นอน
Peter Taylor

@PeterTaylor "this" ใน "element นี้" หมายถึง k
Taemyr

1
@Taemyr ที่ไม่สมเหตุสมผลด้วยสองเหตุผล: ประการแรกเนื่องจากkไม่ได้ระบุว่าเป็นองค์ประกอบ และประการที่สองเพราะเราถูกขอให้ " ค้นหาองค์ประกอบที่ใหญ่ที่สุดที่พอใจ " เงื่อนไขดังนั้น " องค์ประกอบนี้ " มีสิ่งที่มาก่อนนอกเงื่อนไข
Peter Taylor

2
บางทีคุณอาจหลีกเลี่ยงความสับสนด้วยการพูดว่า "หาองค์ประกอบที่ใหญ่ที่สุดเช่นนั้น" แล้วใช้kแทนองค์ประกอบนี้ในคำจำกัดความ?
Martin Ender

คำตอบ:


3

เยลลี่ขนาด 9 ไบต์

Jạþ`=ḅa¹Ṁ

ลองออนไลน์! หรือตรวจสอบกรณีทดสอบทั้งหมด

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

Jạþ`=ḅa¹Ṁ  Main link. Argument: A (array)

J          Indices; yield [1, ..., len(A)].
   `       Use the previous return value as left and right argument:
 ạþ        Absolute difference table; take the absolute value of the difference
           of each pair of indices, yielding a 2D array.
    =      Compare each absolute difference with the corresponding item of A.
     ḅ     Base; convert each Boolean list from base i to integer, where i is the
           corresponding item of A. The value of i is not important; we only care
           if the list contains a 1, which will result in a non-zero integer.
       ¹   Identity; yield A.
      a    Logical AND; replace non-zero values with the corresponding items of A.
        Ṁ  Take the maximum.

1
อืมไม่แน่ใจว่านโยบายเกี่ยวกับเรื่องนี้คืออะไร แต่ตอนนี้คุณมีสองแนวทางที่แตกต่างกันในคำตอบแยกต่างหากในภาษาโปรแกรมเดียวกันโดยผู้ใช้รายเดียวกัน จะเป็นการดีกว่าหรือไม่ที่จะแนะนำให้วางทั้งเกร็ดเล็กเกร็ดน้อยขนาด 9 และ 10 ไบต์ในคำตอบเดียวกันเนื่องจากเป็นภาษาโปรแกรมเดียวกันและคุณทั้งคู่? ฉันสามารถเข้าใจคำตอบหลาย ๆ คำในภาษาการเขียนโปรแกรมเดียวกันโดยผู้ใช้หลายคน แต่ฉันคิดว่าวิธีที่แตกต่างกันโดยผู้ใช้เดียวกันในภาษาการเขียนโปรแกรมเดียวกันจะเหมาะกว่าสำหรับการแก้ไข แค่ความเห็นของฉัน
Kevin Cruijssen

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

8

05AB1E , 21 ไบต์

vyN+Ny-})¹gL<Ãv¹yè})Z

คำอธิบาย

v      }               # for each num in input
 yN+                   # push index + num
    Ny-                # push index - num
        )              # wrap stack in a list
         ¹gL<Ã         # remove indices outside the range of input
              v¹yè})   # get list of elements in input at the remaining indices
                    Z  # get max

ลองออนไลน์!


คุณอาจจะใช้มันตลอดเวลา แต่ฉันเพิ่งสังเกต "ห่อกองในรายการ" เรียบร้อย
GreenAsJade

@GreenAsJade: ใช่มันเป็นหนึ่งในคำสั่งที่ผมใช้มากที่สุด :)
Emigna

7

Haskell, 61 57 55 ไบต์

f x=maximum[a|(n,a)<-x,(i,b)<-x,b==abs(n-i)]
f.zip[0..]

ตัวอย่างการใช้งาน: ->(f.zip[0..]) [5,28,14,5,6,3,4,7]14

(มากหรือน้อย) การดำเนินงานโดยตรงของคำนิยาม: สำหรับดัชนีแต่ละnของรายการป้อนข้อมูลxเก็บไว้a := x!!nถ้ามีดัชนีiที่เท่าเทียมกันb := x!!i abs(n-i)ค้นหาสูงสุด

แก้ไข: @xnor บันทึกสองไบต์ ขอบคุณ!


เนื่องจากคุณไม่ได้ใช้xก็ควรจะสั้นกว่าที่จะกำหนดฟังก์ชั่นในและเขียนในz zip[0..]
xnor

6

เยลลี่ 10 ไบต์

,N+JFfJị¹Ṁ

ลองออนไลน์! หรือตรวจสอบกรณีทดสอบทั้งหมด

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

,N+JFfJị¹Ṁ  Main link. Argument: A (array)

,N          Pair A with -A (element-wise negative).
   J        Yield the indices of A [1, ..., len(A)].
  +         Add the elements of A (and their negatives) with the corr. indices.
    F       Flatten the resulting 2D array.
     fJ     Filter indices; remove invalid indices (not in [1, ..., len(A)]) from
            the generated array. The result is the list of all indices of eligible
            elements of A.
       ị¹   Retrieve the corresponding elements of A.
         Ṁ  Take the maximum.


5

EXCEL: 32 30 ไบต์

=MAX(IF(A:A-ROW(A:A)<0,A:A,0))

ฉันยังไม่อยากจะเชื่อเลยว่าจะได้รับสิ่งนี้ ...

วิธีใช้:
วางสิ่งนี้ลงในเซลล์ใด ๆ ยกเว้นเซลล์ของคอลัมน์ A หลังจากวางในขณะที่ยังคงแก้ไขอยู่ให้กดcontrol+ shift+ enterเพื่อป้อนอย่างถูกต้อง
ใส่ค่าของคุณลงในคอลัมน์ A, 1 ค่าต่อเซลล์ (ตามรายการ CSV)

หากคุณต้องการทราบวิธีการทำงานนี้ฉันได้โพสต์คำแนะนำเพิ่มเติมในคำถามเคล็ดลับสำหรับการเล่นกอล์ฟใน Excel


ฉันรักกอล์ฟ Excel ที่ยอดเยี่ยมเหล่านี้ - ใครที่คิดว่า !!
GreenAsJade


4

Perl, 45 ไบต์

รวมถึง +2 สำหรับ -ap

ให้ตัวเลขกับบรรทัดบน STDIN:

largest.pl <<< "5 12 2 5 4 7 3 3 6 2 10 5 5 5 4 1 8 5"

largest.pl:

#!/usr/bin/perl -ap
($_)=sort{$b-$a}map@F[$^P=$n-$_,$n+++$_],@F

สามารถรับได้อีกหนึ่งไบต์โดยแทนที่ ^Pด้วยอักขระควบคุมตามตัวอักษร แต่สิ่งนี้นำไปสู่คำเตือนเกี่ยวกับ STDERR ใน perls ล่าสุด

ถือว่า largest number + array length < 2^32


3

Pyth, 19 17 ไบต์

ขอบคุณ @ Pietu1998 สำหรับ -2 ไบต์

eS@LQ@UQs.e,-kb+b

โปรแกรมที่รับอินพุตของรายการบน STDIN และพิมพ์ผลลัพธ์

ลองออนไลน์

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

eS@LQ@UQs.e,-kb+b  Program. Input: Q
         .e        Map over Q (implicit input fill) with elements as b and indices as k:
            -kb     k-b
               +b   k+b (Implicit fill with k)
           ,        2-element list of those (possible indices)
        s          Flatten that
      UQ           Yield [0, 1, 2, 3..., len(Q)-1]
     @             Filter the flattened list by presence in the above, removing invalid
                   indices
  @LQ              Index into Q at those indices
 S                 Sort that
e                  Yield the last element of that, giving the maximum
                   Implicitly print

}#@เป็นเช่นเดียวกับ นอกจากนี้หากคุณจัดเรียงบิตสุดท้ายให้ใหม่,-kb+bkคุณสามารถลบส่วนสุดท้ายได้kตั้งแต่ Pyth แทรกอัตโนมัติ
PurkkaKoodari

@ Pietu1998 ขอบคุณ ฉันไม่รู้เกี่ยวกับการเติมโดยปริยายสำหรับการแจกแจง ใช้งานได้กับฟังก์ชั่นประเภทแผนที่อื่น ๆ หรือไม่
TheBikingViking

ใช้ได้กับแลมบ์ดาใด ๆ โดยอัตโนมัติเติมส่วนแลมบ์ดาอื่น ๆ ด้วยตัวแปรแลมบ์ดาแรก
PurkkaKoodari

3

MATL, 13 ไบต์

ttn:tYTq=a)X>

อินพุตต้องเป็นเวกเตอร์คอลัมน์ นั่นคือการป้อนข้อมูลจะคั่นด้วยเครื่องหมายอัฒภาคเช่น [1; 2; 3] หรือคั่นด้วยเครื่องหมายจุลภาคด้วยเห็บ transpose ที่ท้ายเช่น [1,2,3] '

ลองออนไลน์!

กรณีทดสอบทั้งหมด: (A) , (B) , (C) , (D) , (E) , (F)

ขอบคุณ Suever สำหรับคำแนะนำในห้องสนทนา MATL เพื่อบันทึก 2 ตัวอักษร

คำอธิบาย:

กลยุทธ์โดยรวมนั้นเหมือนกับคำตอบ Octave / MATLAB ของฉันซึ่งมีการอธิบายแนวคิดพื้นฐาน: https://codegolf.stackexchange.com/a/94161/42247

รหัสเฉพาะในคำตอบ MATL นี้ถูกสร้างขึ้นดังนี้:

แกนหลักของวิธีนี้คือการสร้างเมทริกซ์ Toeplitz ซึ่งรายการ ij'th คือ abs (ij) เราสร้างเมทริกซ์ Toeplitz ด้วยรายการ abs (i-1) +1 ด้วยคำสั่ง toeplitz ของ MATL ของ YT ดังนี้:

n:tYT % Equivalent to @(v)toeplitz(1:length(v))

หากต้องการดูวิธีการทำงานให้เราเรียกเวกเตอร์อินพุตไปยังข้อมูลโค้ดนี้ 'v' 'n' ค้นหาความยาวของ v แล้ว ':' สร้างเวกเตอร์ 1: length (v) ถัดไป 't' ทำสำเนาอีก 1: length (v) บนสแต็ก; ต้องการสำเนาเพิ่มเติมนี้เนื่องจากข้อบกพร่องที่รู้จักกันดีในฟังก์ชั่น YT ใน MATL (MATL เทียบเท่ากับ toeplitz ()) ซึ่งคาดว่าจะมีสำเนาของอินพุตสองชุดแทนที่จะเป็น 1 จากนั้น YT จะนำสำเนาสองชุดของเวกเตอร์นี้ 1 : length (v) จากสแต็กและทำให้ abs (ij) +1 Toeplitz matrix จากพวกมัน

ตอนนี้เราต้องลบ 1 จากเมทริกซ์นี้เพื่อให้ได้เมทริกซ์ Toeplitz ที่มีรายการ abs (ij) และหาตำแหน่ง ij ที่เมทริกซ์ abs (ij) Toeplitz นี้เท่ากับเมทริกซ์ของเวกเตอร์คอลัมน์ทั้งหมดที่มีสำเนาคอลัมน์ของอินพุต vector v. ทำได้ดังนี้:

t n:tYT q=
% t [code] q= is equivalent to @(v) [code](v)-1 == v

't' ตัวแรกทำสำเนาพิเศษของอินพุตและเก็บไว้ในสแต็ก 'n: tYT' สร้างเมทริกซ์ toeplitz ตามที่อธิบายไว้ก่อนหน้านี้และส่งออกไปยังสแต็ก จากนั้น 'q' ลบ 1 จากเมทริกซ์ Toeplitz และ '=' ทำการเปรียบเทียบความเท่าเทียมกันขององค์ประกอบตามลำดับระหว่างเมทริกซ์ abs (ij) และเวกเตอร์ที่มีคอลัมน์เป็นสำเนาของอินพุต โปรดทราบว่าโดยการเปรียบเทียบเวกเตอร์คอลัมน์กับเมทริกซ์เรากำลังใช้ประโยชน์จากกฎการกระจายสัญญาณของผู้ดำเนินการของ MATLAB / MATL โดยปริยาย (เวกเตอร์คอลัมน์ในการเปรียบเทียบได้รับการคัดลอกเพื่อสร้างเมทริกซ์โดยไม่ต้องใช้คำสั่งใด ๆ )

ในที่สุดเราจำเป็นต้องค้นหาดัชนีแถว i ที่มีคอลัมน์ j เช่นที่รายการ ij'th ในความแตกต่างเมทริกซ์ที่สร้างขึ้นเหนือเท่ากับ 1 จากนั้นรับค่าของเวกเตอร์อินพุตที่สอดคล้องกับดัชนีเหล่านี้จากนั้นใช้ค่าสูงสุด ในสามขั้นตอนต่อไปนี้:

1) ค้นหาดัชนีสำหรับแถวใด ๆ ที่มีค่าไม่ใช่ศูนย์:

tn:tYTq= a
% [code] a is equivalent to @(v) any([code](v))

2) แยกองค์ประกอบของเวกเตอร์อินพุตที่สอดคล้องกับดัชนีเหล่านั้น:

t tn:tYTq= a ) X>
% t [code] ) is equivalent to @(v) v([code](v)]

3) ค้นหาและส่งคืนองค์ประกอบสูงสุด:

t tn:tYTq= a ) X>
% [code] X> is equivalent to @(v) max(v).

ลักษณะการทำงานของฟังก์ชั่นYTมีการเปลี่ยนแปลงในการปล่อย 20.2.2 ตอนนี้มันใช้ 1 อินพุตโดยค่าเริ่มต้น (ซึ่งมีประโยชน์มากกว่าทั่วไป) แม้ว่าจะช่วยให้คุณประหยัดได้ 1 ไบต์ที่นี่ (ลบtก่อนหน้าYT) แต่ก็ไม่สามารถใช้ประโยชน์ได้เนื่องจากการเปลี่ยนภาษาจะทำให้เกิดความท้าทาย แต่มันมีผลกระทบที่คำตอบของคุณจะไม่ถูกต้องในรีลีสใหม่ซึ่งตอนนี้อยู่ใน TIO
Luis Mendo

คุณสามารถแก้ไขรหัสที่เชื่อมโยงและออกจากบันทึกย่อหรือใช้ลิงก์นี้ไปยังล่าม MATL Online ซึ่งรองรับการเผยแพร่รุ่นเก่า น่าเสียดายที่คุณต้องอัพเดตลิงค์อื่น ๆ ด้วย ขออภัยในความไม่สะดวก
Luis Mendo



2

อ็อกเทฟ / MATLAB, 40 ไบต์

@(v)max(v(any(toeplitz(1:nnz(v))-v==1)))

อินพุตต้องเป็นเวกเตอร์คอลัมน์

ขอบคุณ Luis Mendo สำหรับคำแนะนำที่ช่วยประหยัด 3 ไบต์ (ดูความคิดเห็น)

ขอบคุณ Suever สำหรับคำแนะนำที่ช่วยประหยัด 4 ไบต์ขึ้นไป (แทนที่ ~~ (sum ()) ด้วย any ())

คำอธิบาย:

เมื่อป้อนเวกเตอร์ v, ปัญหานี้เทียบเท่ากับการหาวิธีแก้ปัญหาทั้งหมด i, j ของสมการไม่ต่อเนื่องต่อไปนี้

abs(i-j) = v(i),   i,j both in 1..k,

โดยที่ abs () เป็นฟังก์ชันค่าสัมบูรณ์ v (i) แต่ละตัวที่สมการนี้ถูกแก้ไขเป็นหนึ่งในคำตอบของผู้สมัครซึ่งเราสามารถเพิ่มให้ได้มากที่สุด

ในฐานะฟังก์ชันแยกของ i และ j ความเป็นไปได้ทั้งหมดสำหรับด้านซ้ายมือสามารถจัดเรียงในเมทริกซ์ toeplitz ที่มีลักษณะดังนี้:

[0, 1, 2, 3, 4]
[1, 0, 1, 2, 3]
[2, 1, 0, 1, 2]    <--- abs(i-j)
[3, 2, 1, 0, 1]
[4, 3, 2, 1, 0]

และเนื่องจากด้านขวาไม่ได้ขึ้นอยู่กับ i ความเป็นไปได้ทั้งหมดจึงสามารถจัดเป็นเมทริกซ์โดยที่คอลัมน์เป็นสำเนาทั้งหมดของอินพุต

[v(1), v(1), v(1), v(1), v(1)]
[v(2), v(2), v(2), v(2), v(2)]
[v(3), v(3), v(3), v(3), v(3)]   <--- v(i)
[v(4), v(4), v(4), v(4), v(4)]
[v(5), v(5), v(5), v(5), v(5)]

ในการหาคำตอบทั้งหมดของสมการเราจะลบเมทริกซ์สองตัวนี้ออกและหาตำแหน่งที่มีศูนย์ แถวที่มีค่าศูนย์สอดคล้องกับดัชนีที่ต้องการ i ซึ่งมี aj เช่นนั้น abs (ij) = v (i)

เทคนิคอื่น ๆ :

  • ใช้อักขระน้อยลงในการสร้างฟังก์ชันค่าสัมบูรณ์บวกหนึ่ง, abs (ij) +1 จากนั้นตรวจสอบตำแหน่งที่ความแตกต่างคือ 1 แทนที่จะสร้างฟังก์ชันค่าสัมบูรณ์ที่แท้จริง (ไม่เปลี่ยน)
  • ใช้ตัวดำเนินการกระจายเสียงอัตโนมัติเพื่อทำสำเนาคอลัมน์ของ v
  • รับความยาวของอินพุตผ่าน nnz () แทนที่จะเป็น length () ซึ่งทำงานได้เนื่องจากอินพุตถูกกล่าวว่าเป็นค่าบวกในคำชี้แจงปัญหา

รูปแบบอินพุตมีความยืดหยุ่นตามค่าเริ่มต้น คุณสามารถใช้vเป็นเวกเตอร์คอลัมน์เพียงระบุว่าในคำตอบ นอกจากนี้คุณแทนที่findด้วย~~เพื่อประหยัดอีกสองไบต์
Luis Mendo

@LuisMendo ขอบคุณฉันแก้ไขโพสต์เพื่อรวมข้อเสนอแนะของคุณ!
Nick Alger

สำหรับภาษาที่แตกต่างกัน (หรือวิธีการที่แตกต่างกันอย่างมีนัยสำคัญในภาษาเดียวกัน) คุณควรจะโพสต์คำตอบอื่น มีห้องสนทนา MATLหากคุณมีข้อสงสัยเกี่ยวกับภาษา
Luis Mendo

BTW เนื่องจากข้อผิดพลาดใน MATL ของtoeplitz( YT) มันใช้สองอินพุต (ไม่ใช่หนึ่ง) โดยค่าเริ่มต้น
Luis Mendo

โอเคดี. ฉันแปลมันเป็น MATL และโพสต์คำตอบอื่นที่นี่: codegolf.stackexchange.com/a/94183/42247
Nick Alger

1

Mathematica, 69 ไบต์

Max@MapIndexed[{If[#2[[1]]>#,a[[#2-#]],{}],a[[#2+#]]~Check~{}}&,a=#]&

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




1

Java 7, 125 123 bytes

int c(int[]a){int r=0,i=0,l=a.length,x;for(;i<l;r=l>(x=i+a[i])?a[x]>r?a[x]:r:r,r=(x=i-a[i++])>0?a[x]>r?a[x]:r:r);return r;}

2 ไบต์บันทึกขอบคุณที่@mrco

Ungolfed (ประเภท) & รหัสทดสอบ:

ลองที่นี่

class M{
  static int c(int[] a){
    int r = 0,
        i = 0,
        l = a.length,
        x;
    for(; i < l; r = l > (x = i + a[i])
                      ? a[x] > r
                         ? a[x]
                         : r
                      : r,
                 r = (x = i - a[i++]) > 0
                      ? a[x] > r
                         ? a[x]
                         : r
                      : r);
    return r;
  }

  public static void main(String[] a){
    System.out.println(c(new int[]{ 1, 13 }));
    System.out.println(c(new int[]{ 2, 9, 8, 3, 72, 2 }));
    System.out.println(c(new int[]{ 5, 28, 14, 5, 6, 3, 4, 7 }));
    System.out.println(c(new int[]{ 1, 3, 5, 15, 4, 1, 2, 6, 7, 7 }));
    System.out.println(c(new int[]{ 5, 1, 3, 5, 2, 5, 5, 8, 5, 1, 5, 1, 2, 3 }));
    System.out.println(c(new int[]{ 5, 12, 2, 5, 4, 7, 3, 3, 6, 2, 10, 5, 5, 5, 4, 1, 8, 5 }));
  }
}

เอาท์พุท:

13
8
14
7
5
10

1
คุณไม่ต้องการ x & y เพียงแค่ใช้หนึ่งในนั้น (-2) นอกจากนี้ฉันไม่คิดว่าคุณสามารถตั้งค่า r ใน ternary ใหญ่ - ถ้าคุณต้องทดสอบทั้งสองกรณีซ้ายและขวา
mrco

1
@mrco ,yขอบคุณลบ และฉันก็มาถึงข้อสรุปเดียวกันเกี่ยวกับการประกอบไปด้วยสามถ้า แน่นอนว่าเป็นไปได้ แต่คุณจะทำการตรวจสอบสองครั้งทำให้มันนานขึ้น
Kevin Cruijssen

1

Java, 118 ไบต์

int f(int[]a){int t=0,i,j,z=0,l=a.length;while(t<l*l){i=t/l;j=t++%l;z=a[i]>z&&((i<j?j-i:i-j)==a[j])?a[i]:z;}return z;}

ยินดีต้อนรับสู่ PPCG! :)
Martin Ender

1

Python 58 ไบต์

ขึ้นอยู่กับโทนี่เอสคำตอบของทับทิม คำตอบนี้ใช้ได้ใน Python 2 และ 3 ยินดีต้อนรับคำแนะนำการเล่นกอล์ฟ

lambda n:max([n[i+v]for i,v in enumerate(n)if i+v<len(n)])

Ungolfing

def f(array):
    result = []
    for index, value in enumerate(array):
        if index + value < len(array):
            result.append(array[index + value])
    return max(result)

1

ทับทิม 56 ไบต์

โซลูชันทับทิมที่เล็กที่สุดของฉัน

->n{x=[];i=0;n.map{|v|x<<n[v+i]&&v+i<n.size;i+=1};x.max}

ค่อนข้างง่ายที่จะทดสอบในคอนโซลทางรถไฟ

a = ->n{x=[];i=0;n.map{|v|x<<n[v+i]&&v+i<n.size;i+=1};x.max}
a[[1, 13]
=> 13
a[[2, 9, 8, 3, 72, 2]]
=> 8
a[[5, 12, 2, 5, 4, 7, 3, 3, 6, 2, 10, 5, 5, 5, 4, 1, 8, 5]]
=> 10

สิ่งนี้เริ่มต้นที่ 63 ไบต์ขอบคุณสำหรับคำแนะนำเพื่อช่วยลดขนาด!


คุณสามารถใช้.mapแทน.each
Cyoce

ยัง(x) if (y)สามารถแทนที่ด้วย(y)&&(x)
Cyoce

คุณสามารถใช้a<<bแทนa+=[b]
Sherlock9

@ Sherlock9 ฉันลืมไปแล้ว << การใช้ + = [b] ไม่สามารถใช้งานได้กับข้อเสนอแนะของ Cyoce โดยใช้ && ตอนนี้ก็ขอบคุณ!
Tony S.

1

ที่จริงแล้ว 17 ไบต์

คำตอบนี้เป็นเมืองท่าที่จริงของคำตอบหลามของฉัน ยินดีต้อนรับคำแนะนำการเล่นกอล์ฟ ลองออนไลน์!

;╗ñ♂Σ⌠╜l>⌡░⌠╜E⌡MM

Ungolfing

         Implicit input L.
;╗       Duplicate L and save a copy of L to register 0.
ñ        enumerate() the other copy of L.
♂Σ       sum() all the pairs of [index, value of n]. Call this list Z.
⌠...⌡░   Push values of Z where the following function returns a truthy value. Variable v_i.
  ╜        Push L from register 0.
  l        Push len(L).
  >        Check if len(L) > v_i.
⌠...⌡M   Map the following function over Z_filtered. Variable i.
  ╜        Push L from register 0.
  E        Take the ith index of L.
M        max() the result of the map.
         Implicit return.

0

T-SQL (sqlserver 2016), 132 ไบต์

แข็งแรงเล่นกอล์ฟ:

;WITH C as(SELECT value*1v,row_number()over(order by 1/0)n FROM STRING_SPLIT(@,','))SELECT max(c.v)FROM C,C D WHERE abs(D.n-C.n)=D.v

Ungolfed:

DECLARE @ varchar(max)='2, 9, 8, 3, 72, 2'

;WITH C as
(
  SELECT
    value*1v,
    row_number()over(order by 1/0)n
  FROM
    STRING_SPLIT(@,',')
)
SELECT
  max(c.v)
FROM
  C,C D
WHERE
  abs(D.n-C.n)=D.v

ซอ


0

JavaScript (ES6), 56 54 ไบต์

let f =
    
l=>l.map((n,i)=>m=Math.max(m,l[i+n]|0,l[i-n]|0),m=0)|m

console.log(f([1, 13])); // → 13
console.log(f([2, 9, 8, 3, 72, 2])); // → 8
console.log(f([5, 28, 14, 5, 6, 3, 4, 7])); // → 14
console.log(f([1, 3, 5, 15, 4, 1, 2, 6, 7, 7])); // → 7
console.log(f([5, 1, 3, 5, 2, 5, 5, 8, 5, 1, 5, 1, 2, 3])); // → 5
console.log(f([5, 12, 2, 5, 4, 7, 3, 3, 6, 2, 10, 5, 5, 5, 4, 1, 8, 5])); // → 10


0

Clojure, 68 ไบต์

#(apply max(map(fn[i](get % i 0))(flatten(map-indexed(juxt - +)%))))

ยกตัวอย่างเช่น(map-indexed (juxt - +) [3 4 1 2])เป็น([-3 3] [-3 5] [1 3] [1 5])(ดัชนี+/-ความคุ้มค่า) เหล่านี้จะใช้เป็นค่ามองขึ้นจากเดิมเวกเตอร์ (ออกจากช่วงผิดนัด0) และค่าสูงสุดที่พบ ยังคงรู้สึก verbose เล็กน้อย แต่อย่างน้อยฉันก็ต้องใช้juxt:)

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