ASCII Karakter Karmakarışıklığı


24

Girdi olarak basılabilir karakterlerden (ASCII 20-7E) oluşan bir dize ve n[2,16] 'da bir tamsayı alan ve dizede aşağıdaki değişiklikleri yapan bir program yazın .

  • Dizedeki her karakter ASCII koduna dönüştürülür (verilen örnekler onaltılıktır, ancak taban 10 da kabul edilebilir).
  • ASCII kodları tabana dönüştürülür nve birlikte birleştirilir.
  • Yeni dize diğer her karaktere bölünmüştür. Tek sayıda karakter varsa, son karakter tamamen kaldırılır.
  • ASCII kodlarını yazdırma (taban 16'da) karakterlerine geri dönüştürülürken, yazdırılmayan ASCII kodları kaldırılır.
  • Sonuçta ortaya çıkan dize yazdırılır.

Test durumu

Giriş

Hello, World!
6

adımlar

Hello, World!
48 65 6C 6C 6F 2C 20 57 6F 72 6C 64 21
2002453003003031125222330331030024453
20 02 45 30 03 00 30 31 12 52 22 33 03 31 03 00 24 45

Bu programın çıktısı E001R"31$E.


Bu kod golf, yani standart kurallar geçerlidir. Bayt cinsinden en kısa kod kazanır.


Bu kodlama algoritması gizli mesajlar göndermek için yararlı olabilir!
Kritixi Lithos

Bunu bir ara yapmalıyım!
anOKsquirrel

@ ΚριτικσιΛίθος, program her girdi dizgisi için çalışırken, her çıktı dizgisi benzersiz değildir. Örneğin, temel olarak 7, dize J, J- veya - gibi - - - - - - - 50- adımlarına gider . 10110(no output)KL
Arcturus

@Eridan'ın dediği gibi, bu kayıp sıralı şifrelemedir, çünkü garip diziler son karakterin çoğalmasına neden olur. Her ne kadar cahil gözlemciden emin
olmama rağmen

1
Adım 1 kafa karıştırıcıdır - karakterleri onaltılık alana dönüştürmeye gerek yoktur - örnekte: HASCII 72 (ondalık) veya 48 (altıgen), fakat ihtiyacım olan 200 (temel 6). Örnekteki tüm 2. satır bence işe yaramaz ve kafa karıştırıcıdır
edc65 23

Yanıtlar:




3

Bash + ortak linux araçları, 118

printf %s "$1"|xxd -p|sed -r "s/../\U& /g;y/ /n/;s/^/dc -e$2o16i/e;s/../& /g;s/ .$//;"|xxd -rp|sed 's/[^[:print:]]//g'

Sana kısaltmak düşünüyorum printf %s "$1"içine echo -n "$1"2 bayt kaydetmek
Aaron

@Aaron Giriş dizgisi olana kadar çalışır -e. Deneyinecho -n "-e"
Dijital Travma

Kahretsin, güzel lekeli!
Aaron

2

CJam, 24 bayt

l:irifbe_2/{Gbc',32>&}/

'Ve arasında bir DEL karakteri (0x7F) olduğunu unutmayın ,. CJam tercümanında çevrimiçi olarak deneyin .

Nasıl çalışır

l:i                     Read a line from STDIN and cast each char to integer. 
   ri                   Read another integer (base) from STDIN.
     fb                 Convert each integer from line 1 to that base.
       e_2/             Flatten and split into chunks of length 2.
                        If the last chunk has only one element, it will get
                        converted into a control character, which will be
                        removed later.
          {         }/  For each digit pair:
           Gb             Convert the pair from base 16 to integer.
             c            Cast to character.
              ',          Push the string of ASCII characters up to '~'.
                32>       Remove the first 32 (control characters).
                   &      Intersect.

DEL karakteri ne olacak? Bunun üzerinde çalıştın gibi gözüküyor, ama açıklamasında göremiyorum!
wizzwizz4

StackExchange yazdırılamayan karakterleri filtreler. DEL karakteri sadece thr permalink'te bulunur ve orada bile görünmez.
Dennis

Yani ... Sil bir kontrol karakteridir, ancak ilk 32 karakterden biri değildir. ASCII'ye aşina olmayan insanlar için karakter numarası 127, 0x7F'dir.
wizzwizz4

Sorunu anladığımdan emin değilim. Çıktıdan nasıl filtrelediğimi merak ediyor musunuz?
Dennis

Evet. Kod açıklamanız, DELkarakteri çıktıdan nasıl filtrelendiğinizi gösteriyor gibi görünmüyor .
wizzwizz4

2

JavaScript (ES6), 137 147

JavaScript'te mevcut en ayrıntılı işlevleri kullanma

f=(s,b)=>alert(s.replace(/./g,x=>x.charCodeAt().toString(b)).match(/../g).map(x=>(x=String.fromCharCode('0x'+x))<='~'&x>' '?x:'').join``)

// Just for test purpose, redefine alert()
alert=x=>document.write('<pre>'+x+'</pre>')

f('Hello, World!',6)
f('PORK',3)


+1 içinx=>x>=
Ypnypn

Bunun [for(z of ...)if(...)...]yerine bazı baytları kaydedebileceğinizi düşünüyorummap(...).filter(...)
Ypnypn

@Ypnypn İpucunuzu kullanmanın bir yolunu bulamadım (ES7 olan dizi kavrayışını kullanmak dışında) ama hepsini yeniden düşünmek için bana bastınız. Teşekkürler. Ben size 1 bile devam edeceğiz umut x=>x>=gitti
edc65

1
ES7 kullanmanın nesi yanlış?
Ypnypn

1
@Ypnypn Subpar javascript motorlarıyla bile çalışabilen bir cevabı tercih ediyorum <troll on> Chrome gibi </ troll off>
edc65

1

Julia, 118 bayt

f(s,n)=join(map(i->(c=string(Char(parse(Int,i,16))))^isprint(c),matchall(r"..",join(map(i->base(n,Int(i)),[s...])))))

Ungolfed:

function f(s::AbstractString, n::Integer)
    # Construct an array of ASCII codes in base n
    v = map(i -> base(n, Int(i)), [s...])

    # Join into a string and get all pairs, truncating
    # to an even length
    m = matchall(r"..", join(v))

    # Parse each pair as an integer in base 16, get the
    # character associated with that code point, convert
    # to a string, and include if it's printable
    x = map(i -> (c = string(Char(parse(Int, i, 16)))^isprint(c), m)

    # Join as a string and return
    return join(x)
end

1

Mathematica, 134 bayt

Print@FromCharacterCode@Select[#~FromDigits~16&/@StringPartition[""<>ToCharacterCode@InputString[]~IntegerString~Input[],2],31<#<127&]

Bir işleve izin verilirse:

Mathematica, 112 bayt

FromCharacterCode@Select[#~FromDigits~16&/@StringPartition[""<>ToCharacterCode@#~IntegerString~#2,2],31<#<127&]&

1

TeaScript, 23 bayt

TeaScript golf oynamak için JavaScript

£lc¡T(y©K(2)ßC(P(l,16±µ

Nispeten dümdüz ileri ve nefis kısa. Muhtemelen biraz daha fazla operatörle birkaç karakter daha oynayabilirim. Bazı yeni özellikleri, bazı baytları kesmek için de kullanabilirsiniz.

Ungolfed ve Açıklama

x.l(#
    l.c().T(y)
).K(2)
.m(#
    C(
      P(l,16)
    )
).j``

1
Bunun 23 karakter (29 bayt ) uzun olduğuna inanıyorum .
Cristian Lupascu

@ w0lf Bu UTF-8 kodlaması ile olurdu ancak tüm karakterlerin 256'dan küçük olması nedeniyle bunları güvenle bir bayt olarak sayabiliriz
Downgoat 5:15

1

Ruby 92

->s,n{o=''
s.chars.map{|x|x.ord.to_s n}.join.scan(/../).map{|x|x>?2&&x<?8&&o<<x.to_i(16)}
o}

Çevrimiçi test burada .


1

Python 2, 174 bayt

def J(a,b,i=0):
 h=r=''
 B=lambda n,b:n*'x'and B(n/b,b)+chr(48+n%b+7*(n%b>9))
 for c in a:h+=B(ord(c),b)
 while i<len(h):v=int(h[i:i+2],16);r+=chr(v)*(31<v<127);i+=2
 print r

Burada dene

İş için gerçekten en iyi araç değil. Python'un isteğe bağlı bir temel işlevine dönüşmediği için, kendimi uygulamak zorunda kaldım. En azından eğlenceliydi - özellikle rakamlar için [marjinal olarak] daha kısa bir ifade bulmak"0123456789ABCDEF"[n%b] . Bir seferde iki karakterden whilefazla tekrarlamak için, bir döngünün fonksiyonel bir yaklaşımdan biraz daha kısa olduğunu gördüm .

Tam program olarak 181 bayt:

B=lambda n,b:n*'x'and B(n/b,b)+chr(48+n%b+7*(n%b>9))
a=raw_input()
b=input()
h=r=''
for c in a:h+=B(ord(c),b)
i=0
while i<len(h):v=int(h[i:i+2],16);r+=chr(v)*(31<v<127);i+=2
print r

0

MATLAB, 103 bayt

function k(s,n),b=dec2base(s,n)';b(~cumsum(b-'0',1))='';c=base2dec(textscan(b,'%2c'),16)';char(c(c>31))

S dizgesini ve n olarak bir tamsayıyı alan bir fonksiyon k yazdım . Örneğin:

k('Hello, World!',6)

verir

 E001R"31$E

Çalışmam gereken en sinir bozucu şey n üssüne dönüştürürken ortaya çıkan sıfırlardan oluşuyor . Bunları her 2. karakterden sonra bölünecek olan diziden çıkarmak oldukça fazla sayıda bayta mal oldu. Bu yaklaşımı kullanarak daha fazla byte kaydetmenin mümkün olup olmadığından emin değilsiniz.


0

PHP - 286 bayt

Dize $sve tamsayı içeri girin $b.

<?php $s=$_GET["s"];$b;$m="array_map";echo implode($m(function($v){return ctype_print($v)?$v:"";},$m("chr",$m("hexdec",str_split(strlen(implode($a=$m(function($v){global$b;return base_convert($v,16,$b);},$m("dechex",$m("ord",str_split($s))))))%2==1?substr(implode($a),0,-1):$a,2)))));?>

Değeri için iletin GET["s"].

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.