Sekizli, Ondalık mı, Onaltılı mı?


11

Yalnızca harf ve sayı içeren bir giriş dizesi verildiğinde, dizginin 8, 10 ve 16 tabanlarındaki (mümkünse) değerine karşılık gelen olası yazdırılabilir ASCII karakterlerini (Hex 20-7E) yazdıran bir program veya işlev yazın. Karakterler, karşılık geldikleri bazlar (artan ilk 8, vb.) Cinsinden artan sırada yazılmalıdır. Çıktı, dizi biçiminde (gibi [& . F]) olabilir veya örneklerde olduğu gibi boşluklarla veya satırsonlarıyla (takip eden satırsonu isteğe bağlıdır) ayrılabilir.

Oluşturulabilecek olası bir yazdırılabilir ASCII karakteri yoksa, programın çıktısı olmamalıdır.

Numuneler

31
==> 1

47
==> ' / G

69
==> E i

7A
==> z

100
==> @ d

156
==> n

189
==> <empty>

potaTO
==> <empty>

5G
==> <empty>

19
==> <empty>

Bu , bu yüzden en az bayt ile cevap kazanır. Standart kurallar geçerlidir.

Yanıtlar:


6

JavaScript (SpiderMonkey 30+), 74 bayt

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

Siz ve ES7'niz mah ES6 o_o'yu öldürüyorsunuz
Conor O'Brien

2
Hem kullandığınız zaman CᴏɴᴏʀO'Bʀɪᴇɴ @ mapve filter, dizi comprehensions gerçekten yararlıdır.
Neil

Kullanmak Herhangi bir nedenle @Neil '0'+b+...zaman bzaman bir dize olacaktır? 0+b+...
andlrc

@ dev-null Bah, codegolf.stackexchange.com/a/73323/17602'de düzelttim ama burada da yapmayı unuttum.
Neil

4

MATL , 23 24 28 bayt

@David sayesinde 1 bayt kapalı

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

Çevrimiçi deneyin!

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

DGerekli olup olmadığından emin değilim , değil mi? Vektörü oluşturmak için iyi bir çalışma, neredeyse seninle aynı şeyi yaptım ama vektörü kısaltamadım [8,10,16].
David

@David Teşekkürler! DBu durumda yığını boşaltmak için gerekli olduğunu düşündüm . Ama haklısın, değil! Teşekkürler!
Luis Mendo

1
@David ' ':'~'Bir sonraki sürüm için önceden tanımlanmış bir değişmez kelime olarak eklemem gerekiyor !
Luis Mendo

1
32:126miyi bir fikir!!
David

4

Python 3, 84 82 bayt

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 bayt

@rd\m.xCizd0[8T16

Dizi olarak çıktı. \x80Ters eğik çizgi ile C arasında bir yerine geçen bir değişmez değer var .

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

Burada deneyin .


2

Jolf, 26 bayt

Burada deneyin! Test odası

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

açıklama

 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 programları + ascii , 36

asciiYardımcı programın kullanımına izin verilip verilmediğinden emin değilim . Giriş bir komut satırı parametresi olarak alınır.

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

asciiile Ubuntu'ya kurulabilir sudo apt-get install ascii.


1

Javascript ES6, 89 karakter

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

Ölçek:

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 Bayt

Çok daha fazla golf oynayabileceğimi sanmıyorum, bunu yapmanın birçok yolunu test ettim ve en kısa zamanda gel. Kullanımdan kaldırılmış işlevi içeren eski bir derleyici kullanmak bile table.foreach(table,function)bazı baytları tıraş etmez.

Bu program, bir dizeyi bağımsız değişken olarak alır ve boşluklarla ayrılmış bir tablo değerlerinin birleşimini yazdırır.

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 ve açıklamalar

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

Neden bir değişken kümesi olduğunu ancak golf kodunda kullanılmadığını ( _for döngüsünde değişken ) geziyorsanız , neden:

Lua'da bir dizi için bir stil için yineleme yapmanın 2 yolu vardır:

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

veya bir foreach tarzında:

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

{8,10,16}Üzerinde yinelemek zorunda olduğum farklı üsleri gibi tablodaki değerlere ihtiyacım vardı. Ancak çoklu geri dönüşe sahip işlevler, gerçekte hangisini döndürmek istediğinizi seçmenize izin vermez, bir siparişi takip ederler. Değişken valuekümesi olması için , ben de değerini yakalamak gerekir key: biz kukla diyoruz _.


1

C (işlev), 76

  • @Anatolyg sayesinde 2 bayt kaydedildi.
  • @Luserdroog sayesinde 5 byte tasarruf edildi.
j,c;f(char*s){for(j=8;c=strtol(s,0,j);j=j*j/6)isprint(c)?printf("%c ",c):0;}

Ideone.


Döngü "artış" deyim harika! Yine de kısaltılabilir.
anatolyg

j*=j,j/=6daha açık yazılırj=j*j/6
anatolyg

@anatolyg tabii ki - teşekkürler! Gibi bir şey - Ben birleştirerek operatörleri ile akıllı olmaya çalışıyordu j*=j/6ama bu tamsayı bölünmesi sırasında dolayı hassasiyet kaybına işe yaramadı
Dijital Travma

j<20,virgül operatörü bunun tüm etkisini ortadan kaldırır.
luser droog

@luserdroog Evet - teşekkürler!
Dijital Travma

0

JavaScript ES6, 89 88 bayt

Neil sayesinde 1 bayt kaydedildi!

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

Bir dizi döndürür. Bu uygun değilse, olası eşleşmeleri görüntüleyen fazladan 8 bayt için çalışır.

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


Hmm, 0 ayrıştırmadan başlayarak bu sayıların sekiz yaşında bir JavaScript'e ihtiyacınız var mı?
Neil

@Neil Firefox onunla iyi çalışıyor gibi görünüyor.
Conor O'Brien

Çalışmıyor gibi görünüyor 47.
Neil

@Neil tekrar değerlendirmeye dönerek çalışır ...
Conor O'Brien

Ah, Number()gerektirir 0oama evalsadece mutludur 0. Karışıklık için özür dilerim.
Neil

0

R, 84 bayt

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

kullanımları strtoiuygun olarak bir dizi daha sonra bazlı her birine dönüştürmek ve karakter dönüştürmek. catKarakterlerin varsayılan olarak yazdırılmasına izin verdiysek (içine sarılmış "") kaldırarak 4 bayt daha kaydedebilir

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.