Znajdź największą liczbę przylegającą do zera


38

Wyzwanie:

Weź wektor / listę liczb całkowitych jako dane wejściowe i wyślij największą liczbę, która sąsiaduje z zerem.

Dane techniczne:

  • Jak zawsze opcjonalny format wejściowy i wyjściowy
  • Możesz założyć, że będzie co najmniej jedno zero i co najmniej jeden element niezerowy.

Przypadki testowe:

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

Powodzenia i udanej gry w golfa!


Powinieneś dodać przypadek testowy jak czwarty, ale tam, gdzie wynik jest ujemny (na liście są liczby dodatnie).
mbomb007,

Zamierzałem spróbować tego w Retinie, ale potem zauważyłem, że są negatywy. Siatkówka nie znosi negatywów.
mbomb007

2
Nie pozwól siatkówce dyktować, co możesz, a czego nie możesz zrobić. Przejmij kontrolę, jesteś szefem!
Stewie Griffin

Odpowiedzi:



19

MATL , 10 bajtów

t~5BZ+g)X>

Wypróbuj online! Lub sprawdź wszystkie przypadki testowe .

Wyjaśnienie

Weźmy [-4 -6 -2 0 -9]za przykład przykład.

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)). Kto wpadł na pomysł, żeby go wdrożyć? Bardzo sprytny i przydatny do tablic logicznych! :) Niezła odpowiedź!
Stewie Griffin,

1
@WeeingIfFirst Thanks! Użyłem dec2bin()-'0'setki razy w MATLAB, więc wiedziałem, że jeden musi być w MATL :-)
Luis Mendo

5
Nawiasem mówiąc, sam fakt uwzględnienia zawartości stosu po każdej operacji jest warty wzięcia udziału w głosowaniu. To sprawia, że ​​o wiele łatwiej jest zrozumieć (i być może nauczyć się) MATL =)
Stewie Griffin

2
Skały Konwolucji. +1
Suever

10

05AB1E , 9 bajtów

ü‚D€P_ÏOZ

Wyjaśnienie

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

Nie działa w tłumaczu online, ale działa offline.


To niesamowite haha! W samą porę: str.
Adnan

1
Właśnie wdrożyłeś jednego z tych operatorów lub? :)
Stewie Griffin

1
@WeeingIfFirst: üdodano wczoraj :)
Emigna

2
Czy to nie zwróci, 0jeśli rzeczywista odpowiedź będzie negatywna? Myślę, że musisz wyrzucić zera.
Lynn,

1
@ Lynn Nice catch! To może być łatwo ustalony przez zastąpienie ˜z O(suma).
Adnan

9

Haskell, 63 43 bajty

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

Dzięki @MartinEnder za 4 bajty!


Myślę, że możesz użyć a*b==0zamiast ||.
Martin Ender

Musisz wrócić do poprzedniej wersji z zipem. Tutaj a i be już nie sąsiadują
Damien

Nie potrzebujesz tutaj lambdabota. To jest „zwykły” Haskell
Damien

8

Pyth, 12 11 10 bajtów

eSsM/#0,Vt

Tworzy pary, filtry według zerowego elementu, sortuje według sumy, zwraca największy.


,Vt(niejawne QQ) zwraca te same pary co .:Q2, ale z odwróconymi parami. Powinien jednak działać.
PurkkaKoodari

f}0Tis/#0
isaacg

7

JavaScript (ES6), 59 57 56 bajtów

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

Edycja: zapisano 2 bajty dzięki Huntro
Edycja: zapisano 1 bajt dzięki ETHproductions


1
Możesz zapisać dwa bajty, używając ==zamiast===
Huntro

1
Mogę zaoszczędzić kilka bajtów w kilku miejscach:l=>l.map((n,i)=>m=l[i-1]*l[i+1]==0&n>m?n:m,m=-1/0)|m
ETHprodukcje

Błąd: {„wiadomość”: „Błąd składni”, „nazwa pliku”: „ stacksnippets.net/js ”, „lineno”: 15, „colno”: 3}
RosLuP 26.09.16

