Ordina 40 bastoncini


15

Abbiamo 40 bastoncini della stessa larghezza ma di altezze diverse. Quante disposizioni sono possibili per metterle una accanto all'altra in modo che quando guardiamo da destra vediamo 10 bastoni e quando guardiamo da sinistra vediamo di nuovo esattamente 10 bastoncini?

Ad esempio un tale ordine è:Un esempio di ordinazione

I bastoncini neri sono nascosti, i bastoncini rossi sono quelli che puoi vedere quando guardi da sinistra, i bastoncini blu sono quelli che puoi vedere quando guardi da destra e uno viola (cioè il più lungo) è quello che puoi vedere visto da entrambi i lati.

Come casi di test:

  • Se avessimo 3 stick il numero di ordini per vedere 2 da sinistra e 2 da destra è 2
  • Se avessimo 5 stick il numero di ordini per vedere 3 da sinistra e 3 da destra è 6
  • Se avessimo 10 stick il numero di ordini per vedere 4 da sinistra e 4 da destra è 90720

13
Potresti voler evitare domande con un output fisso perché la risposta ottimale da code-golf probabilmente stamperà semplicemente il risultato senza calcolarlo. Consiglierei di fare in modo che la domanda abbia alcuni input variabili, ad esempio N stick in modo tale da vederne K da sinistra / destra, dove N e K sono numeri interi di input
Sp3000,

4
Se modifichi le specifiche in modo che i programmi ricevano input (non vedo perché no - hai già i casi di test), potresti voler pensare se vuoi o meno fissare un limite di tempo ai programmi.
Sp3000,

1
"Devi usare il tuo programma pubblicato per calcolare il caso 40/10" dovrebbe essere un limite di tempo abbastanza buono.
feersum,

1
Non riesco a superare il fatto che 10!/40 = 90720... è una coincidenza?
Tim

1
@Tim Qual è il significato di 90720? Codice postale per Los Alamitos, CA ?
Digital Trauma,

Risposte:


8

PARI / GP, 80

f(n,v)=abs(sum(k=1,n-1,binomial(n-1,k)*stirling(k,v-1,1)*stirling(n-k-1,v-1,1)))

Viene anche chiamato il numero di stick visibili Skyscraper Numbers , dopo il gioco matita / griglia. Questo codice si basa sulla formula (solo leggermente modificata) di OEIS A218531 . Non conosco molto PARI, ma non credo ci sia molto da golf qui.

I casi di test sono tutti mostrati su ideone.com . Il risultato per f(40,10)è:

192999500979320621703647808413866514749680

1
C'è una buona ragione per la formula. Il numero di permutazioni con vstick visibili a sinistra è il numero Stirling s(n,v). Se la levetta più alta è in posizione k, le levette visibili a sinistra sono quella levetta e le levette visibili a sinistra nella sub-permutazione a sinistra dei k-1valori a sinistra della posizione k. Quindi, per avere vlevette visibili a sinistra e levette visibili a vdestra, si hanno s(k,v-1)scelte per permutare la metà sinistra, s(n-k-1,v-1)per permutare la metà destra e binomial(n-1,k)scelte per dividere i bastoncini nelle due metà.
xnor

@xnor Danno sostanzialmente questa spiegazione nel PDF collegato, ma il tuo è scritto molto meglio IMO.
Geobits,

È possibile salvare 11 byte: f(n,v,s=stirling)=abs(sum(k=1,n--,binomial(n,k)*s(k,v-1)*s(n-k,v-1))). Questo salva sterlingin una variabile per il riutilizzo, lascia il suo ultimo argomento, poiché 1 è il valore predefinito e sottrae 1 da n una volta anziché tre volte.
Charles,

1

Python 3, 259 byte

Non molto contento di questo.

import itertools as i
x=input().split()
y,k=x
y=int(y)
c=0
x=list(i.permutations(list(range(1,y+1))))
for s in x:
 t=d=0;l=s[::-1]
 for i in range(y):
  if max(s[:i+1])==s[i]:t+=1
 for i in range(y):
  if max(l[:i+1])==l[i]:d+=1
 if t==d==int(k):c+=1
print(c)

Esempio di input e output:

10 4
90720

Genera tutte le possibili combinazioni dell'intervallo fornito, quindi scorre attraverso di esse, controllando ogni numero in esse contenuto per vedere se è uguale al massimo dei numeri precedenti. Quindi fa lo stesso all'indietro e se il conteggio in avanti (t) = il conteggio all'indietro (d) = il numero di vista dato (k) è valido. Aggiunge questo a un contatore (c) e lo stampa alla fine.


0

R, 104

function(N,K)sum(sapply(combinat::permn(N),function(x)(z=function(i)sum(cummax(i)==i)==K)(x)&z(rev(x))))

De-golfed un po ':

    function(N,K) {
      all_perm <- combinat::permn(N)
      can_see_K_from_left <- function(i)sum(cummax(i) == i) == K
      can_see_K_from_both <- function(x)can_see_K_from_left(x) &
                                        can_see_K_from_left(rev(x))
      return(sum(sapply(all_perm, can_see_K_from_both)))
    }

0

Pyth - 38 36 byte

Fondamentalmente una porta della risposta R. Abbastanza lento, non è nemmeno possibile completare 10, 4online.

AGHQLlfqhS<bhT@bTUGlf!-,yTy_TH.pr1hG

Le uniche cose che Pyth non ha sono cummax e the == vettori over, ma questi hanno impiegato solo pochi byte per implementare.

Spiegazione e ulteriore golf in arrivo.

Provalo qui online .

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.