1'den Tamsayıya Sayma… İkili


13

tanıtım:

Hatırlıyorum, çocukken bir hesap makinesi alıp +düğmeye basmaya devam edecektim ve ne kadar yüksek olabileceğimi görüyorum. Şimdi programlamayı seviyorum ve iOS için geliştiriyorum.

Sayma hem insanlar hem de bilgisayarlar için temel bir beceridir. Onsuz, matematik geri kalanı yapılamaz. Sadece başlayıp 1tekrar tekrar ekleyerek 1yapılır.

Meydan okuma:

Bu basit bir zorluktur. Programınızın yapmasını istediğim şey 1, ne Integergerekiyorsa yazdırmaktır . Ancak, ondalık sayım biraz sıkıcı olduğundan, içine bir bükülme atacağım:

Sayma, taban 10'da olamaz, ikili sayımı göstermelidir.

Yani, 32-bit tamsayılar kullanarak 5'e kadar saymak şöyle olur:

0000 0000 0000 0000 0000 0000 0000 0001 ..... 1
0000 0000 0000 0000 0000 0000 0000 0010 ..... 2
0000 0000 0000 0000 0000 0000 0000 0011 ..... 3
0000 0000 0000 0000 0000 0000 0000 0100 ..... 4
0000 0000 0000 0000 0000 0000 0000 0101 ..... 5

Bu bir bilgisayar. İkili en iyi bilirler. Girişiniz 32 bit veya 64 bit tam sayı olabilir. Gerçekten size kalmış. Ancak 32 bit tamsayı kullanırsanız, çıktı gerekir 32 bitlik tamsayılar olmak ikilik sistemde ve 64 bit tamsayı kullanıyorsa, bu çıkışı olmalıdır 64 bit tamsayı ikilik sistemde .

Örnek giriş:

32 bitlik bir tam sayı, 5

Örnek çıktı:

0000 0000 0000 0000 0000 0000 0000 0001
0000 0000 0000 0000 0000 0000 0000 0010
0000 0000 0000 0000 0000 0000 0000 0011
0000 0000 0000 0000 0000 0000 0000 0100
0000 0000 0000 0000 0000 0000 0000 0101

puanlama:

Puanınız, kodunuzun bulunduğu bayt sayısına eşittir. Bu Code Golf olduğu için en düşük puan kazanır.

Bonus puanlar:

