Glissements de terrain
Dans ce défi, votre travail consiste à prévoir l'étendue des dommages causés par un glissement de terrain massif. Nous utilisons pour cela le modèle bidimensionnel simplifié, paramétré par une hauteur initiale h >= 0
et un coefficient critique c > 0
. Vous commencez par une falaise de hauteur h
, et on suppose que le terrain est complètement plat infiniment à gauche et à droite de celui-ci. Pour h = 6
, la situation ressemble à ceci:
##########
##########
##########
##########
##########
##########
-----------------------
Le -
substratum rocheux est inamovible et le #
sol est instable. Si la différence de hauteur entre deux colonnes voisines est supérieure à c
, un glissement de terrain se produit: les c
unités supérieures du sol de la colonne de gauche tombent dans les c
colonnes suivantes à droite, une à chacune. La colonne non vide la plus à droite de la figure est instable c = 2
, donc un glissement de terrain est déclenché:
#########
#########
##########
##########
##########
############
-----------------------
La colonne est toujours instable, ce qui provoque un deuxième glissement de terrain:
#########
#########
#########
#########
############
############
-----------------------
Maintenant, la colonne de gauche est devenue instable, donc un nouveau glissement de terrain y est déclenché:
########
########
#########
###########
############
############
-----------------------
Après cela, la falaise est de nouveau stable. La bonne chose à propos de ce modèle est que l'ordre dans lequel les glissements de terrain sont traités n'a pas d'importance: le résultat final est le même.
La tâche
Votre programme reçoit les paramètres entiers h
et c
en entrée (l'ordre n'a pas d'importance, mais vous devez le spécifier dans votre réponse), et il doit afficher le nombre total de colonnes affectées par le glissement de terrain. Cela signifie le nombre de colonnes dans la falaise stable résultante dont la hauteur est strictement comprise entre 0
et h
. Dans l'exemple ci-dessus, la sortie correcte est 4
.
Vous pouvez écrire un programme complet ou une fonction. Le nombre d'octets le plus bas l'emporte et les failles standard sont interdites.
Cas de test
Ceux-ci sont donnés dans le format 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
Essayez-le sur http://cjam.aditsu.net/
Explication:
L'
h
opérateur vérifie la dernière valeur de la pile sans la supprimer. Si un glissement de terrain s'est produit, la valeur est le tableau de falaises, qui prend la valeur true car il n'est pas vide. Sinon, la dernière valeur est 0 (faux).Donc, en cas de glissement de terrain, la boucle continue avec le tableau sur la pile, sinon elle se termine par un 0 poussé après le tableau. Ce 0 est ensuite supprimé du tableau par l'
-
opérateur suivant .la source
Python,
200190174Version étendue:
Edit: Après quelques optimisations, j'ai éliminé la terminaison de boucle maladroite via break (enregistre 1 octet). La diapositive a également été modifiée de base en tranche à base en boucle.
la source
sum
pendant 2 octets. De plus, il est généralement préférable de définir un programme complet en Python, en prenant l'entrée avech,c=input()
et en imprimant le résultat à la fin.sum
Pourrez - vous sauver un:sum(h>i>0for i in q)
.c=0
enregistre un octet (je ne peux pas commenter votre réponse).Python 2 -
194158 octets(Notez que l'interpréteur de marquage de SE convertit les tabulations littérales en 4 espaces. Les lignes 7 et 8 de ce programme n'ont qu'une seule tabulation [c'est-à-dire un octet] d'indentation chacune.)
Prend d'abord une entrée sur stdin
h
. Par exemple:Ce programme a connu de nombreuses améliorations. J'avais édité cette réponse pour expliquer certaines des modifications les plus importantes, mais cela devenait un peu long. Vous pouvez consulter l'historique des modifications si vous êtes curieux.
Explication
Tout d'abord,
h
etc
sont lus depuis stdin. En Python 2,input()
est équivalent àeval(raw_input())
, c'est pourquoi je demande une virgule séparant les nombres.input()
donne renvoie un tuple d'ints, aucune conversion requise.Ensuite, une liste d'entiers est établie. C'est
2*h
long. La première moitié esth
0 et la seconde moitié est 0. Je n'ai aucun raisonnement pour montrer que cela suffit pour simuler desh
s infinis à gauche et des 0 à droite. Je suis juste tombé dessus et cela fonctionne pour tous les cas de test, donc si quelqu'un peut trouver une entrée, cela ne fonctionne pas, je le changerai avec plaisir. Quoi qu'il en soit, cette liste est appeléel
, mais une autre copie de celle-ci est appeléeb
.b
La valeur de 's n'a pas vraiment d'importance, tout ce qui compte, c'est que c'est vrai. Une liste non vide est véridique et la seule façon d'b
être vide ici est sih
est 0, auquel cas la réponse correcte est toujours imprimée. Dans tous les autres cas,b
doit être véridique pour s'assurer que nous entrons dans lawhile b:
boucle. Cependant, la première chose qui se produit dans la boucle est la miseb
à 0, une valeur de falsey. Au cours de chaque répétition de la boucleb
doit être spécifiquement remise à un vrai ou la boucle se terminera.Le reste de la boucle est la simulation réelle. C'est très naïf, essentiellement juste une traduction de code de la description du problème. Si un élément de
l
est plus quec
supérieur à celui qui le suit, il est soustrait parc
et lesc
éléments suivants ont 1 ajouté à eux. (La magie au niveau du bit utilisée ici est juste une façon plus courte d'écrirei+1+j
, soit dit en passant.) Lors de ces transformations,b
est défini sur 1. La première fois qu'aucune transformation n'est effectuée,b
reste 0 et la boucle se termine.Toute expression vraie est évaluée à
True
, et lorsque vous essayez de faire des calculs,True
elle est évaluée à 1. Il en va de même pourFalse
et 0. La dernière ligne du programme utilise chaque élément del
ase
dans l'expressionh>e>0
et additionne le résultat. Cela obtient le nombre de colonnes supérieur à 0 mais inférieur à la hauteur de falaise d'origine, qui est la valeur demandée par la question. Il est imprimé et le programme se ferme.la source
c-=c
équivalent àc=0
?i+1+j
peut être écrit commei-~j
Haskell,
163156151 octetsUtilisation:,
h#c
par exemple,6#2
quelles sorties4
.Comment ça marche: la fonction d'aide
s
fait un seul glissement de terrain. Appliquer à plusieurs reprisess
jusqu'à ce que la sortie ne change plus. Comptez les éléments affectés.Trouvé la fonction "appliquer jusqu'à ce que la sortie ne change pas" (c'est
until=<<((==)=<<)
-à- dire ) à Stackoverflow .la source
f
comme infix (h#c=...
) et en déplaçant lawhere
clause sur la même ligne. De plus, il y a encore des parenthèses à utiliser$
, même si je ne sais pas combien ...()
par$
est une piste et une erreur pour moi.Mathematica,
108104100 1009795Usage:
Exemple:
la source
C #
303295Ça marche!
Mais c'est un ....
Je dois trouver une nouvelle langue;)
Je vais vérifier ce truc CJam ...
Amélioré:
la source
int z=i;int y=i-1;
pourrait êtreint z=i,y=i-1;
. Lesfor
boucles ne font pas de choses compliquées avec leurs indices, par exemple celafor(int i=s.Count-1;i>0;i--)
pourrait l'êtrefor(int i=s.Count;--i>0;)
.1<0
est une façon d'écrire plus courtefalse
. Je soupçonne que celaif(s[s.Count-1]>0)s.Add(0);
pourrait perdre la condition sans affecter la justesse, juste la vitesse.