@RosLuP - Wymaga ES6 z obsługą funkcji strzałek i nie będzie działać na wszystkich przeglądarkach (w tym między innymi: we wszystkich wersjach IE przed Edge, we wszystkich wersjach Safari poniżej v10 itd.)
Arnauld

6

JavaScript (ES6), 53 bajty

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

Ponieważ lubię używać reduce. Alternatywne rozwiązanie, również 53 bajty:

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

5

Python, 49 bajtów

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

Testy są w idealnym stanie

Przeskakuje przez pary, sumuje te zawierające dowolne zero, zwraca maksimum.


4

Rubinowy, 51 bajtów

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

stosowanie

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

Nie sądzę, żebyś potrzebował nawiasów a+b.
Martin Ender

@ Występuje błąd składniowy Martina Endera ... ideone.com/F6Ed4B
cia_rana

Działa w Ruby 2.3. (dostępny tutaj na przykład: repl.it/languages/ruby )
Martin Ender

@Martin Ender Kiedy używam „! =” Zamiast „==”, działa. Dzięki za radę! ideone.com/F6Ed4B
cia_rana

Jest tam błąd :(. -3 -2 0Zwraca 0. Myślę, że zastąpienie ...?0:...go ...?-1.0/0:...powinno go naprawić, dodając 5 bajtów.
m-chrzan 21.09.16

4

PHP, 77 68 71 bajtów

-3 bajty z anonimowego, -4 i -2 z MartinEnder

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

Biegnij z php -r '<code>' '<space separated values>'


2
użycie \Kdo tej pory odrzucenia meczu jest krótsze niż obejrzenie się za siebie.
user59178,

2
Można również użyć separacji spacji dla danych wejściowych, a następnie użyć \S+do dopasowania liczby całkowitej ze znakiem. Prawdopodobnie będziesz musiał użyć, \b0,więc nie musisz dodawać ,.
Martin Ender

1
Czy to działa jak wejście 4 0 0 5?
Ton Hospel,

@TonHospel Nie. Nie \Kdziała z alternatywami? Z nieznanego powodu druga alternatywa powraca 0 0, aby nie było już nic 0do dopasowania przed 5. Naprawiono, dziękuję.
Tytus

Zobacz inne rozwiązanie PHP z register_globals
Jörg Hülsermann

4

Java 7, 118 105 106 bajtów

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 bajtów zapisanych dzięki @cliffroot dzięki zastosowaniu metody arytmetycznej. 1 dodatkowy bajt dzięki @mrco po tym, jak odkrył błąd (dodany przypadek testowy 2, 1, 0wróciłby 2zamiast 1).

Kod niepoznany i testowy:

Wypróbuj tutaj.

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

Wydajność:

7
9
-2
0
20
1

1
wydaje się, że działa nieco inne podejście z wykorzystaniem arytmetykiint 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
Dane wyjściowe są niepoprawne, gdy pierwsza liczba nie sąsiaduje z 0, ale jest większa niż dowolna liczba sąsiadująca z 0. Odtwarzalne przez przypadek testowy {2, 1, 0}. Możesz to naprawić, inicjując i bezpośrednio 0 i im 1 << 31 (+1 ogółem).
mrco

3

CJam , 16 bajtów

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

Wypróbuj online! (Jako zestaw testowy.)

Wyjaśnienie

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 z Przybornikiem przetwarzania obrazu, 32 bajty

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

To anonimowa funkcja. Przykładowe zastosowanie dla przypadków testowych:

>> 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 bajtów

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

⌈/ największy z

spłaszczony („ e nlisted”

2(... )/parami

+ suma (zero plus coś jest czymś)

↑⍨ podjęte jeśli

0 zero

jest członkiem

, para (lit. konkatenacja numeru po lewej stronie i numeru po prawej stronie)

Wypróbuj APL online!


3

R, 48 47 bajtów

EDYCJA: Naprawiono błąd dzięki @Vlo i zmieniono go na odczyt danych wejściowych ze standardowych, zapisano jeden bajt poprzez przypisywanie wi pomijanie nawiasów.

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]

Nie wyjaśnione wyjaśnienie

  1. Znajdź indeksy, dla których wektor vprzyjmuje wartości 0:w <- which(v == 0)
  2. Utwórz nowy wektor, który zawiera indeksy +-1: w-1iw+1
  3. Wyodrębnij elementy pasujące do wskaźników w-1iw+1
  4. Sortuj w kolejności malejącej i wyciągnij element pięści

Zauważ, że jeśli ostatnim lub pierwszym elementem vjest zero, w+-1to efektywnie pobierze indeks poza długość wektora, co oznacza, że v[length(v)+1]zwraca NA. Zasadniczo nie stanowi to problemu, ale max()funkcje niewygodnie zwracają się, NAjeśli w wektorze występują jakieś wystąpienia, chyba że określono opcję na.rm=T. Zatem sortowanie i wyodrębnianie pierwszego elementu jest o 2 bajty krótsze niż użycie max(), np .:

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

1
Potrzebujesz dodatkowego nawiasu, w przeciwnym razie zawiodą wszystkie przypadki testowe, w których maksimum ma wartość równą 0, takie jak 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]
Troszeczkę

