ค้นหาจำนวนมากที่สุดที่อยู่ติดกับศูนย์


38

ท้าทาย:

ใช้เวกเตอร์ / รายการเลขจำนวนเต็มเป็นอินพุตและส่งออกจำนวนที่มากที่สุดที่อยู่ติดกับศูนย์

ข้อมูลจำเพาะ:

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

กรณีทดสอบ:

1 4 3 6 0 3 7 0
7

9 4 9 0 9 0 9 15 -2
9

-4 -6 -2 0 -9
-2

-11 0 0 0 0 0 -12 10
0

0 20 
20

ขอให้โชคดีและเล่นกอล์ฟอย่างมีความสุข!


คุณควรเพิ่มกรณีทดสอบเช่นเดียวกับที่ 4 แต่ในกรณีที่ผลลัพธ์เป็นลบ (มีตัวเลขบวกในรายการ)
mbomb007

ฉันกำลังจะลองสิ่งนี้ใน Retina แต่แล้วฉันก็สังเกตเห็นว่ามีฟิล์มเนกาทีฟ Retina เกลียดเชิงลบ
mbomb007

2
อย่าปล่อยให้เรตินาบอกสิ่งที่คุณทำได้และทำไม่ได้ รับหน้าที่คุณเป็นหัวหน้า!
Stewie Griffin

คำตอบ:



19

MATL 10 ไบต์

t~5BZ+g)X>

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

คำอธิบาย

ลองทำ[-4 -6 -2 0 -9]ตัวอย่างเป็นตัวอย่าง

t     % Input array. Duplicate
      %   STACK: [-4 -6 -2 0 -9],  [-4 -6 -2 0 -9]
~     % Logical negate. Replaces zeros by logical 1, and nonzeros by logical 0
      %   STACK: [-4 -6 -2 0 -9],  [0 0 0 1 0]
5B    % Push logical array [1 0 1] (5 in binary)
      %   STACK: [-4 -6 -2 0 -9], [0 0 0 1 0], [1 0 1]
Z+    % Convolution, maintaining size. Gives nonzero (1 or 2) for neighbours of
      % zeros in the original array, and zero for the rest
      %   STACK: [-4 -6 -2 0 -9], [0 0 1 0 1]
g     % Convert to logical
      %   STACK: [-4 -6 -2 0 -9], [0 0 1 0 1]
)     % Use as index into original array
      %   STACK: [-2 -9]
X>    % Maximum of array.
      %   STACK: -2
      % Implicitly display

x(~~(dec2bin(5)-48)). ใครที่มีความคิดที่จะใช้สิ่งนั้น ฉลาดและมีประโยชน์สำหรับอาร์เรย์แบบลอจิคัล! :) คำตอบที่ดี!
Stewie Griffin

1
@ ถ้าฉันขอขอบคุณก่อนอื่น! ผมใช้dec2bin()-'0'หลายร้อยครั้งใน MATLAB เพื่อให้ฉันรู้ว่าหนึ่งจะต้องอยู่ใน MATL :-)
หลุยส์ Mendo

5
อย่างไรก็ตามความจริงที่ว่าคุณรวมเนื้อหาของสแต็คหลังจากการดำเนินการทุกครั้งมีค่าสูงขึ้นเพียงอย่างเดียว มันทำให้เข้าใจได้ง่ายขึ้น (และเรียนรู้ได้) MATL =)
Stewie Griffin

2
Convolution Rocks +1
Suever

10

05AB1E , 9 ไบต์

ü‚D€P_ÏOZ

คำอธิบาย

ü‚         # pair up elements
  D        # duplicate
   €P      # product of each pair (0 if the pair contains a 0)
     _     # logical negate, turns 0 into 1 and everything else to 0
      Ï    # keep only the pairs containing at least 1 zero
       O   # sum the pairs
        Z  # take max

ไม่ทำงานในล่ามออนไลน์ แต่ทำงานแบบออฟไลน์


นี่มันช่างวิเศษจริงๆ! ในเวลา: p.
Adnan