Çıktıda, taban 10 sayısı olarak (örneğin, 0000 0000 0000 0000 0000 0000 0000 0001ikili olarak taban 10'a eşittir 1) sayı gösterirseniz, puanınızı çarpın 0.8.

4 basamaklı çıktıyı benim yaptığım gibi gruplandırırsanız, puanınızı 0.8(tekrar) ile çarpın . Bu gerekli değil.

Yuvarlamayın ve yuvarlamayın. Puanınız kayan noktalı bir sayıdır.

İyi şanslar!


Rakamları boşluklarla ayrılmış dörtlü parçalara koymak zorunda mısınız?
xnor

Okunabilirlik için yaptım, ama bunun için de bir bonus fırsat ekleyeceğim.
DDPWNAGE

Sınırsız boyutta bir veri türü kullanırsam ( intörneğin Python 3'ler ) ne olur?
isaacg

@isaacg Programınızın 32 veya 64 bit tamsayı kullanıp kullanmadığını belirtin. Sınırların dışındaki bu tamsayılara uymanız gerekmez; sadece girdilerinizin çıktısını almanız gerekir. Başka bir deyişle, seçim sizin.
DDPWNAGE

4
Dilimiz 30 bit tamsayılar (Haskell) veya keyfi hassas tamsayılar (J) gibi farklı bir şey kullanıyorsa ne olur?
FUZxxl

Yanıtlar:


14

APL, 10 karakter

APL'de bir başkası. Varsayımlar ⎕IO←1(varsayılan). Bonus puanı yok. Numarayı giriş cihazından okur. APL'niz 32 bit tamsayı yerine 64 bit tamsayı kullanıyorsa, 32 yerine 64 yerine tamsayı kullanın.

Bir tamsayı aralığı aşıldığında APL'nin kayan nokta sayılarına şeffaf bir şekilde dönüştüğüne dikkat edin. Bu nedenle, APL'nin tamsayı boyutunda tam olarak ne olduğunu söylemek zor.

⍉(32⍴2)⊤⍳⎕

açıklama

2          ⍝ the number 2
32⍴2       ⍝ a vector of 32 twos.
(32⍴2)⊤X   ⍝ X represented as base 2 to 32 digits precision
⍳X         ⍝ a vector of the integers from 1 to X
⎕          ⍝ a number queried from the terminal
(32⍴2)⊤⍳⎕  ⍝ the output we want, flipped by 90°
⍉(32⍴2)⊤⍳⎕ ⍝ the output we want in correct orientation (⍉ is transpose)

4 gruplaşmayı almak için çok
uğraşmamalıyım

@protist Uygulanması çok zor olan bonus puanları almaya çalışmayın. Neredeyse hiç çaba harcamaya değmez.
FUZxxl

Soru, karakterden ziyade özellikle bir bayt sayısı istedi, bu nedenle puan 20 bayt olmalıdır.
ankh-morpork

@ dohaqatar7 APL karakter kümesinin tamamını bir bayta sığdıran APL kodlamaları ( kod sayfası 907 gibi ) vardır. Geleneksel APL kod sayfaları ile kodlanamayan bazı APL uzantıları var, ancak bunların hiçbirini kullanmıyorum.
FUZxxl

7

JavaScript ( ES6 ) 56,8 (71 * 0,8)

JavaScript 64 bit hassasiyeti işleyemediğinden 32 bit sürümü (kayan nokta iki katını kullanarak en fazla 53 bit)

Gruplama olmadan

f=n=>{for(i=0;i++<n;)console.log((8*(8<<26)+i).toString(2).slice(1),i)} 

Gruplama ile - skor 60.16 (94 * .64)

f=n=>{for(i=0;i++<n;)console.log((8*(8<<26)+i).toString(2).slice(1).match(/..../g).join` `,i)}

Herhangi bir tarayıcıda test edin (ES5)

function f(n)
{
  for(i=0;i++<n;)console.log((8*(8<<26)+i).toString(2).substr(1).match(/..../g).join(' '),i)
}

// Test
console.log = function(x,y) { O.innerHTML += x+' '+y+'\n' }
Count to: <input id=I><button onclick="O.innerHTML='';f(+I.value)">-></button>
<pre id=O></pre>


6

Pyth, 18 * 0.8 * 0.8 = 11.52 bayt

VSQjd+c.[64.BN\04N

Örnek çıktı:

0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0001 1
0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0010 2
0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0011 3
0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0100 4
0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0101 5
0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0110 6
0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0111 7
0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 1000 8
0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 1001 9
0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 1010 10

2
@DDPWNAGE Bir yanıt kabul etmeden önce diğer insanlara rekabet etmek için biraz zaman verin :)
orlp

Tamam, geçici olarak kabul etmeyi düşünüyordum, bu yüzden insanlar neyi yeneceğini biliyorlardı.
DDPWNAGE

2
@DDPWNAGE Bir yanıtı kabul edip birkaç saat bekledikten sonra bir cevabı kolayca kabul edemeyeceğinizi unutmayın.
FUZxxl

4

Pyth, 19 * 0.8 * 0.8 = 12.16 bayt

VSQjd+cjk.[032.BN4N

Giriş 5 için örnek çıktı:

0000 0000 0000 0000 0000 0000 0000 0001 1
0000 0000 0000 0000 0000 0000 0000 0010 2
0000 0000 0000 0000 0000 0000 0000 0011 3
0000 0000 0000 0000 0000 0000 0000 0100 4
0000 0000 0000 0000 0000 0000 0000 0101 5

Gösteri.


4

Python 2, 48 * 0.8 = 38.4

i=0;exec"i+=1;print format(i,'032b'),i;"*input()

Bir sayıyı ikiliye dönüştürür, 32 basamaklı ikiliye dönüştürmek için dize biçimlendirmesi kullanır ve ardından bonus için ondalık sayıyı yazdırır. Girilen değere execartırmak için bir döngü kullanır 1.


Güzel çözüm! Ben belirtildi inanmıyorum, ama bu 32 bit aralığında çok sayıda başarısız olur: OverflowError: repeated string is too long. Bu sadece benim makinede bir sınır olup olmadığını emin değilim.
Kade


4

APL, 23,68 (37 × 0,8 × 0,8)

{⎕←(⍕⍵),⍨⊃,/,/' ',⍨⍕¨8 4⍴(32⍴2)⊤⍵}¨⍳⎕

3

KDB (Q), 50 * 0.8 * 0.8 = 32

Başvurumda biraz üzgün hissediyorum :( Bunu yapmanın daha iyi bir yolu olmalı!

{-1{" "sv raze@'string(0N 4#0b vs x),x}@'1+til x;}

açıklama

                                         1+til x     / counting
   {                                  }@'            / lambda each
                      (0N 4#0b vs x),x               / convert to binary and join with input
    " "sv raze@'string                               / convert to string, concatenate each string and join with space
{-1                                             ;}   / print and surpress output in lambda

Ölçek

q){-1{" "sv raze@'string(0N 4#0b vs x),x}@'1+til x;}5
0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0001 1
0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0010 2
0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0011 3
0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0100 4
0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0101 5

2
peki K'ye düşebilirsiniz;)k){-1{" "/:,/'$:(0N 4#0b\:x),x}@'1+!x}
protist

3

Yaygın Lisp, 96.0

Puan: (* 150 .8 .8)

(lambda(y)(flet((p(n &aux(x(format()"~39,'0b ~:*~d"n)))(dolist(p'(4 9 14 19 24 29 34))(setf(aref x p)#\ ))(princ x)(terpri)))(dotimes(i y)(p(1+ i)))))

Misal

İşlevi 10 ile çağırma:

0000 0000 0000 0000 0000 0000 0000 0001 1
0000 0000 0000 0000 0000 0000 0000 0010 2
0000 0000 0000 0000 0000 0000 0000 0011 3
0000 0000 0000 0000 0000 0000 0000 0100 4
0000 0000 0000 0000 0000 0000 0000 0101 5
0000 0000 0000 0000 0000 0000 0000 0110 6
0000 0000 0000 0000 0000 0000 0000 0111 7
0000 0000 0000 0000 0000 0000 0000 1000 8
0000 0000 0000 0000 0000 0000 0000 1001 9
0000 0000 0000 0000 0000 0000 0000 1010 10

açıklama

(format()"~39,'0b ~:*~d" #b101010101010) verir:

"000000000000000000000000000101010101010 2730"

Ara dize (bir dizi) aşağıdaki sıfır temelli dizinlere bir boşluk karakteri koymak için değiştirilir: 4 9 14 19 24 29 34. Sonra yazdırılır.

Görünüşe göre basit (format t"~39,'0,' ,4:b ~:*~d" #b101010101010)formatın istediğimizi yapmadığını unutmayın. Yazdırır:

00000000000000000000000001010 1010 1010 2730

(dolgu 4'e göre gruplandırılmaz)


3

Yakut, 28 (35 * 0.8)

?1.upto(*$*){|x|puts"%.32b #{x}"%x}

3

C, 97 * 0.8 * 0.8 = 62.08

a,x;main(b){for(scanf("%u",&b);a++<b;printf("%d\n",a))for(x=32;x--;)printf("%*d",x%-4-2,a>>x&1);}

"5" girişi için örnek çıktı:

0000 0000 0000 0000 0000 0000 0000 0001 1
0000 0000 0000 0000 0000 0000 0000 0010 2
0000 0000 0000 0000 0000 0000 0000 0011 3
0000 0000 0000 0000 0000 0000 0000 0100 4
0000 0000 0000 0000 0000 0000 0000 0101 5
0000 0000 0000 0000 0000 0000 0000 0110 6
0000 0000 0000 0000 0000 0000 0000 0111 7
0000 0000 0000 0000 0000 0000 0000 1000 8
0000 0000 0000 0000 0000 0000 0000 1001 9

Ondalık sayıları ikili sayılardan ayırmak için bir boşluk karakteri daha ekleyebilirim, ancak teknik olarak sorun gerektirmez, sanırım? EDIT: Teşekkürler, CL!


1
Bu arada, fazladan bayt maliyeti olmadan ikili ve ondalık arasında boşluk eklemek için x%-4-1ile değiştirebilirsiniz x%-4-2. (Bu aynı zamanda her satırın başındaki fazladan alandan da kurtulacaktır.)
CL-

2

Oktav, 23 karakter

dec2bin(1:input(""),32)

Giriş 5 için örnek çıktı:

ans =
00000000000000000000000000000001
00000000000000000000000000000010
00000000000000000000000000000011
00000000000000000000000000000100
00000000000000000000000000000101

2

MatLab, 19 bayt

@(x)dec2bin(1:x,32)

Bu kadar çok değil, MatLab yerleşik ondalık-ikili dönüştürücü ve sonucu otomatik olarak yazdırır.


1
32 bit / 64 bit tamsayılar yazdırılmaz.
user0815

Üzgünüm, kafalar için teşekkürler. Kodu buna göre değiştirdim.
Robby

Bu cevap Octave cevabı ile neredeyse tamamen aynı .
Alex

2

Julia, 42 bayt

Bu bonuslar olmadan biraz daha kısadır.

n->for i=1:n println(lpad(bin(i),64,0))end

Bu, bir tamsayı alan ve her bir sayının ikili temsilini 1'den n'ye basan , her biri sıfırlarla 64 karaktere kadar dolgulu olarak adlandırılan adsız bir işlev oluşturur .


Bonuslarla, 78 bayt * 0.8 * 0.8 = 49.92

n->for i=1:n for j=1:4:64 print(lpad(bin(i),64,0)[j:j+3]*" ")end;println(i)end

Bu, bir tamsayı alan ve ikili gösterimi daha önce olduğu gibi bastıran adsız bir işlev oluşturur, bu kez sonunda taban 10'daki sayı ile 4'lü gruplara bölünür.


2

Common Lisp, skor: 64.0

100 bayt * 0.8 * 0.8

Puanımdan oldukça memnunum, ancak yine de kodumu biraz basitleştirme olasılığı olması gerektiğini hissediyorum.

Çıktı

0000 0000 0000 0000 0000 0000 0000 0001  1
0000 0000 0000 0000 0000 0000 0000 0010  2
0000 0000 0000 0000 0000 0000 0000 0011  3
0000 0000 0000 0000 0000 0000 0000 0100  4
0000 0000 0000 0000 0000 0000 0000 0101  5
0000 0000 0000 0000 0000 0000 0000 0110  6
0000 0000 0000 0000 0000 0000 0000 0111  7
0000 0000 0000 0000 0000 0000 0000 1000  8
0000 0000 0000 0000 0000 0000 0000 1001  9
0000 0000 0000 0000 0000 0000 0000 1010  10

kod

(defun r(n)(dotimes(i n)(format t"~{~a~a~a~a ~}~a~%"(coerce(format()"~32,'0B"(1+ i))'list)(1+ i))))

açıklama

Coredump'ın cevabında açıklandığı gibi format dizesi

"~32,'0B"

base2 sayıları çıkarır, ancak gruplandırmayı doğru bir şekilde yapma imkanı yoktur. Bu nedenle , dizeyi bir listeye zorlar ve bu biçim dizesiyle 4 kişilik gruplar seçerek yineleme yaparım :

"~ {~ a ~ a ~ a ~ a ~} ~ a ~%"

Her 4 gruptan sonra bir boşluk vardır ve son gruptan sonra base10 numarası yazdırılır.

Gruplama olmadan (60x0.8 => 48.0)

(defun r(n)(dotimes(i n)(format t"~32,'0B ~:*~a~%"(1+ i))))

Bu, (tekli) biçim bağımsız değişkenini yeniden işlemek için ~: * kullanır.


1

PHP, 51.84 (81 × .8 × .8)

32-bit sürümü, PHP'nin işletim sisteminin 64-bit olup olmadığına bakılmaksızın Windows'ta sadece 32-bit ile sınırlıdır.

Bir komut satırı argümanı alır.

for($i=0;$i++<$argv[1];)echo chunk_split(str_pad(decbin($i),32,0,0),4," ")."$i\n";

1

CoffeeScript, 60.8 (76 × .8)

CoffeeScript JavaScript'e derlendiğinden, yukarıda belirtilen nedenlerden dolayı 32 bit sürüm .

f=(x)->console.log(("0".repeat(32)+i.toString 2).slice(-32),i)for i in[1..x]

Gruplama ile biraz daha uzun hale gelir: 64.64 (101 × .8 × .8)

f=(x)->console.log(("0".repeat(32)+i.toString 2).slice(-32).match(/.{4}/g).join(" "),i)for i in[1..x]

1

Haskell, 56 bayt

f n=putStr$unlines$take n$tail$sequence$replicate 32"01"

Kullanımı:

*Main> f 5 
00000000000000000000000000000001
00000000000000000000000000000010
00000000000000000000000000000011
00000000000000000000000000000100
00000000000000000000000000000101

64bit için 32ile değiştirin 64. Diğer her sayı da işe yarar.


1

J, 20 bayt

(32#2)#:>:i.".1!:1<1

Örnek giriş ve çıkış:

3
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1

1

Hızlı: 98.56 (154 * 0.8 * 0.8)

for x in 1...Int(Process.arguments[1].toInt()!){var p=String(x,radix:2)
let q=count(p)
for i in 0..<32-q{p=(((q+i)%4==0) ?"0 ":"0")+p}
println("\(p) \(x)")}

1

Yakut, 64 bit

70 * 0.8 * 0.8 = 44.8 bayt (bölünmüş, ondalık)

1.upto(gets.to_i){|i|puts ("%064d"%i.to_s 2).scan(/.{4}/)*?\s+" #{i}"}

51 * 0.8 = 40.8 bayt (ondalık)

1.upto(gets.to_i){|i|puts "%064d"%i.to_s(2)+" #{i}"}

67 * 0.8 = 53.6 bayt (bölünmüş)

1.upto(gets.to_i){|i|puts "%064d"%i.to_s(2).scan/.{4}/}

44 bayt (bonus yok)

1.upto(gets.to_i){|i|puts "%064d"%i.to_s(2)}

1

05AB1E , 13 11 bayt

Lb32jsäð0:»

@ Mr.Xcoder sayesinde -2 bayt .

Alan sınırlayıcı veya sıra numarası olmayan çıkışlar.

Çevrimiçi deneyin.

Açıklama:

L              # List of range [1,input]
               #  i.e. 5 → [1,2,3,4,5]
 b             # Convert each to a binary string
               #  i.e. [1,2,3,4,5] → ['1','10','11','100','101']
  32j          # Join everything together with a minimum length per item of 32,
               # which basically prepends spaces to make it length 32
               #  i.e. ['1','10','11','100','101'] → '                               1                              10                              11                             100                             101'
     sä        # Split it into the input amount of parts
               #  i.e. 5 → ['                               1','                              10','                              11','                             100','                             101']
       ð0:     # Replace every space with a 0
               #  i.e. '                             101' → '00000000000000000000000000000101'
          »    # Join everything together by newlines (and output implicitly)

1
Lb32jsäð0:»11 bayt için çalışıyor
Bay Xcoder

@ Mr.Xcoder Teşekkürler, jbaşa çıkmak için kullanmayı tamamen unuttum, böylece doğru uzunluk olur.
Kevin Cruijssen
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.