代码高尔夫 - 十六进制到(原始)二进制转换

Aln*_*tak 12 binary hex code-golf

在回答关于十六进制到(原始)二进制转换的这个问题时,评论表明它可以用"5-10行C或任何其他语言"来解决.

我确信(某些)脚本语言可以实现,并希望看到如何.对于C,我们能否证明评论是真的吗?

注意:这并不意味着十六进制到ASCII二进制 - 特别是输出应该是对应于输入ASCII十六进制的原始八位字节流.此外,输入解析器应跳过/忽略空格.

编辑(Brian Campbell)为了保持一致性,我可以提出以下规则吗?如果您认为这些内容没有帮助,请随意编辑或删除这些内容,但我认为,由于已经讨论过某些案例应该如何运作,因此一些澄清会有所帮助.

  1. 程序必须从stdin读取并写入stdout(我们也可以允许读取和写入在命令行上传入的文件,但我无法想象在任何语言中都会比stdin和stdout更短)
  2. 该程序必须仅使用您的基础包含的软件包,标准语言分发.对于C/C++,这意味着它们各自的标准库,而不是POSIX.
  3. 程序必须编译或运行,没有任何特殊选项传递给编译器或解释器(因此,'gcc myprog.c'或'python myprog.py'或'ruby myprog.rb'都可以,而'ruby -rscanf myprog.rb '是不允许的;要求/导入模块会计入您的字符数).
  4. 程序应该读取由相邻的十六进制数字对(大写,小写或混合大小写)表示的整数字节,可选地由空格分隔,并将相应的字节写入输出.每对十六进制数字首先写入最重要的半字节.
  5. 程序对无效输入的行为(字符除外[a-fA-F \t\r\n],将单个字节中的两个字符分开的空格,输入中的奇数个十六进制数字)是未定义的; 任何行为(除了主动损坏用户的计算机或其他东西)都是可接受的(抛出错误,停止输出,忽略坏字符,将单个字符视为一个字节的值,都可以)
  6. 程序可能不会写入额外的字节输出.
  7. 代码按源文件中最少的总字节数进行评分.(或者,如果我们想要对原始挑战更加真实,那么得分将基于最低代码行数;在这种情况下,我会对每行施加80个字符的限制,否则你会得到一堆1线的关系).

Bri*_*ell 8

编辑 Checkers已将我的C解决方案减少到46个字节,然后由于BillyONeal的提示加上我的错误修正(在错误的输入上没有更多的无限循环,现在它只是终止循环),然后减少到44个字节.请将Checkers减少为77到46个字节:

main(i){while(scanf("%2x",&i)>0)putchar(i);}
Run Code Online (Sandbox Code Playgroud)

而且我有一个比我上一个更好的Ruby解决方案 42 38字节(感谢Joshua Swank的正则表达式建议):

STDIN.read.scan(/\S\S/){|x|putc x.hex}
Run Code Online (Sandbox Code Playgroud)

原始解决方案

C,77个字节,或两行代码(如果你可以将它#include放在同一行,则为1 ).请注意,这在输入错误时会有无限循环; 在Checkers和BillyONeal的帮助下,这个44字节的解决方案修复了这个错误,并且只是在错误的输入上停止.

#include <stdio.h>
int main(){char c;while(scanf("%2x",&c)!=EOF)putchar(c);}
Run Code Online (Sandbox Code Playgroud)

如果你正常格式化,它甚至只有6行:

#include <stdio.h>
int main() {
  char c;
  while (scanf("%2x",&c) != EOF)
    putchar(c);
}
Run Code Online (Sandbox Code Playgroud)

Ruby,79字节(我确信这可以改进):

STDOUT.write STDIN.read.scan(/[^\s]\s*[^\s]\s*/).map{|x|x.to_i(16)}.pack("c*")
Run Code Online (Sandbox Code Playgroud)

这些都从STDIN获取输入并写入STDOUT

  • 您可以将正则表达式减少到\ S\S. (2认同)
  • 不要忘记ruby全局:$ <.read.scan(/\S\S /){putc $&.hex}(33个字符) (2认同)

Has*_*kun 7

39 char perliner

y/A-Fa-f0-9//dc,print pack"H*",$_ for<>
Run Code Online (Sandbox Code Playgroud)

编辑:不是真的接受大写,修复.


Ski*_*izz 7

45字节可执行文件(base64编码):

6BQAitjoDwDA4AQI2LQCitDNIevrWMOy/7QGzSF09jLkBMAa5YDkByrEJA/D
Run Code Online (Sandbox Code Playgroud)

(粘贴到扩展名为.com的文件中)

编辑:好的,这是代码.打开一个Window的控制台,创建一个名为'hex.com'的45字节文件,输入"debug hex.com"然后输入'a'并输入.复制并粘贴以下行:

db e8,14,00,8a,d8,e8,0f,00,c0,e0,04,08,d8,b4,02,8a,d0,cd,21,eb,eb,cd,20
db b2,ff,b4,06,cd,21,74,f6,32,e4,04,c0,1a,e5,80,e4,07,2a,c4,24,0f,c3
Run Code Online (Sandbox Code Playgroud)

按Enter键'w',然后再次输入'q'并输入.你现在可以运行'hex.com'了

EDIT2:缩小了两个字节!

db e8, 11, 00, 8a, d8, e8, 0c, 00, b4, 02, 02, c0, 67, 8d, 14, c3
db cd, 21, eb, ec, ba, ff, 00, b4, 06, cd, 21, 74, 0c, 04, c0, 18
db ee, 80, e6, 07, 28, f0, 24, 0f, c3, cd, 20
Run Code Online (Sandbox Code Playgroud)

这很棘手.我简直不敢相信我是花时间做的.

  • 整洁,但除非你出示代码,否则不能接受;-) (2认同)

Ale*_*x B 6

由于C在功能原型方面的宽大,Brian的77字节C解决方案可以改进到44字节.

main(i){while(scanf("%2x",&i)>0)putchar(i);}
Run Code Online (Sandbox Code Playgroud)