Подсчет от 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 Укажите, использует ли ваша программа 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 байтов.
Анк-Морпорк

@ 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

Python 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){-1{" "/:,/'$:(0N 4#0b\:x),x}@'1+!x}
протист

3

Common Lisp, 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

С, 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

Я мог бы добавить еще один символ пробела, чтобы отделить десятичные числа от двоичных чисел, но технически проблема не требует этого, я думаю? РЕДАКТИРОВАТЬ: Спасибо, 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-битные целые числа.
user0815

Извините, спасибо за внимание. Я изменил код соответственно.
Робби

Этот ответ почти полностью идентичен ответу Octave .
Алекс А.

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

Common Lisp, оценка: 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 появляется пробел, а после последней группы печатается число base10.

Без группировки (60x0,8 => 48,0)

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

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


1

PHP 51,84 (81 × 0,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 × 0,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.