Olympische Weinschwinger üben ihre Routinen in Standardbäumen aus. Insbesondere Standard - Baum n
hat Eckpunkte für nach 0
oben durch n-1
und Kanten Verbinden jeden Nicht - Null - Scheitel a
zu dem Scheitelpunkt n % a
darunter. So sieht Standard Tree 5 beispielsweise folgendermaßen aus:
3
|
2 4
\ /
1
|
0
weil der Rest, wenn 5 durch 3 geteilt wird, 2 ist, der Rest, wenn 5 durch 2 oder durch 4 geteilt wird, 1 ist und der Rest, wenn 5 durch 1 geteilt wird, 0 ist.
In diesem Jahr wird Tarzan sein Gold mit neuen Routinen verteidigen, von denen jede am Scheitelpunkt beginnt n - 1
, zum Scheitelpunkt schwingt, zum Scheitelpunkt n - 2
weitergeht n - 3
usw., bis er schließlich zum Scheitelpunkt absteigt 0
.
Die Punktzahl für eine Routine ist die Summe der Punkte für jeden Schwung (einschließlich des Abstiegs), und die Punktzahl für einen Schwung ist die Entfernung innerhalb des Baums zwischen seinem Start- und Endpunkt. Somit hat Tarzans Routine auf Standard Tree 5 eine Punktzahl von 6:
- ein Schwung von
4
bis3
bringt drei Punkte (runter, rauf, rauf), - ein Schwung von
3
bis2
bringt einen Punkt (nach unten), - ein Schwung von
2
bis1
bringt einen Punkt (nach unten) und - Ein Abstieg von
1
bis0
bringt einen Punkt (nach unten).
Schreiben Sie ein Programm oder eine Funktion, die bei einer positiven Ganzzahl n
die Bewertung von Tarzans Routine auf Standard Tree berechnet n
. Beispiele für Ein- und Ausgänge:
1 -> 0
2 -> 1
3 -> 2
4 -> 6
5 -> 6
6 -> 12
7 -> 12
8 -> 18
9 -> 22
10 -> 32
11 -> 24
12 -> 34
13 -> 34
14 -> 36
15 -> 44
16 -> 58
17 -> 50
18 -> 64
19 -> 60
20 -> 66
21 -> 78
22 -> 88
23 -> 68
24 -> 82
Regeln und Code-Scoring sind wie beim Code-Golf üblich .
quelle
Antworten:
C
9897 BytesDies berechnet den Abstand zwischen jedem Punktepaar mit der folgenden Formel:
Dies hat den Vorteil, dass es bei Anwendung auf alle Paare dasselbe ist wie:
Um die Logik zu vereinfachen, gehen wir davon aus, dass wir von Knoten 0 zu Knoten n-1 gehen und nicht von n-1 zu 0, wie in der Frage angegeben. Der Abstand vom Wurzelknoten zum Knoten 0 ist offensichtlich 0 (sie sind gleich). Und wir können sehen, dass für (die meisten) Bäume der Abstand vom letzten Knoten zur Wurzel 2 beträgt:
Dies bedeutet, dass wir einige Sonderfälle haben (n <2), aber wir können diese leicht genug erklären.
Nervenzusammenbruch:
Danke @feersum für 1 Byte gespeichert
Bonus: Bäume!
Ich habe ein schnelles und schmutziges Programm geschrieben, um zu sehen, wie diese Bäume aussehen. Hier sind einige der Ergebnisse:
19:
quelle
Python 2, 85 Bytes
quelle
Perl,
65595554 BytesBeinhaltet +2 für
-ap
Laufen Sie mit der Baumgröße auf STDIN:
vines.pl
:Erläuterung
Wenn Sie den Baum umschreiben
zu einem, wo jeder Knoten die Menge aller seiner Vorfahren und sich selbst enthält:
Dann können wir zB für alle Knoten den Pfad von 4 nach 3 wie folgt beschreiben:
Die Anzahl der Kanten ist um eins niedriger als die Anzahl der Knoten, sodass der Verbindungspunkt ignoriert werden kann. Daher beträgt die Anzahl der Kanten auf dem Pfad von 4 bis 3 3, da:
Beachten Sie, dass dies auch für einen Pfad funktioniert, der direkt zum Ziel führt, z. B. für den Pfad von 3 bis 2 ist die Anzahl der Kanten 1, weil:
Wir können dann alle diese Kombinationen aufsummieren.
Betrachten Sie stattdessen nur einen Knoten, z. B. Knoten 2 mit gesetztem Vorfahren
{2,3}
. Dieser Knoten wird bei der Verarbeitung des Pfads einmal beitragen,2 to 1
da er eine 2, aber keine 1 enthält. Er wird nichts für den Pfad beitragen,3 to 2
da er sowohl 2 als auch 3 hat. Er wird jedoch bei der Verarbeitung des Pfads einmal beitragen,4 to 3
da er aber 3 hat nein 4. Im Allgemeinen trägt eine Zahl in der Vorfahrmenge eines Knotens eine Zahl für jeden Nachbarn bei (eine niedrigere oder eine höhere), die nicht in der Menge enthalten ist. Mit Ausnahme des maximalen Elements (in diesem Fall 4), das nur für den unteren Nachbarn 3 beiträgt, da kein Pfad vorhanden ist5 to 4
. Gleichzeitige 0 ist einseitig, aber da sich 0 immer an der Wurzel des Baums befindet und alle Zahlen enthält (es ist die ultimative Verknüpfung und wir zählen keine Verknüpfungen), gibt es keinen Beitrag von 0, so dass es am einfachsten ist, den Knoten 0 zu verlassen insgesamt aus.Wir können das Problem also auch lösen, indem wir uns den Vorfahrensatz für jeden Knoten ansehen, die Beiträge zählen und über alle Knoten summieren.
Um Nachbarn einfach zu verarbeiten, werde ich die Vorfahrensätze als eine Folge von Leerzeichen und Einsen darstellen, wobei jede 1 an Position p darstellt, dass n-1-p ein Vorfahr ist. So bedeutet zB in unserem Fall
n=5
einer 1 an Position 0, dass 4 ein Vorfahr ist. Ich werde Leerzeichen weglassen. Die tatsächliche Darstellung des Baums, den ich erstellen werde, lautet also:Beachten Sie, dass ich den Knoten 0 ausgelassen habe, der durch dargestellt wird,
"11111"
weil ich den Knoten 0 ignorieren werde (er trägt nie dazu bei).Vorfahren ohne niedrigeren Nachbarn werden jetzt durch das Ende einer Folge von Einsen dargestellt. Vorfahren ohne höheren Nachbarn werden jetzt durch den Beginn einer Folge von Einsen dargestellt. Wir sollten jedoch jeden Beginn einer Folge am Anfang einer Zeichenfolge ignorieren, da dies den
5 to 4
nicht vorhandenen Pfad darstellen würde . Diese Kombination ist genau auf den regulären Ausdruck abgestimmt/.\b/
.Das Erstellen der Vorfahrenzeichenfolgen erfolgt durch Verarbeiten aller Knoten in der Reihenfolge
n-1 .. 1
und Setzen einer 1 an der Position für den Knoten selbst und Ausführen eines "oder" in den Nachkommen.Trotzdem ist das Programm leicht zu verstehen:
Beachten Sie, dass durch Ersetzen
/.\b/
von/\b/
die Roundtrip-Version dieses Problems behoben wird, bei der auch Tarzan den Pfad nimmt0 to n-1
Einige Beispiele, wie die Vorfahrzeichenfolgen aussehen (in der angegebenen Reihenfolge
n-1 .. 1
):quelle
Mathematica,
113103102 Bytes-10 Bytes dank @feersum; -1 Byte dank @MartinEnder
Das Folgende ist viel schneller (aber leider mit 158 Bytes länger ):
quelle
With
. Auch sieht es wie jedes MalRange
verwendet wird,a
ist das Argument, so dass herausgerechnet werden.r=Range[a=#-1]
Speichert ein Byte.J, 37 Bytes
Verwendung:
Probieren Sie es hier online aus.
quelle
JavaScript (ES6),
118 bis116 ByteDas Fehlen einer eingestellten Differenzfunktion schadet wirklich, aber eine kreative Rekursion verringert die Bytezahl ein wenig. Bearbeiten: 2 Bytes durch Entfernen eines unnötigen Parameters gespeichert.
quelle