Фон :
Вам было дано задание преобразовать числа 10 из базы в базу 2 без использования каких-либо готовых функций преобразования базы. Вы также не можете использовать любые импортированные библиотеки.
Проблема :
Преобразуйте входную строку из базы 10 (десятичная) в базу 2 (двоичная). Вы не можете использовать какой-либо готовый базовый код преобразования / функции / методы или импортированные библиотеки. Поскольку это код-гольф , победит самый короткий ответ в байтах.
Входные данные будут от -32768 до 32767 (включая обработку байтов знака в вашем коде)
the MSB of signed variables controls if they are negative
- это звучит как знак бита, однако, как-32768..32767
предполагает диапазон , вам нужно 2 дополнения. Итак, что вы хотите? ..Ответы:
GolfScript - 17 байт
Не слишком многословный, чем встроенный
~2base
.источник
~
"37"
, например, строка , операция"37" & 1
(в инфиксах) - это операция установки.~
На фронте преобразует входные данные в целое число.10
в стек, нет необходимости оценивать его. Тем не менее, при чтении изstdin
входных данных будет строка ( тест здесь ). В описании проблемы также явно указывается, что ввод является строкой.JavaScript, 46
источник
>>>=
)! +1 (также, если вы запустите его в консоли, вы можете сохранить последние 9 символов.)x=8; x>>>=1; x;
иx=8; x>>>1; x;
- в первом случае значение x изменилось; во втором - нет.>>>=
- единственный оператор .Brainf * ck,
9877Очевидно, что это не для того, чтобы выиграть, но что было бы для конкуренции, если бы у нее не было мозгового решения
Так как brainfk может работать только с 8-битными целыми числами и без негативов, я думаю, что он не полностью соответствует правилам, но эй, я никогда не был в нем, чтобы выиграть его.
Это действительно работает для 16-битного ввода, если ваш интерпретатор поддерживает
Я даже получил его для вывода в значениях ASCII
Вот аннотированный код:
Более короткий алгоритм (77):
Этот может обрабатывать только 8-битные целые числа.
Алгоритм работает с использованием двоичного счетчика, который на самом деле очень короткий (один шаг,
>[->]++[-<+]-<-
который затем раскладывает биты. Проблема в том, что сложно распечатать все битыЭтот последний алгоритм может быть адаптирован к любому количеству битов за счет байтов. Чтобы иметь возможность иметь дело с N битными целыми числами, требуется 53 + 3 * N байтов для кодирования.
Примеры:
источник
Обязательный ответ APL - 21
22Примеры:
источник
⎕IO←0
, и возвращает массив битов вместо строки:2|⌊⎕÷2*⊖⍳16
.Машинный код Тьюринга, 272 байта
Как обычно, я использую синтаксис таблицы правил, определенный здесь. Вы можете протестировать его на этом сайте или, альтернативно, использовать эту реализацию Java.
Большая часть кода скопирована из моего десятичного в шестнадцатеричный конвертер здесь.
Обратный отсчет от входа в базе 10 при увеличении от 0 в базе 2. При уменьшении нуля он стирает блок ввода и завершается.
источник
Javascript 59
источник
+x
вместоparseInt(x)
Perl, 44
Это моя первая программа на Perl, так что, пожалуйста, прости меня, если это можно легко продолжить. Редактировать: Спасибо @primo за то, что убрали 7 символов из моего ответа.
Логика по сути та же, что и в моем предыдущем C-решении.
Также использует 64 бита.
источник
reverse
путем построения массива в обратном направлении:@s=($x&1,@s)
.$\=$_%2 .$\while$_=$_>>1||<>;print
. Или, если параметры командной строки учитывают один байт каждый, 27:1while$\=$_%2 .$\,$_>>=1}{
использование-p
.Javascript -
5648 и3628 символовСпасибо @Blender за бритье 8 символов.
Эта форма принимает ввод и показывает вывод, 48 символов:
Если нужна просто инструкция, которая вставляет переменную
a
в двоичную форму переменнойx
(и вы не потрудитесь уничтожитьx
значение как побочный эффект), то здесь это с 28 символами:источник
Math.floor
на~~
, так как диапазон для чисел мал.a=x%2+a
можно ли сократить это доa+=x%2
? Это работает на всех языках, которые я знаю.a=a+x%2
, что+
и для конкатенации строк. Т.е. ваше предложение приводит к цифрам в обратном порядке.Python -
6160 символовисточник
print
и""
.print
как он автоматически возвращает результатС, 55 символов
Печатает дополнительный ведущий ноль (ради 2 байтов).
Рекурсия внутри
printf
реверсируется порядок печати, поэтому алгоритм извлекает биты справа налево, но печатает слева направо.РЕДАКТИРОВАТЬ : сохранить символ с помощью
putchar
вместоprintf
.источник
Дьялог АПЛ , 11 байт
2|
Остаток от деления на половину⌊
округленного значения⎕
на входе,÷
деленного на каждое из2*
двух до степени каждого из⍳16
{0, 1, 2, ..., 15}Требуется
⎕IO←0
по умолчанию во многих системах.Попробуй APL онлайн!
источник
С, 81
Вывод имеет строго 16 бит (включая нули заполнения)
источник
Apps Script + Google Sheets,
147144121 байтскрипт
Простыня
Модифицированная версия этого скрипта от ZygD.
источник
Haskell, 66 байт
Позвоните
b "-1023"
, добавьтеmain=interact b
полную программу или попробуйте ее на Ideon.c
выполняет преобразование для натуральных чисел.b r=show.c.read$r
преобразует строку в число, применяетc
и преобразует обратно в строку.b('-':r)='-':b r
лишает возможного лидерства-
и повторно добавляет его к результату.источник
PowerShell,
59878270 bytes+28 bytes for supporting negative numbers.
-12 bytes thanks to @ASCII-only
Try it online!
Adapted from this code. Takes input through a commandline parameter
-d
.источник
APL (NARS), 17 символов, 34 байта
Это копия и модификация ответа Адама /codegolf//a/90107 так, как можно добавить параметр для длины битов, и ⎕IO для этой функции (здесь ⎕IO = 1) должен не имеет значения ...
таким образом, легко обрабатывать количество битов (я проверял, что последний результат должен быть правильным)
источник
Smalltalk (Smalltalk / X), 63/78
первая версия создает промежуточную строку (78):
на самом деле, нет необходимости создавать строку; просто выведите символы (63):
ммм - есть ли более короткий способ чтения числа?
источник
Python 3.x: 65 characters
источник
Bash, 44
Pass an input value to the script through the environment variable
n
. The decimal representation of the binary result cannot exceedLONG_MAX
.This should also be compatible with
ksh93
andzsh
ifb
ande
are initialized to0
and proper arithmetic expansion is used.источник
n
is already defined, making it a snippet. That could be fixed by taking input as a command-line argument and settingn
to that in your script.n=127 sh -c '...'
thansh -c 'n=$1 ...' _ 127
. There's no reason to prefer one over the other in this case as they're both perfectly typical way to pass values.C# - 104
This method will convert decimal to binary up to
64
bits.When executed the above method in Linqpad - rr = p(-32768); rr.Dump();
Output:
01111111111111111111111111111111111111111111111111000000000000000
источник
int
.Java 8,
8071 bytes-9 bytes due to a rule in the comments.. Negative base-10 inputs may return the positive/absolute base-2 value as output apparently.
Explanation:
Try it online.
источник
Kotlin, 82 bytes
Try it online!
источник
Small Basic, 133 bytes
A script that inputs from and outputs to the
TextWindow
console.Try it at SmallBasic.com Requires Silverlight and thus must be run in IE.
I/O is taken/given from the black console.
-22 bytes thanks to @Neil
источник
For i=0To c-1
?MATL,
1517 bytesTry it on MATL Online
TIO
(+2 bytes removing leading 0 for negative numbers, sign bit should be the first bit.)
Output on MATL Online should be read bottom-up (MSB is at the bottom).
The main part is pretty simple:
`2&\t
= while the value is greater than 0, divide by 2 and accumulate the remainders.Handling negative numbers and giving them 2's complement representation was the tricky part. In the end I went with the "subtract from2N " method of getting a number's two's complement. Since we're only required to handle values upto -32768, for negative numbers the code creates 216=65536 with
16W
, adds the input to that (eg. 65536 + (-42)), which gives something MATLAB sees as a positive number but represents the input's signed binary representation in 16-bit form.источник
C (gcc),
5043 bytes-7 bytes thanks to ceilingcat.
Try it online!
источник
PowerShell, 43 bytes
Try it online!
источник
><>,
3433 bytesTry it online!
источник