1
เพิ่งใช้งานตัวดำเนินการอย่างใดอย่างหนึ่งเหล่านี้หรือ :)
Stewie Griffin

1
@WeeingIfFirst: üถูกเพิ่มเข้ามาเมื่อวานนี้เพียง :)
Emigna

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

1
@ ลินน์จับได้ดี! สามารถแก้ไขได้อย่างง่ายดายโดยแทนที่˜ด้วยO(รวม)
Adnan

9

Haskell, 63 43 ไบต์

f x=maximum[a+b|(a,b)<-tail>>=zip$x,a*b==0]

ขอบคุณ @MartinEnder สำหรับ 4 ไบต์!


ฉันคิดว่าคุณสามารถใช้แทนa*b==0 ||
Martin Ender

คุณต้องย้อนกลับไปยังรุ่นก่อนหน้าพร้อมซิป ที่นี่และไม่อยู่ติดกันอีกต่อไป
ดาเมียน

คุณไม่จำเป็นต้อง lambdabot ที่นี่ นี่คือ Haskell "ปกติ"
ดาเมียน

8

Pyth, 12 11 10 ไบต์

eSsM/#0,Vt

แบบฟอร์มคู่ตัวกรองโดยสมาชิกศูนย์เรียงตามผลรวมผลตอบแทนที่ใหญ่ที่สุด


,Vt(โดยนัยQQ) ส่งคืนคู่เดียวกันกับ.:Q2แต่มีการพลิกคู่ ควรทำงานแม้ว่า
PurkkaKoodari

f}0Tis/#0
isaacg

7

JavaScript (ES6), 59 57 56 ไบต์

let f =
    
l=>l.map((n,i)=>m=l[i-1]==0|l[i+1]==0&&n>m?n:m,m=-1/0)|m

console.log(f([1, 4, 3, 6, 0, 3, 7, 0]));       // 7
console.log(f([9, 4, 9, 0, 9, 0, 9, 15, -2]));  // 9
console.log(f([-4, -6, -2, 0, -9]));            // -2
console.log(f([-11, 0, 0, 0, 0, 0, -12, 10]));  // 0
console.log(f([3, 0, 5]));                      // 5
console.log(f([28, 0, 14, 0]));                 // 28

แก้ไข: บันทึก 2 ไบต์ขอบคุณ Huntro
แก้ไข: บันทึก 1 ไบต์ขอบคุณ ETHproductions


1
คุณสามารถบันทึกสองไบต์โดยใช้==แทน===
Huntro

1
ฉันสามารถบันทึกไม่กี่ไบต์ในหลายแห่ง:l=>l.map((n,i)=>m=l[i-1]*l[i+1]==0&n>m?n:m,m=-1/0)|m
ETHproductions

ข้อผิดพลาด: {"message": "ข้อผิดพลาดทางไวยากรณ์", "filename": " stacksnippets.net/js ", "lineno": 15, "colno": 3}
RosLuP

@RosLuP - ต้องใช้ ES6 ที่รองรับฟังก์ชั่นลูกศรและจะไม่ทำงานบนเบราว์เซอร์ทั้งหมด (รวมถึง แต่ไม่ จำกัด เฉพาะ: IE ทุกเวอร์ชันก่อน Edge, Safari ทุกรุ่นที่ต่ำกว่า v10 เป็นต้น)
Arnauld

6

JavaScript (ES6), 53 ไบต์

a=>(m=-1/0,a.reduce((l,r)=>(m=l*r||l+r<m?m:l+r,r)),m)

reduceเพราะผมชอบใช้ ทางเลือกอื่นเช่น 53 ไบต์:

a=>Math.max(...a.map((e,i)=>e*a[++i]==0?e+a[i]:-1/0))

5

Python ขนาด 49 ไบต์

lambda a:max(sum(x)for x in zip(a,a[1:])if 0in x)

การทดสอบอยู่ที่ideone

ซิปผ่านคู่ผลรวมที่มีศูนย์ใด ๆ ส่งคืนค่าสูงสุด


