Tìm số lớn nhất liền kề với số 0


38

Thử thách:

Lấy một vectơ / danh sách các số nguyên làm đầu vào và xuất ra số lớn nhất liền kề với số không.

Thông số kỹ thuật:

  • Như mọi khi, định dạng đầu vào và đầu ra tùy chọn
  • Bạn có thể cho rằng sẽ có ít nhất một số không và ít nhất một phần tử khác không.

Các trường hợp thử nghiệm:

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

Chúc may mắn và chơi golf vui vẻ!


Bạn nên thêm một trường hợp thử nghiệm như trường hợp thứ 4, nhưng trong đó kết quả là âm tính (có số dương trong danh sách).
mbomb007

Tôi sẽ thử điều này ở Retina, nhưng sau đó tôi nhận thấy có những tiêu cực. Võng mạc ghét tiêu cực.
mbomb007

2
Đừng để võng mạc ra lệnh những gì bạn có thể và không thể làm. Chịu trách nhiệm, bạn là ông chủ!
Stewie Griffin

Câu trả lời:



19

MATL , 10 byte

t~5BZ+g)X>

Hãy thử trực tuyến! Hoặc xác minh tất cả các trường hợp thử nghiệm .

Giải trình

Hãy lấy đầu vào [-4 -6 -2 0 -9]làm ví dụ.

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)). Ý tưởng của ai là thực hiện cái đó? Rất thông minh, và hữu ích cho các mảng logic! :) Câu trả lời hay!
Stewie Griffin

1
@Weeing IfFirst Cảm ơn! Tôi đã sử dụng dec2bin()-'0'hàng trăm lần trong MATLAB, vì vậy tôi biết rằng một người phải ở MATL :-)
Luis Mendo

5
Nhân tiện, thực tế là bạn đã bao gồm nội dung của ngăn xếp sau mỗi thao tác có giá trị một upvote một mình. Nó làm cho nó dễ hiểu hơn rất nhiều (và có thể học) MATL =)
Stewie Griffin

2
Đá kết hợp. +1
Suever

10

05AB1E , 9 byte

ü‚D€P_ÏOZ

Giải trình

ü‚         # 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

Không hoạt động trong trình thông dịch trực tuyến, nhưng hoạt động ngoại tuyến.


Điều này thật tuyệt vời haha! Chỉ trong thời gian: p.
Ad Nam

1
Chỉ cần thực hiện một trong những toán tử này hay? :)
Stewie Griffin

1
@Weeing IfFirst: üđã được thêm vào ngày hôm qua :)
Emigna

2
Sẽ không trở lại 0nếu câu trả lời thực tế sẽ là tiêu cực? Bạn phải ném ra số không, tôi nghĩ vậy.
Lynn

1
@Lynn Bắt đẹp! Điều này có thể dễ dàng được sửa chữa bằng cách thay thế ˜bằng O(tổng).
Ad Nam

9

Haskell, 63 43 byte

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

Cảm ơn @MartinEnder cho 4 byte!


Tôi nghĩ rằng bạn có thể sử dụng a*b==0thay vì ||.
Martin Ender

Bạn phải quay lại phiên bản trước với zip. Ở đây a và không còn liền kề
Damien

Bạn không cần lambdabot ở đây. Đây là Haskell "thường xuyên"
Damien

8

Bình thường, 12 11 10 byte

eSsM/#0,Vt

Biểu mẫu các cặp, bộ lọc theo thành viên 0, sắp xếp theo tổng, trả về lớn nhất.


,Vt(ngầm QQ) trả về các cặp giống như .:Q2, nhưng với các cặp được lật. Nên làm việc, mặc dù.
PurkkaKoodari

f}0T/#0
isaacg

7

JavaScript (ES6), 59 57 56 byte

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

Chỉnh sửa: đã lưu 2 byte nhờ Huntro
Chỉnh sửa: đã lưu 1 byte nhờ vào ETHproductions


1
Bạn có thể lưu hai byte bằng cách sử dụng ==thay vì===
Huntro

1
Tôi có thể lưu một vài byte ở một vài nơi:l=>l.map((n,i)=>m=l[i-1]*l[i+1]==0&n>m?n:m,m=-1/0)|m
Sản phẩm ETH

Lỗi: {"tin nhắn": "Lỗi cú pháp", "tên tệp": " stacksnippets.net/js ", "lineno": 15, "colno": 3}
RosLuP

