Octal, Decimal hay Hexadecimal?


11

Đưa ra một chuỗi đầu vào chỉ chứa các chữ cái và số, hãy viết chương trình hoặc hàm in các ký tự ASCII có thể in được (Hex 20-7E) có thể tương ứng với giá trị của chuỗi trong các cơ sở 8, 10 và 16 (nếu có thể). Các ký tự phải được viết theo thứ tự tăng dần theo các căn cứ mà chúng tương ứng (cơ sở 8 trước, v.v.). Đầu ra có thể ở định dạng mảng (như [& . F]) hoặc cách nhau bởi khoảng trắng hoặc dòng mới (một dòng mới là tùy chọn) như các mẫu.

Nếu không có ký tự ASCII có thể in có thể được tạo thành, chương trình không được có bất kỳ đầu ra nào.

Mẫu

31
==> 1

47
==> ' / G

69
==> E i

7A
==> z

100
==> @ d

156
==> n

189
==> <empty>

potaTO
==> <empty>

5G
==> <empty>

19
==> <empty>

Đây là , vì vậy câu trả lời có ít byte nhất sẽ thắng. Quy tắc chuẩn áp dụng.

Câu trả lời:


6

JavaScript (SpiderMonkey 30+), 74 byte

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

Bạn và ES7 của bạn đang giết mah ES6 o_o
Conor O'Brien

2
@ CᴏɴᴏʀO'Bʀɪᴇɴ Khi bạn sử dụng cả hai mapfilter, việc hiểu mảng thực sự hữu ích.
Neil

@Neil Bất kỳ lý do để sử dụng '0'+b+...khi nào bsẽ luôn là một chuỗi? 0+b+...
andlrc

@ dev-null Bah, tôi đã sửa nó trong codegolf.stackexchange.com/a/73323/17602 nhưng quên làm điều đó ở đây.
Neil

4

MATL , 23 24 28 byte

Giảm 1 byte nhờ @David

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

Hãy thử trực tuyến!

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

Tôi không chắc Dlà có cần thiết không? Công việc tuyệt vời trong việc tạo ra vectơ, tôi đã làm gần giống như bạn nhưng không thể rút ngắn vectơ từ đó [8,10,16].
David

@David Cảm ơn! Tôi nghĩ Dlà cần thiết trong trường hợp này để làm trống ngăn xếp. Nhưng bạn nói đúng, không phải vậy! Cảm ơn!
Luis Mendo

1
@David Tôi cần đưa vào ' ':'~'như một nghĩa đen được xác định trước cho lần phát hành tiếp theo!
Luis Mendo

1
32:126mlà một ý tưởng tốt!!
David

4

Python 3, 84 82 byte

def a(s):
 for n in 8,10,16:
  try:b=int(s,n);31<b<127and print(chr(b))
  except:0

3

Pyth, 23 21 20 18 byte

@rd\m.xCizd0[8T16

Đầu ra dưới dạng một mảng. Có một nghĩa đen \x80giữa dấu gạch chéo ngược và chữ C, mà tôi đã thay thế bằng a .

@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).

Hãy thử nó ở đây .


2

Jolf, 26 byte

Hãy thử nó ở đây! Bộ kiểm tra

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

Giải trình

 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

Tiện ích Bash + GNU + ascii , 36

Không chắc chắn nếu việc sử dụng các asciitiện ích được cho phép. Đầu vào được lấy như một tham số dòng lệnh.

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

asciicó thể được cài đặt trên Ubuntu với sudo apt-get install ascii.


1

Javascript ES6, 89 ký tự

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

Kiểm tra:

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 byte

Tôi không nghĩ rằng tôi có thể chơi nó nhiều hơn nữa, tôi đã thử rất nhiều cách để làm điều đó, và đây là cách ngắn nhất. Ngay cả khi sử dụng trình biên dịch cũ chứa hàm không dùng nữa table.foreach(table,function)cũng không thể loại bỏ một số byte.

Chương trình này lấy một chuỗi làm đối số và in nối các giá trị bảng được phân tách bằng dấu cách.

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," "))

Ungolfed và giải thích

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

Nếu bạn đang đi lang thang tại sao có một bộ biến nhưng không được sử dụng trong mã golf (biến _trong vòng lặp for), thì đây là lý do:

Bạn có 2 cách để lặp lại một mảng trong Lua, theo kiểu:

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

hoặc theo kiểu foreach:

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

Tôi đang cần các giá trị có trong bảng {8,10,16}vì chúng là các cơ sở khác nhau mà tôi phải lặp đi lặp lại. Nhưng các hàm có nhiều trả về sẽ không cho phép bạn chọn cái nào bạn thực sự muốn được trả về, chúng tuân theo một đơn đặt hàng. Để có bộ biến value, tôi cũng cần nắm bắt giá trị key: đó là cái mà chúng ta gọi là hình nộm _.


1

C (chức năng), 76

  • Lưu 2 byte nhờ @anatolyg.
  • 5 byte được lưu nhờ @luserdroog.
j,c;f(char*s){for(j=8;c=strtol(s,0,j);j=j*j/6)isprint(c)?printf("%c ",c):0;}

Ideone.


Tuyên bố "gia tăng" vòng lặp của bạn là tuyệt vời! Nó có thể được rút ngắn mặc dù.
anatolyg

j*=j,j/=6được viết đơn giản hơn làj=j*j/6
anatolyg

@anatolyg tất nhiên rồi! Tôi đã cố gắng khéo léo với việc kết hợp các toán tử - đại loại như thế j*=j/6nhưng điều đó không hiệu quả do mất độ chính xác trong quá trình phân chia số nguyên
Chấn thương kỹ thuật số

j<20,toán tử dấu phẩy loại bỏ toàn bộ ảnh hưởng của điều này.
kẻ lừa đảo rủ rê

@luserdroog Vâng - cảm ơn!
Chấn thương kỹ thuật số

0

JavaScript ES6, 89 88 byte

Đã lưu 1 byte nhờ Neil!

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

Trả về một mảng. Nếu điều đó không ổn, điều này hoạt động thêm 8 byte, hiển thị các kết quả khớp có thể.

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


Hmm, bạn cần bao nhiêu số JavaScript bắt đầu bằng 0 parse dưới dạng bát phân?
Neil

@Neil Firefox dường như hoạt động tốt với nó.
Conor O'Brien

Dường như không làm việc với 47.
Neil

@Neil Hoạt động trở lại bằng cách quay trở lại eval ...
Conor O'Brien

Ah, Number()yêu cầu 0onhưng evalhạnh phúc với chỉ 0. Xin lỗi vì sự nhầm lẫn.
Neil

0

R, 84 byte

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

sử dụng strtoiđể chuyển đổi sang từng căn cứ và sau đó chuyển đổi thành ký tự nếu trong phạm vi thích hợp. Có thể lưu thêm 4 byte bằng cách xóa catnếu chúng tôi cho phép in các ký tự mặc định (được bao bọc "")

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.