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 c
unidades superiores de suelo de la columna izquierda caen a las siguientes c
columnas 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 h
y c
como 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 0
y 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
h
operador 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
sum
de 2 bytes. Además, generalmente es mejor definir un programa completo en Python, tomando entradah,c=input()
e imprimiendo el resultado al final.sum
puede ahorrarse una:sum(h>i>0for i in q)
.c=0
guarda 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,
h
primero. 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,
h
yc
se 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*h
largo La primera mitad sonh
y la segunda mitad son 0. No tengo ningún razonamiento para demostrar que esto es suficiente para simular infinitosh
s 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
.b
El 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 queb
puede estar vacía aquí es sih
es 0, en cuyo caso todavía se imprime la respuesta correcta. En cualquier otro caso,b
tiene que ser sincero para garantizar que entremos en elwhile b:
bucle. Sin embargo, lo primero que sucede en el bucle es establecerb
a 0, un valor falsey. Durante cada repetición del ciclob
debe 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
l
es más quec
mayor que el siguiente, se restac
y los siguientesc
elementos 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,b
se establece en 1. La primera vez que no se realicen transformaciones,b
permanecerá 0 y el bucle terminará.Cualquier expresión verdadera se evalúa como
True
, y cuando intenta hacer cálculos matemáticosTrue
se evalúa como 1. Lo mismo es cierto paraFalse
y 0. La última línea del programa usa todos los elementos del
comoe
en la expresiónh>e>0
y 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-=c
equivalente ac=0
?i+1+j
se puede escribir comoi-~j
Haskell,
163156151 BytesUso:
h#c
por ejemplo,6#2
qué salidas4
.Cómo funciona: la función auxiliar
s
hace un solo deslizamiento de tierra. Aplicar repetidamentes
hasta 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
f
como infix (h#c=...
) y moviendo lawhere
clá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;
. Losfor
bucles 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<0
Es 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.