Riesci a superare Bill Gates?


13

L'ordinamento per pancake è il termine colloquiale per il problema matematico di ordinare una pila disordinata di frittelle in ordine di dimensione quando una spatola può essere inserita in qualsiasi punto della pila e utilizzata per capovolgere tutte le frittelle sopra di essa. Un numero di pancake P (n) è il numero minimo di lanci necessari per n pancake. 1

Nel 1979, un giovane Bill Gates e Christos Papadimitriou, scrissero un documento dimostrando un limite superiore di P (n) = (5n + 5) / 3 . 2

Penso che sia sicuro presumere che Gates (e / o Papadimitriou) abbia scritto un programma per eseguire l'ordinamento dei pancake usando l'algoritmo che hanno sviluppato (forse più tardi del 1979). Dato che Gates era un abile programmatore, probabilmente hanno provato a golfare questo codice nel miglior modo possibile, ma la dimensione del codice sorgente non è pubblicamente disponibile (AFAIK).

Sfida:

Crea una funzione / programma che esegua l'ordinamento dei pancake, in cui il numero massimo di lanci non supera il limite trovato da Gates e Papadimitriou. 3 È possibile scegliere se si desidera che l'elenco sia crescente o decrescente, purché coerente.

Puoi supporre che n <50 . È quindi necessario limitare il numero di lanci a (alcuni n- valori selezionati casualmente ):

 n   P(n)
38   65
49   83
50   85

L'output dovrebbe essere la posizione della spatola prima di ogni inversione. L'output può essere zero o indicizzato e puoi scegliere se contare dall'alto o dal basso.

Regole aggiuntive:

  • Il runtime deve essere deterministico
  • Non esiste un limite di tempo fisso, ma devi essere in grado di fornire l'output per un elenco con 50 elementi

Elenchi di test:

Non posso fornire gli elenchi più difficili (in tal caso, scriverei un documento, non una sfida), quindi fornirò alcuni elenchi casuali di numeri su cui puoi testare le tue funzioni / programmi. Potrei aggiungere altri se risulta che questi elenchi sono "facili".

9, 63, 62, 75, 45, 78, 59, 75, 69, 3, 28, 94, 51, 10, 45, 93, 97, 80, 72, 36, 80, 88, 30, 93, 84, 80, 17, 31, 6, 80, 76, 91, 9, 76, 38, 33, 22, 15, 45, 46, 15, 98, 2, 56, 90, 27, 27, 26, 69, 25
...
74, 89, 57, 52, 70, 96, 16, 5, 77, 84, 54, 13, 90, 64, 31, 80, 3, 25, 13, 19, 13, 34, 1, 79, 35, 43, 4, 19, 82, 29, 48, 95, 97, 28, 45, 62, 64, 82, 70, 34, 38, 15, 51, 83, 21, 66, 4, 42, 74, 84
...
62, 73, 7, 90, 83, 18, 12, 35, 72, 71, 99, 67, 87, 62, 65, 70, 14, 72, 55, 92, 87, 3, 7, 4, 4, 95, 49, 25, 4, 18, 49, 39, 26, 1, 45, 64, 23, 66, 39, 17, 33, 24, 58, 72, 77, 46, 99, 71, 10, 21

Si spera che Bill Gates e Papadimitriou vedranno questa sfida e forniranno il loro codice, in modo che possiamo determinare se in realtà li hai superati.

Sono stati trovati 3 limiti superiori migliori, ma non è necessario preoccuparsene.


Correlato , ma non duplicato. Le risposte lì non funzionerebbero qui.
Stewie Griffin,

Ho usato BFS nella mia soluzione lì allora, dovrebbe ancora funzionare qui (con leggero aggiornamento) per trovare la soluzione con il numero minimo di lanci.
miglia

@miles quindi sentiti libero di pubblicarlo. Non ho esaminato tutte le risposte in dettaglio, ma la maggior parte ha semplicemente usato l'approccio ingenuo.
Stewie Griffin,

Risposte:


4

Python 2 (PyPy) , 238 235 222 byte

a=input();n=len(a);r=range(n);a=zip(a,r);a=map(sorted(a).index,a)+[n]
def s(u,m):
 if m<1:return[0]
 for k in r:
  v=u[k::-1]+u[k+1:]
  if sum(1<abs(v[i]-v[i+1])for i in r)<m:
   p=s(v,m-1)
   if p:return[k]+p
print s(a,5*n/3)

* (2 spazi = tab)

Provalo online!

13 byte salvati prendendo in prestito un metodo per classificare un elenco .

DFS con una semplice euristica che controlla se una vibrazione separa una coppia di "pancake" che sarebbero adiacenti se ordinati. Ordina in ordine crescente. L'output è 0-indicizzato da sinistra dove 0 lancia i primi 2 e così via. Il numero di mosse utilizzate è (5/3)*n+1 < 5/3*(n+1)dove (18/11)*n < (5/3)*n+1 < 5/3*(n+1)ed (18/11)*nè un limite superiore più stretto trovato nel 2009 .

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.