Підрахунок від 1 до цілого числа ... у двійковій


13

Вступ:

Пам’ятаю, коли я була дитиною, я дістала калькулятор і продовжувала натискати +кнопку, і побачила, як високо я можу рахувати. Зараз я люблю програмувати, і я розробляюсь для iOS.

Підрахунок - це основна навичка як для людей, так і для комп'ютерів. Без цього решта математики не обійтися. Це робиться просто, починаючи 1і повторно додаючи 1його.

Змагання:

Це лише простий виклик. Я хотів би, щоб ваша програма робила друк з 1того, що Integerвона потребує. Однак я перекину її, оскільки десятковий підрахунок є дещо нудним:

Підрахунок не може бути в базі 10, він повинен показати себе підрахунок у двійкових.

Отже, для підрахунку до 5, використовуючи 32-бітні цілі числа, це виглядатиме так:

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

Це комп’ютер. Вони найкраще знають бінарне. Вхід може бути або 32-бітним, або 64-бітним цілим числом. Це справді залежить від вас. Однак якщо ви використовуєте 32-бітні цілі числа, ваш вихід повинен бути 32-бітовими цілими числами у двійкових , а якщо ви використовуєте 64-бітні цілі числа, то ваш вихід повинен бути 64-бітовими цілими числами у двійкових .

Зразок введення:

32-бітове ціле число, 5

Вибірка зразка:

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

Оцінка:

Ваш бал дорівнює тому, скільки байтів ваш код. Оскільки це Code Golf, виграє найнижчий бал.

Бонусні бали:

Якщо ви показуєте, у висновку число, яке воно становить як базове число 10 (наприклад, 0000 0000 0000 0000 0000 0000 0000 0001у двійковій формі дорівнює базовій 10 1), помножте свій бал на 0.8.

Якщо ви згрупуєте 4 цифри результатів, як я, то помножте свою оцінку на 0.8(ще раз). Це не потрібно.

Не округляйте і не округляйте. Ваш рахунок - це число з плаваючою комою.

Удачі!


Чи потрібно ставити цифри в шматки з чотирьох розділених пробілами?
xnor

@xnor Ні. Я зробив для читабельності, але я включу бонусну можливість також.
DDPWNAGE

Що робити, якщо я використовую тип даних без обмеженого розміру (наприклад, Python 3 int)?
isaacg

@isaacg Вкажіть, чи використовує ваша програма 32 чи 64-бітні цілі числа. Вам не доведеться вміщувати ці цілі числа, які виходять за межі; Вам потрібно лише вивести те, що ви ввели. Іншими словами, вибір за вами.
DDPWNAGE

4
Що робити, якщо наш ланцюг використовує щось інше, наприклад 30-бітові цілі числа (Haskell) або цілі числа довільної точності (J)?
FUZxxl

Відповіді:


14

APL, 10 символів

Ще один в APL. Припускає ⎕IO←1(за замовчуванням). Без бонусних очок. Читає номер з пристрою введення. Якщо ваша APL використовує 64-бітні цілі числа замість 32-бітових цілих чисел, замініть 64 на 32, якщо потрібно.

Зауважте, що APL прозоро перетворюється на числа з плаваючою комою, коли діапазон цілого числа перевищений. Тому важко точно сказати, з чим працює APL цілого розміру.

⍉(32⍴2)⊤⍳⎕

пояснення

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 угрупування ха-ха
протіст

@protist Не намагайтеся отримати бонусні бали, які занадто важко реалізувати. Це майже ніколи не варте зусиль.
FUZxxl

У запитанні конкретно було задано кількість байтів, а не символів, тому оцінка повинна становити 20 байт.
ankh-morpork

@ dohaqatar7 Є кодування APL (наприклад, кодова сторінка 907 ), які вміщують весь набір символів APL в один байт. Є деякі розширення APL, які неможливо кодувати традиційними кодовими сторінками APL, але я не використовую жодне з них.
FUZxxl

7

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

32-розрядна версія, оскільки JavaScript не може обробляти 64-бітну точність (щонайбільше 53 біта, використовуючи парні точки з плаваючою комою)

Без групування

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

З групуванням - оцінка 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)}

Тест у будь-якому браузері (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 байти

VSQjd+c.[64.BN\04N

Приклад виводу:

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 Дайте іншим людям час, щоб змагатися, перш ніж приймати відповідь :)
orlp

Добре, я думав про тимчасове його прийняття, тому люди знають, що бити.
DDPWNAGE

2
@DDPWNAGE Пам'ятайте, що ви не можете легко прийняти відповідь, після того як ви прийняли відповідь і почекали кілька годин.
FUZxxl

4

Pyth, 19 * 0,8 * 0,8 = 12,16 байт

VSQjd+cjk.[032.BN4N

Приклад виводу для введення 5:

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

Демонстрація.


4

Пітон 2, 48 * 0,8 = 38,4

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

Перетворює число у двійкове, використовує форматування рядків, щоб перетворити його у двійкове з 32 цифрами, а потім також друкує десяткове число для бонусу. Використовує execцикл для збільшення з 1вхідного значення.


Приємне рішення! Я не вважаю , що це було зазначено, але це не буде працювати у великій кількості в 32-розрядному діапазоні: OverflowError: repeated string is too long. Не впевнений, чи це обмеження лише для моєї машини.
Каде



3

КДБ (Q), 50 * 0,8 * 0,8 = 32

Мені стає трохи сумно від мого подання :( Треба зробити кращий спосіб зробити це!

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

Пояснення

                                         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

Тест

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
ну ви можете потрапити в K;)k){-1{" "/:,/'$:(0N 4#0b\:x),x}@'1+!x}
протіст

3

Ліпп звичайний, 96,0

Оцінка: (* 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)))))