@RosLuP - Điều này yêu cầu ES6 hỗ trợ chức năng mũi tên và sẽ không hoạt động trên tất cả các trình duyệt (bao gồm, nhưng không giới hạn ở: tất cả các phiên bản IE trước Edge, tất cả các phiên bản Safari bên dưới v10, v.v.)
Arnauld

6

JavaScript (ES6), 53 byte

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

Vì tôi thích dùng reduce. Giải pháp thay thế, cũng 53 byte:

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

5

Python, 49 byte

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

Các bài kiểm tra đang ở trạng thái bình thường

Kéo qua các cặp, tính tổng các số có bất kỳ số 0 nào, trả về giá trị tối đa.


4

Ruby, 51 byte

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

sử dụng

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)]

Tôi không nghĩ rằng bạn cần dấu ngoặc đơn xung quanh a+b.
Martin Ender

@Martin Lỗi cú pháp Ender xảy ra ... ideone.com/F6Ed4B
cia_rana

Nó hoạt động trong Ruby 2.3. (có sẵn ở đây chẳng hạn: repl.it/lacular/ruby )
Martin Ender

@Martin Ender Khi tôi sử dụng "! =" Thay vì "==", nó hoạt động. Cảm ơn lời khuyên của bạn! ideone.com/F6Ed4B
cia_rana

Có một lỗi trong đó :(. Trả -3 -2 0về 0. Tôi nghĩ thay thế ...?0:...bằng cách ...?-1.0/0:...sửa nó, thêm 5 byte.
m-chrzan

4

PHP, 77 68 71 byte

-3 byte từ ẩn danh, -4 và -2 từ MartinEnder

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

chạy với php -r '<code>' '<space separated values>'


2
sử dụng \Kđể loại bỏ trận đấu cho đến nay ngắn hơn so với sử dụng nhìn phía sau.
dùng59178

2
Bạn cũng có thể sử dụng phân tách không gian cho đầu vào và sau đó sử dụng \S+để khớp với một số nguyên đã ký. Bạn có thể sẽ phải sử dụng \b0,để bạn không phải trả trước ,.
Martin Ender

1
Liệu tác phẩm này với đầu vào như 4 0 0 5?
TonMedel

@TonHeach số Không \Khoạt động với các lựa chọn thay thế? Vì lý do không rõ, trả lại thay thế thứ hai 0 0, do đó không còn 0phù hợp trước 5. Đã sửa, cảm ơn.
Tít

Hãy xem giải pháp PHP khác với register_globals
Jörg Hülsermann

4

Java 7, 118 105 106 byte

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 byte được lưu nhờ @cliffroot bằng cách sử dụng phương pháp số học thay thế. Thêm 1 byte cảm ơn @mrco sau khi anh ta phát hiện ra một lỗi (trường hợp kiểm tra được thêm 2, 1, 0sẽ trả về 2thay vì 1).

Mã thử nghiệm & mã hóa:

Hãy thử nó ở đây.

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 }));
  }
}

Đầu ra:

7
9
-2
0
20
1

1
cách tiếp cận hơi khác bằng cách sử dụng mỹ phẩm, dường như đang hoạt độngint 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;}
cliffroot

3
Đầu ra sai, khi số đầu tiên không liền kề với 0, nhưng lớn hơn bất kỳ số nào liền kề với 0. Tái sản xuất bằng trường hợp thử nghiệm {2, 1, 0}. Bạn có thể khắc phục điều này bằng cách khởi tạo i bằng 0 trực tiếp và m với 1 << 31 (+1 tổng thể).
mrco

3

CJam , 16 byte

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

Hãy thử trực tuyến! (Là một bộ thử nghiệm.)

Giải trình

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 với Hộp công cụ xử lý ảnh, 32 byte

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

Đây là một chức năng ẩn danh. Ví dụ sử dụng cho các trường hợp thử nghiệm:

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

APL Dyalog , 14 byte

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

⌈/ lớn nhất trong số

sự làm phẳng (" e nlisted"

2(... )/cặp

+ tổng (không cộng với một cái gì đó là một cái gì đó)

↑⍨ lấy nếu

0 số không

là thành viên của

, cặp (nghĩa là nối số bên trái và số bên phải)

Dùng thử trực tuyến!


3

R, 48 47 byte

EDIT: Đã sửa lỗi nhờ @Vlo và thay đổi nó để đọc đầu vào từ stdins, lưu một byte bằng cách gán wvà bỏ qua các thông số.

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]

