八进制,十进制还是十六进制?


11

给定仅包含字母和数字的输入字符串,编写一个程序或函数,以打印可能的可打印ASCII字符(十六进制7-7E),这些字符与以8、10和16为基数的字符串值相对应(如果可能)。字符必须按照与它们对应的基数(以8为基,等等)的升序书写。输出可以是数组格式(如[& . F]),也可以由空格或换行符(如样本)隔开(换行符是可选的)。

如果没有可能形成的可打印ASCII字符,则程序不得有任何输出。

样品

31
==> 1

47
==> ' / G

69
==> E i

7A
==> z

100
==> @ d

156
==> n

189
==> <empty>

potaTO
==> <empty>

5G
==> <empty>

19
==> <empty>

这是,因此,字节数最少的答案将获胜。适用标准规则。

Answers:


6

JavaScript(SpiderMonkey 30 +),74个字节

s=>[for(b of'o0x')if((c=+(0+b+s))>31&c<127)String.fromCharCode(c)].join` `

您和您的ES7正在杀死ES6 o_o
Conor O'Brien

2
@CᴏɴᴏʀO'Bʀɪᴇɴ当您同时使用map和时filter,数组理解确实很有用。
尼尔

@Neil任何理由使用'0'+b+...b将始终是一个字符串?0+b+...
andlrc '16

@ dev-null Bah,我在codegolf.stackexchange.com/a/73323/17602中修复了它,但也忘了在这里做。
尼尔

4

MATL,23 24 28字节

由于@David减少了1个字节

8H6hhYs"G@ZA32:126m?6Mc

在线尝试!

8H6hhYs         % array [8,10,16]
"               % for each base
  G             %   push input. Do nothing the first time
  @             %   push base (8, 10 or 16)
  ZA            %   convert from base to decimal. Takes implicit input the first time
  32:126m       %   is result in acceptable range?
  ?             %   if so
    6M          %     push result of base conversion again
    c           %     convert to char
                %   implicitly end if
                % implicitly end for each
                % implicitly display stack contents

我不确定是否 D有必要,是吗?创建矢量的出色工作,我所做的工作几乎与您相同,但是无法从缩短矢量[8,10,16]
大卫,

@David谢谢!我认为D在这种情况下有必要清空堆栈。但是你是对的,不是!谢谢!
Luis Mendo

1
@David我需要' ':'~'在下一个发行版中包含一个预定义的文字!
Luis Mendo

1
32:126m是个好主意!!
大卫,


3

Pyth,23 21 20 18字节

