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!


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

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

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.


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!


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.


,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


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

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.


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

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


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

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.

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

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!


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]

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.


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

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


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.


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


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

1

q, 38 byte

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

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

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
}

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

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

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!


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

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.


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;

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.