Nhân vật ASCII lộn xộn


24

Viết chương trình lấy chuỗi của nó bao gồm các ký tự có thể in (ASCII 20-7E) và một số nguyên ntrong [2,16] và thực hiện sửa đổi sau cho chuỗi.

  • Mỗi ký tự trong chuỗi được chuyển đổi thành mã ASCII của nó (các ví dụ đã cho là ở hệ thập lục phân, mặc dù cơ sở 10 cũng được chấp nhận).
  • Các mã ASCII được chuyển đổi thành cơ sở nvà được nối với nhau.
  • Chuỗi mới được phân chia mọi ký tự khác. Nếu có một số lượng ký tự lẻ, thì ký tự cuối cùng sẽ bị xóa hoàn toàn.
  • In mã ASCII (trong cơ sở 16) được chuyển đổi trở lại thành ký tự của chúng, trong khi mã ASCII không in được xóa.
  • Chuỗi kết quả được in.

Trường hợp thử nghiệm

Đầu vào

Hello, World!
6

Các bước

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

Đầu ra của chương trình này là E001R"31$E.


Đây là mã golf, vì vậy các quy tắc tiêu chuẩn được áp dụng. Mã ngắn nhất trong byte thắng.


Thuật toán mã hóa này có thể hữu ích để gửi tin nhắn bí mật!
Kritixi Lithos

Thỉnh thoảng hãy làm điều này!
anOKsquirrel 4/11/2015

@ Κρτκσ trong khi chương trình hoạt động cho mọi chuỗi đầu vào có thể, không phải mọi chuỗi đầu ra là duy nhất. Ví dụ, trong cơ sở 7, chuỗi Jsẽ trải qua các bước J-> 50-> 101-> 10-> (no output), cũng như chuỗi Khoặc L.
Arcturus

Giống như @Eridan đã nói, đây là một mã hóa bị mất do các chuỗi lẻ đưa ký tự cuối cùng bị loại bỏ. Mặc dù tôi chắc chắn với người quan sát không biết gì, đó có thể là một cách giao tiếp
lén lút

1
Bước 1 khó hiểu - không cần chuyển đổi ký tự thành thập lục phân - trong ví dụ: Hlà ASCII 72 (thập phân) hoặc 48 (hex), nhưng cái tôi cần là 200 (cơ sở 6). Tất cả hàng 2 trong ví dụ là vô dụng và khó hiểu theo ý kiến ​​của tôi
edc65

Câu trả lời:




3

Bash + tiện ích linux phổ biến, 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'

Tôi nghĩ rằng bạn có thể rút ngắn printf %s "$1"vào echo -n "$1"để tiết kiệm 2 byte
Aaron

@Aaron Điều đó hoạt động cho đến khi chuỗi đầu vào là -e. Thửecho -n "-e"
Chấn thương kỹ thuật số

Chết tiệt, độc đáo phát hiện!
Aaron

2

CJam, 24 byte

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

Lưu ý rằng có một ký tự DEL (0x7F) giữa ',. Dùng thử trực tuyến trong thông dịch CJam .

Làm thế nào nó hoạt động

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.

Còn nhân vật DEL thì sao ...? Có vẻ như bạn đã làm việc xung quanh điều đó, nhưng tôi không thể thấy điều đó trong lời giải thích của bạn!
wizzwizz4

StackExchange lọc các ký tự không thể in. Nhân vật DEL chỉ hiện diện trong permalink, và vô hình ngay cả ở đó.
Dennis

Ý tôi là ... Xóa là một ký tự điều khiển, nhưng không phải là một trong 32 ký tự đầu tiên. Đó là ký tự số 127, 0x7F, dành cho những người không quen thuộc với ASCII.
wizzwizz4

Tôi không chắc là tôi hiểu câu hỏi của bạn. Bạn đang tự hỏi làm thế nào tôi lọc nó từ đầu ra?
Dennis

Vâng. Giải thích mã của bạn dường như không nói cách bạn lọc DELký tự từ đầu ra.
wizzwizz4

2

JavaScript (ES6), 137 147

Sử dụng các hàm dài nhất có sẵn trong JavaScript

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 chox=>x>=
Ypnypn

Tôi nghĩ bạn có thể lưu một số byte bằng cách sử dụng [for(z of ...)if(...)...]thay vìmap(...).filter(...)
Ypnypn

@Ypnypn Tôi không tìm thấy cách sử dụng gợi ý của bạn (ngoài việc sử dụng hiểu mảng là ES7) nhưng bạn đã ép tôi phải suy nghĩ lại tất cả. Cám ơn. Tôi hy vọng bạn sẽ giữ +1 của mình ngay cả khi x=>x>=đã hết
edc65

1
Có gì sai khi sử dụng ES7?
Ypnypn

1
@Ypnypn Tôi thích một câu trả lời có thể hoạt động ngay cả với các công cụ javascript phụ <troll on> như Chrome </ troll off>
edc65

1

Julia, 118 byte

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

Ung dung:

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

Toán học, 134 byte

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

Nếu một chức năng được cho phép:

Toán học, 112 byte

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

1

TeaScript, 23 byte

TeaScript là JavaScript để chơi gôn

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

Tương đối đơn giản nhưng ngắn gọn thú vị. Tôi có thể chơi golf thêm một vài nhân vật với một số nhà khai thác nữa. Một vài tính năng mới khác cũng có thể được sử dụng để cắt giảm một số byte.

Ungolfed && Giải thích

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

1
Tôi tin rằng đây là 23 ký tự (29 byte ).
Cristian Lupascu

@ w0lf Điều đó sẽ xảy ra với mã hóa UTF-8 nhưng vì tất cả các ký tự đều nhỏ hơn 256 nên chúng tôi có thể đếm chúng một cách an toàn dưới dạng một byte
Downgoat

1

Hồng ngọc 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}

Kiểm tra trực tuyến tại đây .


1

Python 2, 174 byte

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

Hãy thử nó ở đây

Không thực sự là công cụ tốt nhất cho công việc. Vì Python không có chức năng chuyển đổi thành cơ sở tùy ý, tôi phải tự thực hiện. Điều đó thật thú vị, ít nhất - đặc biệt là tìm một biểu thức ngắn hơn [lề] cho các chữ số hơn "0123456789ABCDEF"[n%b]. Để lặp lại hai ký tự cùng một lúc, tôi thấy một whilevòng lặp ngắn hơn một chút so với cách tiếp cận chức năng.

181 byte là một chương trình đầy đủ:

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 byte

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

Tôi đã viết một hàm k lấy một chuỗi s và một số nguyên n làm đầu vào. ví dụ:

k('Hello, World!',6)

cho

 E001R"31$E

Điều khó chịu nhất mà tôi phải làm việc xung quanh là các số 0 xuất hiện khi chuyển đổi sang cơ sở n . Việc đưa chúng ra khỏi mảng sẽ được phân tách sau mỗi ký tự thứ 2 tốn khá nhiều byte. Không chắc chắn nếu có thể lưu thêm bất kỳ byte nào bằng cách sử dụng phương pháp này.


0

PHP - 286 byte

Đặt chuỗi vào $svà số nguyên trong $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)))));?>

Truyền giá trị cho GET["s"].

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.