Limita i tuoi numeri con le tue corse


15

Elenchi autolimitanti

Si consideri un elenco non vuoto L contenente numeri interi non negativi. Una corsa in L è un sottoelenco contiguo di elementi uguali, che non può essere allungato. Ad esempio, le serie di [0,0,1,1,3,3,3,2,1,1] sono [0,0], [1,1], [3,3,3], [2 ], [1,1] . L'elenco L è auto-limitante se per ogni numero intero N ≥ 1 , il numero di occorrenze di N è inferiore o uguale al numero di serie di N-1 . L'elenco sopra non è auto-limitante, perché ci sono 4 occorrenze di 1 , ma solo una corsa di 0 s.

Ecco un esempio di un elenco auto-limitante: [0,0,3,4,1,0,2,1,1,0,2,1,0,0,0,1,0] . Esso ha

  • 5 esecuzioni di 0 e 5 occorrenze di 1 ,
  • 4 serie di 1 e 2 occorrenze di 2 ,
  • 2 serie di 2 e 1 occorrenza di 3 ,
  • 1 serie di 3 e 1 occorrenza di 4 ,
  • 1 serie di 4 e nessuna occorrenza di 5 ,
  • nessuna occorrenza di altri numeri interi.

L'obiettivo

Il tuo compito è decidere se un elenco è auto-limitante. Più esplicitamente, il tuo input deve essere un elenco non vuoto di numeri interi non negativi. Se l'elenco è auto-limitante, l'output deve essere veritiero; in caso contrario, sarà falso. L'input e l'output possono essere in qualsiasi formato ragionevole.

Il conteggio dei byte più basso in ciascun linguaggio di programmazione è il vincitore. Si applicano le regole standard del .

Casi test

Istanze sincere:

[0]
[1,0]
[0,1,1,0,2]
[3,1,1,0,0,2,0,0]
[5,0,4,1,3,0,2,2,0,1,1,1,0]
[0,0,1,1,0,0,1,1,0,0,2,2,0,0]
[6,0,0,0,2,2,1,0,5,0,3,4,0,1,1,1]
[5,0,1,0,0,0,0,4,0,3,1,1,1,2,2,0,0,0,0,0]
[4,5,1,3,2,0,5,2,0,3,0,1,0,1,0,0,0,1,0,0,1,0,3,4,4,0,2,6,0,2,6]
[0,4,1,3,10,6,0,1,3,7,9,5,5,0,7,4,2,2,5,0,1,3,8,8,11,0,0,6,2,1,1,2,0,4]

Esempi di falsi:

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

Per non disturbare, ma per favore considera di usare uno degli approcci di questa meta discussione invece di verità / falsità, poiché la verità non è una proprietà di più di un paio di lingue usate qui spesso.
FryAmTheEggman,

@LeakyNun Sì, altrimenti la condizione non riesce per quelle N per le quali N-1 non è presente.
Zgarb,

@ Mr.Xcoder C'è [2]anche, ma tali casi dovrebbero essere falsi, sì.
Erik the Outgolfer,

@FryAmTheEggman Non avevo visto quella discussione, grazie per averla collegata. Terrò questa sfida così com'è, perché voglio elaborare gli approcci discussi lì per un po '.
Zgarb,

Certo, ma vorrei mantenere il commento lì, poiché sento che molte persone lo hanno perso. Importa molto, almeno per me, nel pubblicare in lingue come Retina.
FryAmTheEggman,

Risposte:


5

Perl 6 , 29 byte

{bag(.grep(?*)X-1)⊆.squish}

Provalo online!

Sfida molto bella per Perl 6. Usa l'operatore del sottoinsieme su Borse (set con ponderazione intera). Spiegazione:

{
    bag(           # Create bag of
        .grep(?*)  # non-zero elements,
        X- 1       # decremented by one.
    )
                  # Subset test.
    .squish        # "squish" removes repeated elements in each run.
                   # The result is implicitly converted to a bag
                   # counting the number of runs.
}

1
Bellissimo. Ho visto l'approccio del sottoinsieme Bag + ma mi sono bloccato sulla cosa da confrontare.
Phil H,

3

JavaScript (ES6), 92 89 byte

a=>a.map(n=>g(~n,n!=p&&g(p=n)),c=[j=0],p=g=n=>c[n]=-~c[n])&&!c.some((n,i)=>i-j++|n<c[~j])

Provalo online!

Come?

L'array c [] viene utilizzato per memorizzare sia il numero di esecuzioni che il numero di occorrenze di numeri interi. Le esecuzioni sono memorizzate in indici non negativi e le occorrenze di interi sono archiviate in indici del complemento a 1 ( c [-1] = numero di 0 's, c [-2] = numero di 1 ', ecc.).

Gli indici negativi vengono effettivamente salvati come proprietà dell'oggetto array sottostante e .some () non scorre su di essi.

a =>                        // given the input array a[]
  a.map(n =>                // for each value n in a[]:
    g(                      //   update c[]:
      ~n,                   //     increment c[~n] (# of integer occurrences)
      n != p && g(p = n)    //     if n != p, set p to n and increment c[n] (# of runs)
    ),                      //   end of c[] update
    c = [j = 0],            //   start with c = [0] and j = 0 (used later)
    p =                     //   initialize p to a non-numeric value
    g = n => c[n] = -~c[n]  //   g = helper function to increment c[n]
  )                         // end of map()
  && !c.some((n, i) =>      // for each value n at position i in c[]:
    i - j++ |               //   make sure that i == j++
    n < c[~j]               //   and n is greater than or equal to c[~j]
  )                         // end of some()


3

Gelatina , 10 byte

œ-ŒgḢ€‘ƊS¬

Provalo online!

Come funziona

œ-ŒgḢ€‘ƊS¬  Main link. Argument: A (array)

       Ɗ    Drei; group the three links to the left into a monadic chain.
  Œg          Group consecutive, identical elements of A into subarrays.
    Ḣ€        Head each; pop the first element of each run.
      ‘       Increment the extracted integers.
            The resulting array contains n repeated once for each run of (n-1)'s.
œ-          Perform multiset subtraction, removing one occurrence of n for each
            run of (n-1)'s.
       S    Take the sum. If only 0's remain, the sum will be 0.
        ¬   Take the logical NOT, mapping 0 to 1 and positive integers to 0.





2

Stax , 13 9 byte

Dennis ha trovato un algoritmo molto migliore . L'ho spudoratamente portato a stax.

ä╨²@┬↕OR♣

Eseguilo ed esegui il debug online

Disimballato, non golfato e commentato, ecco come appare.

c   copy input
:g  get run elements
{^m increment each
|-  multiset-subtract from original input
|M! get maximum from result, and apply logical not

Esegui questo

Vecchia risposta:

║Ä|╤#╫∩▼cëózü

Esegui ed esegui il debug

Iterate sull'input e controlla le condizioni:

  • È l'elemento > 0?
  • È occurrences(element) >= runs(element - 1)?

Se una di queste condizioni è vera per un elemento, quell'elemento è conforme. Se tutti gli elementi sono conformi, il risultato è 1.

Ecco la rappresentazione scompattata, ungolfed e commentata dello stesso programma.

O           push 1 under the input
F           iterate over the input using the rest of program
  |c        skip this iteration of the value is 0
  x#        number of occurrences of this value in input (a)
  x:g _v#   number of runs of (current-1) in input (b)
  >!        not (a > b); this will be truthy iff this element is compliant
  *         multiply with running result

Esegui questo


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.