Rimuovere gli zeri iniziali e finali


31

Dato un elenco / array non vuoto contenente solo numeri interi non negativi come questo:

[0, 0, 0, 8, 1, 4, 3, 5, 6, 4, 1, 2, 0, 0, 0, 0]

Output dell'elenco con zero finali e iniziali rimossi.

L'output per questo sarebbe:

[8, 1, 4, 3, 5, 6, 4, 1, 2]

Alcuni altri casi di test:

[0, 4, 1, 2, 0, 1, 2, 4, 0] > [4, 1, 2, 0, 1, 2, 4]
[0, 0, 0, 0, 0, 0] > nothing
[3, 4, 5, 0, 0] > [3, 4, 5]
[6] > [6]

Il codice più corto vince


I numeri sono solo numeri interi non negativi? Ti suggerisco di chiarire o aggiungere casi di test con altri numeri
Luis Mendo,

1
Possiamo supporre che ci sarà almeno uno 0 iniziale e uno finale?
DJMcMayhem

4
Cosa non costituisce nulla? Posso pensare a diverse cose diverse che sono variazioni sul nulla in Perl 6. Nil ()/ [] slip()/ Empty Any {}alcune sono indefinite, alcune definite ma singolari, alcune che scivolano in altre liste in modo tale da non aumentare il numero di elementi. (Esistono tante varianti diverse Anyquante sono le classi / i tipi e i ruoli)
Brad Gilbert b2gills

7
È una coincidenza che non ci siano numeri interi superiori a 10 o possiamo supporre che tutti i numeri saranno a una cifra?
A Simmons,

1
Possiamo inserire / emettere l'elenco come una stringa delimitata? Ad esempio: "0,4,1,2,0,1,2,4,0" => "4,1,2,0,1,2,4"EDIT : ho appena notato che molte lingue lo fanno già.
Mwr247,

Risposte:



10

JavaScript (ES6) 43

a=>(f=a=>a.reverse().filter(x=>a|=x))(f(a))

Meno golf

a=>{
  f=a=>a.reverse().filter(x=>a|=x) // reverse and remove leading 0
  // leverage js cast rules: operator | cast operands to integer
  // an array casted to integer is 0 unless the array is made of
  // a single integer value (that is ok for me in this case)
  return f(f(a)) // apply 2 times
}

Test

F=a=>(f=a=>a.reverse().filter(x=>a|=x))(f(a))

function test(){
  var l=(I.value.match(/\d+/g)||[]).map(x=>+x)
  O.textContent=F(l)
}

test()
#I { width:90%}
<input id=I oninput='test()' value='0 0 1 3 7 11 0 8 23 0 0 0'>
<pre id=O></pre>


1
Bello. f=(a,r=f(a,a))=>r.reverse().filter(x=>a|=x)è anche 43 byte.
Neil,

6

CJam, 13 byte

l~{_{}#>W%}2*

Con l'array immesso.

Versione più lunga:

l~             Puts input on the stack and parse as array
  {       }    Code block
   _           Duplicate the first thing on the stack
    {}#        Finds the index of the first non-0 value in the array, puts it on the stack
       >       Slices the array from that index
        W%     Reverses the array
           2*  Does the code block twice in total

Vorrei poter usare il fatto che la conversione da e verso una base eliminerebbe gli zeri iniziali, ma sembra che sia troppo lungo.
Esolanging Fruit,

5

Pyth, 4 byte

.sQ0

demo:

llama@llama:~$ pyth -c .sQ0
[0, 0, 0, 1, 2, 0, 3, 4, 0, 0, 5, 0, 0, 0, 0]
[1, 2, 0, 3, 4, 0, 0, 5]

Da Pyth'srev-doc.txt :

.s <seq> <any>
    Strip from A maximal prefix and suffix of A consisting of copies of B.

5

05AB1E , 4 byte

Codice:

0Û0Ü

Provalo online!

Spiegazione:

0Û    # Trim off leading zeroes
  0Ü  # Trim off trailing zeroes

Utilizza la codifica CP-1252.



5

R, 43 byte

function(x)x[cummax(x)&rev(cummax(rev(x)))]

o come lettura / scrittura STDIN / STDOUT

x=scan();cat(x[cummax(x)&rev(cummax(rev(x)))])

Questo trova il massimo cumulativo dall'inizio e la fine (inversa) della stringa. L' &operatore converte questi due vettori in uno logico della stessa dimensione di x, (gli zero verranno sempre convertiti in FALSEe tutto il resto in TRUE), in questo modo consente di effettuare il sottoinsieme in xbase alle condizioni soddisfatte.



4

Mathematica 34 27 byte

#//.{0,a___}|{a___,0}:>{a}&

Ciò applica ripetutamente regole di sostituzione fino a quando tale azione non riesce a fornire un nuovo output. 7 byte salvati grazie ad Alephalpha.

La prima regola elimina uno zero all'inizio; la seconda regola elimina uno zero alla fine dell'array.


3
#//.{0,a___}|{a___,0}:>{a}&
alephalpha,


3

Perl, 19 + 1 = 20 byte

s/^(0 ?)+|( 0)+$//g

Richiede -pbandiera:

$ perl -pE's/^(0 )+|( 0)+$//g' <<< '0 0 0 1 2 3 4 5 6 0 0 0'
1 2 3 4 5 6

@ MartinBüttner Ho pensato più o meno allo stesso modo dopo aver premuto [Aggiungi commento], ora ho solo bisogno di capire ora per consentire al markdown di salvare la mia nuova riga in un blocco di codice
e il

Tramite hack HTML malevoli. ;)
Martin Ender,