@Vlo Dziękujemy za wskazanie tego oczywistego błędu, +1. W swoim sugerowanym rozwiązaniu też zapomniałeś ();). Zaktualizowałem kod i przypisałem vwcześniejszą manipulację teraz.
Billywob,

3

Mathematica, 46 43 bajty

Zapisano 3 bajty dzięki @MartinEnder .

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

Funkcja anonimowa. Pobiera listę liczb całkowitych jako dane wejściowe i zwraca liczbę całkowitą jako dane wyjściowe. Oparty na rozwiązaniu Ruby.


2

Perl, 42 bajty

Obejmuje +1 dla -p

Podaj liczby na linii na 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 bajtów

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

Utwórz krotki dla sąsiednich wartości, weź krotki zawierające 0, zsumuj wartości krotek i znajdź maksimum


1

Python 2, 74 bajty

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

Przełączaj kolejno każdy element, jeśli znajduje się on 0w pozycji po lewej lub po prawej stronie bieżącego elementu, włącz go do generatora, a następnie przepuść max. Musimy uzupełnić listę niektórymi 0liczbami. Nigdy nie zostanie uwzględniony, ponieważ plasterek [-1:2:2]niczego nie będzie zawierał.


1

T-SQL, 182 bajty

Gra w golfa:

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 @

Nie golfowany:

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 @

Skrzypce


1

PowerShell v3 +, 62 bajty

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

Trochę dłużej niż inne odpowiedzi, ale fajne podejście.

Pobiera dane wejściowe $n. Następnie pętle przez indeksy 0..$n.count, używa Where-Object( |?{...}), aby wyciągnąć indeksy, w których znajduje się poprzedni lub następny element w tablicy 0, i przekazuje je z powrotem do wycinka tablicy $n[...]. Mamy wtedy |sortte elementy i bierzemy największy [-1].

Przykłady

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 bajtów

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

Nie wydaje się to działać, gdy maksimum pojawia się po 0 . Poza tym nie jestem q ekspertem, ale myślę, że musiałbyś otoczyć swój kod, {}aby uczynić go funkcją.
Dennis,

1

J, 18 bajtów

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

Wyjaśnienie

[:>./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 bajtów

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

Rozszerzony:

# 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 bajtów

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

Całkiem proste. Iteruje wejściu, a gdy liczba jest 0, że wyznacza $msię w największej ilości w 2 sąsiednich liczb i poprzednich wartości $m.

Działaj w ten sposób ( -ddodano tylko dla estetyki):

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 bajty

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

Wyjaśnienie:

Użyj zip, aby połączyć tablicę z samym sobą, ale pomiń pierwszą wartość w drugim odwołaniu, aby pozycja zero łączyła się z pozycją pierwszą. Pomnóż a razy b, jeśli wynikiem jest zero, jeden z nich musi wynosić zero i wyprowadzić a + b. W przeciwnym razie wypisz minimalną możliwą liczbę całkowitą w języku. Biorąc pod uwagę założenie, że zawsze będziemy mieć zero i niezerowe wartości, ta minimalna wartość nigdy nie zostanie wyprowadzona jako wartość maksymalna.

Stosowanie:

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

Cześć. możesz usunąć miejsce na int[]i) {. Ponadto liczę 75 bajtów w bieżącym kodzie (74, jeśli usuniesz spację).
Kevin Cruijssen

Myślę, że można zaoszczędzić 4 bajty, odwracając trójskładniki:a?b?i.Min()).Max():a:b
Tytus

