String to Binary

19

Это кодовый вызов для гольфа. Как написано в заголовке, напишите программу для преобразования строки символов ascii в двоичный файл.

Например:

"Hello World!" должен превратиться в 1001000 1100101 1101100 1101100 1101111 100000 1010111 1101111 1110010 1101100 1100100 100001.

Примечание: меня особенно интересует реализация pyth.

ericmarkmartin
источник
1
У нас был перевернутый вопрос: codegolf.stackexchange.com/questions/35096/…
hmatt1
1
Я заметил, что. Есть анекдот, почему я задал этот вопрос. Я призвал моего друга изучать программирование, и он летом прошлого года посещал уроки по Java, где каждый ученик должен был выбрать проект. Он сказал мне, что хочет перевести текст в двоичный файл, что я и сделал (к его ужасу) в строке 3 в 1 на языке python (очень длинная строка). Мне кажется невероятным, что его проектная идея может быть разобрана до 8 байт.
ericmarkmartin
1
это круто, спасибо что поделились! Мне нравятся более простые вопросы, подобные этим, потому что это дает возможность большему количеству людей участвовать и генерирует много контента в форме ответов.
hmatt1
1
Это должен быть ASCII? то есть, если технология не совместима с ASCII, могут ли результаты отразить это?
Шон Бебберс
1
Можем ли мы предположить ASCII для печати 32-127? Если так, могут ли двоичные строки быть 7 символами с левым дополнением нулями?
640 КБ

Ответы:

13

CJam, 8 байт

l:i2fbS*

Очень просто:

l:i           "Read the input line and convert each character to its ASCII value";
   2fb        "Put 2 on stack and use that to convert each ASCII value to base 2";
      S*      "Join the binary numbers by space";

Попробуй здесь

оптимизатор
источник
13

Python 3, 41 байт

print(*[bin(ord(x))[2:]for x in input()])

Как и ответ KSFT , но я подумал, что, помимо raw_input -> inputPython 3, здесь есть еще и преимущество, благодаря сплату для print.

Sp3000
источник
8

Pyth, 10 байт

jdmjkjCd2z

Отображение и объяснение Python:

j           # join(                               "Join by space"
 d          #      d,                             "this space"
 m          #      Pmap(lambda d:                 "Map characters of input string"
  j         #                    join(            "Join by empty string"
   k        #                        k,           "this empty string"
    j       #                        join(        "This is not a join, but a base conversion"
     C      #                             Pchr(   "Convert the character to ASCII"
      d     #                                  d  "this character"
            #                                 ),
     2      #                             2       "Convert to base 2"
            #                            )
            #                        ),
  z         #           z)))                      "mapping over the input string"

Ввод - это строка, которую нужно преобразовать без кавычек.

Попробуй здесь

оптимизатор
источник
10
Является ли asdfghjlkl допустимой программой pyth? Что оно делает?
flawr
@ Flawr какой-либо вред при попытке? ;)
Оптимизатор
2
@flawr, который компилируется в питон Psum(d).append(Pfilter(lambda T:gte(head(join(Plen(k),Plen()))))), где d = '' и k = ''. Так что нет, это не действительно вообще.
Исаак
12
@ ericmark26 осмотрите свою комнату или офис, разбейте все, что вы можете найти, на клавиатуре и посмотрите, будет ли она интерпретирована. Выясните, что он делает, а затем повторите со следующим объектом. Когда вы закончите, попробуйте разные повороты.
Глупый
2
@ ericmark26 Я думаю, что лучший способ привыкнуть к Pyth - это взять несколько простых программ на Python и перевести их на Pyth.
Исаак
4

Python 3 - 43 байта


print(*map("{:b}".format,input().encode()))

Не совсем короткий, но интересный подход ИМО. Это имеет дополнительное преимущество, заключающееся в том, что если количество значащих битов меняется, то EG Hi!, заполнение нулями тривиально (еще 2 байта, в отличие от 9 для .zfill(8)):

print(*map("{:08b}".format,input().encode()))
matsjoyce
источник
3

Python - 52

print" ".join([bin(ord(i))[2:]for i in raw_input()])