1
17 + 1 byte:s/^0 | 0$//&&redo
Kenney,

@Kenney È bellissimo :-) Dovresti postarlo come risposta!
Andlrc,

Grazie! Anche il mio originale era di 19 + 1 byte, ma poi ho visto la tua risposta che mi ha dato l'idea di radere altri 2, quindi è tuo se lo vuoi. A proposito, la tua risposta è in realtà 18 + 1 se lasci cadere ?come nell'esempio - ma ciò non ridurrà "0"..
Kenney,

3

Gelatina, 10 byte

Uo\U,o\PTị

Questo non usa il built-in.

Uo\U            Backward running logical OR
    ,           paired with
     o\         Forward running logical OR
       P        Product
        T       All indices of truthy elements
         ị      Index the input at those values.

Provalo qui .


3

Perl, 38 byte

$\.=$_}{$\=~s/^(0\n)*|(0\n)*\n$//gs

Esegui con perl -p, (3 byte aggiunti per -p).

Accetta numeri su STDIN, uno per riga; emette numeri su STDOUT, uno per riga, come dovrebbe essere un'utilità unix ben educata.

Tratta solo i numeri rappresentati esattamente da '0' come zero; sarebbe possibile supportare altre rappresentazioni con qualche byte in più nella regex.

Versione più lunga, ancora da eseguire con -p:

    # append entire line to output record separator
    $\.=$_
}{
    # replace leading and trailng zeroes in output record separator
    $\ =~ s/^(0\n)*|(0\n)*\n$//gs
    # output record separator will be implicitly printed

Versione estesa, che mostra le interazioni con -p flag:

# implicit while loop added by -p
while (<>) {
    # append line to output record separator
    $\.=$_
}{ # escape the implicit while loop
    # replace leading and traling 
    $\=~s/^(0\n)*|(0\n)*\n$//gs
    # print by default prints $_ followed by
    # the output record separator $\ which contains our answer
    ;print # implicit print added by -p
} # implicit closing brace added by -p

Supponendo che stai correndo perl -E, il -pflag di solito viene conteggiato solo come un byte, poiché c'è solo un byte aggiuntivo diverso tra quello e perl -pE.
Chris,

3

Elisir, 77 byte

import Enum
z=fn x->x==0 end
reverse(drop_while(reverse(drop_while(l,z)),z))

Sono l'array.

Edit: wah! copia / pasta fallita. ovviamente bisogna importare Enum, che aumenta il numero di byte di 12 (o usare Enum.function_name, che lo renderà ancora più lungo).


3

Vitsy, 13 byte

Vitsy sta lentamente migliorando ... (Vengo per te, Jelly. ಠ_ಠ)

1mr1m
D)[X1m]

Questo si chiude con l'array nello stack. Per leggibilità, TryItOnline! il link che ho fornito sotto la spiegazione produrrà un elenco formattato.

Spiegazione:

1mr1m
1m      Do the second line of code.
  r     Reverse the stack.
   1m   I'ma let you figure this one out. ;)

D)[X1m]
D       Duplicate the top item of the stack.
 )[   ] If the top item of the stack is zero, do the stuff in brackets.
   X    Remove the top item of the stack.
    1m  Execute the second line of code.

Si noti che ciò genererà StackOverflowException per input irragionevolmente grandi.

TryItOnline!


2
Vitsy prenderà Jelly un giorno.
Conor O'Brien,

