Der zweite Teil einer Reihe von Überprüfungen mysteriöser Zahlen mit Ruby! (Wie oft wird es noch weitergehen?)
Klicken Sie hier für das vorherige 1. ↓ Ich habe bei Ruby nachgefragt, ob eine Ganzzahl in einem bestimmten Bereich eine Capreca-Zahl enthält
Diesmal ist es ** Anzahl der Taxis **. Wie beim letzten Mal habe ich das Material von Youtube erhalten.
Die n-te Taxinummer (bezeichnet als Taxinummer, Ta (n) oder Taxicab (n)) ist das kleinste Positiv, das auf n Arten als Summe von ** zwei kubischen Zahlen ** dargestellt wird. Definiert als Ganzzahl von. Der Name "Anzahl der Taxis" stammt aus einer Episode, in der Shrinivasa Ramanujan darauf hinwies, dass es Ta (2) für die Steuernummer 1729 war, die Hardy nahm.
Quelle: Wikipedia
** Gesetzliche Nummer ** ist eine Nummer, die der Würfel einer bestimmten Nummer ist **. Da die quadratische Zahl quadratisch ist, handelt es sich um ein Evolutionssystem.
Und die Anzahl der Taxis scheint auf verschiedene Weise durch die Summe der gesetzgebenden Zahlen ausgedrückt zu werden (Addition)
Inhalt: Die kleinste positive ganze Zahl, die auf n Arten durch "x ^ 3 + y ^ 3" dargestellt wird (einschließlich der Ausgabe der Kombination von "x, y"). Bedingung: "(1 ≤ x ≤ y ≤ 500)"
taxi.rb
def safe_invert(orig_hash)
orig_hash.each_key.group_by { |key| orig_hash[key] }.sort.to_h
end
hash = {}
(1..500).each do |y|
(1..500).each do |x|
hash.store([x, y], x ** 3 + y ** 3)
if x == y
break
end
end
end
taxi = []
n = 1
safe_invert(hash).each do |k, v|
if v.size == n
taxi.push("Ta(#{n}) => #{k}: #{v}")
n += 1
end
end
puts taxi
Ta(1) => 2: [[1, 1]]
Ta(2) => 1729: [[9, 10], [1, 12]]
Ta(3) => 87539319: [[255, 414], [228, 423], [167, 436]]
Die Mindestzahl, die auf drei Arten als Summe der Gesetzgebungszahlen ausgedrückt werden kann, beträgt bereits 87,53 Millionen, was eine ziemlich große Zahl ist.
Ich werde Schritt für Schritt erklären Versuchen wir der Einfachheit halber, die Reichweite zu verringern
Bedingung: "(1 ≤ x ≤ y ≤ 5)"
taxu.rb
hash = {}
(1..5).each do |y|
(1..5).each do |x|
hash.store([x, y], x ** 3 + y ** 3)
end
end
p hash
{[1, 1]=>2, [2, 1]=>9, [3, 1]=>28, [4, 1]=>65, [5, 1]=>126,
[1, 2]=>9, [2, 2]=>16, [3, 2]=>35, [4, 2]=>72, [5, 2]=>133,
[1, 3]=>28, [2, 3]=>35, [3, 3]=>54, [4, 3]=>91, [5, 3]=>152,
[1, 4]=>65, [2, 4]=>72, [3, 4]=>91, [4, 4]=>128, [5, 4]=>189,
[1, 5]=>126, [2, 5]=>133, [3, 5]=>152, [4, 5]=>189, [5, 5]=>250}
Geben Sie zuerst x
und y
eine ganze Zahl von 1 bis 5.
Lassen Sie uns die Antwort (Summe) nachschlagen, die die Summe der gewürfelten Zahlen ist, und sie zu "Hash" hinzufügen.
Die store
-Methode der Hash-Klasse ist eine Methode, die ein Element mit dem Schlüssel als erstem Argument und dem Wert als zweitem Argument hinzufügt.
Es gibt 5 x 5 = 25 verschiedene Längen für "Hash".
Wie Sie der Tabelle entnehmen können, ist die Antwort, die Sie durch Vertauschen von x und y erhalten, dieselbe. Die Antwort lautet "133", sowohl wenn "(x, y) = (2, 5)" als auch wenn "(x, y) = (5, 2)". Dies zählt nicht als zwei Möglichkeiten. Es gibt einen Weg. Es ist also dieser Bereich, der in der Tabelle gefunden werden muss
Wenn also "x" und "y" gleich sind, fügen Sie "hash" und "break" ein Element hinzu, um die Schleife zu unterbrechen.
taxu.rb
hash = {}
(1..5).each do |y|
(1..5).each do |x|
hash.store([x, y], x ** 3 + y ** 3)
if x == y
break
end
end
end
p hash
{[1, 1]=>2,
[1, 2]=>9, [2, 2]=>16,
[1, 3]=>28, [2, 3]=>35, [3, 3]=>54,
[1, 4]=>65, [2, 4]=>72, [3, 4]=>91, [4, 4]=>128,
[1, 5]=>126, [2, 5]=>133, [3, 5]=>152, [4, 5]=>189, [5, 5]=>250}
Dann die zweite Hälfte Insbesondere das Innere der Methode ist kompliziert.
Im Hash enthielt der Schlüssel das Array "[x, y]" und der Wert das Element "Summe der kanonischen Zahlen". Wenn Sie die Methode "safe_invert" durchlaufen, wird ein Hash erstellt, bei dem Schlüssel und Wert unter Berücksichtigung der Duplizierung umgekehrt werden.
taxi.rb
def safe_invert(orig_hash)
orig_hash.each_key.group_by { |key| orig_hash[key] }.sort.to_h
end
p safe_invert(hash)
{2=>[[1, 1]], 9=>[[1, 2]], 16=>[[2, 2]], 28=>[[1, 3]], 35=>[[2, 3]],
54=>[[3, 3]], 65=>[[1, 4]], 72=>[[2, 4]], 91=>[[3, 4]], 126=>[[1, 5]],
128=>[[4, 4]], 133=>[[2, 5]], 152=>[[3, 5]], 189=>[[4, 5]], 250=>[[5, 5]]}
each_key.group_by { |key| orig_hash[key] }
Mit jedem Schlüssel als Wert,
Erstellen Sie einen Hash mit "orig_hash [Schlüssel]" (dh Wert) als Schlüssel.
Inversion des Schlüsselwerts.
Es ist eine schwierige Idee, aber ich habe darauf hingewiesen Hash # invert (Ruby 2.7.0 Referenzhandbuch)
Und da es in aufsteigender Reihenfolge des Schlüssels mit "sort" sortiert und gleichzeitig in ein Array konvertiert wird,
Kehren Sie mit .to_h
zum Hash zurück.
Ich denke, dass der Wert dieser Verarbeitung nicht zum Vorschein kommt, wenn "x, y" 1 bis 5 ist. Wenn Sie den Bereich von 1 bis 12 erweitern, sodass ** 1729 ** (Ta (2)) angezeigt wird, sieht das Ausgabeergebnis folgendermaßen aus ...
{ ......, 1729=>[[9, 10], [1, 12]], ......}
Sie können sehen, dass die Länge des Wertearrays jetzt zwei beträgt, und es gibt zwei Möglichkeiten, es als Summe der Gesetzgebungszahlen von 1729 auszudrücken.
taxi.rb
taxi = []
n = 1
safe_invert(hash).each do |k, v|
if v.size == n
taxi.push("Ta(#{n}) => #{k}: #{v}")
n += 1
end
end
puts taxi
Mit "jedem" für den letzten Hash Fügen Sie die erste Übereinstimmung der Wertarraylänge von 1 zum leeren Array "Taxi" hinzu Das Ergebnis ausgeben und fertig.
Das habe ich bei Wikipedia herausgefunden
Ta (4)
wird erst angezeigt, wenn der Bereich von ** 1 auf 19000 ** erweitert wurde.
Ich habe versucht, es mit (1..19000)
auszuführen,
Selbst nachdem ich einige Minuten gewartet hatte, endete der Prozess nicht und ich gab auf.
Schließlich ist Ruby möglicherweise nicht für eine umfassende Überprüfung geeignet: Schweiß:
Wenn Sie eine bessere Möglichkeit haben, es zu schreiben, lassen Sie es uns in den Kommentaren wissen!
** (Hinzugefügt am 05.07.2020) ** Sie haben in den Kommentaren eine verbesserte Version vorgeschlagen!
Recommended Posts