Betrachten Sie den folgenden Prozess:
Nehmen Sie eine nicht negative ganze Zahl N.
zB N =
571
Drücken Sie es binär ohne führende Nullen aus. (Null selbst ist die einzige Ausnahme, immer
0
.)zB
571
=1000111011
in binärTeilen Sie aufeinanderfolgende Reihen von Einsen und Nullen in dieser binären Darstellung auf.
zB
1000111011
→1
,000
,111
,0
,11
Sortieren Sie die Läufe von der längsten zur kürzesten.
zB
1
,000
,111
,0
,11
→000
,111
,11
,1
,0
Überschreiben Sie alle Ziffern in jedem Lauf mit abwechselnden
1
und0
, immer beginnend mit1
.zB
000
,111
,11
,1
,0
→111
,000
,11
,0
,1
Verketten Sie das Ergebnis, um eine neue Binärzahl zu erhalten.
zB
111
,000
,11
,0
,1
→1110001101
=909
in dezimal
Wenn Sie die Werte zeichnen, die durch diesen Prozess erzeugt werden, erhalten Sie ein hübsches Diagramm:
Und es ist hoffentlich klar, warum ich die resultierende Sequenz als Temple Skyline-Sequenz bezeichne :
Herausforderung
Schreiben Sie ein Programm oder eine Funktion, die eine nicht negative Ganzzahl N aufnimmt und die entsprechende Temple Skyline-Sequenznummer ausgibt oder zurückgibt. Ihre Eingabe und Ausgabe sollten beide dezimal sein.
zB wenn der eingang 571
der ausgang sein soll 909
.
Der kürzeste Code in Bytes gewinnt.
Als Referenz sind hier die Ausdrücke in der Reihenfolge von N = 0 bis 20:
0 1
1 1
2 2
3 3
4 6
5 5
6 6
7 7
8 14
9 13
10 10
11 13
12 12
13 13
14 14
15 15
16 30
17 29
18 26
19 25
20 26
.BQ
anstelle von verwendenjQ2
, was bedeutet, dass Sie den Abstand zwischen dem8
und dem vorhergehenden verlieren können2
.is*R`s=!Z_ShMr.BQ8 2
ist eine interessante Lösung gleicher Länge. Meistens, weil ich nicht wirklich damit gerechnet habe, dass die Zuweisung in einem Kartenargument funktioniert.`s
durch]
. Speichert ein Byte.Python 2, 121 Bytes
125121: Danke an Sp3000 für das Abschneiden von 4 Bytes!
125
quelle
n*`~i%2`for
anstelle von"10"[i%2]*n for
sorted(...,key=len)
anstelle von verwenden,map(len,...
aber ich verstehe Ihr Programm derzeit nicht vollständig, sodass ich nicht sicher bin, dass Sie davon profitieren würden.len
weil dies die einzige Information ist, die ich brauche, um die Menge von 1 und 0 zu replizieren. Ich habe Ihren Vorschlag ausprobiert und er fügt 2 Bytes hinzu, da ich ihnlen
dann zweimal verwenden muss, aber danke für den Vorschlag!JavaScript ES6, 110 Bytes
1131161191203 Bytes gespart dank @intrepidcoder
3 Bytes dank @NinjaBearMonkey gespeichert
Unkomplizierter Ansatz. Die Länge der Sortierfunktion gefällt mir nicht, aber ich kann mir keine Möglichkeit zum Golfen vorstellen.
quelle
+
anstelle von verwendeneval
.split(/(0+)/g)
sollte es aber ersetzen könnenmatch(/(.)\1*/g)
.+(s=0, ... .map(l=>l.replace(/./g,s^=1))...)
C ++,
535527 Bytes(Danke, Zereges, für das Abschneiden einiger Bytes.)
Nachdem wir diese Bytes entfernt haben, ist das Programm nun konkurrenzfähig;)
Ich bin neu im Golfen, also gib mir bitte einige Tipps in den Kommentaren .
Dinge wie "Du brauchst diese Klammern nicht" oder "benutze printf" sind alle hilfreich, aber ich schätze auch Ratschläge zur Logik. Danke im Voraus!
Zur Erleichterung des Lesens präsentiere ich die ungolfed Version:
Die EDIT Golf Version hat ein paar Bytes verloren, die ungolfed Version ist unverändert
quelle
int a; int b;
verwendenint a,b;
. Auch Variablen im globalen Bereich werden mit initialisiert0
. Außerdem müssen Sie keine geschweiften Klammern verwenden, wenn nur ein Befehl ausgeführt werden muss. Auchones=!ones;
kann vereinfacht werdenones ^= 1;
for
Schleife um1
, dhfor(int i=D;i;i--)
und verwenden Siepow(2,i-1)
innerhalb der Schleife.ones
kann auch seinint
. Vielleicht Makroint(pow(i))
inP(i)
. Ich würde Ihnen empfehlen, die Diskussion hier zuHaskell,
132131 BytesAnwendungsbeispiel:
Wie es funktioniert:
quelle
J - 30 Bytes
Funktion, die rechts eine Ganzzahl annimmt. Behandelt 0 richtig.
#:
- Nehmen Sie die binäre Darstellung.1,2~:/\]
- Geben Sie zwischen den einzelnen Ziffern True an, wenn sie unterschiedlich sind. Stellen Sie ein True voran, damit die Liste zu Beginn jedes "Laufs" True enthält .(#;.1~...)
- Verwenden Sie den obigen booleschen Vektor, um die Länge jedes Laufs zu bestimmen.\:~
- Sortieren Sie diese Längen von der längsten zur kürzesten.2|#\
- Nehmen Sie eine Liste von abwechselnden1 0 1 0 ...
so lange wie die Liste der Längen.(...#...)
- Nehmen Sie für jede Zahl auf der linken Seite (sortierte Längen) so viele der entsprechenden Positionen auf der rechten Seite (abwechselnd Einsen und Nullen).&.
- Konvertieren Sie diese neue Binärdarstellung zurück in eine Zahl.Beispiele:
quelle
Perl 5.10,
121101Ich denke, der Sortierteil kann kürzer sein.
Edit: -20 Bytes dank Symbabque!
quelle
\n
, und dasm
ist für den Abgleich mit regulären Ausdrücken nicht erforderlich. Verwenden Sie in Ihrer Ersetzung einfach.
anstelle der Zeichengruppe.grep
Teil ist nicht erforderlich . Dasoct
ist aber ordentlich :)Python 3,
146136 Bytesquelle
map
mit einemlambda
zu tun''.join(... for ... in ...)
?Mathematica, 83 Bytes
Dies definiert eine unbenannte Funktion.
quelle
Ruby,
107104102 Bytes(3 Bytes gespart dank nimi )
Ich werde nicht die Gleichen von CJam schlagen, aber ich habe es ziemlich klein für eine vernünftige Sprache.
quelle
(i+=1)%2
isti=1-i
.Java 8,
179176 BytesIch habe zwei statische Importe verwendet:
java.util.Integer.highestOneBit
undjava.util.Arrays.sort
.Zur besseren Lesbarkeit ist hier der Code ungolfed:
quelle
Python 2, 170 Bytes
quelle
t(0) = 0
wann1
erwartet wird undt(4) = 1
wann 6 erwartet wird