这是代码高尔夫挑战赛。就像标题所说的那样,编写一个程序来将一串ascii字符转换为二进制。
例如:
"Hello World!"
应该变成
1001000 1100101 1101100 1101100 1101111 100000 1010111 1101111 1110010 1101100 1100100 100001
。
注意:我对pyth实现特别感兴趣。
这是代码高尔夫挑战赛。就像标题所说的那样,编写一个程序来将一串ascii字符转换为二进制。
例如:
"Hello World!"
应该变成
1001000 1100101 1101100 1101100 1101111 100000 1010111 1101111 1110010 1101100 1100100 100001
。
注意:我对pyth实现特别感兴趣。
Answers:
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"
输入是需要转换而没有引号的字符串。
Psum(d).append(Pfilter(lambda T:gte(head(join(Plen(k),Plen())))))
,d =''和k =''。所以不,它根本无效。
$<.bytes{|c|$><<"%b "%c}
通过STDIN进行输入。感谢AShelly,节省了6个字节;感谢britishtea,节省了4个字节。
$<.each_byte{|c|$><<"%b "%c}
String#bytes
代替来删除更多字符String#each_byte
。块形式已弃用,但仍可使用:)
这是一个匿名函数
f=@(x) dec2bin(char(x))
用法是f('Hello World')
。
或者,如果在工作空间中将x
其定义为字符串Hello World!
,那么just就dec2bin(char(x))
可以工作。
char
呢 我想你的意思是dec2bin(x)-'0'
char(x)
,当x
已经是一个字符串时,什么也不做。因此,您可以删除它以节省一些空间。另一方面,结果dec2bin
是一个字符串,我认为输出应为数字
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)+" ");}}}
编辑以包括完整文件
for(char c:a[0].toCharArray()){
,甚至使用for(byte b:a[0].getBytes()){
输入为ascii 也可能会更短,假设使用非utf-16机器语言环境
public
并将程序名称缩短为一个字符,以赢得更多字节。另外,(String[]a)
编译器可以完美地接受它,从而为您带来另一个字节。
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(' '))
[for of]
比[...].map
枚举字符串中的字符稍短:alert([for(c of prompt())c.charCodeAt().toString(2)].join(' '))
.join(' ')
为来打掉两个字节.join` `
。您可以使用函数而不是prompt
/alert
清单:
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。
*由于尚不清楚我是否允许使用前导零,因此请同时发布两种版本。
输入字符串位于内存地址#0000H
(允许)。通过前面板I / O灯以二进制形式输出D7-D0
。
例如,执行RESET
,然后EXAMINE
查看第一个字节,然后重复EXAMINE NEXT
查看其余字节。
"H" = 01 001 000:
"e" = 01 100 101:
"l" = 01 101 100:
当然,不竞争。:)
释放内存?那是什么?
#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编译带有警告的代码)
main(int c,char**v){char x[9];for(;c=*(v[1]++);printf("%s ",itoa(c,x,2)));}
这是使用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 的数字参数,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
结束。
: 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
我使用的方法与大多数方法不同。通过显示_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
}
C#永远不会赢得这类问题,但是完全不用编码,请尝试一下。:)
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