Восьмі, десяткові або шістнадцяткові?


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 вбиваєте mah ES6 o_o
Conor O'Brien

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].
Девід

@David Дякую! Я вважав за Dнеобхідне в цьому випадку спорожнити стопку. Але ти маєш рацію, це не так! Дякую!
Луїс Мендо

1
@David Мені потрібно включити ' ':'~'як попередньо визначений літерал для наступного випуску!
Луїс Мендо

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

Спробуйте тут .



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

Луа, 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 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: саме так ми називаємо манекен _.


1

C (функція), 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;}

Ідеон.


Ваше твердження про "приріст" циклу - приголомшливо! Це можна було б скоротити.
anatolyg

j*=j,j/=6j=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 розбору як восьмеричного?
Ніл

@Neil Firefox, здається, добре працює з цим.
Conor O'Brien

Здається, це не працює 47.
Ніл

@Neil знову працює, повертаючись назад до eval ...
Conor O'Brien

Ах, 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якщо ми дозволили друкувати символи за замовчуванням (обгорнуті "")

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.