Randall Munroe'nın kitabı "xkcd, hacim 0", sayfa numaraları için oldukça tuhaf bir sayı sistemi kullanır. İlk birkaç sayfa numarası
1, 2, 10, 11, 12, 20, 100, 101, 102, 110, 111, 112, 120, 200, 1000, 1001, ...
Bu üçlü gibi biraz görünüyor, ama gelen atlar olduğunu fark 20
düz için 100
gelen 120
için 200
ve gelen 200
etmek 1000
. Bu diziyi tanımlamanın bir yolu, en fazla bir tane içeren 2
ve 1
ondan sonra olmayan tüm üçlü sayıları saydığını söylemektir 2
. Bunu A169683 numaralı girişte OEIS'te bulabilirsiniz . Bu sayı sistemi çarpık ikili olarak bilinir .
Göreviniz N
, bu sayı sisteminde verilen bir pozitif tamsayı gösterimini bulmaktır .
STDIN (veya en yakın alternatif), komut satırı argümanı veya işlev argümanı yoluyla giriş alarak ve sonucu STDOUT (veya en yakın alternatif), fonksiyon dönüş değeri veya function (out) parametresi ile çıktı alarak bir program veya işlev yazabilirsiniz.
Çıktı, bir dize, çarpık ikili gösterime eşit bir ondalık gösterime sahip bir sayı veya bir sayılar listesi (tamsayılar veya karakterler / dizeler olarak) olabilir. Baştaki sıfırları geri döndürmemelisiniz.
Bu kod golf, yani en kısa cevap (bayt cinsinden) kazanır.
Eğlenceli gerçek: Bu sayı sistemine aslında bir miktar hak var. Bir sayıyı artırırken, her zaman en çok iki bitişik haneyi değiştirirsiniz - değişikliği hiçbir zaman tüm sayı boyunca taşımak zorunda kalmazsınız. O (1) 'de artışa izin veren doğru gösterimle.
Test Kılıfları
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
Son test vakasını (ve benzer büyüklükteki diğer girdilerin hepsini çözebilecek en kısa cevaba) bir saniyeden daha kısa sürede çözeceğim.
Liderler
Burada hem düzenli bir lider tablosu hem de kazananların dile göre bir genel bakışını oluşturmak için bir Stack Snippet'i var.
Cevabınızın göründüğünden emin olmak için, lütfen aşağıdaki Markdown şablonunu kullanarak cevabınızı bir başlık ile başlatın:
# Language Name, N bytes
Gönderinizin N
büyüklüğü nerede ? Puanınızı yükseltirseniz, başlıkları üstüne vurarak eski skorları başlıkta tutabilirsiniz. Örneğin:
# 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
ve 109->110
ekstra 0. ile