Sie sollten alle bereits mit der Conway-Sequenz (auch bekannt als "Look-and-Say" -Sequenz) vertraut sein :
1
11
21
1211
111221
312211
etc
Sie können auch mit einer beliebigen Zahl als Startpunkt beginnen. Sei f(s)
das nächste Element der Sequenz. Jetzt s
können wir für jede gegebene finden f(s)
. Das Gegenteil ist nicht so trivial: Es ist nicht für jeden y
möglich, den Vorgänger s
so zu finden, dass f(s) = y
. ZB weil y = 1
wir keinen Vorgänger finden können. Aber wenn y
eine hat sogar Länge können Sie ihn in Ziffernpaare unterteilen , die jeweils einen Teil eines Vorgänger beschreiben:
513211 divides in 51,32,11
so: 51 comes from 11111
32 comes from 222
11 comes from 1
put together: 111112221
Auf diese Weise können wir für jede gerade Länge einen eindeutigen Vorgänger definieren y
.
Hinweis : Der so s
definierte 'Vorgänger' erfüllt im Allgemeinen NICHT f(s) = y
.
Tor
Schreiben Sie ein Funktions- / Programm-Snippet, das eine Ziffernfolge als Eingabe akzeptiert
- berechnet das nächste Element der Conway-Sequenz, wenn die Länge der Eingabezeichenfolge ungerade ist
- berechnet den Vorgänger der Eingabezeichenfolge wie oben definiert, wenn die Länge der Eingabezeichenfolge gerade ist .
Kürzester Code in Bytes gewinnt.
Aktuelle Fragen zu den Look-and-Say-Sequenzen:
513111
teilt sich in51
,32
und11
?11111111111111
? Nach Ihrer Spezifikation wäre es1111111
. Sie sollten Ihre Spezifikation ändern, um eine angemessene Antwort darauf zu definieren.11111111111111
einfach keinen Vorgänger. Es ist eine illegale Eingabe.Antworten:
CJam,
4645444342 BytesTeste es hier. Es nimmt die Nummer auf STDIN und gibt das Ergebnis an STDOUT aus.
quelle
si
->~
= 45Rubin,
125 120 119101 BytesZeichenketteneingabe über Funktion
f
:Mit Notizen erweitert:
quelle
Prolog - 170 Bytes
Dieser Ausschnitt definiert die Funktion
(-)/2
. Sie können es wie aufrufenIn dieser Sequenz scheint es nur eine Länge mit einer ungeraden Parität zu geben: die Initiale
[1]
.Lesbar:
quelle
Python: 139 Zeichen
einzelner Testfall
quelle
s)] if
bis entfernens)]if
.2 else
Haskell,
134 128115Wenn es von stdin / stdout sein muss, addieren Sie
main=interact l
für150 144131 Zeichen. Die Funktion wird aufgerufenl
.quelle
l "11"
zur Arbeit ging, bekam ich eine Ausnahme mitl "111"
oderl "1111111111111"
Perl - 98 Bytes
Die Größe all dieser Steueranweisungen stört mich, aber ich bin ziemlich glücklich darüber, wie die Regexes ausgearbeitet haben.
Unkomprimiert:
quelle
Erlang, 205
Die Hauptfunktion ist f, wobei die Eingabe als Erlang-Zeichenfolge und die Ausgabe als Zeichenfolge zurückgegeben wird.
Die Funktion kann um 15 Byte gekürzt werden (190), indem die Groß- und Kleinschreibung für mehr als 9 identische Zeichen weggelassen wird.
f
ruft auf,g
was den Vorgänger rekursiv berechnet, und wenn die Anzahl der Zeichen ungerade ist (gefunden am Ende der Berechnung), ruft es eine Funktion auf,i
die zusammen mith
dem nächsten Element berechnet.quelle
Haskell, 105
Ich finde es schön, dass es keine Hilfsfunktionen gibt :-).
quelle
|x:y:z<-r
- Ich wusste gar nicht, dass du das kannst. Das ist so cool!APL (45)
Ja, das ist eine gültige Funktionsdefinition, auch
∊
von außen.quelle
Java 7, Score =
252235 BytesJa, es ist wieder Java. die schlechteste Golfsprache der Welt. Dieser Ansatz verwendet Zeichenfolgen. Beliebig große Ganzzahlen werden in Java unterstützt, benötigen jedoch viel mehr Platz für die Codeeingabe.
Mit anrufen
f(intputString)
. Gibt den entsprechenden String zurück.Golf gespielt:
Golf Erweitert mit Strukturcode:
Teilweise Golf gespielt:
Komplett erweitert:
Zum Ausführen kompilieren Sie zuerst den zweiten Eintrag mit:
javac LookAndSayExpandedGolfed.java
Dann lauf mit:
java LookAndSayExpandedGolfed
Bearbeiten: Fehler behoben.
quelle
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 4 at java.lang.String.charAt(String.java:658)
--1
soll das sein--i
?513211
->11111
.Javascript (im Browser, ES5, IE8 +), 152
Kann um 4 Zeichen gekürzt werden, wenn Sie var überspringen, oder um ein paar Zeichen mehr, wenn Sie andere nicht-geordnete Zwischenglobale verwenden, aber tun wir mal so, als wären wir für eine Minute keine schlechten Programmierer.
Wenn Sie zur ES6-Kurzsyntaxfunktion mit Argument und Rückgabewert wechseln, anstatt die Eingabeaufforderung zu verwenden, können Sie mit der E / A-Warnung weitere Einsparungen erzielen.
JSFiddle hier: http://jsfiddle.net/86L1w6Lk/
quelle
var
... wir sind alle "schlechte Programmierer" hier. ;)Python 3 - 159 Bytes
quelle
Cobra - 217
(186 wenn ich davon ausgehen kann, dass eine
use
Aussage fürSystem.Text.RegularExpressions
woanders existiert)quelle
JavaScript (ES6) 85
Mit regulären Ausdrücken durch Funktion ersetzen. Unterschiedliche Ausdrücke und unterschiedliche Funktionen, abhängig davon, ob die Länge der Eingabe gerade oder ungerade ist.
quelle