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.