字符串到二进制


19

这是代码高尔夫挑战赛。就像标题所说的那样,编写一个程序来将一串ascii字符转换为二进制。

例如:

"Hello World!" 应该变成 1001000 1100101 1101100 1101100 1101111 100000 1010111 1101111 1110010 1101100 1100100 100001

注意:我对pyth实现特别感兴趣。



1
我注意到了。我为什么要问这个问题有一个轶事。我鼓励我的朋友学习编程,去年夏天他参加了Java课程,每个学生都必须选择一个项目。他告诉我他想将文本转换为二进制,然后我在python 3 in 1行(很长的一行)中做了(令他沮丧)。我感到不可思议的是,他的项目构想可以精简为8个字节。
ericmarkmartin 2015年

1
太好了,谢谢分享!我喜欢这样更简单的问题,因为它使更多的人有机会参与并以答案的形式产生大量的内容。
hmatt1 2015年

1
必须是ASCII吗?即,如果一种技术与ASCII不兼容,结果可以反映出来吗?
Shaun Bebbers,

1
我们可以假定ASCII可打印32-127吗?如果是这样,二进制字符串是否可以为7个字符,且左填充为零?
640KB

Answers:


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 -> input,Python 3在这里也有一个优势print


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尝试有害吗?;)
Optimizer

2
@flawr编译为python Psum(d).append(Pfilter(lambda T:gte(head(join(Plen(k),Plen()))))),d =''和k =''。所以不,它根本无效。
isaacg 2015年

12
@ ericmark26环顾您的房间或办公室,然后将可以找到的所有内容粉碎到键盘上,看看它是否可以解释。弄清楚它的作用,然后重复下一个对象。用尽时,请尝试不同的旋转。
globby 2015年

2
@ ericmark26我认为习惯Pyth的最好方法是采用一些简单的Python程序,并将其转换为Pyth。
isaacg 2015年

4

Python 3-43个字节


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

IMO并非最短,但很有趣。它还有一个好处,就是如果有效位数变化,则EG Hi!,零填充是微不足道的(另外2个字节,而不是9个字节.zfill(8)):

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

3

Python-52

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

我将把它翻译成Pyth。其他人已经做了Pyth的答案。

如果您不关心它是完整的程序还是I / O格式并使用Python 3,则可以像这样使用23个字节来实现:

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

x 是输入。

我知道这不算什么,因为在发布挑战之前没有发布解释器,但是在KSFTgolf中:

oan

3

Ruby,34 28 24字节

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

通过STDIN进行输入。感谢AShelly,节省了6个字节;感谢britishtea,节省了4个字节。


$<.each_byte{|c|$><<"%b "%c}
AShelly删减

您可以使用String#bytes代替来删除更多字符String#each_byte。块形式已弃用,但仍可使用:)
britishtea

@britishtea哦,太好了。谢谢!
马丁·恩德


2

Matlab的

这是一个匿名函数

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

用法是f('Hello World')

或者,如果在工作空间中将x其定义为字符串Hello World!,那么just就dec2bin(char(x))可以工作。


我不确定该如何评分,因为我不确定如何获得输入。任何意见?
大卫

为什么char呢 我想你的意思是dec2bin(x)-'0'
Luis Mendo 2015年

因为我不那么聪明!
大卫

我的观点是:char(x),当x已经是一个字符串时,什么也不做。因此,您可以删除它以节省一些空间。另一方面,结果dec2bin是一个字符串,我认为输出应为数字
Luis Mendo 2015年

我了解,您当然是对的。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
您可以添加".到开头。它会评估您的结果,因此它将在一行中并以空格分隔。更短的是用base2数字创建base10数字:10#.#:3&u:
randomra

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需要一个完整的程序,而不仅仅是一个片段。另外,它可以打更多的高尔夫球,methinks。
Rodolfo Dias 2015年

这是完整的程序,如果将其放在主类中,它将运行。至于更好的打高尔夫球,可能是,但我找不到。
布莱恩·德瓦尼

1
完整的程序也包括主类。
Rodolfo Dias 2015年

可能会更短for(char c:a[0].toCharArray()){,甚至使用for(byte b:a[0].getBytes()){输入为ascii 也可能会更短,假设使用非utf-16机器语言环境
njzk2,2015年

1
您可以摆脱public并将程序名称缩短为一个字符,以赢得更多字节。另外,(String[]a)编译器可以完美地接受它,从而为您带来另一个字节。
Rodolfo Dias 2015年

2

JavaScript ES6,63 65字节

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

由于JavaScript的长函数名,这相当长。下面的Stack Snippet与ES5大致相当,因此可以在任何浏览器中运行。感谢edc65对高尔夫的改进。

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


1
[for of][...].map枚举字符串中的字符稍短:alert([for(c of prompt())c.charCodeAt().toString(2)].join(' '))
edc65

您可以将替换.join(' ')为来打掉两个字节.join` ` 。您可以使用函数而不是prompt/alert
RamenChef

2

斯卡拉- 59 - 55字节

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

通常,应该使用foreach而不是map。


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 

完整的PC DOS可执行COM文件,通过命令行输入。

前导零:

在此处输入图片说明

下载并测试ASCBIN.COM

39个字节,不带前导零:

在此处输入图片说明

下载并测试ASCBIN2.COM

*由于尚不清楚我是否允许使用前导零,因此请同时发布两种版本。


2

MITS Altair 8800,0字节

输入字符串位于内存地址#0000H允许)。通过前面板I / O灯以二进制形式输出D7-D0

例如,执行RESET,然后EXAMINE查看第一个字节,然后重复EXAMINE NEXT查看其余字节。

"H" = 01 001 000:

在此处输入图片说明

"e" = 01 100 101:

在此处输入图片说明

"l" = 01 101 100:

在此处输入图片说明

在线尝试!

当然,不竞争。:)


1

哈斯克尔,65岁

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

大量使用清单monad。由于最后一个语句不是,因此无法将其转换为列表解析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)));}
–h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳





1

Commodore VIC-20 / C64 / 128和TheC64Mini,101个标记化的BASIC字节

这是使用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在第零行上声明的函数接受ed 的数字参数,xAND值是b;。然后使用SGN转换x and b10

第一行接受输入到变量的字符串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(' ')

欢迎来到PPCG!您需要.split('')在空字符串处分割;.split()"abc"["abc"]
丹尼斯

1

第四(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


1

盖亚 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 

在线尝试!



0

斯塔塔158

我使用的方法与大多数方法不同。通过显示_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
}

0

高朗-68

我是Go语言的新手,我也不知道这里使用这种语言计算字符的规则。

导入(11个字节):

import"fmt"

功能(55字节):

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

你可以在这里运行它。


0

C#永远不会赢得这类问题,但是完全不用编码,请尝试一下。:)

C#-84

Console.Write(String.Join(" ",Console.ReadLine().Select(x=>Convert.ToString(x,2))));

通过使用lambda函数,可以使它变短得多,即:x=>String.Join(" ",x.Select(y=>Convert.ToString(y,2)));但是,请注意,由于使用.Select(),这个较短的答案和您的原始答案都需要包含18个字节,using System.Linq;除非您指定使用的是Visual C#交互式编译器,默认情况下会导入System.Linq
Skidsdev,

这是使用Interactive Compiler的lambda函数解决方案,总共55个字节
Skidsdev,

0

眼镜蛇-64

作为Lambda:

do(s='')=(for c as int in s get Convert.toString(c,2)).join(' ')
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.