Deslizamientos de tierra
En este desafío, su trabajo es predecir el alcance del daño causado por un deslizamiento de tierra masivo. Utilizamos el siguiente modelo bidimensional simplificado para ello, parametrizado por una altura inicial h >= 0 y un coeficiente crítico c > 0 . Comienzas con un acantilado de altura h, y se supone que el terreno es completamente plano infinitamente a la izquierda y a la derecha. Para h = 6, la situación se ve así:
##########
##########
##########
##########
##########
##########
-----------------------
El -son lecho de roca inamovible, y el #son suelos inestables. Si la diferencia de altura entre dos columnas vecinas es mayor que c, se produce un deslizamiento de tierra : las cunidades superiores de suelo de la columna izquierda caen a las siguientes ccolumnas a la derecha, una a cada una. La columna no vacía más a la derecha de la figura es inestable c = 2, por lo que se desencadena un deslizamiento de tierra:
#########
#########
##########
##########
##########
############
-----------------------
La columna aún es inestable, lo que causa un segundo deslizamiento de tierra:
#########
#########
#########
#########
############
############
-----------------------
Ahora, la columna a su izquierda se ha vuelto inestable, por lo que se desencadena un nuevo deslizamiento de tierra allí:
########
########
#########
###########
############
############
-----------------------
Después de esto, el acantilado es estable nuevamente. Lo bueno de este modelo es que el orden en que se procesan los deslizamientos de tierra no importa: el resultado final es el mismo.
La tarea
Su programa recibe los parámetros enteros hy ccomo entradas (el orden no importa, pero debe especificarlo en su respuesta), y debería generar el número total de columnas que afecta el deslizamiento de tierra. Esto significa el número de columnas en el acantilado estable resultante cuya altura es estrictamente entre 0y h. En el ejemplo anterior, la salida correcta es 4.
Puede escribir un programa completo o una función. El conteo de bytes más bajo gana, y las lagunas estándar no se permiten.
Casos de prueba
Estos se dan en el formato h c -> output.
0 2 -> 0
2 3 -> 0
6 2 -> 4
6 6 -> 0
10 1 -> 10
15 1 -> 14
15 2 -> 11
15 3 -> 6
40 5 -> 16
80 5 -> 28
80 10 -> 17

CJam - 70
Pruébalo en http://cjam.aditsu.net/
Explicación:
El
hoperador verifica el último valor en la pila sin eliminarlo. Si ocurrió un deslizamiento de tierra, el valor es la matriz de acantilados, que se evalúa como verdadera porque no está vacía. Si no, el último valor es 0 (falso).Entonces, en caso de deslizamiento de tierra, el bucle continúa con la matriz en la pila, de lo contrario termina con un 0 empujado después de la matriz. Ese 0 luego es eliminado de la matriz por el siguiente
-operador.fuente
Pitón,
200190174Versión ampliada:
Editar: después de un poco de optimización, eliminé la incómoda terminación del bucle a través de un descanso (guarda 1 byte). También cambió la diapositiva de rebanada a bucle.
fuente
sumde 2 bytes. Además, generalmente es mejor definir un programa completo en Python, tomando entradah,c=input()e imprimiendo el resultado al final.sumpuede ahorrarse una:sum(h>i>0for i in q).c=0guarda un byte (no puedo comentar su respuesta).Python 2 -
194158 bytes(Tenga en cuenta que el intérprete de rebajas de SE convierte las pestañas literales en 4 espacios. Las líneas 7 y 8 de este programa tienen una sola pestaña [es decir, un byte] de sangría cada una).
Toma entrada en stdin,
hprimero. Por ejemplo:Este programa ha pasado por muchas mejoras. Había estado editando esta respuesta para explicar algunas de las ediciones más importantes, pero se estaba haciendo bastante larga. Puede consultar el historial de edición si tiene curiosidad.
Explicación
Primero,
hycse leen de stdin. En Python 2,input()es equivalente aeval(raw_input()), por eso pido una coma que separe los números.input()devuelve una tupla de entradas, no se requiere conversión.A continuación, se hace una lista de enteros. Es
2*hlargo La primera mitad sonhy la segunda mitad son 0. No tengo ningún razonamiento para demostrar que esto es suficiente para simular infinitoshs a la izquierda y 0s a la derecha. Simplemente me topé con él y funciona para todos los casos de prueba, por lo que si alguien puede encontrar información, no funciona, con mucho gusto lo cambiaré. De todos modos, se llama a esta listal, pero se llama a otra copiab.bEl valor en realidad no importa, lo único que importa es que es verdad. Una lista no vacía es verdadera y la única forma en quebpuede estar vacía aquí es sihes 0, en cuyo caso todavía se imprime la respuesta correcta. En cualquier otro caso,btiene que ser sincero para garantizar que entremos en elwhile b:bucle. Sin embargo, lo primero que sucede en el bucle es establecerba 0, un valor falsey. Durante cada repetición del ciclobdebe establecerse específicamente en uno verdadero o el ciclo finalizará.El resto del bucle es la simulación real. Es muy ingenuo, esencialmente solo es una traducción de código de la descripción del problema. Si algún elemento de
les más quecmayor que el siguiente, se restacy los siguientescelementos tienen 1 agregado. (La magia bit a bit utilizada aquí es solo una forma más corta de escribiri+1+j, por cierto). Mientras realiza estas transformaciones,bse establece en 1. La primera vez que no se realicen transformaciones,bpermanecerá 0 y el bucle terminará.Cualquier expresión verdadera se evalúa como
True, y cuando intenta hacer cálculos matemáticosTruese evalúa como 1. Lo mismo es cierto paraFalsey 0. La última línea del programa usa todos los elementos delcomoeen la expresiónh>e>0y suma el resultado. Esto obtiene el número de columnas mayor que 0 pero menor que la altura del acantilado original, que es el valor que pide la pregunta. Está impreso y el programa sale.fuente
c-=cequivalente ac=0?i+1+jse puede escribir comoi-~jHaskell,
163156151 BytesUso:
h#cpor ejemplo,6#2qué salidas4.Cómo funciona: la función auxiliar
shace un solo deslizamiento de tierra. Aplicar repetidamenteshasta que la salida ya no cambie. Cuenta los elementos afectados.Encontró la función "aplicar hasta que la salida no cambia" (es decir
until=<<((==)=<<)) en Stackoverflow .fuente
fcomo infix (h#c=...) y moviendo lawherecláusula a la misma línea. Además, todavía hay algunos paréntesis para arrojar$, aunque no estoy seguro de cuántos ...()con$es prueba y error para mí.Mathematica,
1081041009795Uso:
Ejemplo:
fuente
C #
303295¡Funciona!
Pero es un ...
Debo encontrar un nuevo lenguaje;)
Comprobaré esto de CJam ...
Mejorado:
fuente
int z=i;int y=i-1;podría serint z=i,y=i-1;. Losforbucles no hacen cosas complicadas con sus índices, por ejemplo,for(int i=s.Count-1;i>0;i--)podrían serlofor(int i=s.Count;--i>0;).1<0Es una forma más corta de escribirfalse. Sospecho queif(s[s.Count-1]>0)s.Add(0);podría perder la condición sin afectar la corrección, solo la velocidad.