Plus using System.Linq;nie?
pinkfloydx33

To prawda, ale to pytanie dotyczyło tylko metody, a nie pełnego programu, a używanie System.Linq;jest częścią domyślnego nowego szablonu klasy.
Grax32

@Grax Tak czy inaczej musisz dołączyć usinginstrukcję do swojej liczby bajtów
TheLethalCoder

1

R, 48 54 bajtów

s=scan()

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

Odczytuje wektor z danych wejściowych konsoli, a następnie przyjmuje maksimum nad wszystkimi wartościami sąsiadującymi z 0.

Edycja: Łapie NA wyprodukowane na granicy, dzięki rturnbull!


Czy robię to źle? pastebin.com/0AA11xcw
manatwork

Nie udaje się to w przypadkach takich jak 20 0, ponieważ s[w(s==0)+1]zwraca NA, a maxdomyślnym sposobem postępowania NAjest zwrócenie go. Możesz to naprawić, dodając argument na.rm=Tlub przerób kod, którego chcesz użyć sort(zobacz drugą odpowiedź R opublikowaną powyżej).
rturnbull

Czy potrafisz skondensować wszystko w jedną linię? Nie wiem, jak napisać w języku R, ale zakładam, że potrafisz.
clismique

@ Qwerp-Derp: O ile mi wiadomo. scan () czeka na wejście konsoli do odczytu w wektorze, strumień wejściowy jest zamykany przez wprowadzenie pustej linii. Jeśli miałbyś poprowadzić dwie linie jako jedną, druga część byłaby przynajmniej częściowo rozpoznana jako wprowadzona do wektora.
Headcrash

0

Rakieta 183 bajtów

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

Wersja szczegółowa:

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

Testowanie:

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

Wydajność:

7
9
-2
0
20

0

C 132 bajty

Dane wyjściowe przy użyciu kodu powrotu main:

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

Czuję, że powinienem być w stanie zaoszczędzić kilka bajtów, zapisując jedno z wywołań atoi, ale nie mogłem znaleźć skutecznego sposobu. ( ,tplus t=plus ,plus tdwa razy jest za długi). Również to technicznie wykorzystuje niezdefiniowane zachowanie (ustawienie _ [a] na „1”), ale każdy kompilator, o którym wiem, zezwala na to domyślnie.

Strategia: wstaw początek i koniec tablicy za pomocą 1, a następnie zapętlić wewnętrzną sekcję, sprawdzając każdego sąsiada.


0

PHP 69 64 bajty

Niektóre bajty włączane i wyłączane przez Jörga Hülsermanna i Tytusa. =(-5)

Wymaga włączenia register_globals. Stosowanie: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;

Gra w golfa:

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

Dlaczego nie używać bezpośrednio danych wejściowych jako tablicy. Nie widziałem przyczyny błędu json_encode.
Jörg Hülsermann

W przypadku ustawień innych niż domyślne musisz dodać pełną długość zmiany ustawienia do liczby bajtów. (patrz meta.codegolf.stackexchange.com/q/4778#4778 ) W tym przypadku +21 bajtów dla -d register_globals=1(lub podaj wersję, w której register_globals jest domyślnie włączony)
Titus

Ale json_decodeto fajny pomysł.
Tytus

@Titus Mam na myśli, ?id[]=1&id[]=2&id[]=3 a następnie $_GET["id"]zwraca tablicę. Z tego powodu json_decode nie ma dla mnie sensu
Jörg Hülsermann

@ JörgHülsermann Kosztuje bajty, ale wciąż jest to fajny pomysł.
Tytus
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.