Ein Reisender muss n Tage in einem Hotel außerhalb der Stadt bleiben . Er hat kein Geld mehr und seine Kreditkarte ist abgelaufen. Aber er hat eine goldene Kette mit n Gliedern.
Die Regel in diesem Hotel ist, dass die Bewohner ihre Miete jeden Morgen bezahlen sollten. Der Reisende vereinbart mit dem Manager, dass er für jeden Tag ein Glied der goldenen Kette zahlt. Der Manager fordert aber auch, dass der Reisende die Kette so wenig wie möglich beschädigt, während er jeden Tag zahlt. Mit anderen Worten, er muss eine Lösung finden, um so wenig Glieder wie möglich zu schneiden.
Durch das Ausschneiden einer Verknüpfung werden drei Unterketten erstellt: eine, die nur die ausgeschnittene Verknüpfung enthält, und eine auf jeder Seite. Wenn Sie beispielsweise das dritte Glied einer Kette mit der Länge 8 abschneiden, werden Unterketten mit der Länge [2, 1, 5] erstellt. Der Manager nimmt gerne Änderungen vor, sodass der Reisende den ersten Tag mit der Kette der Länge 1 und den zweiten Tag mit der Kette der Länge 2 bezahlen und die erste Kette zurückerhalten kann.
Ihr Code sollte die Länge n eingeben und eine Liste der zu schneidenden Links mit minimaler Länge ausgeben.
Regeln :
- n ist eine ganze Zahl> 0.
- Sie können für die Links entweder eine 0-basierte oder eine 1-basierte Indizierung verwenden.
- Für einige Zahlen ist die Lösung nicht eindeutig. Zum Beispiel, wenn
n = 15
beide[3, 8]
und[4, 8]
gültige Ausgaben sind. - Sie können die Liste entweder zurückgeben oder mit einem geeigneten Trennzeichen drucken.
- Das ist Code-Golf , also gewinnt der kürzeste Code in Bytes.
Testfälle :
Input Output (1-indexed)
1 []
3 [1]
7 [3]
15 [3, 8]
149 [6, 17, 38, 79]
Ausführliches Beispiel
Für n = 15 führt das Schneiden der Glieder 3 und 8 zu Unterketten mit einer Länge [2, 1, 4, 1, 7]
. Dies ist eine gültige Lösung, weil:
1 = 1
2 = 2
3 = 1+2
4 = 4
5 = 1+4
6 = 2+4
7 = 7
8 = 1+7
9 = 2+7
10 = 1+2+7
11 = 4+7
12 = 1+4+7
13 = 2+4+7
14 = 1+2+4+7
15 = 1+1+2+4+7
Es gibt keine Lösung mit nur einem Schnitt, daher ist dies eine optimale Lösung.
Nachtrag
Beachten Sie, dass dieses Problem mit der Partitionierung ganzer Zahlen zusammenhängt. Wir suchen nach einer Partition P von n, so dass alle ganzen Zahlen von 1 bis n mindestens eine Partition haben, die eine Teilmenge von P ist .
Hier ist ein YouTube-Video zu einem möglichen Algorithmus für dieses Problem.
quelle
1+2
. Woher kommt die zweite 2-Gliederkette?Antworten:
05AB1E ,
23118 BytesProbieren Sie es online!
Verwendet eine 0-basierte Indizierung.
Erläuterung:
иg
Es sieht aus wie ein Noop, macht aber zwei nützliche Dinge: Es schneidet auf eine Ganzzahl ab (;
gibt einen Float zurück) und stürzt den Interpreter ab, wenn x negativ ist (dies ist die einzige Exit-Bedingung).Die 23-Byte-Lösung verwendete einen ganz anderen Ansatz, und hier ist es für die Nachwelt:
ÅœʒR2äθP}ʒæOê¥P}θ2äθη€O
( TIO , Erklärung ).quelle
Ø.Ø
. Haben Sie nur ein paar zufällige Dinge ausprobiert, um sowohl Stockwerke als auch alle Negative zuzuordnen-1
? Egal, sehr nette Antwort und viel kürzer als ich erwartet hatte. Ich habe ungefähr 20 Bytes nachgedacht, nachdem ich meine schlechten 42 Bytes gepostet habe.Ø.Ø
war eigentlich meine erste Idee. Ihr Kommentar hat mich dazu inspiriert, zufällige Dinge auszuprobieren: Ich habe festgestellt®Ÿà
,ï®M
und was noch wichtiger istиg
, dass dies ein schöner 8-Byte-Wert ist. Ich fand es immer ärgerlich, dass osabie es in vielen Fällen vorzieht, nichts zu tun, anstatt abzustürzen (dividiert durch 0, falscher Typ usw.), so dass dieser Absturz nützlich sein wird.Python 2 , 75 Bytes
Probieren Sie es online!
Erläuterung:
Bildet eine Folge von 'binären' Blöcken, wobei eine Basisnummer mit der Anzahl der Schnitte übereinstimmt.
Z.B:
63
kann in 3 Schnitten gemacht werden, was eine Partition in Basis 4 bedeutet (da wir 3 einzelne Ringe haben):Cuts:,
5, 14, 31
was Ketten von4 1 8 1 16 1 32
(sortiert :) ergibt1 1 1 4 8 16 32
.Alle Zahlen können gemacht werden:
Andere Beispiele:
quelle
f=
zum Start hinzufügen ? Da Sief
in der Lambda-Funktion einen Aufruf von verwenden, kann ich nur davon ausgehen, dass Sie sich auf dasselbe Lambda beziehen, das Sie definieren.f
ist nicht rekursiv, wird jedoch im Code referenziert und muss daher benannt werden.R ,
7769 Bytes-8 Bytes dank Aaron Hayman
Probieren Sie es online!
(Die letzte Unterkette muss möglicherweise gekürzt werden, wenn die Gesamtlänge der Kette überschritten wird.)
Ungolfed (basierend auf einer früheren, ähnlichen Version):
quelle
n=1
, aber eine alternative Möglichkeit, die Grenzwerte zu generieren, ist die Wiederholung1, 4, 4a(n-1)-4a(n-2)
.k
; dies entspricht OEIS A134401: oeis.org/A134401 Meine Implementierung der Wiederholungsrelation benötigt jedoch mehr Bytes als der aktuelle Code.sum
stattmatch
.Gelee , 12 Bytes
Probieren Sie es online!
Übersetzung 05AB1E Antwort des Grimy so sicher sein , auch , dass man upvote! Etwas enttäuscht kommt dies in einem Byte länger, hat aber zumindest etwas wie ein Emoticon als die ersten drei Bytes!
quelle
JavaScript (ES6), 66 Byte
Dies ist eine Portierung von TFelds Antwort .
Probieren Sie es online!
quelle
C ++,
109, 107 Bytes-2 Bytes dank Kevin
Der Algorithmus ähnelt der Antwort von Robin Ryder. Der Code ist in einer kompilierbaren, vollständigen Form geschrieben. Versuch es!
Einzelheiten:
Dies hat eine C- Variante mit der gleichen Bytelänge (scheint keine separate Antwort zu benötigen):
quelle
=0
Afterk
kann entfernt werden, da es0
standardmäßig ist.std::cin>>n;while(++k<<k<n);
kann seinfor(std::cin>>n;++k<<k<n;);
. Ich habe auch das Gefühl, manfor(n-=k;n>0;k*=2,n-=k+1)
kann es irgendwie vereinfachen, indem man Sachen kombiniert, aber ich weiß nicht wie. PS: Das Ändern des Komma-Trennzeichens in ein Leerzeichen sieht etwas besser aus, da Sie das nachgestellte imo nicht sehen, aber das ist rein kosmetisch :)=0
war notwendig für die Portabilität;) Ich erkannte auch, dass der Raum danach#include
nicht notwendig ist.std::cin>>n
darin enthaltene.Retina 0.8.2 , 61 Bytes
Probieren Sie es online! 1-indizierter Port von @ Grimys Antwort. Erläuterung:
Beginnen Sie mit
N=2
und konvertieren Sie die Eingabe in Unary.Versuchen Sie wiederholt,
N
von der Eingabe zu subtrahieren und dann durch 2 zu dividieren.Wenn erfolgreich, merken Sie sich 1 mehr als die Eingabe in der vorherigen Zeile, erhöhen Sie
N
die Eingabe in der aktuellen Zeile und aktualisieren Sie die Eingabe auf den neuen Wert.Entfernen Sie
N
den letzten Wert und erhöhen Sie ihn, damit er auch 1-indiziert ist.Entfernen Sie die inkrementierte Originaleingabe.
Konvertieren Sie die Ergebnisse in Dezimalzahlen.
quelle
Ruby , 62 Bytes
Probieren Sie es online!
Meistens aus TFelds Python-Antwort gestohlen.
quelle