Aggiungi la corrispondenza del bracketing automatico su EOL / EOF
Cyoce,

3

R, 39 byte

function(x)x[min(i<-which(x>0)):max(i)]

Quattro byte più brevi della risposta R di David Arenburg . Questa implementazione trova il primo e l'ultimo indice nell'array che è maggiore di zero e restituisce tutto l'array tra quei due indici.


3

MATL , 9 byte

2:"PtYsg)

Provalo online!

Spiegazione

2:"     % For loop (do the following twice)
  P     %   Flip array. Implicitly asks for input the first time
  t     %   Duplicate
  Ys    %   Cumulative sum
  g     %   Convert to logical index
  )     %   Apply index
        % Implicitly end for
        % Implicitly display stack contents

2

Dyalog APL, 15 byte

{⌽⍵↓⍨+/0=+\⍵}⍣2

               ⍣2     Apply this function twice:
{             }       Monadic function:
           +\⍵        Calculate the running sum.
       +/0=           Compare to zero and sum. Number of leading zeroes.
   ⍵↓⍨               Drop the first that many elements from the array.
 ⌽                   Reverse the result.

Provalo qui .


Che ne dici {⌽⍵/⍨×+\⍵}⍣2?
lstefano,

2

Rubino, 49 44 byte

->a{eval ?a+'.drop_while{|i|i<1}.reverse'*2}

Grazie alla manatwork per tagliare 5 byte con un metodo completamente diverso!

Questo è solo dropil primo elemento dell'array whileche è 0, inverte l'array, si ripete e infine inverte l'array per riportarlo nell'ordine corretto.


Ahia. Ora anche una .drop_while()soluzione basata sarebbe più breve (se si utilizzano 2 funzioni):f=->a{a.drop_while{|i|i<1}.reverse};->a{f[f[a]]}
manatwork

Doh. Non c'è bisogno di 2 funzioni, solo alcune evalbrutture: ->a{eval ?a+'.drop_while{|i|i<1}.reverse'*2}.
arte

@manatwork Non so perché non ci abbia pensato <1, comunque. Grazie!
Maniglia della porta

2

Vim 16 sequenze di tasti

i<input><esc>?[1-9]<enter>lD0d/<up><enter>

L'input deve essere digitato dall'utente tra ie esce non viene considerato come una sequenza di tasti. Questo presuppone che ci sarà almeno uno zero iniziale e uno finale. Se questo non è un presupposto valido, possiamo usare questa versione leggermente più lunga: (18 sequenze di tasti)

i <input> <esc>?[1-9]<enter>lD0d/<up><enter>

1
Non penso che sia necessario includere il codice per consentire all'utente di inserire i numeri ( ie <esc>). Nel campo da golf il giocatore inizia con l'ingresso già in un file caricato il buffer e il cursore nell'angolo in alto a sinistra, ma l'utente deve anche salvare ed uscire (di ZZsolito è il modo più veloce). Quindi potresti fare qualcosa del genere d[1-9]<enter>$NlDZZ(13 battute). Nota N/ ninvece di/<up><enter>
daniero,

2

ES6, 51 byte

f=a=>a.map(x=>x?t=++i:f<i++||++f,f=i=0)&&a.slice(f,t)

tviene impostato sull'indice dopo l'ultimo valore diverso da zero, mentre fviene incrementato fino a quando sono stati visti solo zeri finora.


2

Perl 6 , 23 byte

{.[.grep(?*):k.minmax]}
{.[minmax .grep(?*):k]}

Uso:

# replace the built-in trim subroutine
# with this one in the current lexical scope
my &trim = {.[.grep(?*):k.minmax]}

say trim [0, 0, 0, 8, 1, 4, 3, 5, 6, 4, 1, 2, 0, 0, 0, 0];
# (8 1 4 3 5 6 4 1 2)
say trim [0, 4, 1, 2, 0, 1, 2, 4, 0];
# (4 1 2 0 1 2 4)
say trim [0, 0, 0, 0, 0, 0];
# ()
say trim [3, 4, 5, 0, 0];
# (3 4 5)
say trim [6];
# (6)


2

JavaScript (ES6), 47 byte

a=>a.join(a="").replace(/(^0+|0+$)/g,a).split(a)

Dov'è al'array.


4
Penso che è necessario effettuare una funzione anonima all'ingresso prendere: a=>a.join(a="")....
Andlrc,

2
Questo gestisce gli interi correttamente solo quando sono una singola cifra
intorno al

