L'algoritmo di conteggio di ritiro


14

I bambini che stanno imparando a contare spesso conoscono le serie di numeri, ma non riescono a metterle insieme correttamente.

Ad esempio, potrebbero dire:

1,2,3,4,7,8,9,10

A volte i bambini si rendono conto che hanno saltato alcuni numeri e tornano indietro:

1,2,3,4,7,8,5,6,7,8,9,10

Questo è chiaramente il modello superiore. Dobbiamo identificarli.

Per identificare questi elenchi:

  1. Identifichiamo il minimo Me il massimo Ndell'elenco

  2. Scorriamo l'elenco. Se il numero corrente è maggiore o uguale a qualsiasi membro dell'elenco alla sua destra, rimuoviamo il numero corrente.

  3. Se la restante lista contiene tutti i numeri da Ma N, quindi restituiamo un valore di verità.

Puoi presumere che il tuo elenco di input contenga almeno 1 elemento. Puoi presumere che tutti i numeri interi saranno non negativi.

Casi test:

Truthy:

0
10
0 0 0 
1 0 1
0 1 2 3 4 5 6 7 8 9 10
0 1 2 3 0 1 2 3
0 1 2 3 4 5 5
0 1 1 2 2 3
0 3 6 1 4 7 2 5 8 3 4 5 6 7 8
1 3 5 7 2 3 4 5 6 7
5 6 0 1 2 3 6 7 4 5 6 7
5 6 7 8
5 5 6 7 8
4 6 7 8 3 4 5 6 7 8

Falsy:

1 0
4 3 2 1
1 2 3 7 8 9
0 1 2 3 1 3
0 1 2 3 1 3 4
0 1 2 3 1 3 2 4
0 1 2 3 1 3 2 4 3
1 3 5 7 2 4 6 8
0 1 2 1 3 4 5 6
4 5 6 3 4 5

Questo è , quindi fai in modo che le tue risposte siano le più brevi possibili!


Non molto chiaro: [0,1,2,3,4,5,4,3,2,1] dovrebbe essere considerato vero o falso?
GB

1
@GB False. Quando sei sul secondo elemento, lo rimuoveresti al passaggio 2 (perché ce n'è un altro 1più avanti). Rimuoverebbe anche ogni altro elemento (tranne l'ultimo 1), quindi finiresti con 0 1, che non lo è0 1 2 3 4 5
Nathan Merrill,

Risposte:


6

05AB1E , 5 byte

Non sono sicuro al 100% che funzioni, ma supera tutti i casi di test e non sono riuscito a trovare alcuna situazione in cui fallisca.

Ú¥1QP

Provalo online!

Ú¥1QP   Main link. Argument a
Ú       Reverse uniquify a, keeps only last occurence of each element
 ¥      Get all deltas - all 1 if ascending list
  1Q    Compare all deltas to 1
    P   Product of all results

7 byte, infatti
dice Val Reinstate Monica

2
@val No, 05AB1E utilizza una codifica personalizzata, 05AB1E.
Erik the Outgolfer,

2

Gelatina , 10 9 byte

ṀrṂɓṚ«\Q⁼

Provalo online!

Come funziona

ṀrṂɓṚ«\Q⁼  Main link. Argument: A (array)

Ṁ          Yield the maximum of A.
  Ṃ        Yield the minimum of A.
 r         Yield R := [max(A), ... min(A).
   ɓ       Begin a new chain. Left argument: A. Right argument: R
    Ṛ      Reverse A.
     «\    Take the cumulative minimum.
       Q   Unique; deduplicate the results.
        ⁼  Compare the result with R.

Interessante, è ɓuna funzionalità relativamente nuova?
Produzioni ETH

Sì, proviene da una richiesta pull di Jonathan Allan.
Dennis,

Ah, 13 giorni fa. Non l'avevo ancora visto usato però (forse tu o Jonathan ce l'hai e l'ho perso).
Produzioni ETH

La parte davvero interessante qui è «\secondo me però.
Erik the Outgolfer



1

PHP , 148 130 byte

-18 byte, grazie @Christoph

$a=explode(' ',$argn);$b=range(min($a),max($a));foreach($a as$i=>&$k)for(;++$i<count($a);)$k<$a[$i]?:$k=-1;echo!array_diff($b,$a);

Provalo online!


Ok un sacco di commenti qui: $argnè sempre una stringa foreachnon funziona su di essa. È possibile utilizzare $argvper ottenere un array come input, ma attenzione che contiene sempre il nome file come primo elemento. Si utilizza $me $nsolo una volta in modo da poter risparmiare un sacco di byte che creano $bprecedenti: $b=range(min($a),max($a));. Il cast (bool)è completamente inutile. if($k>=$a[$s])$a[$i]=null;a $k<$a[$s]?:$a[$i]=-1;. Usando il riferimento possiamo fare questo: foreach($a as$i=>&$k)(+1 byte) e $a[$i]a $k(-4 byte). Inoltre, questo ci lascia cadere $s=$iperché possiamo iterare $idirettamente ora.
Christoph,

Il risultato è simile al seguente $a=$argn;$b=range(min($a),max($a));foreach($a as$i=>&$k)for(;++$i<count($a);)$k<$a[$i]?:$k=-1;echo!array_diff($b,$a);(117 byte). Ma utilizza ancora $argnnel modo sbagliato. $a=explode(' ',$argn);risolverebbe questo problema per 13 byte aggiuntivi.
Christoph,

1
Nessun problema ! Sempre bello trovare un nuovo giocatore di golf PHP spero di vederti più :) o Titus, Jörg o io siamo sempre lì per aiutarti!
Christoph,

