Limite seus números por suas corridas

15

Listas autolimitadas

Considere uma lista não vazia L contendo números inteiros não negativos. Uma execução em L é uma sub-lista contígua de elementos iguais, que não podem ser prolongados. Por exemplo, as execuções de [0,0,1,1,3,3,3,2,1,1] são [0,0], [1,1], [3,3,3], [2 ], [1,1] . A lista L é autolimitada se, para cada número inteiro N ≥ 1 , o número de ocorrências de N for menor ou igual ao número de execuções de N-1 . A lista acima não é autolimitada, porque existem 4 ocorrências de 1 , mas apenas uma execução de 0 s.

Aqui está um exemplo de uma lista autolimitada: [0,0,3,4,1,0,2,1,1,0,2,1,0,0,0,1,0] . Tem

  • 5 execuções de 0 e 5 ocorrências de 1 ,
  • 4 execuções de 1 e 2 ocorrências de 2 ,
  • 2 execuções de 2 e 1 ocorrência de 3 ,
  • 1 corrida de 3 e 1 ocorrência de 4 ,
  • 1 execução de 4 e nenhuma ocorrência de 5 ,
  • sem ocorrências de outros números inteiros.

A tarefa

Sua tarefa é decidir se uma lista é autolimitada. Mais explicitamente, sua entrada deve ser uma lista não vazia de números inteiros não negativos. Se a lista for autolimitada, sua saída será verdadeira; caso contrário, será falso. A entrada e a saída podem estar em qualquer formato razoável.

A menor contagem de bytes em cada linguagem de programação é a vencedora. Aplicam-se as regras de padrão .

Casos de teste

Instâncias verdadeiras:

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

Instâncias de falsidade:

[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]
Zgarb
fonte
Para não incomodar, mas considere usar uma das abordagens desta meta-discussão em vez de verdade / falsidade, pois a veracidade não é uma propriedade de mais do que algumas línguas usadas aqui com frequência.
FryAmTheEggman 22/03
@LeakyNun Sim, caso contrário, a condição falhará para aqueles N para os quais N-1 não está presente.
Zgarb
@ Mr.Xcoder Há [2]também, mas esses casos devem ser falsos, sim.
Erik the Outgolfer 22/03
@FryAmTheEggman Eu não tinha visto essa discussão, obrigado por vinculá-la. Vou manter esse desafio como está, porque quero processar as abordagens discutidas por um tempo.
Zgarb
Claro, mas eu gostaria de manter o comentário lá, pois sinto que muitas pessoas perderam. Importa bastante, pelo menos para mim, postar em idiomas como o Retina.
FryAmTheEggman 22/03

Respostas:

5

Perl 6 , 29 bytes

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

Experimente online!

Desafio muito bom para o Perl 6. Usa o operador de subconjunto em Bags (conjuntos com pesos inteiros). Explicação:

{
    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.
}
Nwellnhof
fonte
1
Lindo. Eu vi o subconjunto Bag + se aproximar, mas ficou preso na coisa com a qual comparar.
22718 Phil H
3

JavaScript (ES6), 92 89 bytes

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

Experimente online!

Quão?

A matriz c [] é usada para armazenar o número de execuções e o número de ocorrências inteiras. As execuções são armazenadas em índices não negativos e as ocorrências inteiras são armazenadas em índices complementares de 1 ( c [-1] = número de 0 's, c [-2] = número de 1 ' s, etc.).

Os índices negativos são realmente salvos como propriedades do objeto de matriz subjacente e .some () não itera sobre eles.

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()
Arnauld
fonte
3

Gelatina , 10 bytes

œ-ŒgḢ€‘ƊS¬

Experimente online!

Como funciona

œ-Œ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.
Dennis
fonte
2

Python 3 , 94 bytes

lambda a:all(sum(1for x,y in zip(a,a[1:]+[-1])if x==j!=y)>=a.count(j+1)for j in range(max(a)))

Experimente online!

HyperNeutrino
fonte
1
sum(1for ... if x==j!=y)=> sum(x==j!=y for ...).
Sr. Xcoder 22/0318
@ Mr.Xcoder oh ofc. obrigado!
HyperNeutrino
2

Japonês , 21 bytes

x o e@ó¥ mÌè¥X ¨Uè¥XÄ

Teste online!

ETHproductions
fonte
2

Stax , 13 9 bytes

Dennis encontrou um algoritmo muito melhor . Eu descaradamente portado para stax.

ä╨²@┬↕OR♣

Execute e depure on-line

Descompactado, não jogado e comentado, é assim que parece.

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

Execute este

Resposta antiga:

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

Execute e depure

Ele itera sobre a entrada e verifica as condições:

  • É o elemento > 0 ?
  • É occurrences(element) >= runs(element - 1) ?

Se qualquer uma dessas condições for verdadeira para um elemento, esse elemento será compatível. Se todos os elementos são compatíveis, o resultado é 1.

Aqui está a representação descompactada, não destruída e comentada do mesmo programa.

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

Execute este

recursivo
fonte
1

Haskell, 80 bytes

import Data.List
o#l=[1|x<-l,x==o]
f x=and[(i-1)#(head<$>group x)>=i#x|i<-x,i>0]

Experimente online!

nimi
fonte