@ dev-null Fatto.
user2428118,

Restituisce ancora errato per numeri interi a più cifre. [14]tornerà [1, 4].
Mwr247,

In realtà, ero (e sono) ancora in attesa di una risposta a questo commento . Ad ogni modo, purtroppo non vedo un modo per gestire numeri interi a più cifre usando la stessa tecnica che ho usato per la mia risposta e non credo che riuscirò comunque a battere questa risposta . Potrei provare quando ho tempo, però.
user2428118


2

JavaScript (ES6), 34 byte

a=>a.replace(/^(0 ?)*|( 0)*$/g,'')

L'input e l'output hanno la forma di un elenco delimitato da spazi, ad esempio "0 4 1 2 0 1 2 4 0".


2

Javascript (ES6) 40 byte

a=>/^(0,)*(.*?)(,0)*$/.exec(a.join())[2]

2

PHP, 56 54 52 byte

Utilizza la codifica Windows-1252

Soluzione basata su stringhe

<?=preg_replace(~ÜÒ×ßÏÖÔƒ×ßÏÖÔÛÜ,"",join($argv,~ß));

Esegui in questo modo:

echo '<?=preg_replace(~ÜÒ×ßÏÖÔƒ×ßÏÖÔÛÜ,"",join($argv,~ß));' | php -- 0 0 123 234 0 500 0 0 2>/dev/null;echo

Se il terminale è impostato su UTF-8, questo è lo stesso:

echo '<?=preg_replace("#-( 0)+|( 0)+$#","",join($argv," "));' | php -- 0 0 123 234 0 500 0 0 2>/dev/null;echo

Ritocchi

  • Salvato 2 byte negando le stringhe e rilasciando i delimitatori di stringa
  • Salvato 2 byte utilizzando un tag di stampa breve

1
Potete per favore fornire una soluzione ASCII. Nessuno può leggere questo!
Tito

1
@Titus Certo. Tuttavia, un sacco di esolang illeggibili là fuori ... non è come se la mia risposta non si sentisse come a casa.
aross

Un array come primo parametro di join?
Jörg Hülsermann,

1
@ JörgHülsermann Yup. È documentato il contrario, ma accetta entrambi.
aross

Hai ragione, non me ne sono reso conto
Jörg Hülsermann,


1

PowerShell, 49 byte

($args[0]-join',').trim(',0').trim('0,')-split','

Prende input $args[0]e -joinli inserisce insieme alle virgole per formare una stringa. Quindi utilizziamo la .Trim()funzione chiamata due volte per rimuovere prima il trailing e poi gli zeri e le virgole iniziali. Quindi -splitriportiamo la stringa tra virgole in un array.


Versione alternativa, senza utilizzare la conversione
PowerShell, 81 byte

function f{param($a)$a=$a|%{if($_-or$b){$b=1;$_}};$a[$a.Count..0]}
f(f($args[0]))

Poiché PowerShell non ha una funzione per tagliare gli array, definiamo una nuova funzione fche farà la metà di questo per noi. La funzione accetta $acome input, quindi scorre ciclicamente ogni elemento con un ciclo foreach |%{...}. Ogni iterazione, controlliamo un condizionale per $_ -or $b. Poiché i numeri interi diversi da zero sono veritieri, ma $nullsono falsi (e $b, non essendo precedentemente definiti, iniziano come $null), questo verrà valutato solo $truedopo aver raggiunto il nostro primo elemento diverso da zero nella matrice. Quindi impostiamo $b=1e aggiungiamo il valore corrente $_sulla pipeline. Ciò continuerà fino alla fine dell'array di input, con gli zeri nel mezzo e la fine che verrà aggiunta all'output, poiché abbiamo impostato$b verità.

Incapsuliamo e archiviamo nuovamente i risultati del loop $a. Quindi, indicizziamo $ain ordine inverso (cioè invertendo l'array), che viene lasciato sulla pipeline e quindi è il valore di ritorno della funzione.

Chiamiamo la funzione due volte $args[0]sull'ingresso al programma per "tagliare" dalla parte anteriore, quindi di nuovo dalla parte anteriore (che è la parte posteriore, poiché abbiamo invertito). L'ordine è conservato poiché ci stiamo invertendo due volte.

Questa versione gioca un po 'in disparte con le regole per un array di input di tutti gli zeri, ma poiché ignorare STDERR è una pratica accettata, il programma sputerà due Cannot index into a null arrayerrori (dettagliati) a (equivalente di PowerShell di) STDERR e quindi non produrrà nulla.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.