Giải thích chưa được kiểm chứng

  1. Tìm các chỉ số mà vectơ vnhận các giá trị 0:w <- which(v == 0)
  2. Tạo vector mới chứa các chỉ số +-1: w-1w+1
  3. Trích xuất các yếu tố phù hợp với các chỉ số w-1w+1
  4. Sắp xếp theo thứ tự giảm dần và trích xuất phần tử nắm tay

Lưu ý rằng nếu phần tử cuối cùng hoặc đầu tiên vlà 0, w+-1sẽ tìm nạp một chỉ mục bên ngoài độ dài của vectơ có nghĩa là v[length(v)+1]trả về NA. Điều này thường không có vấn đề gì nhưng các max()hàm trả về một cách bất tiện NAnếu có bất kỳ sự cố nào xảy ra trong vectơ trừ khi chỉ định tùy chọn na.rm=T. Do đó, nó ngắn hơn 2 byte để sắp xếp và trích xuất phần tử đầu tiên so với sử dụng max(), ví dụ:

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

1
Cần một dấu ngoặc đơn bổ sung nếu không sẽ thất bại trong tất cả các trường hợp kiểm tra trong đó tối đa là bên phải của 0, chẳng hạn như c(1, 4, 3, 6, 0, 10, 7, 0) c((w<-which(v==0))-1,w+1)ngắn hơn một chút khi quétsort((v<-scan())[c(w<-which(v==0)-1,w+1)],T)[1]
Vlo

@Vlo Cảm ơn bạn đã chỉ ra lỗi rõ ràng đó, +1. Trong giải pháp đề xuất của bạn, bạn đã quên ()quá mặc dù;). Cập nhật mã và gán vthao tác trước ngay bây giờ.
Billywob

3

Toán học, 46 43 byte

Đã lưu 3 byte do @MartinEnder .

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

Chức năng ẩn danh. Lấy danh sách các số nguyên làm đầu vào và trả về một số nguyên làm đầu ra. Dựa trên giải pháp Ruby.


2

Perl, 42 byte

Bao gồm +1 cho -p

Đưa ra các số trên dòng trên STDIN

largest0.pl <<< "8 4 0 0 5 1 2 6 9 0 6"

largest0.pl:

#!/usr/bin/perl -p
($_)=sort{$b-$a}/(?<=\b0 )\S+|\S+(?= 0)/g

2

Julia, 56 55 byte

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

Tạo các bộ dữ liệu cho các giá trị lân cận, lấy các bộ dữ liệu có chứa 0, tổng các giá trị bộ dữ liệu và tìm tối đa


1

Python 2, 74 byte

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

Xoay vòng qua mọi phần tử, nếu có một 0vị trí bên trái hoặc bên phải của phần tử hiện tại, hãy đưa nó vào trong trình tạo và sau đó chạy nó qua max. Chúng ta cần đệm danh sách với một số không 0. Nó sẽ không bao giờ được bao gồm bởi vì lát cắt [-1:2:2]sẽ không bao gồm bất cứ điều gì.


1

T-SQL, 182 byte

Chơi gôn

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 @

Ung dung:

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 @

Vĩ cầm


1

PowerShell v3 +, 62 byte

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

Một chút dài hơn các câu trả lời khác, nhưng một cách tiếp cận tiện lợi.

Đưa đầu vào $n. Sau đó lặp qua các chỉ mục 0..$n.count, sử dụng Where-Object( |?{...}) để lấy ra các chỉ mục có mục trước hoặc mục tiếp theo trong mảng 0và đưa chúng trở lại thành lát $n[...]. Chúng tôi sau đó |sortnhững yếu tố, và lấy lớn nhất [-1].

Ví dụ

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 byte

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

Điều này dường như không hoạt động khi mức tối đa đến sau 0 . Ngoài ra, tôi không phải là chuyên gia về q, nhưng tôi nghĩ bạn sẽ phải bao quanh mã của mình {}để biến nó thành một hàm.
Dennis

1

J, 18 byte

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

Giải trình

[:>./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 byte

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

Mở rộng:

# 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 byte

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

Khá đơn giản. Lặp lại trên đầu vào và khi một số là 0, nó đặt $mthành số cao nhất trong số 2 số liền kề bất kỳ giá trị nào trước đó $m.

Chạy như thế này (chỉ -dthêm tính thẩm mỹ):

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 byte

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

Giải trình:

Sử dụng zip để tham gia mảng với chính nó nhưng bỏ qua giá trị đầu tiên trong tham chiếu thứ 2 để mục 0 tham gia vào mục một. Nhân một lần b, nếu kết quả bằng 0, một trong số chúng phải bằng 0 và xuất ra a + b. Mặt khác, xuất số nguyên tối thiểu có thể có trong ngôn ngữ. Giả định rằng chúng ta sẽ luôn có 0 và khác không, giá trị tối thiểu này sẽ không bao giờ được xuất ra dưới dạng tối đa.

Sử dụng:

[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 }));
}

