Octal, décimal ou hexadécimal?

11

Étant donné une chaîne d'entrée contenant uniquement des lettres et des chiffres, écrivez un programme ou une fonction qui imprime les caractères ASCII imprimables possibles (Hex 20-7E) qui correspondent à la valeur de la chaîne dans les bases 8, 10 et 16 (si possible). Les caractères doivent être écrits en ordre croissant en fonction des bases avec lesquelles ils correspondent (base 8 d'abord, etc.). La sortie peut être au format tableau (comme [& . F]) ou séparée par des espaces ou des retours à la ligne (un retour à la ligne est facultatif) comme les échantillons.

Si aucun caractère ASCII imprimable possible ne peut être formé, le programme ne doit pas avoir de sortie.

Échantillons

31
==> 1

47
==> ' / G

69
==> E i

7A
==> z

100
==> @ d

156
==> n

189
==> <empty>

potaTO
==> <empty>

5G
==> <empty>

19
==> <empty>

Il s'agit de , donc la réponse avec le moins d'octets l'emporte. Des règles standard s'appliquent.

Arcturus
la source

Réponses:

6

JavaScript (SpiderMonkey 30+), 74 octets

s=>[for(b of'o0x')if((c=+(0+b+s))>31&c<127)String.fromCharCode(c)].join` `
Neil
la source
Vous et votre ES7 tuez mah ES6 o_o
Conor O'Brien
2
@ CᴏɴᴏʀO'Bʀɪᴇɴ Lorsque vous utilisez les deux mapet filter, les compréhensions de tableaux sont vraiment utiles.
Neil
@Neil Une raison d'utiliser '0'+b+...quand bsera toujours une chaîne? 0+b+...
andlrc
@ dev-null Bah, je l'ai corrigé dans codegolf.stackexchange.com/a/73323/17602 mais j'ai oublié de le faire ici aussi.
Neil
4

MATL , 23 24 28 octets

1 octet de moins grâce à @David

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

Essayez-le en ligne!

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
la source
Je ne sais pas si Dc'est nécessaire, n'est-ce pas? Beau travail sur la création du vecteur, j'ai fait presque la même chose que vous mais je n'ai pas pu raccourcir le vecteur [8,10,16].
David
@David Merci! J'ai pensé qu'il Détait nécessaire dans ce cas de vider la pile. Mais tu as raison, ça ne l'est pas! Merci!
Luis Mendo
1
@David J'ai besoin d'inclure ' ':'~'un littéral prédéfini pour la prochaine version!
Luis Mendo
1
32:126mest une bonne idée !!
David
4

Python 3, 84 82 octets

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

Pyth, 23 21 20 18 octets

@rd\m.xCizd0[8T16

Sortie sous forme de tableau. Il y a un littéral \x80entre la barre oblique inverse et le C, que j'ai remplacé par un .

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

Essayez-le ici .

lirtosiast
la source
2

Jolf, 26 octets

Essayez-le ici! Suite de tests

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

Explication

 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
la source
1

Bash + utilitaires GNU + ascii , 36

Je ne sais pas si l'utilisation de l' asciiutilitaire est autorisée. L'entrée est considérée comme un paramètre de ligne de commande.

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

asciipeut être installé sur Ubuntu avec sudo apt-get install ascii.

Traumatisme numérique
la source
1

Javascript ES6, 89 caractères

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

Tester:

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
la source
1

Lua, 147 octets

Je ne pense pas que je puisse jouer au golf beaucoup plus bas, j'ai testé de nombreuses façons de le faire et voici le plus court. Même en utilisant un ancien compilateur qui contient la fonction obsolètetable.foreach(table,function) ne supprime pas certains octets.

Ce programme prend une chaîne en argument et affiche la concaténation des valeurs d'une table séparées par des espaces.

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

Non golfé et explications

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

Si vous vous demandez pourquoi il y a un ensemble de variables mais non utilisé dans un code golfé (la variable _dans la boucle for), voici pourquoi:

Vous avez 2 façons d'itérer sur un tableau dans Lua, soit dans un style for:

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

ou dans un style foreach:

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

J'avais besoin des valeurs contenues dans le tableau {8,10,16}car ce sont les différentes bases sur lesquelles je dois répéter. Mais les fonctions à retours multiples ne vous permettront pas de choisir celle que vous souhaitez réellement retourner, elles suivent un ordre. Pour que la variable soit valuedéfinie, je dois également saisir la valeur de key: c'est ce que nous appelons un mannequin _.

Katenkyo
la source
1

C (fonction), 76

  • 2 octets enregistrés grâce à @anatolyg.
  • 5 octets enregistrés grâce à @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.

Traumatisme numérique
la source
Votre déclaration "incrément" de boucle est géniale! Il pourrait cependant être raccourci.
anatolyg
j*=j,j/=6 est plus clairement écrit comme j=j*j/6
anatolyg
@anatolyg bien sûr - merci! J'essayais d'être intelligent avec la combinaison des opérateurs - quelque chose comme, j*=j/6mais cela n'a pas fonctionné en raison de la perte de précision lors de la division entière
Digital Trauma
j<20, l'opérateur de virgule supprime tout l'effet de cela.
luser droog
@luserdroog Oui - merci!
Digital Trauma
0

JavaScript ES6, 89 88 octets

1 octet enregistré grâce à Neil!

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

Renvoie un tableau. Si ce n'est pas correct, cela fonctionne pour 8 octets supplémentaires, affichant les correspondances possibles.

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

Conor O'Brien
la source
Hmm, quel âge un JavaScript avez-vous besoin de ces nombres commençant par 0 en octal?
Neil
@Neil Firefox semble fonctionner correctement.
Conor O'Brien
Ne semble pas fonctionner avec 47.
Neil
@Neil fonctionne à nouveau en revenant à eval ...
Conor O'Brien
Ah, Number()exige 0omais evalest content de juste 0. Désolé pour la confusion.
Neil
0

R, 84 octets

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

utilise strtoipour convertir à chacune des bases, puis convertir en caractère si dans la plage appropriée. Pourrait économiser 4 octets supplémentaires en supprimant catsi nous autorisions l'impression par défaut des caractères (enveloppé "")

mnel
la source