Temukan angka terbesar yang berdekatan dengan nol

38

Tantangan:

Ambil vektor / daftar bilangan bulat sebagai input, dan hasilkan angka terbesar yang berdekatan dengan nol.

Spesifikasi:

  • Seperti biasa, format input dan output opsional
  • Anda dapat mengasumsikan bahwa akan ada setidaknya satu nol, dan setidaknya satu elemen tidak nol.

Kasus uji:

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

Semoga sukses dan senang bermain golf!

Stewie Griffin
sumber
Anda harus menambahkan test case seperti yang ke-4, tetapi jika hasilnya negatif (ada angka positif dalam daftar).
mbomb007
Saya akan mencoba ini di Retina, tetapi kemudian saya perhatikan ada yang negatif. Retina membenci yang negatif.
mbomb007
2
Jangan biarkan retina menentukan apa yang Anda bisa dan tidak bisa lakukan. Ambil alih, Anda bosnya!
Stewie Griffin

Jawaban:

3

Jelly , 8 byte

ṡ2ẠÐḟS€Ṁ

Cobalah online!

ṡ2            Overlapping pairs
  ẠÐḟ         Remove pairs without zeroes
     S€       Sum of each pair
       Ṁ      Maximum
Lynn
sumber
19

MATL , 10 byte

t~5BZ+g)X>

Cobalah online! Atau verifikasi semua kasus uji .

Penjelasan

Mari kita ambil input [-4 -6 -2 0 -9]sebagai contoh.

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
Luis Mendo
sumber
x(~~(dec2bin(5)-48)). Ide siapa itu untuk mengimplementasikan yang itu? Sangat pintar, dan berguna untuk array logis! :) Jawaban bagus!
Stewie Griffin
1
@WeeingIfFirst Terima kasih! Saya telah menggunakan dec2bin()-'0'ratusan kali dalam MATLAB, jadi saya tahu bahwa orang harus menggunakan MATL :-)
Luis Mendo
5
Ngomong-ngomong, fakta bahwa Anda memasukkan konten stack setelah setiap operasi bernilai upvote saja. Itu membuatnya jauh lebih mudah untuk dipahami (dan mungkin dipelajari) MATL =)
Stewie Griffin
2
Batuan Konvolusi. +1
Suever
10

05AB1E , 9 byte

ü‚D€P_ÏOZ

Penjelasan

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

Tidak bekerja di penerjemah online, tetapi bekerja offline.

Emigna
sumber
Ini luar biasa haha! Tepat pada waktunya: hlm.
Adnan
1
Hanya menerapkan salah satu dari operator ini atau? :)
Stewie Griffin
1
@WeeingIfFirst: übaru ditambahkan kemarin :)
Emigna
2
Tidakkah ini akan kembali 0jika jawaban yang sebenarnya akan negatif? Anda harus membuang nol, saya pikir.
Lynn
1
@ Lynn Tangkapan bagus! Ini dapat dengan mudah diperbaiki dengan mengganti ˜dengan O(jumlah).
Adnan
9

Haskell, 63 43 byte

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

Terima kasih kepada @MartinEnder selama 4 byte!

BlackCap
sumber
Saya pikir Anda dapat menggunakan a*b==0bukan ||.
Martin Ender
Anda harus kembali ke versi sebelumnya dengan zip. Di sini a dan be tidak lagi berdekatan
Damien
Anda tidak perlu lambdabot di sini. Ini Haskell "biasa"
Damien
8

Pyth, 12 11 10 byte

eSsM/#0,Vt

Membentuk pasangan, menyaring berdasarkan nol anggota, mengurutkan berdasarkan jumlah, mengembalikan terbesar.

orlp
sumber
,Vt(implisit QQ) mengembalikan pasangan yang sama .:Q2, tetapi dengan pasangan yang dibalik. Seharusnya bekerja.
PurkkaKoodari
f}0Tis/#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

Sunting: disimpan 2 byte berkat Huntro
Sunting: disimpan 1 byte berkat ETHproductions

Arnauld
sumber
1
Anda dapat menyimpan dua byte dengan menggunakan ==alih-alih===
Huntro
1
Saya Anda dapat menyimpan beberapa byte di beberapa tempat:l=>l.map((n,i)=>m=l[i-1]*l[i+1]==0&n>m?n:m,m=-1/0)|m
ETHproduksi
Kesalahan: {"message": "Syntax error", "filename": " stacksnippets.net/js ", "lineno": 15, "colno": 3}
RosLuP
@RosLuP - Ini membutuhkan ES6 dengan dukungan fungsi panah dan tidak akan berfungsi di semua browser (termasuk, tetapi tidak terbatas pada: semua versi IE sebelum Edge, semua versi Safari di bawah v10, dll.)
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)