1
@Christoph Perché non utilizzare $_GETcome array di input? In questo caso non è necessario utilizzare explode-6 byte aggiuntivi per non utilizzare la $bvariabile
Jörg Hülsermann

1
@Christoph Okay In questo caso abbiamo bisogno di una versione sotto 7.1 e usiamo ´a & `invece di ~ Provarlo online!
Jörg Hülsermann,

1

Java 8, 264 262 byte

import java.util.*;l->{int m=Collections.max(l),n=Collections.min(l),i=0,q;for(;i<(q=l.size());i++)if(l.subList(i+1,q).size()>0&&l.get(i)>=Collections.min(l.subList(i+1,q)))l.remove(i--);for(i=0;n<=m;)if(i<l.size()&&l.get(i++)==n)n++;else return 0>1;return 1>0;}

Spiegazione:

Provalo qui.

import java.util.*;                 // Import for Collections

l->{                                // Method with integer-ArrayList parameter and boolean return-type
  int m=Collections.max(l),         //  Max of the list
      n=Collections.min(l),         //  Min of the list
      i=0,q;                        //  Two temp integers
  for(;i<(q=l.size());i++)          //  Loop (1) over the list
    if(l.subList(i+1,q).size()>0    //   If the sublist right of the current item is not empty
    &&l.get(i)>=Collections.min(l.subList(i+1,q))) 
                                    //   and if the current item is larger or equal to the lowest value of this sublist
      l.remove(i--);                //    Remove the current item from the main list
                                    //  End of loop (1) (implicit / single-line body)
  for(i=0;n<=m;)                    //  Loop (2) from min to max
    if(i<l.size()                   //   If the current item doesn't exceed the list's size
    &&l.get(i++)==n)                //   and the items are in order so far
      n++;                          //    Go to the next item
    else                            //   Else:
      return 0>1;//false            //    Return false
                                    //  End of loop (2) (implicit / single-line body)
  return 1>0;//true                 //  Return true
}                                   // End of method

1

R, 88 85 byte

y=NULL;for(i in x<-scan())if(all(i<x[-(1:(F<-F+1))]))y=c(y,i);all(min(x):max(x)%in%y)

Questo può probabilmente essere ulteriormente risolto. Passa sopra gli elementi di x, controlla se tutti i valori imminenti sono più grandi e solo allora mantiene quell'elemento. Dopo il ciclo crea una sequenza da min(x)a max(x)e verifica %in%se tutti i valori sono inclusi nella versione eliminata di x.


Portando la risposta di Dennis potremmo arrivare a 53 byte. function(n)all(unique(cummin(rev(n)))==max(n):min(n))
Giuseppe,

1

JavaScript (ES6), 60 byte

s=>(o={},s.reverse().every((n,i)=>!i|o[n+1]|o[n]&&(o[n]=1)))

Ungolfed:

s=>(
  o={},
  s.reverse().every((n,i)=>
    !i|o[n+1]|o[n]&&(o[n]=1)
  )
)

Questo è un algoritmo più semplice:

Iterate l'array al contrario e assicuratevi che ogni numero (tranne il primo) sia uno in meno o uguale a un numero già visto.

Frammento:


1

Haskell, 62 byte

g(a:b)=[a|all(a<)b]++g b
g a=a
f x=g x==[minimum x..maximum x]

Provalo online!

Un'implementazione diretta della definizione in cui grimuove gli elementi se sono> = degli elementi alla sua destra.


1

C #, 69 byte

s=>s.Where((e,i)=>s.Skip(i+1).All(r=>e<r)).Count()==s.Max()-s.Min()+1

In breve:
s = input (s) equence
take from s element dove all items after this one (skip (I) ndex + 1 items), il valore corrente è maggiore contali
e vedi se la quantità rimasta è uguale alla quantità prevista ((max) imum value meno (min) imum) quantità di numeri

Provalo online!


@MDXF Vuoi dargli il benvenuto?
Stan Strum,

@StanStrum ho frainteso le regole? il mio inglese è troppo disordinato? Sto postando per la prima volta ...
Barodus,

No, no! È un privilegio dare il benvenuto a un nuovo arrivato in PPCG e gli stavo chiedendo se avrebbe voluto salutarti
Stan Strum,

Sembra che il privilegio sia per entrambi. Grazie, gente ^^
Barodus,

Questa è un'ottima prima risposta, spero che ti diverta nel tuo futuro di PPCG!
Stan Strum,

0

JavaScript (ES6), 82 73 72 70 byte

Restituisce un valore booleano.

a=>a.filter((x,i)=>k-=a.every(y=>~i--<0|y>x,m=x>m?x:m),m=k=0)[0]+~m==k

Come?

Esaminiamo ogni elemento x dell'array di input a , tenendo traccia del valore massimo rilevato me del numero -k di valori che non sono maggiori o uguali a qualsiasi membro alla loro destra. Per definizione, i valori validi vengono visualizzati in ordine strettamente crescente.

Usiamo filter()piuttosto che map(), in modo che tutti gli elementi vengano filtrati fino a quando k diventa negativo. Questo ci consente di isolare il primo elemento valido, che è anche garantito essere il valore minimo dell'array.

Infine, testiamo se minimum - (maximum + 1) == -number_of_valid_elements:

a.filter(...)[0] + ~m == k

Casi test

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.