Приклад

Виклик функції за допомогою 10:

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

Пояснення

(format()"~39,'0b ~:*~d" #b101010101010) дає:

"000000000000000000000000000101010101010 2730"

Проміжний рядок (масив) модифікується для розміщення символу пробілу за такими нульовими показниками: 4 9 14 19 24 29 34. Потім він друкується.

Зауважте, що зовні очевидний (format t"~39,'0,' ,4:b ~:*~d" #b101010101010)формат не робить те, що ми хочемо. Він друкує:

00000000000000000000000001010 1010 1010 2730

(прокладки не згруповані по 4)



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":

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

Я можу додати ще один символ пробілу, щоб відокремити десяткові числа від двійкових чисел, але технічно ця проблема цього не потребує, я думаю? EDIT: Спасибі, CL!


1
До речі , ви можете замінити x%-4-1з x%-4-2додати простір між двійковій і десяткової без додаткових витрат байт. (Це також позбудеться зайвого місця на початку кожного рядка.)
CL

2

Октава, 23 символи

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

Приклад виводу для введення 5:

ans =
00000000000000000000000000000001
00000000000000000000000000000010
00000000000000000000000000000011
00000000000000000000000000000100
00000000000000000000000000000101

2

MatLab, 19 байт

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

Не надто багато для цього, MatLab має вбудований десятковий у двійковий перетворювач і автоматично друкує результат.


1
Це не друкує 32-бітні / 64-бітні цілі числа.
користувач0815

Вибачте, дякую за голову вгору. Я відповідно змінив код.
Robby

Ця відповідь майже повністю ідентична відповіді Октави .
Олексій А.

2

Джулія, 42 байти

Це трохи коротше без бонусів.

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

Це створює безіменну функцію, яка приймає ціле число і друкує двійкове представлення кожного числа від 1 до n , кожне ліворуч з підписаними нулями до 64 символів.


З бонусами 78 байт * 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

Це створює неназвану функцію, яка приймає ціле число і друкує двійкове представлення, як і раніше, на цей раз розділившись на групи 4 з числом в базі 10 в кінці.


2

Звичайний Лісп, оцінка: 64,0

100 байт * 0,8 * 0,8

Я дуже задоволений своєю оцінкою, але все ще відчуваю, що має бути можливість трохи спростити код.

Вихідні дані

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

Код

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

Пояснення

Як описано у відповіді coredump , рядок формату

"~32,'0B"

робить вихідні бази base2, але, здається, немає можливості отримати групування правильно. Тому я примушую рядок до списку і повторюю його, вибираючи групи з 4 рядка цього формату:

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

Після кожної групи з 4 є пробіл, а після останньої групи друкується номер базового10.

Без групування (60x0,8 => 48,0)

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

При цьому використовується ~: * для повторної обробки аргументу (одного) формату.


1

PHP, 51,84 (81 × .8 × .8)

32-розрядна версія, оскільки PHP обмежується лише 32-розрядною в Windows, незалежно від того, 64-бітна ОС.

Бере один аргумент командного рядка.

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)

32-розрядна версія з зазначених вище причин , оскільки CoffeeScript збирається в JavaScript.

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

З групуванням воно стає трохи довше: 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 байт

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

Використання:

*Main> f 5 
00000000000000000000000000000001
00000000000000000000000000000010
00000000000000000000000000000011
00000000000000000000000000000100
00000000000000000000000000000101

Для 64 - бітної, замініть 32з 64. Будь-яке інше число теж працює.


1

J, 20 байт

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

Зразок введення та виведення:

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

Швидкий: 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

Рубі, 64 біт

70 * 0,8 * 0,8 = 44,8 байт (розділений, десятковий)

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

51 * 0,8 = 40,8 байт (десятковий)

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

67 * 0,8 = 53,6 байт (розділений)

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

44 байти (без бонусів)

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

1

05AB1E , 13 11 байт

Lb32jsäð0:»

-2 байти завдяки @ Mr.Xcoder .

Виходи без роздільника пробілу, а також порядкового номера.

Спробуйте в Інтернеті.

Пояснення:

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 байт
Містер Xcoder

@ Mr.Xcoder Спасибі, повністю забув про використання препендату, jщоб він став правильною довжиною.
Кевін Кройсейсен
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.