4

Ruby, 51 ไบต์

->a{a.each_cons(2).map{|a,b|a*b!=0?-1.0/0:a+b}.max}

การใช้

f=->a{a.each_cons(2).map{|a,b|a*b!=0?-1.0/0:a+b}.max}
p f[gets.split.map(&:to_i)]

a+bผมไม่คิดว่าคุณต้องวงเล็บรอบ
Martin Ender

ข้อผิดพลาดทางไวยากรณ์ @Martin Ender เกิดขึ้น ... ideone.com/F6Ed4B
cia_rana

มันทำงานในทับทิม 2.3 (มีให้ที่นี่เช่น: repl.it/languages/ruby )
Martin Ender

@Martin Ender เมื่อฉันใช้ "! =" แทนที่จะเป็น "==" มันใช้งานได้ ขอบคุณสำหรับคำแนะนำ! ideone.com/F6Ed4B
cia_rana

มีข้อผิดพลาดในนั้น :(. -3 -2 0ผลตอบแทน0ฉันคิดว่าการแทนที่...?0:...ด้วย...?-1.0/0:...ควรแก้ไขได้เพิ่ม 5 ไบต์
m-chrzan

4

PHP, 77 68 71 ไบต์

-3 ไบต์จากนิรนาม -4 และ -2 จาก MartinEnder

preg_match_all("#(?<=\b0 )\S+|\S+(?= 0)#",$argv[1],$m);echo max($m[0]);

ทำงานด้วย php -r '<code>' '<space separated values>'


2
ใช้\Kเพื่อละทิ้งการแข่งขันจนสั้นกว่าการใช้การดู
user59178

2
คุณยังสามารถใช้การแยกช่องว่างสำหรับการป้อนข้อมูลจากนั้นใช้\S+เพื่อจับคู่จำนวนเต็มที่ลงนามแล้ว คุณอาจจะต้องใช้\b0,เพื่อให้คุณไม่ต้องย่อหน้า ,
Martin Ender

1
มันใช้งานได้กับการป้อนข้อมูล4 0 0 5หรือไม่
Ton Hospel

@TonHospel ไม่\Kทำงานกับทางเลือกอื่นหรือไม่ ไม่ทราบด้วยเหตุผลที่ผลตอบแทนทางเลือกที่สอง0 0เพื่อให้มีไม่มากเพื่อให้ตรงกับก่อน0 5คงที่ขอบคุณ
ติตัส

ดูโซลูชัน PHP อื่น ๆ กับ register_globals
JörgHülsermann

4

Java 7, 118 105 106 ไบต์

int d(int[]a){int i=0,m=1<<31,c;for(;++i<a.length;m=a[i]*a[i-1]==0&(c=a[i]+a[i-‌​1])>m?c:m);return m;}

บันทึก 13 ไบต์ด้วย@cliffrootโดยใช้วิธีการทางคณิตศาสตร์แทน 1 ไบต์เพิ่มเติมขอบคุณ@mrcoหลังจากที่เขาพบข้อผิดพลาด (กรณีทดสอบเพิ่ม2, 1, 0จะกลับมา2แทน1)

Ungolfed & รหัสการทดสอบ:

ลองที่นี่

class M{
  static int c(int[] a){
    int i,
        m = a[i=0],
        c;
    for(; ++i < a.length; m = a[i] * a[i-1] == 0 & (c = a[i] + a[i - 1]) > m)
                           ? c
                           : m);
    return m;
  }

  public static void main(String[] a){
    System.out.println(c(new int[]{ 1, 4, 3, 6, 0, 3, 7, 0 }));
    System.out.println(c(new int[]{ 9, 4, 9, 0, 9, 0, 9, 15, -2 }));
    System.out.println(c(new int[]{ -4, -6, -2, 0, -9 }));
    System.out.println(c(new int[]{ -11, 0, 0, 0, 0, 0, -12, 10 }));
    System.out.println(c(new int[]{ 0, 20 }));
    System.out.println(c(new int[]{ 2, 1, 0 }));
  }
}