Karena saya suka menggunakan reduce. Solusi alternatif, juga 53 byte:

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

Python, 49 byte

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

Tes ada di ideone

Ritsleting melalui pasangan, jumlah yang berisi nol, mengembalikan maksimum.

Jonathan Allan
sumber
4

Ruby, 51 byte

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

pemakaian

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)]
cia_rana
sumber
Saya tidak berpikir Anda membutuhkan tanda kurung di sekitar a+b.
Martin Ender
Kesalahan @ Martin Ender sintaks terjadi ... ideone.com/F6Ed4B
cia_rana
Ini bekerja di Ruby 2.3. (tersedia di sini misalnya: repl.it/languages/ruby )
Martin Ender
@ Martin Ender Ketika saya menggunakan "! =" Bukannya "==", itu berfungsi. Terima kasih atas saranmu! ideone.com/F6Ed4B
cia_rana
Ada bug di sana :(. -3 -2 0Pengembalian 0saya pikir menggantikan. ...?0:...Dengan ...?-1.0/0:...harus memperbaikinya, menambahkan 5 bytes.
m-chrzan
4

PHP, 77 68 71 byte

-3 byte dari anonim, -4 dan -2 dari MartinEnder

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

jalankan bersama php -r '<code>' '<space separated values>'

Titus
sumber
2
menggunakan \Kuntuk membuang pertandingan sejauh ini lebih pendek daripada menggunakan melihat-belakang.
user59178
2
Anda juga dapat menggunakan pemisahan ruang untuk input dan kemudian gunakan \S+untuk mencocokkan integer yang ditandatangani. Anda mungkin harus menggunakan \b0,sehingga Anda tidak harus menambahkan sebelumnya ,.
Martin Ender
1
Apakah ini berfungsi untuk input 4 0 0 5?
Ton Hospel
@TonHospel No. Tidak \Kberfungsi dengan alternatif? Untuk alasan yang tidak diketahui, alternatif kedua kembali 0 0, sehingga tidak ada lagi yang 0cocok sebelum 5. Tetap, terima kasih.
Titus
Lihatlah solusi PHP lainnya dengan 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 disimpan berkat @cliffroot dengan menggunakan pendekatan aritmatika. 1 byte tambahan terima kasih @mrco setelah ia menemukan bug (test case tambahan 2, 1, 0akan kembali 2sebagai ganti 1).

Tidak digabungkan & kode uji:

Coba di sini.

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

Keluaran:

7
9
-2
0
20
1
Kevin Cruijssen
sumber
1
pendekatan yang sedikit berbeda dengan menggunakan aritmatika, tampaknya berhasil 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;}
cliffroot
3
Outputnya salah, ketika angka pertama tidak berdekatan dengan 0, tetapi lebih besar dari angka yang berdekatan dengan 0. Dapat diproduksi ulang oleh test case {2, 1, 0}. Anda dapat memperbaikinya dengan menginisialisasi i dengan 0 secara langsung dan m dengan 1 << 31 (+1 keseluruhan).
mrco
3

CJam , 16 byte

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

Cobalah online! (Sebagai suite uji.)

Penjelasan

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.
Martin Ender
sumber
3

MATLAB dengan Image Processing Toolbox, 32 byte

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

Ini adalah fungsi anonim. Contoh penggunaan untuk kasus uji:

>> 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
Luis Mendo
sumber
3

Dyalog APL , 14 byte

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

⌈/ terbesar dari

yang diratakan (" e nlisted"

2(... )/berpasangan

+ sum (nol plus sesuatu adalah sesuatu)

↑⍨ diambil jika

0 nol

adalah anggota dari

, pasangan (lit. gabungan dari nomor kiri dan kanan)

TryAPL online!

Adám
sumber
3

R, 48 47 byte

EDIT: Memperbaiki kesalahan berkat @Vlo dan mengubahnya untuk membaca input dari stdins, menyimpan satu byte dengan menetapkan wdan melewatkan paranthes.

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]

