Ihre Aufgabe ist ziemlich einfach, berechnen Sie das n-te Element von A190810 .
Elemente von A190810 werden nach folgenden Regeln berechnet:
- Das erste Element ist 1
- Die Reihenfolge nimmt zu
- Wenn
x
in der Sequenz vorkommt, dann2x+1
und3x-1
auch
Sie können eine 1-basierte oder eine 0-basierte Indizierung verwenden. Wenn Sie jedoch eine 0-basierte Indizierung verwenden, geben Sie dies bitte in der Antwort an.
Testfälle
a(1) = 1
a(2) = 2
a(3) = 3
a(4) = 5
a(5) = 7
a(10) = 17
a(20) = 50
a(30) = 95
a(55) = 255
Da dies Codegolf ist, gewinnt die kürzeste Antwort in Bytes!
x ϵ A → (2*x) + 1 ϵ A
undx ϵ A → (3*x)-1 ϵ A
, wobeiϵ
bedeutet "ist Mitglied von" und→
kann als "impliziert" verstanden werden.Antworten:
Gelee , 16 Bytes
Sehr ineffizient. Probieren Sie es online!
Wie es funktioniert
quelle
Python 2,
888372 BytesVielleicht möchten Sie die Programme in dieser Antwort in umgekehrter Reihenfolge lesen ...
Noch langsamer und kürzer dank Dennis:
Probieren Sie es online aus
Dies läuft nicht so schnell, ist aber kürzer ( 83 Byte ). Durch Sortieren und Entfernen von Duplikaten bei jeder Iteration sowie durch Entfernen des ersten Elements ersparen wir mir einen Index in der Liste. Das Ergebnis ist einfach das erste Element nach
n
Iterationen.Vielleicht habe ich Dennis herausgolfen. : D
Probieren Sie es online aus
Diese Version unten ( 88 Bytes ) läuft sehr schnell und findet das 500000. Element in ungefähr zwei Sekunden.
Es ist ziemlich einfach. Berechnen Sie die Elemente der Liste, bis es dreimal mehr Elemente als gibt
n
, da jedes hinzugefügte Element höchstens 2 weitere eindeutige Elemente hinzufügen kann. Entfernen Sie dann Duplikate, sortieren Sie und drucken Sie dasn
th-Element (null-indiziert)Probieren Sie es online aus
quelle
Python 2, 59 Bytes
Basierend auf der Python-Antwort von @ mbomb007 . Teste es auf Ideone .
quelle
min
ist O (n), während die Indexierung der Liste O (1) ist , so ist diese Lösung mindestens O (n²) ...Haskell,
767369 BytesVerwendet einen 0-basierten Index. Anwendungsbeispiel:
(filter t[1..]!!) 54
->255
.Anstatt die Liste durch wiederholtes Einfügen zu erstellen
2x+1
und3x-1
wie in den meisten anderen Antworten zu sehen, gehe ich alle ganzen Zahlen durch und überprüfe, ob sie1
durch wiederholtes Anwenden(x-1) / 2
oder(x+1) / 3
falls teilbar, auf reduziert werden können .quelle
f=filter t[1..]!!
) zu, weil ich das nicht für richtig halte.Haskell,
7774 BytesDies bietet eine Funktion
a
für den n-ten Eintrag. Es ist null indiziert. Alternativa=nub$f[1]
wird die ganze Liste (träge) erstellt.Es ist eine Listenvariante von Reinhard Zumkellers
Set
Code.quelle
y
stattxs
zwei Bytes zu sparen? Ich glaube auch, dass Sie in der Lage sein können, die letzte Zeile auf etwas wie(!!)$nub.f[1]
(x:xs)
, habe das komplett vergessen, danke.Python 2,
8884 BytesTeste es auf Ideone .
quelle
Pyth,
20 bis19 BytesProbieren Sie es online aus. Testsuite.
Verwendet nullbasierte Indizierung.
quelle
1
und es hat offensichtlich nicht funktioniert.Brachylog , 45 Bytes
Berechnet
N = 1000
in ca. 6 Sekunden auf meinem Computer.Dies ist 1-indiziert, z
Erläuterung
Hauptprädikat:
Prädikat 1:
Möglicherweise stellen Sie fest, dass wir beim Aufruf keine Eingabe an Prädikat 1 übergeben
y - Yield
. Aufgrund der Weitergabe von Bedingungen wird die richtige Eingabe gefunden, sobald die1.
Klausel erreicht ist, die die korrekten Eingabewerte weitergibt .quelle
MATL,
19, 1817 BytesDies ist ein äußerst ineffizienter Algorithmus. Der Online-Interpreter verfügt nicht über genügend Speicher für Eingaben über 13.
Ein Byte gespart, dank Luis Mendo!
Probieren Sie es online!
Diese Version ist länger, aber effizienter (21 Bytes)
Probieren Sie es online aus
Erläuterung:
Der logische Weg, dies zu tun, besteht darin, dem Array Elemente hinzuzufügen, bis es lang genug ist, um das i-te Element zu erfassen. So funktioniert der Effiziente. Der golferische (und ineffiziente) Weg, dies zu tun, besteht darin, die Array-Größe i- mal zu erhöhen .
Also zuerst definieren wir den Start Array:
1
. Dann tauschen wir die beiden oberen Elemente aus, sodass die Eingabe oben liegt.w
. Nun durchlaufen wir die Eingabe mit:"
. Also ich mal:Jetzt haben wir eine gigantische Reihe von Sequenzen. (Viel mehr als zur Berechnung benötigt wird) Also hören wir auf zu schleifen
]
und nehmen die i-te Zahl aus diesem Array mitG)
(1-indiziert)quelle
1`tEQy3*qvuStnG<]G)
. Die Loop-Bedingung isttnG<
(beenden, wenn das Array bereits die erforderliche Größe hat)for
bin mir nicht sicher, wie viel Betrug es ist, aber in der -loop-Version können Sie die Eingabe in unary als Zeichenfolge nehmen und die:
JavaScript (ES6), 63 Byte
Wahrscheinlich gibt es aufgrund der Rekursion schnell auf.
quelle
Retina, 57
Probieren Sie es online!
0-indiziert. Befolgen Sie den häufig verwendeten Algorithmus: Entfernen Sie den Minimalwert aus der aktuellen Menge, rufen Sie ihn auf
x
und addieren Sie2x+1
und3x-1
zur Menge eine Anzahl von Malen, die der Eingabe entsprechen. Dann ist die führende Zahl das Ergebnis. Die "Menge" in Retina ist nur eine Liste, die wiederholt sortiert und so erstellt wird, dass sie nur eindeutige Elemente enthält. Der Algorithmus für Golf enthält einige raffinierte Details, die ich später erläutern werde.Vielen Dank an Martin für die rund 20 Bytes!
quelle
Clojure,
114108 BytesEs würde mich nicht überraschen, wenn dies um einen signifikanten Betrag reduziert werden könnte, aber die Tatsache, dass dies
set
nicht unterstützt wird, schadet meinem Gedankengang wirklich.Probieren Sie das online
Version mit Leerzeichen:
quelle
05AB1E,
1817 BytesVerwendet die CP-1252- Codierung.
Erläuterung
Probieren Sie es online für kleine Zahlen
Sehr langsam.
Verwendet eine 0-basierte Indizierung.
quelle
C ++, 102 Bytes
Diese Lambda-Funktion benötigt
#include <map>
undusing std::map
.Das
map
hier ist nur eine Sammlung von Schlüsseln; ihre Werte werden ignoriert. Ich benutzemap
, um vom Kurzcode zum Einfügen zu profitieren:Dank der sortierten Reihenfolge von
map
wird das kleinste Element von extrahiertk.begin()->first
.quelle
set
und initializer Listen:[](int i){int t;set<int>k{1};for(;i--;k.erase(t))t=*k.begin(),k.insert({t*2+1,t*3-1});return t;};
.Eigentlich 27 Bytes
Probieren Sie es online!
Dieses Programm verwendet eine 0-basierte Indizierung. Der Ansatz ist sehr brachial. Erwarten Sie daher nicht, dass er im Online-Interpreter für größere Eingaben funktioniert.
Erläuterung:
quelle
CJam (25 Bytes)
Online-Demo . Beachten Sie, dass hierbei eine auf Null basierende Indizierung verwendet wird.
Dies verwendet einen ähnlichen Ansatz wie die meisten anderen: Wenden Sie die Transformationszeiten
n
an und sortieren und extrahieren Sie dann dasn
dritte Element. Aus Gründen der Effizienz wird die Deduplizierung innerhalb der Schleife und die Sortierung außerhalb der Schleife angewendet.quelle
1ari{(_2*)\3*(@||$}*0=
(Auch viel effizienter.)Netzhaut , 48 Bytes
Probieren Sie es online!
Inspiriert von Nimis Antwort dachte ich, ich würde einen anderen Ansatz für Retina ausprobieren und die Rückverfolgung der Regex-Engine nutzen, um herauszufinden, ob eine bestimmte (unäre) Nummer in der Sequenz enthalten ist oder nicht. Es stellt sich heraus, dass dies mit einem 27-Byte-regulären Ausdruck festgestellt werden kann, aber die Verwendung kostet ein paar mehr, ist jedoch immer noch kürzer als der generative Ansatz.
Hier ist eine alternative 48-Byte-Lösung:
Und mit unary I / O können wir 42 Bytes machen, aber ich versuche das zu vermeiden und die andere Retina-Antwort verwendet auch Dezimalzahlen:
quelle
Ruby, 70 Bytes
Erläuterung
quelle
*1
Trick ist ordentlichJ, 31 Bytes
Verwendet nullbasierte Indizierung. Sehr speicherineffizient.
Erläuterung
quelle
Oktave, 68 Bytes
quelle
;end
Perl,
173132 Byte +1 für -n = 133Ungolfed:
Ich kann es wahrscheinlich besser machen, wenn ich mehr darüber nachdenke, aber das ist es, worauf ich nach nur wenigen Minuten gekommen bin. Ich habe das erste Mal Golf gespielt, also hat das ziemlich Spaß gemacht!
Vielen Dank an @Dada und @ TùxCräftîñg (und ein paar kleinere Byte-Optimierungen) für -40 Byte
quelle
my
s, demreturn
und demprint
(Kann nicht testen, habe kein Perl) fallen lassenreturn
. Dasprint
kann durch a ersetzt werdensay
. Die meisten dermy
nicht benötigt werden (Sie müssen nur die eine , bevor$a
in der Funktion denke ich. Nicht initialize noch declare@b
. Sie haben wahrscheinlich die Initialisierung fallen können ,$i
wenn Sie tun ,$i++
zu Beginn der while statt am Ende.pop
Ist kürzer alsshift
Denken Sie daran , als es viel mehr zu perl - Golf ist als nur Leerzeichen und Zeilenumbrüche entfernen ....JavaScript (ES6), 58
Weniger golfen
Prüfung
Über Zeit und Speicher: Element 500000 in ~ 20 Sekunden und 300 MB, die von meinem FireFox 64-Bit-Alpha verwendet werden
quelle