Diese Frage stammt aus diesem reddit-Thread des reddit-Benutzers taho_teg, wurde jedoch zu einem allgemeineren "Rätsel" erweitert.
Sie haben eine Zentrifuge mit 24 Löchern für die Fläschchen, die gleichmäßig in einem Kreis um die Mittelachse verteilt sind. Wenn Sie jetzt über mehrere Fläschchen verfügen und die Zentrifuge starten möchten, müssen Sie sicherstellen, dass diese ausgewogen platziert sind. Die einzige Anzahl von Fläschchen, die Sie nicht ausbalancieren können, ist 1 und 23. Sie können beispielsweise offensichtlich 4 ausbalancieren, aber Sie können auch 5 ausbalancieren, indem Sie ein 'Dreieck' mit 3 Fläschchen bilden und die beiden anderen an zwei gegenüberliegenden Stellen platzieren.
Tor
Sie müssen ein Programm schreiben, das die Anzahl der Löcher (die gleichmäßig in einem Kreis um die Drehachse verteilt sind) Ihrer Zentrifuge als Eingabe akzeptiert und eine Liste der Anzahl der Fläschchen ausgibt, die in der Zentrifuge nicht ausgewuchtet werden können.
Sie müssen die Berechnung durchführen und können die vorberechneten Lösungen nicht einfach hartcodieren.
Eingabe und Ausgabe müssen so implementiert werden, dass der Programmcode nicht geändert werden muss, um das Programm für verschiedene Eingaben aufzurufen. Es ist auch akzeptabel, eine Funktion (oder ein ähnliches Konstrukt in Ihrer Sprache) zu schreiben, die über eine Konsole aufgerufen werden kann.
Beachten Sie auch, dass Sie bei 6 Löchern in Ihrer Zentrifuge 2 und 3 Fläschchen zentrifugieren können, aber 5 nicht ausgleichen können, da sich das 'Dreieck' und die beiden gegenüberliegenden an einem Punkt überlappen. Ein anderes Beispiel wäre, dass Sie für n = 15 nicht 11 Fläschchen ausbalancieren können, Sie können 6 und 5 Fläschchen ausbalancieren, aber die Kombination dieser Lösungen wird sich überschneiden (dies ist natürlich noch nicht das Kriterium, dass dies unmöglich ist).
Aktualisieren
Es scheint, dass einige Leute das gegebene Beispiel nicht verstanden haben, also habe ich hier eine Grafik gemacht. BITTE schreiben Sie eine kurze Beschreibung der Funktionsweise Ihres Algorithmus sowie einige Beispielausgaben zur Überprüfung. Bitte geben Sie folgende Beispiele an:
n = 1, 6, 10, 24, 63, 100 = 10^2, 163 (prime), 40320 = 8!, 65536=2^2^2^2^2, 105953 (prime)
Beachten Sie, dass 40320 und 65536 große Listen erzeugen. Es ist möglicherweise eine gute Idee, nur die Länge dieser Listen anzugeben.
Wenn Sie interessante Zahlen kennen, die Sie zu dieser Liste hinzufügen können, lassen Sie es mich bitte wissen! Der Algorithmus sollte mindestens bis zu n = 1'000'000 arbeiten.
Beispielausgaben:
Dies sind einige Beispielausgaben - aber möglicherweise fehlerhaft, weil ich sie nur manuell berechnet habe.
1: 1
2: 1
3: 1,2
4: 1,3
5: 1,2,3,4
6: 1,5
7: 1,2,3,4,5,6
8: 1,3,5,7
9: 1,2,4,5,7,8
10:1,3,7,9
11:1,2,3,4,5,6,7,8,9,10
12:1,11
13:1,2,3,4,5,6,7,8,9,10,11,12
14:1,3,5,9,11,13
15:1,2,4,7,8,11,13,14
Hinweis
Wenn Sie eine Zentrifuge mit n Löchern haben und z. B. 6 Fläschchen nicht ausbalancieren können , können Sie auch nicht n-6 Fläschchen ausbalancieren . Grundsätzlich ist es die gleiche Aufgabe, m Fläschchen auf einer leeren Zentrifuge oder einer gefüllten Zentrifuge auszubalancieren durch wegnehmen von m fläschchen. Wenn Sie also die Zahl m in Ihrer Liste haben, müssen Sie auch nm einschließen .
7 spoke wheel
.Antworten:
Salbei -
102104/115Warum die Zahlentheorie anwenden, wenn es rohe Gewalt gibt?
Bei einer bestimmten Anzahl von Durchstechflaschen werden alle Möglichkeiten zum Positionieren der Durchstechflaschen durchlaufen und deren Massenmittelpunkt mithilfe komplexer Arithmetik berechnet. Wenn der Schwerpunkt für keine dieser Methoden Null ist, wird die Zahl zurückgegeben.
Leider funktioniert dies in bestimmten Fällen nicht (10,14), da Sage einige Ausdrücke nicht auf Null vereinfacht (was möglicherweise mit diesem Fehler zusammenhängt ). Man könnte dies als einen Fehler des Interpreters und nicht des Programms ansehen und trotzdem sagen, dass der Algorithmus und das Programm in Ordnung sind.
Die folgende 113-stellige Alternative basiert auf Floats anstelle von Symbolen und weist diese Probleme nicht auf:
Testausgabe der 113-stelligen Version (
for n in range(14): print n,v(n)
):Ich wollte die Laufzeit nicht auf höher warten
n
.Dies stammt aus der folgenden Python-Lösung. Genaue Arithmetik und der Verzicht auf den Import einiger Module ist schon etwas.
Python -
173 154156Testausgabe dieser Variante (
for n in range(24): print n,v(n)
):Ich wollte die Laufzeit nicht auf höher warten
n
.quelle
Lua - 197
Eine Methode ohne Brute Force, die eine Liste von Faktoren erstellt und diese ausschließt. Sie schließt auch Zahlen aus, die durch Addition dieser Faktoren erhalten werden können, solange der größte verwendete Faktor weniger als die Anzahl der nicht gefüllten Löcher ist. Einer wird immer gedruckt und wird im Algorithmus nicht verwendet.
Beispielausgabe: (einige als Bereiche setzen, damit ich die Zeichenbeschränkung nicht überschreite)
quelle
Pyth -
3937 BytesEine direkte Übersetzung von @Wrzlprmfts Python-Antwort.
Erklärung und wahrscheinlich bald weiteres Golfen.
Probieren Sie es hier online aus .
quelle