Я буду работать над переводом этого на Pyth. Кто-то уже сделал ответ Pyth.

Если вам не нужна полная программа или формат ввода-вывода и вы используете Python 3, вы можете сделать это в 23 байтах следующим образом:

[bin(ord(i))for i in x]

x это вход.

Я знаю, что это не считается, потому что переводчик не был выпущен до того, как был объявлен вызов, но вот он в KSFTgolf:

oan
KSFT
источник
3

Рубин, 34 28 24 байта

$<.bytes{|c|$><<"%b "%c}

Принимает ввод через STDIN. Спасибо за 6 байтов, спасибо за AShelly и еще 4 благодаря britishtea.

Мартин Эндер
источник
обрезать на 6 с$<.each_byte{|c|$><<"%b "%c}
AShelly
Вы можете сбрить еще несколько символов, используя String#bytesвместо String#each_byte. Форма блока устарела, но он все еще работает :)
Британцы
@britishtea О, хорошо. Спасибо!
Мартин Эндер
2

Matlab

Это анонимная функция

f=@(x) dec2bin(char(x))

использование есть f('Hello World').

В качестве альтернативы, если xопределяется как строка Hello World!в рабочей области, то просто dec2bin(char(x))будет работать.

Дэвид
источник
Я не уверен, как это оценить, потому что я не уверен, как я могу получить информацию. Любые комментарии?
Дэвид
Почему char? Я думаю, что вы имеете в видуdec2bin(x)-'0'
Луис Мендо
Потому что я не такой умный!
Дэвид
Моя точка зрения: char(x)когда xстрока уже ничего не делает. Таким образом, вы можете удалить его, чтобы сэкономить место. С другой стороны, результатом dec2binявляется строка, и я думаю, что выходные данные должны быть числами
Луис Мендо
Я понимаю, и вы правы, конечно. Matlab позволяет легко забыть о типах данных.
Дэвид
2

J - 9

1":#:3&u:

Не знаю, как сделать это подряд без удвоения длины кода, мне нужно, чтобы гуру J сказали мне :)

1":#:3&u:'Hello world!'
1001000
1100101
1101100
1101100
1101111
0100000
1110111
1101111
1110010
1101100
1100100
0100001
рассекать
источник
2
Вы можете добавить ".в начало. Он оценивает ваш результат, поэтому он будет в одну строку и разделен пробелами. Еще короче создать base10 номера с BASE2 цифрами: 10#.#:3&u:.
рандома
2

Java - 148 байт

public class sToB{public static void main(String[] a){for(int i=0;i<a[0].length();i++){System.out.print(Integer.toString(a[0].charAt(i) ,2)+" ");}}}

Отредактировано, чтобы включить полный файл

