Schreiben Sie mit einer Ganzzahl n
(wo n < 10001
) als Eingabe ein Programm, das die ersten n
Ulam-Zahlen ausgibt . Eine Ulam-Nummer ist wie folgt definiert:
- U 1 =
1
, U 2 =2
. - Denn
n > 2
U n ist die kleinste ganze Zahl, die größer ist als U n-1 , dh die Summe zweier unterschiedlicher früherer Terme auf genau eine Weise.
Zum Beispiel U 3 ist , 3
(2 + 1), U 4 ist 4
(3 + 1) ( Man beachte , daß (2 + 2) gilt nicht als die Begriffe nicht unterscheidbar sind) und U 5 ist 6
, (U 5 ist nicht mehr als 5 weil 5 entweder als 2 + 3 oder 4 + 1 dargestellt werden kann). Hier sind die ersten Ulam-Nummern:
1, 2, 3, 4, 6, 8, 11, 13, 16, 18, 26, 28, 36, 38, 47, 48, 53, 57, 62, 69, 72, 77, 82, 87, 97, 99
Dies ist Codegolf, also gewinnt der kürzeste Eintrag.
code-golf
number
number-theory
sequence
Absinth
quelle
quelle
n
wir bewältigen müssen?Antworten:
CJam,
474137 BytesProbieren Sie es online aus.
Beispiellauf
Wie es funktioniert
Diese Grundidee ist die folgende:
Beginnen Sie mit dem Array
A := [ 0 U₁ U₂ ... Uₖ ]
.Berechnen Sie
S
das Array aller Summenx + y
so, dassx,y ∊ A
undx < y
.Verwerfen Sie alle nicht eindeutigen Beträge von
S
. Da jede Ulam-Zahl größer als 2 sowohl die Summe zweier kleinerer Einsen als auch die Summe von Null und sich selbst ist, werden die Ulam-Zahlen verworfenU₃, U₄, ... Uₖ
.Das verbleibende Array ist
[ U₁ U₂ Uₖ₊₁ ... ]
, also ist die nächste Ulam-Nummer das drittkleinste Element. Hänge es anA
und gehe zurück zu Schritt 1.quelle
100
dauert bereits einige Sekunden. Ich nehme an, die Berechnung der maximalen Eingabe 1e5 würde ewig dauern.J - 46 Zeichen
Funktion
n
als Argument nehmen.Erklärt durch Explosion:
quelle
+_*
...T-SQL,
301300288287Ich habe einen leichten SQL-Missbrauch begangen.
Probieren Sie es hier in SQL Server 2008 aus .
@N enthält die ganze Zahl der Eingabe. Ändern Sie das Beispiel "100" in das, was n sein soll. "10000" wird wahrscheinlich irgendwann fertig sein, aber ich habe das nicht zu Ende laufen lassen. Die Zeichenanzahl dieses Eintrags gilt für eine einstellige Eingabe. Die Ausgabe erfolgt in Abfrageergebnisform.
quelle
Haskell,
7067 ZeichenVerwendung:
quelle
GolfScript (
4137 Bytes)Online-Demo
Die kartesischen Produkte in GolfScript sind ziemlich lang, daher wird ein anderer Ansatz gewählt. Das langfristige Wachstum der Ulam-Zahlen ist, dass die
n
th Ulam-Zahl ungefähr ist13.5n
, aber in den ersten 10000 Begriffen das größte Verhältnis zwischen dern
th Ulam-Zahl undn
ist knapp13.3
. Dahern
können wir die ersten14n
Zahlen filtern , um diejenigen zu finden, die in die Sequenz gehören.Vielen Dank an Dennis für 41-> 37.
quelle
n = 1000
dauert mit GolfScript weniger als eine Minute; Ein Port zu CJam istn = 1000
in 8 Sekunden undn = 10000
in 1 Stunde 20 Minuten fertig . - Sie können vier Bytes einsparen, indem Sie Ihren Ansatz mit meinem kombinieren, nämlich 0 in das Array aufnehmen und es anschließend verwerfen. Dies ermöglicht die Verwendung von set union anstelle des Blocks und macht eine Variable~.14*,4,\{1$.{2$1$-.@<*}%&,2=*|}/1><`
14
.14
ist geradeE
. Sie müssen jedoch aus STDIN lesen, die Ganzzahl in einen Singleton konvertieren, bevor Sie die Mengenvereinigung ausführen (ich werde einen Fehlerbericht darüber einreichen) und2$
werden in der inneren Schleife nicht funktionieren, da CJam den Stapel nach jeder Iteration ändert ... I Habe verschiedene Tricks ausprobiert, aber der kürzeste war genau 37 Bytes:li4,1$E*{__{I1$-_@<*}%&,2=I*a|}fI1><`
JavaScript ES6,
100 ... 9390 ZeichenFühren Sie dies in der Webkonsole oder im Scratchpad des neuesten Firefox (Nightly oder Release) aus.
EDIT 8 Golf viel !!! und machte es auf
94 Zeichen9390 Zeichen (dank @openorclose). (Meine erste Unter 100)Hier ist meine Version, die viel schneller ist,
aber 3 Zeichen länger (107 Zeichen)und genau so viele Zeichen enthält wie obenund viel kleiner als die unten angegebene Brute-Force-Methode !, (dank edc65):Ich werde weiterhin versuchen, weiter Golf zu spielen. Aber wir quetschen es aus dem Rahmen von JS: P
Hier sind einige Zahlen, wenn ich dies in einem Skript-Tag auf einer Webseite ausführe:
Dies ist meine erste Einreichung, die stark von der Antwort von @ rink.attendant.6 in JavaScript inspiriert ist.
Ich weiß, das kann noch weiter golfen werden. Ich werde auch eine nicht brachiale Lösung posten, die möglicherweise noch kürzer ist.
EDIT 1 : Golf ein bisschen mehr und für n = 1 behoben
Ich muss sagen, ich beneide Haskell und J um solch super nützliche Verknüpfungen für jede Art von Anforderung -_-
quelle
u=n=>{for(s=[,1,1],r=[i=1,l=2];c=l<n;!c?s[r[l++]=i]=1:0,i++)for(j of r)c-=j<i/2&s[i-j];return n>1?r:[1]}
und vielleicht noch mehrreturn
. 100:u=n=>(s=>{for(r=[i=1,l=2];c=l<n;i+=!c?s[r[l++]=i]=1:1)for(j of r)c-=j<i/2&s[i-j]})([,1,1])|n>1?r:[1]
u=n=>(s=>{for(r=[i=l=1];c=l<n;i+=c&&i-2?1:s[r[l++]=i]=1)for(j of r)c-=j<i/2&s[i-j]})([,1])||r
u=n=>(s=>{for(r=[i=l=1];c=l<n;i+=c&&i-2?1:s[r[l++]=i]=1)r.map(j=>c-=j<i/2&s[i-j])})([])||r
Sofern das [, 1] nicht irgendwo benötigt wirdPerl - 71 Bytes
Probieren Sie es online!
Zähle den Shebang als einen.
Die Verwendung eines zweiten Arrays zum Speichern der Summen scheint bedeutend schneller zu sein als ein Hash. Die Speichernutzung ist auch geringer, was ich nicht erwartet hätte.
Beispielnutzung:
Beispielausgabe:
Ungefähre Laufzeiten:
quelle
n == 1e4
. Tolle! Die Ausgabe fürn == 1
ist jedoch falsch. es sollte eine einzelne Zahl drucken.Java, 259
Brute Force funktioniert gut dafür.
quelle
1
sollte eine einzelne Zahl sein.APL (Dyalog ausgefahren) ,
3635 Bytes-1 Byte von Adám
Probieren Sie es online!
Wenn wir die Additionstabelle erstellen, sind diagonale Elemente doppelt so groß wie die Einträge in ⍵. Nichtdiagonale Elemente sind jeweils Summen verschiedener Elementex zweimal für jeden Weg auftreten x kann als Summe verschiedener Elemente geschrieben werden. Daher jede Nummerx tritt ein 2a+b times, where a is the number of ways x can be written as a sum of distinct elements from ⍵, and b is 1 iff x is twice some entry in ⍵. We want ein=1 Es reicht also aus, dies zu überprüfen 2 a + b ∈ { 2 , 3 } .
* (In ngn / APL kann eine Konstante einen Zug ohne Verwendung
⍨
beenden. In ngn / APL ist jedoch kein Count-In vorhanden, daher benötigen wir so irgendwo.)quelle
{(2 3∊⍨⍵⍧⍵)/⍵}
→(∊⊢⊆⍨⍧⍨∊2 3⍨)
PHP 5.4+, 164
Gleicher Ansatz wie meine Antworten:
quelle
Gelee , 20 Bytes
Probieren Sie es online!
quelle
CoffeeScript,
119114In letzter Zeit habe ich CoffeeScript geübt, um das Golfspiel mit JavaScript zu verbessern. Deshalb ist hier meine in CoffeeScript kompilierte JavaScript-Antwort:
Ich verstehe die Loops und das Verständnis in CoffeeScript nicht sehr gut, so dass ich vielleicht weiter Golf spielen kann, aber es ist das, was ich jetzt habe. Zeilenumbrüche werden als ein Zeichen gezählt (Unix-Stil).
quelle
JavaScript,
147154150 (136)Stark inspiriert von der Brute-Force-Java-Lösung von @ Ypnypn:
Vielen Dank für @Dennis, dass Sie 4 bis 18 Bytes von meiner ursprünglichen Version entfernt haben
Gefährliche Version (mit
for..in
Schleifen)Ich würde es nicht empfehlen, dies auszuführen, da das Durchlaufen eines Objekts, das eine Schleife verwendet, dazu führen kann, dass Ihr Computer in Flammen aufgeht und / oder sich in einen wütenden Mörder verwandelt. Aber hier ist es:
instanceof
Array
for..in
Ungolfed
quelle
z=0
innerhalb der Schleife bewegen , brauchen Sie sie nur einmal. 2.for(j in l)for(k in l)z+=l[j]<l[k]&l[j]+l[k]==i;
ist viel kürzer als derl.forEach
Ansatz.Mathematica,
10791 BytesEs ist eine sehr direkte Implementierung der Spezifikation.
Ich wende auch Dennis 'Trick an, Summen mit einzubeziehen
0
, aber der Haken ist, dass dies das dritte Element der Liste macht,0
bevor ich wie erwartet fortfahre, also muss ich dieses Element aus der Liste entfernen.Es verarbeitet eine Eingabe von
1000
in ein paar Sekunden, aber ich bezweifle, dass Sie in angemessener Zeit ein Ergebnis für 10k erhalten werden. Aber ich denke auch, dass keiner der anderen darin gute Leistungen erbringt.quelle
OCaml - 254 Zeichen
Der Code verwendet eine Hash-Tabelle, um die Summe der aktuellen Elemente der Liste zu speichern und sie jedes Mal zu aktualisieren, wenn ein neues Element berechnet wird.
Verwendung:
Im OCaml-Interpreter:
Ungolfed
quelle
Python,
137128126 Zeichen.Dies ist mein erstes Golfspiel, und ich habe es von ~ 250 Zeichen reduziert. Ich bin ziemlich glücklich, würde aber gerne Vorschläge zur Verbesserung machen!
quelle
for b in U:t[a+b]+=a!=b
und die Linien 8 & 9 biswhile t[i]-2:i+=1
for
U,i=[1,2],2
aufU,i=[1],2
undinput()-2
nachinput()-1
undt=_*3*i
nach wechseln und am Ende von fort=_*3*i;U+=[i]
;U+=[i]
C #, 257
Brute-Force-Ansatz unter Verwendung von LINQ:
Ungolfed, mit Testgeschirr
quelle
Pyth,
2725 BytesProbieren Sie es hier online aus .
Bearbeiten: 2 Bytes durch Summieren vor dem Gruppieren golfen. Vorherige Version:
<uaGh-mssdfq1lT.gsk.cG2GQS2
quelle
C 478 Bytes
In Tio würde es nun in 9 Sekunden 10000 Werte finden (und dort die ersten 100 Werte ausgeben). Der Trick ist, nicht die lineare Suche in der inneren Schleife zu verwenden, sondern die binäre Suche ... Die folgenden Funktionen sind gut eingerückt und vollständig lesbar (endlich für mich):
quelle
APL (NARS), 278 Zeichen, 556 Byte
Es wäre die Übersetzung in APL von C, die ich gesendet habe. Es scheint, ich verstehe nicht, wann ich ∇∇ anstelle von ∇ verwenden soll ... möglich ∇∇ wird verwendet, wenn es ein Argument gibt, bei dem es sich um eine Funktion handelt (und nicht um einen anderen Typ). "u bs x, a, b" sollte die Bin-Suche im "u" -Array nach dem Wert "x" im Bereich a..b sein; es würde 1, indexWhereFind oder 0, indexWhereEndOfsearch zurückgeben. Mit Argument 200 p Funktion + - hier eine Minute ...
quelle
∇∇
in einem dop bezieht sich auf den Operator selbst, während∇
sich auf die abgeleitete Funktion bezieht, die aus dem Operator mit seinen Operanden besteht. In einem monadischen Operator∇
ist es also dasselbe wie(⍺⍺∇∇)
in einem dyadischen Operator(⍺⍺∇∇⍵⍵)
.