เอาท์พุท:

7
9
-2
0
20
1

1
วิธีการที่แตกต่างกันเล็กน้อยโดยใช้ arithmetics ดูเหมือนว่าจะใช้งานได้int d(int[]a){int i,m=a[i=0],c;for(;++i<a.length;m=a[i]*a[i-1]==0&(c=a[i]+a[i-1])>m?c:m);return m;}
หน้าผา

3
เอาต์พุตไม่ถูกต้องเมื่อหมายเลขแรกไม่ได้อยู่ติดกับ 0 แต่ใหญ่กว่าจำนวนใด ๆ ที่อยู่ติดกับ 0 สามารถทำซ้ำได้โดยกรณีทดสอบ {2, 1, 0} คุณสามารถแก้ไขได้โดยการเริ่มต้นฉันด้วย 0 โดยตรงและ m กับ 1 << 31 (+1 โดยรวม)
mrco

3

CJam , 16 ไบต์

q~2ew{0&},::+:e>

ลองออนไลน์! (เป็นชุดทดสอบ)

คำอธิบาย

q~    e# Read and eval input.
2ew   e# Get all (overlapping) pairs of adjacent values.
{0&}, e# Keep only those that contain a 0.
::+   e# Sum each pair to get the other (usually non-zero) value.
:e>   e# Find the maximum.

3

MATLAB พร้อมกล่องเครื่องมือประมวลผลภาพ 32 ไบต์

@(x)max(x(imdilate(~x,[1 0 1])))

นี่คือฟังก์ชั่นที่ไม่ระบุชื่อ ตัวอย่างใช้สำหรับกรณีทดสอบ:

>> f = @(x)max(x(imdilate(~x,[1 0 1])))
f =
  function_handle with value:
    @(x)max(x(imdilate(~x,[1,0,1])))

>> f([1 4 3 6 0 3 7 0])
ans =
     7

>> f([9 4 9 0 9 0 9 15 -2])
ans =
     9

>> f([-4 -6 -2 0 -9])
ans =
    -2

>> f([-11 0 0 0 0 0 -12 10])
ans =
     0

>> f([0 20])
ans =
    20

3

Dyalog APL ขนาด 14 ไบต์

⌈/∊2(+↑⍨0∊,)/⎕

⌈/ ใหญ่ที่สุดของ

แบน (" eรายการ"

2(... )/คู่

+ ผลรวม (ศูนย์บวกบางสิ่งบางอย่าง)

↑⍨ ถ่ายถ้า

0 ศูนย์

เป็นสมาชิกของ

, คู่ (lit. การต่อข้อมูลหมายเลขทางซ้ายและหมายเลขทางขวา)

ลองใช้ออนไลน์!


3

R, 48 47 ไบต์

แก้ไข: แก้ไขข้อผิดพลาดด้วย @Vlo และเปลี่ยนเป็นอ่านอินพุตจาก stdins บันทึกหนึ่งไบต์โดยการกำหนดwและข้าม parantheses

function(v)sort(v[c(w<-which(v==0)-1,w+1)],T)[1]

v=scan();w=which(v==0);sort(v[c(w-1,w+1)],T)[1]

คำอธิบายที่ไม่ได้ซ้อน

  1. ค้นหาดัชนีที่เวกเตอร์vใช้กับค่า 0:w <- which(v == 0)
  2. สร้างเวกเตอร์ใหม่ที่มีดัชนี+-1: w-1และw+1
  3. แยกองค์ประกอบที่ตรงกับดัชนีw-1และw+1
  4. เรียงลำดับจากมากไปน้อยและแยกองค์ประกอบกำปั้น

โปรดทราบว่าถ้าองค์ประกอบสุดท้ายหรือครั้งแรกของการvเป็นศูนย์w+-1ได้อย่างมีประสิทธิภาพจะเรียกนอกดัชนีของความยาวของเวกเตอร์ที่แสดงให้เห็นว่าผลตอบแทนv[length(v)+1] NAนี้โดยทั่วไปไม่มีปัญหา แต่max()ฟังก์ชั่นลำบากกลับNAหากมีเหตุการณ์ใด ๆ na.rm=Tในเวกเตอร์เว้นแต่ระบุตัวเลือก ดังนั้นจึงสั้นกว่า 2 ไบต์ในการเรียงลำดับและแยกองค์ประกอบแรกที่ใช้max()เช่น:

max(x,na.rm=T)
sort(x,T)[1]

1
ต้องการวงเล็บพิเศษมิฉะนั้นจะล้มเหลวในทุกกรณีทดสอบที่สูงสุดคือขวาเป็น 0 เช่นc(1, 4, 3, 6, 0, 10, 7, 0) c((w<-which(v==0))-1,w+1)นอกจากนี้ยังมีบิตที่สั้นกว่าเล็กน้อยเมื่อสแกนsort((v<-scan())[c(w<-which(v==0)-1,w+1)],T)[1]
Vlo

@Vlo ขอบคุณที่ระบุข้อผิดพลาดที่เห็นได้ชัด +1 ในโซลูชันที่คุณแนะนำคุณลืมไป()เช่นกัน;) อัปเดตรหัสและกำหนดการvจัดการก่อนหน้านี้ทันที
Billywob