@rd\m.xCizd0[8T16

输出为数组。\x80反斜杠和C之间有一个文字,我已将其替换为

@rd\•m.xCizd0[8T16    Implicit: z=input
     m     d [8T16    Map the following lambda d over [8, 10, 16]:
      .x                try:
         izd              convert z from that base
        C                                          and convert to char
            0           except: return the number 0
@                     Filter that on presence in
 rd\•                   strings from space to \x80 (the printable ASCII characters).

在这里尝试。


2

Jolf,26个字节

在这里尝试! 测试套件

 fΜ‘Ci8iΗi’dpAHdh sH"[ -~]

说明

 fΜ‘Ci8iΗi’dpAHdh sH"[ -~]
   ‘      ’                array containing
    Ci8                     input as base 8
       i                    input as base 10
        Ηi                  input as base 16
  Μ        d               mapped
            pAH             with from char code
_f             d           filtered
                _sH"[ -~]   with strings matching that.

1

Bash + GNU实用程序+ ascii,36

不知道是否ascii允许使用该实用程序。输入被当作命令行参数。

ascii $1|tac|grep -Po '(?<=s as `).'

ascii可以通过来安装在Ubuntu上sudo apt-get install ascii


1

Javascript ES6,89个字符

s=>'0o,,0x'.split`,`.map(x=>(x+=s)>31&x<128&&String.fromCharCode(x)).filter(x=>x).join` `

测试:

f=s=>'0o,,0x'.split`,`.map(x=>(x+=s)>31&x<128&&String.fromCharCode(x)).filter(x=>x).join` `
"31,47,69,7A,100,156,189,potaTo,5G,19".split`,`.map(f) == "1,' / G,E i,z,@ d,n,,,,"

1

Lua,147字节

我认为我无法再降低很多,我已经测试了很多方法,但这是最短的。即使使用包含不推荐使用的函数的旧编译器,table.foreach(table,function)也不会节省一些字节。

该程序将字符串作为参数,并打印由空格分隔的表值的串联。

t={}for _,i in pairs({8,10,16})do x=tonumber(arg[1],i)x=x and x or 0 t[#t+1]=127>x and 19<x and string.char(x)or nil end print(table.concat(t," "))

脱节和解释

t={}                        -- Initalise the array containing the chars to print
for _,i in pairs({8,10,16}) -- Iterate over the array {8,10,16}
do
  x=tonumber(arg[1],i)      -- convert the input in base i to a number in base 10
  x=x and x or 0            -- if the input wasn't a number, x is nil
                            -- use a ternary operator to set x in this case
  t[#t+1]=127>x and 19<x    -- if x is the bytecode of a printable character
    and string.char(x)or nil-- insert this character into t
end
print(table.concat(t," "))  -- concatenate the values in t with " " as separator
                            -- and print it

如果您在徘徊为什么有一个变量集但在高尔夫代码中没有使用(_for循环中的变量),这是为什么:

您可以通过两种方式遍历Lua中的数组,两种方式均为for:

for i=1,#table do --[[code here, use table[i] ]] end

或以foreach样式:

for key,value do pairs(table) do --[[code here]] end

我需要表中包含的值,{8,10,16}因为它们是我必须迭代的不同基础。但是具有多次返回的函数将不允许您选择要返回的实际对象,而是遵循顺序。要value设置变量,我也需要捕捉值key:这就是我们所谓的dummy _


1

C(功能),76

  • @anatolyg节省了2个字节。
  • @luserdroog节省了5个字节。
j,c;f(char*s){for(j=8;c=strtol(s,0,j);j=j*j/6)isprint(c)?printf("%c ",c):0;}

伊迪恩


您的循环“ increment”语句很棒!虽然可以缩短。
anatolyg

j*=j,j/=6更明确地写为j=j*j/6
anatolyg

@anatolyg当然-谢谢!我巧言令色相结合运营商-有点像j*=j/6,但没有整数除法期间由于精度损失的工作
数字创伤

j<20,逗号运算符将放弃此操作的全部效果。
luser droog

@luserdroog是的-谢谢!
Digital Trauma

0

的JavaScript ES6,89 88个字节

感谢尼尔,节省了1个字节!

n=>[..."0x+"].map(t=>String.fromCharCode(eval(`0${t+n}`))).filter(k=>~k.search(/[ -~]/))

返回一个数组。如果这样不行,则会额外占用8个字节,并显示可能的匹配项。

n=>[..."0x+"].map(t=>String.fromCharCode(eval(`0${t+n}`))).filter(k=>~k.search(/[ -~]/)).join` `


嗯,您需要多大的JavaScript代码以0解析为八进制的数字?
尼尔

@Neil Firefox似乎可以正常使用。
科纳·奥布莱恩

似乎无法使用47
尼尔

@Neil再次回到工作状态,重新工作...
Conor O'Brien

啊,Number()要求0oeval对just感到满意0。对困惑感到抱歉。
尼尔

0

R,84个字节

function(x){s=sapply;y=s(c(8,10,16),strtoi,x=x);cat(s(y[y%in%c(32:126)],intToUtf8))}

用于strtoi转换为每个基数,然后在适当范围内转换为字符。cat如果我们允许默认打印字符(包裹在中""),则可以通过删除来节省另外4个字节

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.