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.