Oktal, Desimal, atau Heksadesimal?

11

Diberikan string input yang hanya berisi huruf dan angka, tulis sebuah program atau fungsi yang mencetak karakter ASCII yang mungkin dicetak (Hex 20-7E) yang sesuai dengan nilai string dalam basis 8, 10, dan 16 (jika mungkin). Karakter harus ditulis dalam urutan yang meningkat dalam hal basis yang sesuai (basis 8 pertama, dll). Outputnya bisa dalam format array (seperti [& . F]) atau dipisahkan oleh spasi atau baris baru (baris tambahan adalah opsional) seperti sampel.

Jika tidak ada karakter ASCII yang dapat dicetak yang dapat dibentuk, program tidak boleh memiliki output apa pun.

Sampel

31
==> 1

47
==> ' / G

69
==> E i

7A
==> z

100
==> @ d

156
==> n

189
==> <empty>

potaTO
==> <empty>

5G
==> <empty>

19
==> <empty>

Ini adalah , jadi jawabannya dengan byte paling sedikit menang. Aturan standar berlaku.

Arcturus
sumber

Jawaban:

6

JavaScript (SpiderMonkey 30+), 74 byte

s=>[for(b of'o0x')if((c=+(0+b+s))>31&c<127)String.fromCharCode(c)].join` `
Neil
sumber
Anda dan ES7 Anda membunuh mah ES6 o_o
Conor O'Brien
2
@CᴏɴᴏʀO'Bʀɪᴇɴ Saat Anda menggunakan keduanya mapdan filter, pemahaman array sangat berguna.
Neil
@Neil Ada alasan untuk menggunakan '0'+b+...kapan bakan selalu menjadi string? 0+b+...
andlrc
@ dev-null Bah, saya memperbaikinya di codegolf.stackexchange.com/a/73323/17602 tapi lupa melakukannya di sini juga.
Neil
4

MATL , 23 24 28 byte

1 byte off berkat @David

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

Cobalah online!

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
Luis Mendo
sumber
Saya tidak yakin apakah Ditu perlu, bukan? Pekerjaan yang bagus untuk membuat vektor, saya melakukan hampir sama seperti Anda tetapi tidak dapat mempersingkat vektor dari [8,10,16].
David
@ David Terima kasih! Saya pikir Dperlu dalam hal ini untuk mengosongkan tumpukan. Tapi kau benar, bukan! Terima kasih!
Luis Mendo
1
@ David Saya harus memasukkan ' ':'~'sebagai literal yang telah ditentukan untuk rilis berikutnya!
Luis Mendo
1
32:126madalah ide yang bagus !!
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
Cameron Aavik
sumber
3

Pyth, 23 21 20 18 byte

@rd\m.xCizd0[8T16

Output sebagai array. Ada literal \x80antara garis miring terbalik dan C, yang telah saya ganti dengan 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).

Coba di sini .

lirtosiast
sumber
2

Jolf, 26 byte

Coba di sini! Suite uji

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

Penjelasan

 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.
Conor O'Brien
sumber
1

Utilitas Bash + GNU + ascii , 36

Tidak yakin apakah penggunaan asciiutilitas diizinkan. Input diambil sebagai parameter commandline.

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

asciidapat diinstal pada Ubuntu dengan sudo apt-get install ascii.

Trauma Digital
sumber
1

Javascript ES6, 89 karakter

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

Uji:

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,,,,"
Qwertiy
sumber
1

Lua, 147 Bytes

Saya tidak berpikir saya bisa bermain golf lebih banyak, saya sudah menguji banyak cara untuk melakukannya, dan inilah yang terpendek. Bahkan menggunakan kompiler lama yang berisi fungsi yang sudah tidak digunakan lagitable.foreach(table,function) tidak mengurangi beberapa byte.

Program ini mengambil string sebagai argumen, dan mencetak rangkaian nilai tabel yang dipisahkan oleh spasi.

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

Tidak disatukan dan penjelasan

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

Jika Anda bingung mengapa ada set variabel tetapi tidak digunakan dalam kode golf (variabel _dalam for loop), inilah alasannya:

Anda memiliki 2 cara untuk beralih pada array di Lua, baik dengan gaya for:

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

atau dalam gaya foreach:

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

Saya membutuhkan nilai-nilai yang terkandung dalam tabel {8,10,16}karena mereka adalah pangkalan yang berbeda yang harus saya ulangi. Tetapi fungsi-fungsi dengan pengembalian berganda tidak memungkinkan Anda untuk memilih mana yang sebenarnya ingin Anda kembalikan, mereka mengikuti pesanan. Untuk memiliki valueset variabel , saya perlu menangkap nilai keyjuga: itu yang kita sebut dummy _.

Katenkyo
sumber
1

C (fungsi), 76

  • 2 byte disimpan berkat @anatolyg.
  • 5 byte disimpan berkat @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.

Trauma Digital
sumber
Pernyataan "kenaikan" loop Anda mengagumkan! Itu bisa dipersingkat.
anatolyg
j*=j,j/=6lebih jelas ditulis sebagaij=j*j/6
anatolyg
@anatolyg tentu saja -Terima kasih! Saya mencoba untuk menjadi pintar dengan menggabungkan operator - sesuatu seperti j*=j/6tapi itu tidak berhasil karena kehilangan presisi selama pembagian integer
Digital Trauma
j<20,operator koma membuang seluruh efek ini.
luser droog
@luserdroog Ya - terima kasih!
Digital Trauma
0

JavaScript ES6, 89 88 byte

Disimpan 1 byte berkat Neil!

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

Mengembalikan array. Jika tidak apa-apa, ini berfungsi untuk tambahan 8 byte, menampilkan kemungkinan yang cocok.

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

Conor O'Brien
sumber
Hmm, berapa umur JavaScript yang Anda perlukan angka yang dimulai dengan 0 parse sebagai oktal?
Neil
@Neil Firefox sepertinya berfungsi dengan baik.
Conor O'Brien
Sepertinya tidak bekerja 47.
Neil
@Neil Bekerja lagi dengan kembali ke eval ...
Conor O'Brien
Ah, Number()membutuhkan 0otapi evalsenang dengan hanya 0. Maaf bila membingungkan.
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))}

menggunakan strtoiuntuk mengkonversi ke masing-masing pangkalan dan kemudian dikonversi ke karakter jika dalam kisaran yang sesuai. Dapat menyimpan 4 byte lebih banyak dengan menghapus catjika kami mengizinkan pencetakan karakter default (terbungkus dalam "")

mnel
sumber