Verifica un triangolo di scrutinio


12

Un numero di scrutinio , che etichettiamo con B , è il numero di modi per disporre i numeri da 1 a B (B + 1) / 2 in un triangolo, in modo tale che ogni riga e colonna sia in ordine crescente. I primi quattro numeri di scrutinio sono:

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

a(3)è 2, il che significa che ci sono 2 modi per disporre i numeri da 1 a 3(3+1)/2 = 6in un triangolo del genere:

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

Vedere la voce della sequenza OEIS per maggiori dettagli.

La tua sfida, dato un triangolo di scrutinio, è di verificarne la correttezza. Se soddisfa le condizioni di un triangolo di scrutinio (righe e colonne in aumento), dovresti generare quanti altri modi (escluso quello nell'input) ci sono per disporre correttamente il triangolo. Se il triangolo di input non è stato costruito correttamente, non si dovrebbe produrre nulla.

Sono consentite nuove righe finali.

Ingresso

Un triangolo di numeri, che può essere o meno un triangolo di scrutinio valido. Per esempio:

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

Produzione

Se l'input è un triangolo di voto valido, il numero rimanente di modi per disporre gli stessi numeri in un triangolo di voto valido. Se l'input non è un triangolo di scrutinio valido, niente. Ad esempio, gli input sopra generano questi output ( <nothing>è un segnaposto per un output vuoto effettivo):

1                     # the same as a(3)-1

<nothing>

<nothing>

<nothing>

33591                 # the same as a(6)-1

punteggio

Questo è : come al solito, vince il conteggio dei byte più basso. Tiebreaker viene pubblicato per la prima volta.


1
Dovresti probabilmente menzionare che anche le colonne sono in ordine crescente. Ciò mi ha confuso fino a quando non ho cercato la definizione di OEIS.
ballesta25,

Allora perché non è 1/4 5/2 3 6valido?
Leaky Nun,

Spec riparata - Ho letto la voce OEIS sbagliata. @
ballesta25

cc @LeakyNun ^
ArtOfCode

Possiamo supporre che l'input conterrà i numeri corretti, anche se non nell'ordine corretto?
Dennis,

Risposte:


4

Gelatina , 20 byte

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

Per triangoli di scheda validi, il tempo di esecuzione e l'utilizzo della memoria sono almeno O (n!) , Dove n è il numero di voci del triangolo. Quelli non validi vengono riconosciuti da arresti anomali, quindi non stampa nulla.

Provalo online!

Prova

A livello locale, sono stato in grado di verificare che un (4) sia calcolato correttamente.

$ 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

Come funziona

;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.

3

Brachylog , 44 byte

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

Provalo online!

Funziona in un tempo a doppia esponenziale, quindi per prove veritiere dovresti credermi che teoricamente produce il risultato corretto, per triangoli con lunghezza maggiore o uguale a 3.

Puoi ancora testare falsi testcase, che dovrebbero terminare piuttosto rapidamente.


Ho dovuto aggiornare le specifiche: sia le righe che le colonne dovrebbero aumentare. Risultato della lettura errata della voce OEIS. Scusa se questo invalida la tua risposta!
ArtOfCode

@ArtOfCode Questo è stato ciò che la mia risposta fa da sempre
Leaky Nun,

2

JavaScript (ES6), 143 byte

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

Cerca nel triangolo una voce non valida e quindi utilizza una formulazione ricorsiva della formula in OEIS per calcolare il risultato.


Ho dovuto aggiornare le specifiche: sia le righe che le colonne dovrebbero aumentare. Risultato della lettura errata della voce OEIS. Scusa se questo invalida la tua risposta!
ArtOfCode

@ArtOfCode No, lo stavo già verificando, ma grazie comunque.
Neil,
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.