Randall Munroes Buch "xkcd, Band 0" verwendet ein ziemlich ungerades Zahlensystem für die Seitenzahlen. Die ersten Seitenzahlen sind
1, 2, 10, 11, 12, 20, 100, 101, 102, 110, 111, 112, 120, 200, 1000, 1001, ...
Das sieht ein bisschen wie ternär aus, aber beachte, dass er von 20
direkt nach 100
, von 120
nach 200
und von 200
nach überspringt 1000
. Eine Möglichkeit , diese Sequenz zu definieren , ist zu sagen dass es alle ternären Zahlen aufzählt , die höchstens ein enthalten 2
und nicht 1
danach 2
. Sie finden dies auf OEIS in Eintrag A169683 . Dieses Zahlensystem ist als Binärverschiebung bekannt .
Ihre Aufgabe ist es, die Darstellung einer bestimmten positiven ganzen Zahl N
in diesem Zahlensystem zu finden.
Sie können ein Programm oder eine Funktion schreiben, indem Sie eine Eingabe über STDIN (oder die nächstgelegene Alternative), ein Befehlszeilenargument oder ein Funktionsargument vornehmen und das Ergebnis über STDOUT (oder die nächstgelegene Alternative), einen Funktionsrückgabewert oder einen Funktionsparameter (out) ausgeben.
Die Ausgabe kann eine Zeichenfolge, eine Zahl mit einer Dezimaldarstellung sein, die der binären Neigungsdarstellung entspricht, oder eine Liste von Ziffern (als Ganzzahlen oder Zeichen / Zeichenfolgen). Sie dürfen keine führenden Nullen zurückgeben.
Dies ist Codegolf, daher gewinnt die kürzeste Antwort (in Bytes).
Unterhaltsame Tatsache: Dieses Zahlensystem hat tatsächlich einige Vorteile. Wenn Sie eine Zahl erhöhen, ändern Sie immer höchstens zwei benachbarte Ziffern - Sie müssen die Änderung nie durch die gesamte Zahl führen. Mit der richtigen Darstellung, die das Inkrementieren in O (1) ermöglicht.
Testfälle
1 => 1
2 => 2
3 => 10
6 => 20
7 => 100
50 => 11011
100 => 110020
200 => 1100110
1000 => 111110120
10000 => 1001110001012
100000 => 1100001101010020
1000000 => 1111010000100100100
1048576 => 10000000000000000001
1000000000000000000 => 11011110000010110110101100111010011101100100000000000001102
Ich werde der kürzesten Antwort eine Prämie geben, die den letzten Testfall (und jede andere Eingabe von ähnlicher Größe, also denken Sie nicht daran, sie hart zu codieren) in weniger als einer Sekunde lösen kann.
Bestenlisten
Hier ist ein Stack-Snippet, um sowohl eine reguläre Rangliste als auch eine Übersicht der Gewinner nach Sprache zu generieren.
Um sicherzustellen, dass Ihre Antwort angezeigt wird, beginnen Sie Ihre Antwort mit einer Überschrift. Verwenden Sie dazu die folgende Markdown-Vorlage:
# Language Name, N bytes
Wo N
ist die Größe Ihres Beitrags? Wenn Sie Ihre Punktzahl verbessern, können Sie alte Punkte in der Überschrift behalten, indem Sie sie durchstreichen. Zum Beispiel:
# Ruby, <s>104</s> <s>101</s> 96 bytes
<script>site = 'meta.codegolf'; postID = 5314; isAnswer = true; QUESTION_ID = 51517</script><script src='https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js'></script><script>jQuery(function(){var u='https://api.stackexchange.com/2.2/';if(isAnswer)u+='answers/'+postID+'?order=asc&sort=creation&site='+site+'&filter=!GeEyUcJFJeRCD';else u+='questions/'+postID+'?order=asc&sort=creation&site='+site+'&filter=!GeEyUcJFJO6t)';jQuery.get(u,function(b){function d(s){return jQuery('<textarea>').html(s).text()};function r(l){return new RegExp('<pre class="snippet-code-'+l+'\\b[^>]*><code>([\\s\\S]*?)</code></pre>')};b=b.items[0].body;var j=r('js').exec(b),c=r('css').exec(b),h=r('html').exec(b);if(c!==null)jQuery('head').append(jQuery('<style>').text(d(c[1])));if (h!==null)jQuery('body').append(d(h[1]));if(j!==null)jQuery('body').append(jQuery('<script>').text(d(j[1])))})})</script>
59->60
und 109->110
mit der zusätzlichen 0 gesehen habe.