Ottale, decimale o esadecimale?


11

Data una stringa di input contenente solo lettere e numeri, scrivere un programma o una funzione che stampa i possibili caratteri ASCII stampabili (esadecimale 20-7E) che corrispondono al valore della stringa nelle basi 8, 10 e 16 (ove possibile). I caratteri devono essere scritti in ordine crescente in base alle basi con cui corrispondono (prima la base 8, ecc.). L'output può essere in formato array (come [& . F]) o separato da spazi o newline (una newline finale è opzionale) come i campioni.

Se non è possibile formare un possibile carattere ASCII stampabile, il programma non deve avere alcun output.

Campioni

31
==> 1

47
==> ' / G

69
==> E i

7A
==> z

100
==> @ d

156
==> n

189
==> <empty>

potaTO
==> <empty>

5G
==> <empty>

19
==> <empty>

Questo è , quindi vince la risposta con il minor numero di byte. Si applicano le regole standard.

Risposte:


6

JavaScript (SpiderMonkey 30+), 74 byte

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

Tu e il tuo ES7 state uccidendo mah ES6 o_o
Conor O'Brien,

2
@ CᴏɴᴏʀO'Bʀɪᴇɴ Quando si utilizzano entrambi mape filter, la comprensione dell'array è davvero utile.
Neil,

@Neil Qualche motivo per usare '0'+b+...quando bsarà sempre una stringa? 0+b+...
Andlrc,

@ dev-null Bah, l'ho corretto in codegolf.stackexchange.com/a/73323/17602 ma ho dimenticato di farlo anche qui.
Neil,

4

MATL , 23 24 28 byte

1 byte spento grazie a @David

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

Provalo 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

Non sono sicuro che Dsia necessario, vero? Bel lavoro sulla creazione del vettore, ho fatto quasi lo stesso di te ma non ho potuto accorciare il vettore [8,10,16].
David,

@ Grazie David! Ho pensato che Din questo caso fosse necessario svuotare la pila. Ma hai ragione, non lo è! Grazie!
Luis Mendo,

1
@ David Devo includere ' ':'~'come valore letterale predefinito per la prossima versione!
Luis Mendo,

1
32:126mè una buona idea !!
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

Output come un array. C'è un letterale \x80tra la barra rovesciata e la C, che ho sostituito con 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).

Provalo qui .


2

Jolf, 26 byte

Provalo qui! Suite di test

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

Spiegazione

 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 + utility GNU + ascii , 36

Non sono sicuro se l'uso asciidell'utilità sia consentito. L'input viene considerato come parametro della riga di comando.

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

asciipuò essere installato su Ubuntu con sudo apt-get install ascii.


1

Javascript ES6, 89 caratteri

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

Test:

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

Non credo di poter giocare a golf molto di più, ho testato molti modi per farlo, e qui arriva il più breve. Anche l'utilizzo di un vecchio compilatore che contiene la funzione obsoleta table.foreach(table,function)non elimina alcuni byte.

Questo programma accetta una stringa come argomento e stampa la concatenazione dei valori di una tabella separati da spazi.

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 e spiegazioni

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

Se stai vagando perché c'è un set di variabili ma non utilizzato in un codice golf (la variabile _nel ciclo for), ecco perché:

Hai 2 modi per iterare su un array in Lua, in uno stile:

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

o in stile foreach:

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

Avevo bisogno dei valori contenuti nella tabella {8,10,16}in quanto sono le diverse basi su cui devo scorrere. Ma le funzioni con ritorno multiplo non ti permetteranno di scegliere quale vuoi effettivamente essere restituito, ma seguono un ordine. Per valueimpostare la variabile , devo anche cogliere il valore key: questo è ciò che chiamiamo un manichino _.


1

C (funzione), 76

  • 2 byte salvati grazie a @anatolyg.
  • 5 byte salvati grazie a @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.


L'istruzione "increment" del tuo loop è fantastica! Potrebbe essere abbreviato però.
Anatolyg,

j*=j,j/=6è più chiaramente scritto comej=j*j/6
anatolyg il

@anatolyg ovviamente -grazie! Stavo cercando di essere intelligente nel combinare gli operatori - qualcosa di simile j*=j/6ma che non funzionava a causa della perdita di precisione durante la divisione dei numeri interi
Trauma digitale

j<20,l'operatore virgola ignora l'intero effetto di questo.
Luser droog

@luserdroog Sì, grazie!
Trauma digitale

0

JavaScript ES6, 89 88 byte

Salvato 1 byte grazie a Neil!

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

Restituisce un array. Se non va bene, questo funziona per altri 8 byte, visualizzando le possibili corrispondenze.

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


Hmm, quanti anni hai bisogno di un JavaScript per cui i numeri che iniziano con 0 analizzano come ottale?
Neil,

@Neil Firefox sembra funzionare bene con esso.
Conor O'Brien,

Non sembra funzionare con 47.
Neil,

@Neil Funziona di nuovo tornando alla valutazione ...
Conor O'Brien,

Ah, Number()richiede 0oma evalè contento di solo 0. Dispiace per la confusione.
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))}

utilizza strtoiper convertire in ciascuna delle basi e quindi convertire in carattere se nell'intervallo appropriato. Potrebbe salvare altri 4 byte rimuovendo catse consentissimo la stampa predefinita dei caratteri (racchiusa "")

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.