Introducción
La mayoría de ustedes está familiarizado con el algoritmo de clasificación de fusión para ordenar una lista de números. Como parte del algoritmo, se escribe una función auxiliar llamada mergeque combina dos listas ordenadas en una lista ordenada. En el pseudocódigo similar a Python, la función generalmente se ve así:
function merge(A, B):
C = []
while A is not empty or B is not empty:
if A is empty:
C.append(B.pop())
else if B is empty or A[0] ≤ B[0]:
C.append(A.pop())
else:
C.append(B.pop())
return C
La idea es seguir haciendo aparecer el primer elemento más pequeño de Ay Bhasta que ambas listas estén vacías, y recopilar los resultados C. Si Ay Bestán ambos ordenados, entonces también lo está C.
Por el contrario, si Ces una lista ordenada, y dividirlo en dos subsecuencias Ay B, a continuación, Ay Btambién se ordenan y merge(A, B) == C. Curiosamente, esto no se cumple necesariamente si Cno se clasifica, lo que nos lleva a este desafío.
Entrada
Su entrada es una permutación de los primeros 2*nenteros no negativos [0, 1, 2, ..., 2*n-1]para algunos n > 0, dada como una lista C.
Salida
Su salida será un valor verdadero si existen dos listas Ay Bde longitud ntal que C == merge(A, B), y un valor falso de lo contrario. Como la entrada no contiene duplicados, no tiene que preocuparse por cómo se rompen los lazos en la mergefunción.
Reglas y bonos
Puede escribir una función o un programa completo. El conteo de bytes más bajo gana, y las lagunas estándar no se permiten.
Tenga en cuenta que no es necesario que calcule las listas Ay Ben las instancias de "sí". Sin embargo, si realmente genera las listas, recibirá una bonificación de -20% . Para reclamar este bono, debe generar solo un par de listas, no todas las posibilidades. Para hacer que este bono sea más fácil de reclamar en idiomas fuertemente tipados, está permitido generar un par de listas vacías en las instancias "no".
El forzamiento bruto no está prohibido, pero hay una bonificación de -10% para calcular los últimos cuatro casos de prueba en menos de 1 segundo en total.
Casos de prueba
Solo se da una salida posible en las instancias "yes".
[1,0] -> False
[0,1] -> [0] [1]
[3,2,1,0] -> False
[0,3,2,1] -> False
[0,1,2,3] -> [0,1] [2,3]
[1,4,0,3,2,5] -> False
[4,2,0,5,1,3] -> [4,2,0] [5,1,3]
[3,4,1,2,5,0] -> [4,1,2] [3,5,0]
[6,2,9,3,0,7,5,1,8,4] -> False
[5,7,2,9,6,8,3,4,1,0] -> False
[5,6,0,7,8,1,3,9,2,4] -> [6,0,8,1,3] [5,7,9,2,4]
[5,3,7,0,2,9,1,6,4,8] -> [5,3,7,0,2] [9,1,6,4,8]
[0,6,4,8,7,5,2,3,9,1] -> [8,7,5,2,3] [0,6,4,9,1]
[9,6,10,15,12,13,1,3,8,19,0,16,5,7,17,2,4,11,18,14] -> False
[14,8,12,0,5,4,16,9,17,7,11,1,2,10,18,19,13,15,6,3] -> False
[4,11,5,6,9,14,17,1,3,15,10,12,7,8,0,18,19,2,13,16] -> [4,17,1,3,15,10,12,7,8,0] [11,5,6,9,14,18,19,2,13,16]
[9,4,2,14,7,13,1,16,12,11,3,8,6,15,17,19,0,10,18,5] -> [9,4,2,16,12,11,3,8,6,15] [14,7,13,1,17,19,0,10,18,5]

(K[0], Q-K[0]), puede imprimir(K[0], K[-1]). Sin embargo, no sé si eso daría un ahorro.K[::len(K)-1].GolfScript (35 * 0.9 = 31.5)
La demostración en línea es bastante lenta: en mi computadora, ejecuta todas las pruebas en menos de 0.04 segundos, por lo que reclamo la reducción del 10%.
Explicación
fuente
APL,
625044 * 90% = 39,6Pruébalo aquí.
fuente