Verificar um triângulo de votação

12

Um número de cédula , que rotularemos de B , é o número de maneiras de organizar os números de 1 a B (B + 1) / 2 em um triângulo, de modo que cada linha e coluna esteja em ordem crescente. Os quatro primeiros números da cédula são:

a(0) = 1
a(1) = 1
a(2) = 1
a(3) = 2

a(3)é 2, o que significa que existem 2 maneiras de organizar os números de 1 a 3(3+1)/2 = 6nesse triângulo:

1          1
2 3    or  2 4
4 5 6      3 5 6

Veja a entrada da sequência OEIS para mais detalhes.

Seu desafio, dado um triângulo eleitoral, é verificar sua correção. Se ele satisfizer as condições de um triângulo eleitoral (linhas e colunas aumentando), você deve mostrar quantas outras maneiras (excluindo a da entrada) existem para organizar o triângulo corretamente. Se o triângulo de entrada for construído incorretamente, você não deverá produzir nada.

Novas linhas à direita são permitidas.

Entrada

Um triângulo de números, que pode ou não ser um triângulo de voto válido. Por exemplo:

1
2 3
4 5 6

1
10 5 
9 8 2
7 6 4 3

1
3 2

9
2 11
14 3 5
12 8 1 7
15 13 10 4 6

1
2 3
4 5 6
7 8 9 10
11 12 13 14 15
16 17 18 19 20 21

Resultado

Se a entrada for um triângulo de voto válido, o número restante de maneiras de organizar os mesmos números em um triângulo de voto válido. Se a entrada não for um triângulo de voto válido, nada. Por exemplo, as entradas acima produzem essas saídas ( <nothing>é um espaço reservado para uma saída vazia real):

1                     # the same as a(3)-1

<nothing>

<nothing>

<nothing>

33591                 # the same as a(6)-1

Pontuação

Este é o : como sempre, a menor contagem de bytes vence. O desempatador é o mais antigo publicado.

ArtOfCode
fonte
1
Você provavelmente deve mencionar que as colunas também estão em ordem crescente. Isso me confundiu até procurar a definição da OEIS.
precisa saber é o seguinte
Então, por que não é 1/4 5/2 3 6válido?
Leaky Nun
Especificação fixa - li a entrada OEIS incorreta. @ ballesta25
ArtOfCode 14/08
cc @LeakyNun ^
artofcode
Podemos supor que a entrada conterá os números corretos, mesmo que não na ordem correta?
Dennis

Respostas:

4

Gelatina , 20 bytes

;Zµ⁼Ṣ€
ẋÇFŒ!ṁ€⁸ÇÐfL’

Para triângulos de cédula válidos, o tempo de execução e o uso de memória são pelo menos O (n!) , Onde n é o número de entradas do triângulo. Os inválidos são reconhecidos por falhas, imprimindo nada.

Experimente online!

Execução de teste

Localmente, pude verificar se um (4) é calculado corretamente.

$ time jelly eun ';Zµ⁼Ṣ€¶ẋÇFŒ!ṁ€⁸ÇÐfL’' '[1],[2,3],[4,5,6],[7,8,9,10]'
11

real    6m9.829s
user    6m7.930s
sys     0m2.579s

Como funciona

;Zµ⁼Ṣ€         Helper link. Argument: T (triangular array)

 Z             Zip/transpose T.
;              Concatenate the original and the transposed copy.
  µ            Begin a new monadic chain, with the previous result (R) as argument.
    Ṣ€         Sort each array in R.
   ⁼           Test for equality with R.
               This returns 1 if T is a ballot triangle, 0 if not.

ẋÇFŒ!ṁ€⁸ÇÐfL’  Main link. Argument: A (triangular array)

 Ç             Call the helper link with argument A.
ẋ              Repeat A that many times.
               This yields an empty array if A is not a ballot triangle.
  F            Flatten the result.
   Œ!          Generate all permutations of the digits of A.
     ṁ€⁸       Mold each permutation like A, i.e., give it triangular form.
               This crashes if permutation array is empty.
        ÇÐf    Filter; keep permutations for which the helper link returns 1.
           L’  Compute the length and decrement it.
Dennis
fonte
3

Braquilog , 44 bytes

{:{o?}a,?z:2a},?ly+yb:3flw
p~c.:laBtybB,.:1&

Experimente online!

Isso ocorre em tempo exponencial duplo, portanto, para casos reais de teste, você precisa acreditar em mim que, teoricamente, produz o resultado correto, para triângulos com comprimento maior ou igual a 3.

Ainda é possível testar casos de teste falsey, que devem terminar rapidamente.

Freira Furada
fonte
Eu tive que atualizar a especificação - ambas as linhas e colunas devem estar aumentando. Resultado da leitura incorreta da entrada OEIS. Desculpe se isso invalida sua resposta!
ArtOfCode
@ArtOfCode Isso foi o que a minha resposta faz tudo junto
Leaky Nun
2

JavaScript (ES6), 143 bytes

a=>a.some((b,i)=>b.some((c,j)=>c<b[j-1]||i&&c<a[i-1][j]))?'':(f=n=>n<2||n*f(n-1),g=(n,m=f(n*n+n>>1))=>n<2?m:g(--n,m*f(n)/f(n+n+1)),g(a.length))

Pesquisa no triângulo uma entrada inválida e, em seguida, usa uma formulação recursiva da fórmula no OEIS para calcular o resultado.

Neil
fonte
Eu tive que atualizar a especificação - ambas as linhas e colunas devem estar aumentando. Resultado da leitura incorreta da entrada OEIS. Desculpe se isso invalida sua resposta!
ArtOfCode
@ArtOfCode Não, eu já estava verificando isso, mas obrigado de qualquer maneira.
Neil