3

Mathematica, 46 43 ไบต์

ที่บันทึกไว้ 3 ไบต์เนื่องจาก@MartinEnder

Max[Tr/@Partition[#,2,1]~Select~MemberQ@0]&

ฟังก์ชั่นไม่ระบุชื่อ รับรายการจำนวนเต็มเป็นอินพุตและส่งคืนเลขจำนวนเต็มเป็นเอาต์พุต อ้างอิงจากโซลูชัน Ruby



2

Julia, 56 55 Bytes

f(l)=max(map(sum,filter(t->0 in t,zip(l,l[2:end])))...)

สร้างสิ่งอันดับสำหรับค่าที่อยู่ใกล้เคียงรับสิ่งอันดับที่มี 0, ผลรวมของค่าอันดับและหาค่าสูงสุด


1

Python 2, 74 ไบต์

def f(x):x=[9]+x;print max(x[i]for i in range(len(x)) if 0in x[i-1:i+2:2])

วงจรผ่านทุกองค์ประกอบถ้ามีอยู่ในตำแหน่งของทั้งซ้ายหรือขวาขององค์ประกอบปัจจุบันที่รวมไว้ในเครื่องกำเนิดไฟฟ้าและเรียกมันผ่าน0 maxเราจำเป็นต้อง pad รายการด้วย0หมายเลขที่ไม่ใช่ มันจะไม่ถูกรวมเพราะส่วน[-1:2:2]จะไม่รวมอะไรเลย


1

T-SQL, 182 ไบต์

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

DECLARE @x varchar(max)='1 5 4 3 6 1 3 17 1 -8 0 -7'

DECLARE @a INT, @b INT, @ INT WHILE @x>''SELECT @a=@b,@b=LEFT(@x,z),@x=STUFF(@x,1,z,''),@=IIF(@a=0,IIF(@b<@,@,@b),IIF(@b<>0 or @>@a,@,@a))FROM(SELECT charindex(' ',@x+' ')z)z PRINT @

Ungolfed:

DECLARE @x varchar(max)='1 5 4 3 6 1 3 17 1 -8 0 -7'

DECLARE @a INT, @b INT, @ INT
WHILE @x>''
  SELECT 
   @a=@b,
   @b=LEFT(@x,z),
   @x=STUFF(@x,1,z,''),
   @=IIF(@a=0,IIF(@b<@,@,@b),IIF(@b<>0 or @>@a,@,@a))
  FROM(SELECT charindex(' ',@x+' ')z)z 
PRINT @

ซอ


1

PowerShell v3 +, 62 ไบต์

param($n)($n[(0..$n.count|?{0-in$n[$_-1],$n[$_+1]})]|sort)[-1]

ค่อนข้างนานกว่าคำตอบอื่น ๆ แต่เป็นวิธีที่ดี

$nจะเข้า แล้ว loops ผ่านดัชนี0..$n.count, ใช้Where-Object( |?{...}) เพื่อดึงออกจากดัชนีผู้ที่รายการก่อนหน้าหรือถัดไปในอาร์เรย์เป็นและฟีดกลับเหล่านั้นลงในอาร์เรย์ชิ้น0 $n[...]จากนั้นเราจะองค์ประกอบเหล่านั้นและนำที่ใหญ่ที่สุด|sort[-1]

ตัวอย่าง

PS C:\Tools\Scripts\golfing> @(1,4,3,6,0,3,7,0),@(9,4,9,0,9,0,9,15,-2),@(-4,-6,-2,0,-9),@(-11,0,0,0,0,0,-12,10)|%{""+$_+" --> "+(.\largest-number-beside-a-zero.ps1 $_)}
1 4 3 6 0 3 7 0 --> 7
9 4 9 0 9 0 9 15 -2 --> 9
-4 -6 -2 0 -9 --> -2
-11 0 0 0 0 0 -12 10 --> 0

PS C:\Tools\Scripts\golfing> @(0,20),@(20,0),@(0,7,20),@(7,0,20),@(7,0,6,20),@(20,0,6)|%{""+$_+" --> "+(.\largest-number-beside-a-zero.ps1 $_)}
0 20 --> 20
20 0 --> 20
0 7 20 --> 7
7 0 20 --> 20
7 0 6 20 --> 7
20 0 6 --> 20

1

q, 38 ไบต์

{max x where 0 in'x,'(next x),'prev x}

นี้ดูเหมือนจะไม่ทำงานเมื่อสูงสุดมาหลังจากที่0 นอกจากนี้ฉันไม่ใช่ผู้เชี่ยวชาญ แต่ฉันคิดว่าคุณจะต้องล้อมโค้ดของคุณด้วย{}เพื่อให้เป็นฟังก์ชัน
Dennis

1

J, 18 ไบต์

[:>./2(0&e.\#+/\)]

คำอธิบาย

[:>./2(0&e.\#+/\)]  Input: array A
                 ]  Identity. Get A
     2              The constant 2
      (         )   Operate on 2 (LHS) and A (RHS)
               \    Get each subarray of size 2 from A and
             +/       Reduce it using addition
           \        Get each subarray of size 2 from A and
       0&e.           Test if 0 is a member of it
            #       Filter for the sums where 0 is contained
[:>./               Reduce using max and return

1

Perl 6 , 53 ไบต์

{max map ->$/ {$1 if !$0|!$2},(1,|@_,1).rotor(3=>-2)}

ขยาย:

# bare block lambda with implicit signature of (*@_)
{
  max

    map

      -> $/ {           # pointy lambda with parameter 「$/」
                        # ( 「$0」 is the same as 「$/[0]」 )
        $1 if !$0 | !$2 # return the middle value if either of the others is false
      },

      ( 1, |@_, 1 )     # list of inputs, with added non-zero terminals
      .rotor( 3 => -2 ) # grab 3, back-up 2, repeat until less than 3 remain
}

1

PHP, 66 ไบต์

foreach($a=$argv as$k=>$v)$v||$m=max($m,$a[$k-1],$a[$k+1]);echo$m;

ตรงไปตรงมาสวย iterates มากกว่าการป้อนข้อมูลและเมื่อจำนวนคือ0จะกำหนด$mจำนวนสูงสุดของ 2 หมายเลขที่อยู่ติดกันและ$mค่าก่อนหน้าใด ๆ

ทำงานแบบนี้ ( -dเพิ่มเพื่อความสวยงามเท่านั้น):

php -d error_reporting=30709 -r 'foreach($a=$argv as$k=>$v)$v||$m=max($m,$a[$k-1],$a[$k+1]);echo$m;' -- -4 -6 -2 0 -9;echo

1

C # 76 74 ไบต์

using System.Linq;i=>i.Zip(i.Skip(1),(a,b)=>a*b==0?1<<31:a+b).Max(‌​);

คำอธิบาย:

ใช้ zip เพื่อเข้าร่วมอาร์เรย์ด้วยตัวเอง แต่ข้ามค่าแรกในการอ้างอิงที่ 2 เพื่อให้รายการศูนย์รวมกับรายการหนึ่ง คูณ a คูณ b หากผลลัพธ์เป็นศูนย์หนึ่งในนั้นต้องเป็นศูนย์และส่งออกเป็น + b มิฉะนั้นให้ส่งออกจำนวนเต็มที่น้อยที่สุดที่เป็นไปได้ในภาษา ด้วยสมมติฐานที่ว่าเราจะมีศูนย์และไม่เป็นศูนย์เสมอค่าต่ำสุดนี้จะไม่ถูกส่งออกเป็นสูงสุด

การใช้งาน:

[TestMethod]
public void LargestFriend()
{
    Assert.AreEqual(7, F(new int[] { 1, 4, 3, 6, 0, 3, 7, 0 }));
    Assert.AreEqual(9, F(new int[] { 9, 4, 9, 0, 9, 0, 9, 15, -2 }));
    Assert.AreEqual(-2, F(new int[] { -4, -6, -2, 0, -9 }));
    Assert.AreEqual(0, F(new int[] { -11, 0, 0, 0, 0, 0, -12, 10 }));
    Assert.AreEqual(20, F(new int[] { 0, 20 }));
}

สวัสดี int[]i) {คุณสามารถลบพื้นที่ที่ นอกจากนี้ฉันนับ 75 ไบต์ในรหัสปัจจุบันของคุณ (74 ถ้าคุณลบช่องว่าง)
Kevin Cruijssen

ฉันคิดว่าคุณสามารถบันทึก 4 ไบต์โดย inverting ternaries นี้:a?b?i.Min()).Max():a:b
ติตัส

นอกจากusing System.Linq;นี้ใช่มั้ย
pinkfloydx33

จริง แต่คำถามนี้เพิ่งถามหาวิธีไม่ใช่โปรแกรมเต็มรูปแบบและการใช้System.Linq;เป็นส่วนหนึ่งของแม่แบบคลาสเริ่มต้นใหม่
Grax32

@Grax ทั้งสองวิธีที่คุณจะต้องรวมusingคำสั่งในการนับจำนวนไบต์ของคุณ
TheLethalCoder

1

R, 48 54 ไบต์

s=scan()

w=which;max(s[c(w(s==0)+1,w(s==0)-1)],na.rm=T)

อ่านเวกเตอร์จากอินพุตคอนโซลจากนั้นรับค่าสูงสุดเหนือค่าทั้งหมดที่อยู่ติดกับ 0

แก้ไข: จับ NAs ที่ผลิตที่ขอบเขตขอบคุณ rturnbull!


ฉันทำผิดหรือเปล่า? pastebin.com/0AA11xcw
จัดการ

สิ่งนี้ล้มเหลวในกรณีเช่น20 0เพราะs[w(s==0)+1]ส่งคืนNAและmaxการรักษาเริ่มต้นของNAคือส่งคืน คุณสามารถแก้ไขได้โดยการเพิ่มอาร์กิวเมนต์na.rm=Tหรือใช้รหัสซ้ำอีกครั้งsort(ดูคำตอบ R อื่น ๆ ที่โพสต์ไว้ด้านบน)
rturnbull

คุณสามารถรวมทุกอย่างไว้ในบรรทัดเดียวได้หรือไม่? ฉันไม่รู้วิธีเขียนโค้ดใน R แต่ฉันคิดว่าคุณทำได้
clismique

@ Qwerp-Derp: ไม่เท่าที่ฉันรู้ scan () รอให้อินพุตคอนโซลอ่านในเวกเตอร์สตรีมอินพุตถูกปิดโดยป้อนบรรทัดว่าง หากคุณเรียกใช้สองบรรทัดเป็นหนึ่งส่วนที่สองจะเป็นที่รู้จักอย่างน้อยบางส่วนที่จะป้อนให้กับเวกเตอร์ s
Headcrash

0

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

(λ(k)(let*((lr(λ(l i)(list-ref l i)))(l(append(list 1)k(list 1)))(m(for/list((i(range 1(sub1(length l))))
#:when(or(= 0(lr l(sub1 i)))(= 0(lr l(add1 i)))))(lr l i))))(apply max m)))

รุ่นโดยละเอียด:

(define f
 (λ(k)
    (let* ((lr (λ(l i)(list-ref l i)))
           (l (append (list 1) k (list 1)))
           (m (for/list ((i (range 1 (sub1(length l))))
                         #:when (or (= 0 (lr l (sub1 i)))
                                    (= 0 (lr l (add1 i))) ))
                (lr l i) )))
      (apply max m) )))

การทดสอบ:

(f (list 1 4 3 6 0 3 7 0))
(f (list 9 4 9 0 9 0 9 15 -2))
(f (list -4 -6 -2 0 -9))
(f (list -11 0 0 0 0 0 -12 10))
(f (list 0 20 ))

เอาท์พุท:

7
9
-2
0
20

0

C 132 ไบต์

เอาท์พุทโดยใช้รหัสส่งคืนของหลัก:

int main(int a,char**_){int i,m=0;_[0]=_[a]="1";for(i=1;i<a;++i){m=(*_[i-1]-48||*_[i+1]-48?m>atoi(_[i])?m:atoi(_[i]):m);}return m;}

ฉันรู้สึกว่าฉันควรจะสามารถบันทึกได้สองสามไบต์โดยการบันทึกการโทรหนึ่งสาย แต่ฉันไม่สามารถหาวิธีที่มีประสิทธิภาพได้ ( ,tบวกt=บวก,บวกtสองครั้งยาวเกินไป) เทคนิคนี้ใช้ลักษณะการทำงานที่ไม่ได้กำหนด (การตั้งค่า _ [a] ถึง "1") แต่คอมไพเลอร์ทั้งหมดที่ฉันรู้จักอนุญาตโดยค่าเริ่มต้น

กลยุทธ์: วางส่วนเริ่มต้นและจุดจบของอาร์เรย์ด้วย 1 จากนั้นวนรอบส่วนภายในเพื่อตรวจสอบแต่ละเพื่อนบ้าน


0

PHP 69 64 ไบต์

บางไบต์เปิดและปิดจากJörgHülsermannและ Titus =(-5)

ต้องเปิดใช้งาน register_globals การใช้งาน:http://localhost/notnull.php?i[]=9&i[]=-5i[]=...

$x=$_GET['i'];
$y=0;
foreach($x as $j){
if($y<abs($j)){
$y=$j;
}
}
echo $y;

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

$x=$_GET['i'];$y=0;foreach($x as $j)if($y<abs($j))$y=$j;echo $y;

ทำไมไม่ใช้อินพุตโดยตรงเป็นอาร์เรย์ ฉันไม่เห็นเหตุผลของการ json_encode
JörgHülsermann

สำหรับการตั้งค่าที่ไม่ใช่ค่าเริ่มต้นคุณจะต้องเพิ่มความยาวเต็มของการเปลี่ยนแปลงการตั้งค่าเป็นจำนวนไบต์ของคุณ (ดูmeta.codegolf.stackexchange.com/q/4778#4778 ) ในกรณีนี้ +21 ไบต์สำหรับ-d register_globals=1(หรือระบุรุ่นที่เปิดใช้งาน register_globals โดยค่าเริ่มต้น)
Titus

แต่json_decodeเป็นความคิดที่ดี
ติตัส

@Titus สิ่งที่ฉันหมายถึงคือ?id[]=1&id[]=2&id[]=3 แล้ว$_GET["id"]ให้กลับอาร์เรย์ ด้วยเหตุนี้ json_decode ทำให้ไม่สมเหตุสมผลสำหรับฉัน
JörgHülsermann

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