Penjelasan belum ditanggapi

  1. Temukan indeks yang vektornya vmengambil nilai 0:w <- which(v == 0)
  2. Buat vektor baru yang berisi indeks +-1: w-1danw+1
  3. Ekstrak elemen yang cocok dengan indeks w-1danw+1
  4. Mengurutkan dalam urutan menurun dan mengekstrak elemen tinju

Perhatikan bahwa jika elemen terakhir atau pertama vadalah nol, w+-1secara efektif akan mengambil indeks di luar panjang vektor yang menyiratkan bahwa v[length(v)+1]pengembalian NA. Ini umumnya tidak ada masalah tetapi max()fungsi - fungsi tidak nyaman kembali NAjika ada kejadian dalam vektor kecuali ada yang menentukan opsi na.rm=T. Jadi, 2 byte lebih pendek untuk mengurutkan dan mengekstraksi elemen pertama daripada menggunakan max(), misalnya:

max(x,na.rm=T)
sort(x,T)[1]
Billywob
sumber
1
Perlu tanda kurung tambahan jika tidak gagal semua kasus uji di mana maks di sebelah kanan 0 seperti c(1, 4, 3, 6, 0, 10, 7, 0) c((w<-which(v==0))-1,w+1)Juga sedikit lebih pendek dengan pemindaiansort((v<-scan())[c(w<-which(v==0)-1,w+1)],T)[1]
Vlo
@Vo Terima kasih telah menunjukkan kesalahan yang jelas, +1. Dalam solusi yang disarankan, Anda juga lupa ();). Diperbarui kode dan ditugaskan vmanipulasi sebelumnya sekarang.
Billywob
3

Mathematica, 46 43 byte

Disimpan 3 byte karena @MartinEnder .

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

Fungsi anonim. Mengambil daftar integer sebagai input dan mengembalikan integer sebagai output. Didasarkan pada solusi Ruby.

LegionMammal978
sumber
2

Perl, 42 byte

Termasuk +1 untuk -p

Berikan nomor on line di 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
Ton Hospel
sumber
2

Julia, 56 55 Bytes

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

Buat tupel untuk nilai tetangga, ambil tupel yang berisi 0, jumlahkan nilai tupel, dan temukan maksimum

nyro_0
sumber
1

Python 2, 74 Bytes

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

Siklus melalui setiap elemen, jika ada 0di posisi kiri atau kanan elemen saat ini, masukkan dalam generator, dan kemudian jalankan melalui max. Kita perlu mengisi daftar dengan beberapa0 nomor. Itu tidak akan pernah dimasukkan karena irisan [-1:2:2]tidak akan memasukkan apa pun.

SCB
sumber
1

T-SQL, 182 byte

Golf:

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 @

Tidak Disatukan:

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 @

Biola

t-clausen.dk
sumber
1

PowerShell v3 +, 62 byte

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

Sedikit lebih lama dari jawaban yang lain, tetapi pendekatan yang bagus.

Mengambil input $n. Kemudian lewati indeks 0..$n.count, gunakan Where-Object( |?{...}) untuk menarik keluar indeks di mana item sebelumnya atau berikutnya dalam array 0, dan feed mereka kembali ke dalam irisan array $n[...]. Kami kemudian |sortelemen-elemen itu, dan mengambil yang terbesar [-1].

Contohnya

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
AdmBorkBork
sumber
1

q, 38 byte

