Erdrutsche
In dieser Herausforderung besteht Ihre Aufgabe darin, das Ausmaß der durch einen massiven Erdrutsch verursachten Schäden vorherzusagen. Wir verwenden das folgende vereinfachte zweidimensionale Modell, das durch eine Anfangshöhe h >= 0
und einen kritischen Koeffizienten parametrisiert wird c > 0
. Sie beginnen mit einer hohen Klippe h
, und es wird angenommen, dass das Gelände links und rechts davon unendlich flach ist. Für h = 6
sieht die Situation so aus:
##########
##########
##########
##########
##########
##########
-----------------------
Das -
sind unbewegliche Grundgesteine und der #
Boden ist instabil. Beträgt der Höhenunterschied zwischen zwei benachbarten Spalten mehr als c
, kommt es zu einem Erdrutsch : Die obersten c
Bodeneinheiten der linken Spalte fallen zu den nächsten c
Spalten rechts hinunter , eine zu jeder. Die am weitesten rechts stehende nicht leere Spalte in der Abbildung ist instabil c = 2
, daher wird ein Erdrutsch ausgelöst:
#########
#########
##########
##########
##########
############
-----------------------
Die Säule ist immer noch instabil, was einen zweiten Erdrutsch verursacht:
#########
#########
#########
#########
############
############
-----------------------
Jetzt ist die linke Spalte instabil geworden, sodass dort ein neuer Erdrutsch ausgelöst wird:
########
########
#########
###########
############
############
-----------------------
Danach ist die Klippe wieder stabil. Das Schöne an diesem Modell ist, dass die Reihenfolge, in der die Erdrutsche verarbeitet werden, keine Rolle spielt: Das Endergebnis ist dasselbe.
Die Aufgabe
Ihr Programm erhält die ganzzahligen Parameter h
und c
als Eingaben (die Reihenfolge spielt keine Rolle, aber Sie müssen sie in Ihrer Antwort angeben) und es sollte die Gesamtzahl der Spalten ausgeben , die vom Erdrutsch betroffen sind. Dies bedeutet die Anzahl der Spalten in der resultierenden stabilen Klippe, deren Höhe genau zwischen 0
und liegt h
. Im obigen Beispiel ist die korrekte Ausgabe 4
.
Sie können ein vollständiges Programm oder eine Funktion schreiben. Die niedrigste Byteanzahl gewinnt, und Standardlücken sind nicht zulässig.
Testfälle
Diese sind im Format angegeben 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
Versuchen Sie es unter http://cjam.aditsu.net/
Erläuterung:
Der
h
Bediener prüft den letzten Wert auf dem Stapel, ohne ihn zu entfernen. Wenn ein Erdrutsch aufgetreten ist, ist der Wert das Cliff-Array, das als wahr ausgewertet wird, da es nicht leer ist. Wenn nicht, ist der letzte Wert 0 (falsch).Im Falle eines Erdrutschs fährt die Schleife mit dem Array auf dem Stapel fort, andernfalls endet sie mit einer 0, die hinter dem Array steht. Diese 0 wird dann vom nächsten
-
Operator aus dem Array entfernt .quelle
Python,
200190174Erweiterte Version:
Bearbeiten: Nach einigen Optimierungen habe ich die umständliche Schleifenbeendigung über break (spart 1 Byte) beseitigt. Außerdem wurde die Folie von scheibenbasiert auf schleifenbasiert geändert.
quelle
sum
für 2 Bytes nach innen setzen . Außerdem ist es normalerweise besser, ein vollständiges Programm in Python zu definieren, Eingaben mit aufzunehmenh,c=input()
und das Ergebnis am Ende auszudrucken.sum
kann sparen Sie ein:sum(h>i>0for i in q)
.c=0
Speichert ein Byte (ich kann Ihre Antwort nicht kommentieren).Python 2 -
194158 Bytes(Beachten Sie, dass der Markdown-Interpreter von SE Literal-Tabulatoren in vier Leerzeichen umwandelt. Die Zeilen 7 und 8 dieses Programms enthalten jeweils nur einen Tabulator (dh ein Byte) mit Einrückung.)
Übernimmt zuerst die Eingabe für stdin
h
. Beispielsweise:Dieses Programm hat viele Verbesserungen durchgemacht. Ich hatte diese Antwort überarbeitet, um einige der wichtigsten Änderungen zu erklären, aber es wurde ein bisschen lang. Sie können den Bearbeitungsverlauf überprüfen, wenn Sie neugierig sind.
Erläuterung
Zuerst
h
undc
werden von stdin gelesen. In Python 2input()
entsprichteval(raw_input())
, weshalb ich nach einem Komma frage, das die Zahlen trennt.input()
Gibt ein Tupel Ints zurück, ohne dass eine Konvertierung erforderlich ist.Als nächstes wird eine Liste von ganzen Zahlen erstellt. Es ist
2*h
lang Die erste Hälfte isth
und die zweite Hälfte ist 0. Ich habe keinen Grund zu zeigen, dass dies ausreicht, um unendlicheh
s links und 0s rechts zu simulieren . Ich bin nur ein bisschen hineingestolpert und es funktioniert für alle Testfälle. Wenn also jemand eine Eingabe findet, funktioniert sie nicht, dann ändere ich sie gerne. Wie auch immer, diese Liste wird aufgerufenl
, aber eine andere Kopie davon wird aufgerufenb
.b
Der Wert von ist eigentlich egal, alles was zählt ist, dass es wahr ist. Eine nicht leere Liste ist wahr und der einzige Wegb
, hier leer zu sein, ist, wennh
0 ist. In diesem Fall wird die richtige Antwort immer noch gedruckt. In jedem anderen Fallb
muss wahr sein, um sicherzustellen, dass wir in diewhile b:
Schleife eintreten . Das erste, was in der Schleife passiert, ist das Setzenb
auf 0, einen falschen Wert. Während jeder Wiederholungb
muss die Schleife gezielt auf eine Wahrheit zurückgesetzt werden, sonst endet die Schleife.Der Rest der Schleife ist die eigentliche Simulation. Es ist sehr naiv, im Wesentlichen nur eine Code-Übersetzung der Problembeschreibung. Wenn eines der Elemente von
l
mehr alsc
das folgende Element ist , wird es um subtrahiertc
und den nächstenc
Elementen wird 1 hinzugefügt. (Die hier verwendete bitweise Magie ist im Übrigen nur eine kürzere Schreibweisei+1+j
.) Wird beim Durchführen dieser Transformationenb
auf 1 gesetzt. Wenn zum ersten Mal keine Transformationen durchgeführt werden,b
bleibt der Wert 0, und die Schleife wird beendet.Jeder wahre Ausdruck wird zu 1 ausgewertet
True
, und wenn Sie versuchen, mit ihm zu rechnen, wirdTrue
er zu 1 ausgewertet. Dasselbe gilt fürFalse
und 0. Die letzte Zeile des Programms verwendet jedes Element vonl
wiee
im Ausdruckh>e>0
und summiert das Ergebnis. Dadurch wird die Anzahl der Spalten größer als 0, aber kleiner als die ursprüngliche Klippenhöhe. Dies ist der Wert, nach dem die Frage fragt. Es wird gedruckt und das Programm wird beendet.quelle
c-=c
gleichbedeutend mitc=0
?i+1+j
kann geschrieben werden alsi-~j
Haskell,
163156151 BytesVerwendung:
h#c
zB6#2
welche Ausgänge4
.So funktioniert es: Die Helferfunktion
s
macht einen einzelnen Erdrutsch. Wiederholt anwenden,s
bis sich die Ausgabe nicht mehr ändert. Zählen Sie die betroffenen Elemente.Es wurde die Funktion " Anwenden , bis sich die Ausgabe nicht ändert" (dh
until=<<((==)=<<)
) bei Stackoverflow gefunden .quelle
f
als infix (h#c=...
) definieren und diewhere
Klausel in dieselbe Zeile verschieben. Außerdem müssen noch einige Klammern verwendet werden$
, obwohl ich nicht sicher bin, wie viele ...()
durch$
ist für mich eine Spur und ein Irrtum.Mathematica,
1081041009795Verwendung:
Beispiel:
quelle
C #
303295Es klappt!
Aber es ist ein ....
Ich muss neue sprache finden;)
Ich werde diese CJam-Sache überprüfen ...
Verbessert:
quelle
int z=i;int y=i-1;
könnte seinint z=i,y=i-1;
. Diefor
Schleifen machen mit ihren Indizes keine komplizierten Dinge, sofor(int i=s.Count-1;i>0;i--)
könnte es zB seinfor(int i=s.Count;--i>0;)
.1<0
ist eine kürzere Schreibweisefalse
. Ich vermute, dasif(s[s.Count-1]>0)s.Add(0);
könnte den Zustand verlieren, ohne die Richtigkeit zu beeinträchtigen, nur die Geschwindigkeit.