Брайан Девани
источник
2
Я думаю, что OP хочет полную программу, а не просто фрагмент. Плюс, это может быть игра в гольф намного больше, Minks.
Родольфо Диас
это полная программа, если вы поместите ее в основной класс, она запустится. Что касается лучшего игры в гольф, вероятно, но я не мог определить, как.
Брайан Девани
1
Полная программа также включает в себя основной класс.
Родольфо Диас
может быть короче при использовании for(char c:a[0].toCharArray()){или даже for(byte b:a[0].getBytes()){потому, что ввод ascii, если предположить, что язык машины не-utf-16
njzk2
1
Вы можете избавиться от publicи сократить имя программы до одного символа, чтобы выиграть больше байтов. Плюс, (String[]a)отлично принимается компилятором, зарабатывая вам еще один байт.
Родольфо Диас
2

JavaScript ES6, 63 65 байт

alert([for(c of prompt())c.charCodeAt().toString(2)].join(' '))

Это довольно долго, благодаря длинным именам функций JavaScript. Приведенный ниже фрагмент кода является грубым эквивалентом ES5, поэтому его можно запустить в любом браузере. Спасибо edc65 за улучшения игры в гольф.

alert(prompt().split('').map(function(e){return e.charCodeAt().toString(2)}).join(' '))

NinjaBearMonkey
источник
1
[for of]немного короче, чем [...].mapперечислять символы в строках:alert([for(c of prompt())c.charCodeAt().toString(2)].join(' '))
edc65
Вы можете сыграть в гольф два байта, заменив .join(' ')на .join` ` . Вы можете promptalert
отыграть
2

Scala - 59 - 55 байт

readLine().map(x=>print(x.toByte.toInt.toBinaryString))

Обычно следует использовать foreach, а не карту.

Доминик Мюллер
источник
2

Машинный код 8088, IBM PC DOS, 33 31 байт *

Листинг:

D1 EE           SHR  SI, 1          ; point SI to DOS PSP (80H)
AD              LODSW               ; load input string length into AL, SI to 82H 
8A C8           MOV  CL, AL         ; set up loop counter 
49              DEC  CX             ; remove leading space/slash from char count 
            LOOP_CHAR: 
B3 08           MOV  BL, 8          ; loop 8 bits 
AC              LODSB               ; load next char 
            LOOP_BIT: 
D0 C0           ROL  AL, 1          ; high-order bit into low-order bit 
B4 0E           MOV  AH, 0EH        ; BIOS display character function 
50              PUSH AX             ; save AH/AL 
24 01           AND  AL, 1          ; mask all but low-order bit 
04 30           ADD  AL, '0'        ; convert to ASCII 
CD 10           INT  10H            ; write char to display 
58              POP  AX             ; restore AH/AL 
4B              DEC  BX             ; decrement bit counter 
75 F1           JNZ  LOOP_BIT       ; loop next bit      
B0 20           MOV  AL, ' '        ; display a space 
CD 10           INT  10H            ; write space to display 
E2 E8           LOOP LOOP_CHAR      ; loop next char 
C3              RET                 ; return to DOS 

Заполните исполняемый COM-файл для ПК DOS, ввод осуществляется через командную строку.

С ведущими нулями:

введите описание изображения здесь

Загрузите и протестируйте ASCBIN.COM .

Или 39 байтов без начальных нулей:

введите описание изображения здесь

Загрузите и протестируйте ASCBIN2.COM .

* Поскольку мне было не совсем ясно, разрешены ли ведущие нули, я публикую версии в обоих направлениях.

640 КБ
источник
2

MITS Altair 8800 , 0 байтов

Входная строка находится по адресу памяти #0000H( разрешено ). Вывод в двоичном виде через индикаторы ввода / вывода на передней панели D7-D0.

Пример, сделать RESET, затем, EXAMINEчтобы увидеть первый байт, а затем повторить, EXAMINE NEXTчтобы увидеть остальные.

"H" = 01 001 000:

введите описание изображения здесь

"e" = 01 100 101:

введите описание изображения здесь

"l" = 01 101 100:

введите описание изображения здесь

Попробуйте онлайн!

Без конкуренции, конечно. :)

640 КБ
источник
1

Хаскелл, 65

m s=tail$do c<-s;' ':do j<-[6,5..0];show$mod(fromEnum c`div`2^j)2

интенсивное использование списка монады. это не могло быть преобразовано в списки, потому что последние утверждения не были return.

гордый хаскеллер
источник
1

C ++ - 119 байт

Освобождение памяти? Что это?

#include<cstdio>
#include<cstdlib>
int main(int c,char**v){for(*v=new char[9];c=*(v[1]++);printf("%s ",itoa(c,*v,2)));}

(MSVC компилирует код с предупреждением)

ККЭЗ
источник
1
C версия, корочеmain(int c,char**v){char x[9];for(;c=*(v[1]++);printf("%s ",itoa(c,x,2)));}
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳
1

Commodore VIC-20 / C64 / 128 и TheC64Mini, 101 токенизированный бейсик байтов

Вот запутанный список с использованием сокращений ключевых слов Commodore BASIC:

 0dEfnb(x)=sG(xaNb):inputa$:fOi=1tolen(a$):b=64:c$=mI(a$,i,1):fOj=0to6
 1?rI(str$(fnb(aS(c$))),1);:b=b/2:nEj:?" ";:nE

Здесь в целях пояснения приведен незапутанный символический листинг:

 0 def fn b(x)=sgn(x and b)
 1 input a$
 2 for i=1 to len(a$)
 3 let b=64
 4 let c$=mid$(a$,i,1)
 5 for j=0 to 6
 6 print right$(str$(fn b(asc(c$))),1);
 7 let b=b/2
 8 next j
 9 print " ";
10 next i

Функция, fn bобъявленная в нулевой строке, принимает числовой параметр, xкоторый ANDредактируется со значением b; SGN затем используется для преобразования x and bв 1или0 .

Первая строка принимает строковый ввод в переменную a$, и цикл начинается (обозначается i) до длины этого ввода. bпредставляет каждый бит от 6-го до 0-го бита. c$занимает каждый символ строки в позиции i.

строка 5 запускает цикл для проверки каждой битовой позиции; right$используется в строке 6 для устранения проблемы автоформатирования, когда Commodore BASIC отображает число, преобразуя выходные данные fn bв строку; asc(c$)преобразует текущий символ в его код ascii как десятичное значение.

Строка 7 представляет следующее битовое значение. Цикл jзаканчивается перед печатью пробела, затем последний цикл iзаканчивается.

C64 преобразование PETSCII в двоичный

Шон Бебберс
источник
1

JavaScript ES6, 71 байт

alert(prompt().split('').map(c=>c.charCodeAt(0).toString(2))).join(' ')
thomascorthouts
источник
Добро пожаловать в PPCG! Вам нужно .split('')разбить пустую строку; .split()превращается "abc"в ["abc"].
Деннис
1

Forth (gforth) , 45 байтов

: f 0 do dup i + c@ 2 base ! . decimal loop ;

Попробуйте онлайн!

Код Объяснение

: f           \ start a new word definition
  0 do        \ start a loop from 0 to string length - 1
    dup i +   \ duplicate the address and add the loop index to get addr of current character
    c@        \ get the character at that address
    2 base !  \ set the base to binary
    .         \ print the ascii value (in binary)
    decimal   \ set the base back to decimal
  loop        \ end the loop
;             \ end the word definition
reffu
источник
1

Gaia , 4 байта

ċb¦ṡ

Очень доволен этим

Как это устроено

ċ   Get a list of all the code points in the input string
b¦  Convert every number in that list to binary
ṡ   Joins the element of the list with spaces
Implicit Output 

Попробуйте онлайн!

EdgyNerd
источник
0

СТАТА 158

Я использовал другой подход, чем большинство. Прочитайте с помощью подсказки display _request () (сокращено до di _r (r)). Запишите строку в файл с именем b в текстовом режиме. Откройте b в двоичном режиме и прочитайте каждый символ как байт и преобразуйте в двоичный. Технически файл b должен быть закрыт в конце, но это допустимая программа, которая успешно работает без нее.

di _r(r)
file open a using "b",w
file w a "$r"
file close a
file open a using "b",b r
file r a %1bu t
while r(eof)==0 {
loc q=t
inbase 2 `q'
file r a %1bu t
}
bmarks
источник
0

Голанг - 68

Я новичок в Go, и я не уверен в правилах подсчета символов на этом языке здесь.

Импорт (11 байт):

import"fmt"

Функция (55 байт):

func c(s string){for _,r:=range s{fmt.Printf("%b ",r)}}

Вы можете запустить его здесь .

hmatt1
источник
0

Никогда C # не выиграет такие вопросы, но вот попытка, полностью без кодирования. :)

C # - 84

Console.Write(String.Join(" ",Console.ReadLine().Select(x=>Convert.ToString(x,2))));
Аббас
источник
Это можно сделать намного короче с помощью лямбда-функции, то есть: x=>String.Join(" ",x.Select(y=>Convert.ToString(y,2))); однако учтите, что из-за использования .Select()и этого более короткого ответа, и вашего исходного ответа необходимо включать 18 байт, using System.Linq;если только вы не укажете, что он использует интерактивный компилятор Visual C # , который импортирует System.Linq по умолчанию
Skidsdev
Вот решение лямбда-функции с использованием Interactive Compiler, всего 55 байт
Skidsdev
0

Кобра - 64

Как лямбда:

do(s='')=(for c as int in s get Convert.toString(c,2)).join(' ')
Οurous
источник