{max x where 0 in'x,'(next x),'prev x}
Liam Baron
sumber
Ini tampaknya tidak berfungsi ketika maksimum datang setelah 0 . Juga, saya bukan ahli q, tapi saya pikir Anda harus mengelilingi kode Anda dengan {}untuk membuatnya berfungsi.
Dennis
1

J, 18 byte

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

Penjelasan

[:>./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
mil
sumber
1

Perl 6 , 53 byte

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

Diperluas:

# 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
}
Brad Gilbert b2gills
sumber
1

PHP, 66 byte

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

Cukup mudah. Iterate atas input, dan ketika suatu angka 0, itu menetapkan $mke angka tertinggi dari 2 angka yang berdekatan dan nilai sebelumnya dari$m .

Jalankan seperti ini ( -dditambahkan hanya untuk estetika):

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
aross
sumber
1

C # 76 74 byte

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

Penjelasan:

Gunakan zip untuk bergabung dengan array dengan sendirinya tetapi melewatkan nilai pertama dalam referensi ke-2 sehingga item nol bergabung ke item satu. Kalikan a kali b, jika hasilnya nol, salah satunya harus nol dan output a + b. Kalau tidak, output bilangan bulat minimum yang mungkin dalam bahasa. Dengan asumsi bahwa kita akan selalu memiliki nol dan bukan nol, nilai minimum ini tidak akan pernah menjadi output sebagai maks.

Pemakaian:

[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 }));
}
Grax32
sumber
Hai. Anda dapat menghapus ruang di int[]i) {. Juga, saya menghitung 75 byte dalam kode Anda saat ini (74 jika Anda menghapus spasi).
Kevin Cruijssen
Saya pikir Anda dapat menyimpan 4 byte dengan membalik terner:a?b?i.Min()).Max():a:b
Titus
Plus using System.Linq;, tidak?
pinkfloydx33
Benar tetapi pertanyaan ini hanya menanyakan metode, bukan program lengkap dan penggunaannya System.Linq;adalah bagian dari templat kelas baru yang standar.
Grax32
@Grax Either way Anda perlu memasukkan usingpernyataan dalam hitungan byte Anda
TheLethalCoder
1

R, 48 54 byte

s=scan()

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

Membaca vektor dari input konsol, kemudian mengambil maksimum semua nilai yang berdekatan dengan 0.

Sunting: Tangkapan NAs yang diproduksi di perbatasan, terima kasih rturnbull!

Headcrash
sumber
Apakah saya salah? pastebin.com/0AA11xcw
manatwork
Ini gagal untuk kasus-kasus seperti 20 0, karena s[w(s==0)+1]kembali NA, dan maxperlakuan standar NAadalah mengembalikannya. Anda dapat memperbaikinya dengan menambahkan argumen na.rm=T, atau mengerjakan kembali kode yang akan digunakan sort(lihat jawaban R lainnya yang diposting di atas).
rturnbull
Bisakah Anda memadatkan semuanya menjadi satu baris? Saya tidak tahu cara membuat kode dalam R, tapi saya berasumsi Anda bisa.
clismique
@ Qwerp-Derp: Tidak sejauh yang saya tahu. scan () menunggu input konsol untuk dibaca dalam vektor, aliran input ditutup dengan memasukkan baris kosong. Jika Anda menjalankan dua baris sebagai satu, bagian kedua akan setidaknya sebagian diakui sebagai input untuk untuk vektor s.
Headcrash
0

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

Versi detail:

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

Pengujian:

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

Keluaran:

7
9
-2
0
20
juga
sumber
0

C 132 byte

Output menggunakan kode pengembalian utama:

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

Saya merasa harus menyimpan beberapa byte dengan menyimpan salah satu panggilan atoi, tetapi saya tidak dapat menemukan cara yang efisien. ( ,tplus t=plus ,plus tdua kali terlalu panjang). Juga ini secara teknis menggunakan perilaku yang tidak terdefinisi (pengaturan _ [a] menjadi "1") tetapi setiap kompiler yang saya kenal mengizinkannya secara default.

Strategi: pad awal dan akhir array dengan 1, kemudian lewati bagian internal memeriksa setiap tetangga.

LambdaBeta
sumber
0

PHP 69 64 byte

Beberapa byte dan mematikan dari Jörg Hülsermann dan Titus. =(-5)

Membutuhkan register_globals diaktifkan. Pemakaian: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;

Golf:

$x=$_GET['i'];$y=0;foreach($x as $j)if($y<abs($j))$y=$j;echo $y;
Roman Gräf
sumber
Mengapa tidak menggunakan input sebagai array secara langsung. Saya tidak bisa melihat alasan json_encode.
Jörg Hülsermann
Untuk pengaturan non-default, Anda harus menambahkan panjang penuh dari perubahan pengaturan ke jumlah byte Anda. (lihat meta.codegolf.stackexchange.com/q/4778#4778 ) Dalam hal ini +21 byte untuk -d register_globals=1(atau tentukan versi di mana register_globals diaktifkan secara default)
Titus
Tapi json_decodeitu ide yang bagus.
Titus
@ Titus Yang saya maksud adalah ?id[]=1&id[]=2&id[]=3 dan kemudian $_GET["id"]mengembalikan array. Karena alasan ini json_decode tidak masuk akal bagi saya
Jörg Hülsermann
@ JörgHülsermann Harganya byte, tapi itu masih ide yang bagus.
Titus