Questa è una sfida con il minor numero di operazioni in cui l'obiettivo è ordinare un vettore in ordine crescente usando il minor numero di inversioni. Il tuo algoritmo può solo ordinare il vettore usando "inversioni di sotto-vettori" 1 , ma può usare altre operazioni per operazioni aritmetiche, cicli, controllare se è ordinato ecc. Il numero di inversioni di sotto-vettori eseguite dall'algoritmo è il suo punteggio.
1 Una "inversione di sotto-vettore":
- Seleziona un intervallo di numeri nel vettore e inverti gli elementi in quell'intervallo.
Per fare un semplice esempio, se inizi con il vettore {4,3,2,1}
, puoi ordinarlo in molti modi diversi:
- Invertire l'intero vettore. Questo è ovviamente l'approccio più breve in quanto richiede solo un'inversione:
{4,3,2,1} -> {1,2,3,4}
- È possibile eseguire una versione dell'ordinamento a bolle, che richiede 6 inversioni:
{4,3,2,1} -> {3,4,2,1} -> {3,2,4,1} -> {2,3,4,1} -> {2,3,1,4} -> {2,1,3,4} -> {1,2,3,4}
- Puoi iniziare con i primi 3 elementi, poi i tre ultimi e infine i due primi e i due ultimi, che richiede 4 scambi:
{4,3,2,1} -> {2,3,4,1} -> {2,1,4,3} -> {1,2,4,3} -> {1,2,3,4}
- ... e così via. Ci sono infinite opzioni disponibili (puoi ripetere qualsiasi operazione, se lo desideri).
Regole e requisiti:
Il tuo codice deve terminare in meno di un minuto per un elenco con 100 numeri. Puoi cronometrare tu stesso, ma per favore gioca bene 2 .
È necessario memorizzare gli indici di inizio e fine di tutti gli swap eseguiti, in modo che la soluzione possa essere verificata. (Spiegherò cosa significa di seguito).
Il codice deve essere deterministico.
Puoi prendere l'input in qualsiasi formato tu voglia: vettore numerico, elenco collegato, matrice con lunghezza ... qualunque cosa tu voglia.
Puoi fare quello che vuoi su una copia del vettore. Ciò include il tentativo di diverse inversioni e il controllo di quale sia la più efficiente. La forza bruta va benissimo, ma attenersi al limite di tempo.
Il punteggio è il numero totale di lanci per i 5 vettori di test. Il pareggio sarà il timbro della data.
Esempio:
4 1 23 21 49 2 7 9 2 | Elenco / vettore iniziale 4 1 2 9 7 2 49 21 23 | (2, 8) (capovolto gli elementi tra gli indici 2 e 8) 4 1 2 2 7 9 49 21 23 | (3, 5) 4 1 2 2 7 9 23 21 49 | (6, 8) 4 1 2 2 7 9 21 23 49 | (6, 7) 2 2 1 4 7 9 21 23 49 | (0, 3) 1 2 2 4 7 9 21 23 49 | (0, 2)
Il punteggio sarebbe 6, dato che hai eseguito 6 inversioni. È necessario memorizzare (non stampare) gli indici elencati sul lato destro in un formato adatto che può essere facilmente stampato / prodotto a scopo di verifica.
Vettori di prova:
133, 319, 80, 70, 194, 333, 65, 21, 345, 142, 82, 491, 92, 167, 281, 386, 48, 101, 394, 130, 111, 139, 214, 337, 180, 24, 443, 35, 376, 13, 166, 59, 452, 429, 406, 256, 133, 435, 446, 304, 350, 364, 447, 471, 236, 177, 317, 342, 294, 146, 280, 32, 135, 399, 78, 251, 467, 305, 366, 309, 162, 473, 27, 67, 305, 497, 112, 399, 103, 178, 386, 343, 33, 134, 480, 147, 466, 244, 370, 140, 227, 292, 28, 357, 156, 367, 157, 60, 214, 280, 153, 445, 301, 108, 77, 404, 496, 3, 226, 37
468, 494, 294, 42, 19, 23, 201, 47, 165, 118, 414, 371, 163, 430, 295, 333, 147, 336, 403, 490, 370, 128, 261, 91, 173, 339, 40, 54, 331, 236, 255, 33, 237, 272, 193, 91, 232, 452, 79, 435, 160, 328, 47, 179, 162, 239, 315, 73, 160, 266, 83, 451, 317, 255, 491, 70, 18, 275, 339, 298, 117, 145, 17, 178, 232, 59, 109, 271, 301, 437, 63, 103, 130, 15, 265, 281, 365, 444, 180, 257, 99, 248, 378, 158, 210, 466, 404, 263, 29, 117, 417, 357, 44, 495, 303, 428, 146, 215, 164, 99
132, 167, 361, 145, 36, 56, 343, 330, 14, 412, 345, 263, 306, 462, 101, 453, 364, 389, 432, 32, 200, 76, 268, 291, 35, 13, 448, 188, 11, 235, 184, 439, 175, 159, 360, 46, 193, 440, 334, 128, 346, 192, 263, 466, 175, 407, 340, 393, 231, 472, 122, 254, 451, 485, 257, 67, 200, 135, 132, 421, 205, 398, 251, 286, 292, 488, 480, 56, 284, 484, 157, 264, 459, 6, 289, 311, 116, 138, 92, 21, 307, 172, 352, 199, 55, 38, 427, 214, 233, 404, 330, 105, 223, 495, 334, 169, 168, 444, 268, 248
367, 334, 296, 59, 18, 193, 118, 10, 276, 180, 242, 115, 233, 40, 225, 244, 147, 439, 297, 115, 354, 248, 89, 423, 47, 458, 64, 33, 463, 142, 5, 13, 89, 282, 186, 12, 70, 289, 385, 289, 274, 136, 39, 424, 174, 186, 489, 73, 296, 39, 445, 308, 451, 384, 451, 446, 282, 419, 479, 220, 35, 419, 161, 14, 42, 321, 202, 30, 32, 162, 444, 215, 218, 102, 140, 473, 500, 480, 402, 1, 1, 79, 50, 54, 111, 189, 147, 352, 61, 460, 196, 77, 315, 304, 385, 275, 65, 145, 434, 39
311, 202, 126, 494, 321, 330, 290, 28, 400, 84, 6, 160, 432, 308, 469, 459, 80, 48, 292, 229, 191, 240, 491, 231, 286, 413, 170, 486, 59, 54, 36, 334, 135, 39, 393, 201, 127, 95, 456, 497, 429, 139, 81, 293, 359, 477, 404, 129, 129, 297, 298, 495, 424, 446, 57, 296, 10, 269, 350, 337, 39, 386, 142, 327, 22, 352, 421, 32, 171, 452, 2, 484, 337, 359, 444, 246, 174, 23, 115, 102, 427, 439, 71, 478, 89, 225, 7, 118, 453, 350, 109, 277, 338, 474, 405, 380, 256, 228, 277, 3
Sono abbastanza certo che trovare una soluzione ottimale sia NP-difficile (dal momento che lo smistamento normale del pancake è).
2 Sì, le persone con computer molto veloci potrebbero avere un vantaggio, a causa del limite di tempo di un minuto. Dopo molte discussioni ho pensato che fosse meglio se tutti facessero il proprio benchmarking, non è una sfida di codice più veloce.
n-1
flip? Posso solo provare un limite inferiore di circa 50.