Chào. bạn có thể loại bỏ không gian tại int[]i) {. Ngoài ra, tôi đếm 75 byte trong mã hiện tại của bạn (74 nếu bạn loại bỏ khoảng trắng).
Kevin Cruijssen

Tôi nghĩ rằng bạn có thể tiết kiệm 4 byte bằng cách đảo ngược các ternary:a?b?i.Min()).Max():a:b
Titus

Thêm nữa using System.Linq;, không?
Pinkfloydx33

Đúng nhưng câu hỏi này chỉ yêu cầu một phương thức, không phải là một chương trình đầy đủ và sử dụng System.Linq;là một phần của mẫu lớp mới mặc định.
Grax32

@Grax Dù bằng cách nào bạn cũng cần đưa usingcâu lệnh vào số byte của mình
TheLethalCoder

1

R, 48 54 byte

s=scan()

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

Đọc vectơ từ đầu vào giao diện điều khiển, sau đó lấy tối đa trên tất cả các giá trị liền kề 0.

Chỉnh sửa: Bắt NA được sản xuất tại ranh giới, cảm ơn rturnbull!


Tôi đang làm sai à? pastebin.com/0AA11xcw
manatwork

Điều này không thành công đối với các trường hợp như 20 0, vì s[w(s==0)+1]trả về NAmaxcách xử lý mặc định NAlà trả lại nó. Bạn có thể sửa bằng cách thêm đối số na.rm=Thoặc làm lại mã để sử dụng sort(xem câu trả lời R khác được đăng ở trên).
rturnbull

Bạn có thể ngưng tụ mọi thứ thành một dòng không? Tôi không biết cách viết mã trong R, nhưng tôi cho rằng bạn có thể.
clismique

@ Qwerp-Derp: Không xa như tôi biết. scan () đợi đầu vào giao diện điều khiển đọc trong vector, luồng đầu vào được đóng bằng cách nhập một dòng trống. Nếu bạn chạy hai dòng là một, phần thứ hai ít nhất sẽ được nhận dạng một phần để làm đầu vào cho vectơ s.
Headcrash

0

Vợt 183 byte

(λ(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)))

Phiên bản chi tiết:

(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) )))

Kiểm tra:

(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 ))

Đầu ra:

7
9
-2
0
20

0

C 132 byte

Đầu ra sử dụng mã trả về của chính:

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ôi cảm thấy mình có thể lưu một vài byte bằng cách lưu một trong các cuộc gọi atoi, nhưng tôi không thể tìm thấy một cách hiệu quả. ( ,tcộng t=với ,cộng thai lần là quá dài). Ngoài ra, về mặt kỹ thuật này sử dụng hành vi không xác định (cài đặt _ [a] thành "1") nhưng mọi trình biên dịch tôi biết đều cho phép theo mặc định.

Chiến lược: đệm phần đầu và phần cuối của mảng bằng 1, sau đó lặp qua phần bên trong kiểm tra từng hàng xóm.


0

PHP 69 64 byte

Một số byte bật và tắt từ Jörg Hülsermann và Titus. = =(-5)

Yêu cầu register_globals được kích hoạt. Sử dụng: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;

Chơi gôn

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

Tại sao không sử dụng trực tiếp đầu vào như mảng. Tôi không thể thấy lý do cho json_encode.
Jörg Hülsermann

Đối với các cài đặt không mặc định, bạn phải thêm toàn bộ chiều dài thay đổi cài đặt vào số byte của mình. (xem meta.codegolf.stackexchange.com/q/4778#4778 ) Trong trường hợp này +21 byte cho -d register_globals=1(hoặc chỉ định một phiên bản trong đó register_globals được bật theo mặc định)
Titus

Nhưng json_decodelà một ý tưởng tốt đẹp.
Tít

@Titus Ý tôi là gì ?id[]=1&id[]=2&id[]=3 và sau đó $_GET["id"]trả lại một mảng. Vì lý do này, json_decode không có ý nghĩa đối với tôi
Jörg Hülsermann

@ JörgHülsermann Nó có giá byte, nhưng nó vẫn là một ý tưởng hay.
Tít
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.