Восьмеричное, десятичное или шестнадцатеричное?

11

Для заданной входной строки, содержащей только буквы и цифры, напишите программу или функцию, которая печатает возможные печатаемые символы ASCII (Hex 20-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>

Это , поэтому выигрывает ответ с наименьшим количеством байтов. Стандартные правила применяются.

Арктур
источник

Ответы:

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
Конор О'Брайен
2
@ CᴏɴᴏʀO'Bʀɪᴇɴ Когда вы используете оба mapи filter, массивы действительно полезны.
Нил
@Neil Любая причина использовать, '0'+b+...когда bвсегда будет строка? 0+b+...
andlrc
@ dev-null Бах, я исправил это в codegolf.stackexchange.com/a/73323/17602, но забыл сделать это и здесь.
Нил
4

MATL , 23 24 28 байт

1 байт благодаря @David

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].
Дэвид
@ Дэвид Спасибо! Я думал, что Dв этом случае необходимо очистить стек. Но ты прав, это не так! Благодаря!
Луис Мендо
1
@ Давид Мне нужно включить ' ':'~'в качестве предопределенного литерала для следующего выпуска!
Луис Мендо
1
32:126mэто хорошая идея!
Дэвид
4

Python 3, 84 82 байта

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 байт

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

Попробуй это здесь .

lirtosiast
источник
2

Джольф, 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,,,,"
Qwertiy
источник
1

Луа, 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), вот почему:

У вас есть 2 способа перебора массива в 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: это то, что мы называем фиктивной _.

Katenkyo
источник
1

С (функция), 76

  • 2 байта сохранены благодаря @anatolyg.
  • 5 байтов сохранено благодаря @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.

Цифровая травма
источник
Ваш оператор "инкремента" цикла потрясающий! Это может быть сокращено, хотя.
anatolyg
j*=j,j/=6более ясно написано какj=j*j/6
Анатолий
@anatolyg, конечно, спасибо! Я пытался быть умным с объединением операторов - что-то вроде этого, j*=j/6но это не сработало из-за потери точности при целочисленном делении
Digital Trauma
j<20,оператор запятой отбрасывает весь эффект этого.
luser droog
@luserdroog Да, спасибо!
Цифровая травма
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, анализировались как восьмеричные?
Нил
@ Нил Firefox, кажется, работает хорошо с этим.
Конор О'Брайен
Кажется, не работает с 47.
Нил
@Neil снова работает, вернувшись обратно в Eval ...
Конор О'Брайен
Ну, Number()требует 0oно evalдоволен всего 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для преобразования в каждую из баз, а затем для преобразования в символ, если находится в соответствующем диапазоне. Можно было бы сохранить еще 4 байта, удалив, catесли бы мы разрешили печать символов по умолчанию (завернутые "")

mnel
источник