ASCII कैरेक्टर जंबल


24

एक प्रोग्राम लिखें जो अपने इनपुट को एक स्ट्रिंग के रूप में प्रिंट करने योग्य वर्ण (ASCII 20-7E) और एक पूर्णांक nसे युक्त करता है [2,16] और स्ट्रिंग के लिए निम्न संशोधन करता है।

  • स्ट्रिंग के प्रत्येक वर्ण को उसके ASCII कोड में बदल दिया गया है (दिए गए उदाहरण हेक्साडेसिमल में हैं, हालांकि आधार 10 भी स्वीकार्य है)।
  • ASCII कोड को आधार में बदल दिया जाता है nऔर एक साथ समेट लिया जाता है।
  • नई स्ट्रिंग हर दूसरे चरित्र को विभाजित करती है। यदि विषम संख्या में वर्ण हैं, तो अंतिम वर्ण पूरी तरह से हटा दिया जाता है।
  • मुद्रण ASCII कोड (बेस 16 में) अपने वर्णों में वापस बदल दिए जाते हैं, जबकि गैर-मुद्रण ASCII कोड हटा दिए जाते हैं।
  • परिणामी स्ट्रिंग मुद्रित होती है।

परीक्षण का मामला

इनपुट

Hello, World!
6

कदम

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

इस कार्यक्रम का आउटपुट है E001R"31$E


यह कोड गोल्फ है, इसलिए मानक नियम लागू होते हैं। बाइट्स में सबसे छोटा कोड जीतता है।


यह एन्कोडिंग एल्गोरिथ्म गुप्त संदेश भेजने के लिए उपयोगी हो सकता है!
कृति लीथोस 20

कुछ समय के लिए यह करना होगा!
anoksquirrel

@ ΣριΚικσιΛίθοΚ जबकि कार्यक्रम हर संभव इनपुट स्ट्रिंग के लिए काम करता है, न कि हर आउटपुट स्ट्रिंग अद्वितीय है। उदाहरण के लिए, आधार में 7, स्ट्रिंग Jचरणों के माध्यम से जाएगी J-> 50-> 101-> 10-> (no output), जैसा कि स्ट्रिंग Kया होगा L
आर्कटुरस

जैसे @Eridan ने कहा, यह एक हानिपूर्ण एन्क्रिप्शन है क्योंकि अजीब सीक्वेंस से आखिरी किरदार को खो दिया जाता है। हालाँकि मुझे अज्ञानी पर्यवेक्षक पर यकीन है कि यह संवादहीनता का एक
भद्दा

1
चरण 1 भ्रामक है - वर्णों को हेक्साडेसिमल में बदलने की आवश्यकता नहीं है - उदाहरण में: HASCII 72 (दशमलव) या 48 (हेक्स) है, लेकिन मुझे जो चाहिए वह 200 (बेस 6) है। उदाहरण में सभी पंक्ति 2 बेकार है और मेरी राय में भ्रमित करने वाली है
edc65

जवाबों:




3

बैश + आम लिनेक्स के बर्तन, 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'

मुझे लगता है कि आप को छोटा कर सकता है printf %s "$1"में echo -n "$1"2 बाइट्स को बचाने के लिए
हारून

@Aaron वह काम करता है जब तक इनपुट स्ट्रिंग है -eकोशिश करेंecho -n "-e"
डिजिटल ट्रामा

धिक्कार है, अच्छी तरह से देखा!
हारून

2

सीजेएम, 24 बाइट्स

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

ध्यान दें कि बीच में एक DEL वर्ण (0x7F) है 'और ,CJam दुभाषिया में इसे ऑनलाइन आज़माएं ।

यह काम किस प्रकार करता है

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 चरित्र के बारे में क्या ...? ऐसा लगता है कि आपने इसके आसपास काम किया है, लेकिन मैं इसे आपके स्पष्टीकरण में नहीं देख सकता हूं!
wizzwizz4

StackExchange अनपेक्षित वर्ण फ़िल्टर करता है। DEL वर्ण केवल थ्रू पर्मलिंक में मौजूद है, और वहां भी अदृश्य है।
डेनिस

मेरा मतलब है ... हटाना एक नियंत्रण चरित्र है, लेकिन पहले 32 पात्रों में से एक नहीं है। यह उन लोगों के लिए चरित्र संख्या 127, 0x7F है, जो ASCII से परिचित नहीं हैं।
wizzwizz4

मुझे यकीन नहीं है कि मैं आपके सवाल को समझ गया हूं। क्या आप सोच रहे हैं कि मैं इसे आउटपुट से कैसे फ़िल्टर करूं?
डेनिस

हाँ। आपका कोड स्पष्टीकरण यह कहने में नहीं लगता कि आप DELचरित्र को आउटपुट से कैसे फ़िल्टर करते हैं ।
wizzwizz4

2

जावास्क्रिप्ट (ईएस 6), 137 147

जावास्क्रिप्ट में उपलब्ध सबसे क्रिया कार्यों का उपयोग करना

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 के लिएx=>x>=
यपनिपन

मुझे लगता है कि आप [for(z of ...)if(...)...]map(...).filter(...)
Ypnypn

@Ypnypn मुझे आपके संकेत का उपयोग करने का एक तरीका नहीं मिला (इसके अलावा सरणी समझ कि ES7 का उपयोग करने के अलावा) लेकिन आपने मुझे यह सब बताने के लिए दबाव डाला। धन्यवाद। मुझे आशा है कि आप अपना +1 रखेंगे भले ही x=>x>=चला गया हो
edc65

1
ES7 का उपयोग करने में क्या गलत है?
य्प्निपन

1
@Ypnypn मुझे एक उत्तर पसंद है जो सबअपर जावास्क्रिप्ट इंजनों के साथ भी काम कर सकता है <ट्रोल> जैसे क्रोम </ ट्रोल ऑफ>
edc65

1

जूलिया, 118 बाइट्स

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

गणितज्ञ, 134 बाइट्स

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

यदि किसी कार्य की अनुमति है:

गणितज्ञ, 112 बाइट्स

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

1

टीस्क्रिप्ट, 23 बाइट्स

TeaScript गोल्फिंग के लिए जावास्क्रिप्ट है

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

अपेक्षाकृत सीधे-आगे लेकिन खुशी से कम। मैं शायद कुछ और ऑपरेटरों के साथ कुछ और पात्रों को नीचे कर सकता हूं। कुछ अन्य नई सुविधाओं को भी कुछ बाइट्स में कटौती करने के लिए इस्तेमाल किया जा सकता है।

अनप्लग्ड && स्पष्टीकरण

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

1
मेरा मानना ​​है कि यह 23 वर्ण (29 बाइट ) लंबा है।
क्रिस्टियन लुपस्कू

@ w0lf जो UTF-8 एन्कोडिंग के साथ होगा, लेकिन क्योंकि सभी वर्ण कम हैं, तो 256 हम सुरक्षित रूप से उन्हें एक बाइट के रूप में गिन सकते हैं
डाउगोएट


1

पायथन 2, 174 बाइट्स

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

इसे यहाँ आज़माएँ

वास्तव में नौकरी के लिए सबसे अच्छा साधन नहीं है। चूंकि पायथन का कोई रूपांतरित-मनमाना-आधार कार्य नहीं है, इसलिए मुझे अपना स्वयं का कार्यान्वयन करना पड़ा। यह मज़ेदार था, कम से कम - विशेष रूप से अंकों के लिए [मामूली] छोटी अभिव्यक्ति "0123456789ABCDEF"[n%b]। एक बार में दो पात्रों से अधिक के लिए, मुझे एक मिलाwhile लूप एक कार्यात्मक दृष्टिकोण से थोड़ा कम था।

एक पूर्ण कार्यक्रम के रूप में 181 बाइट्स:

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 बाइट्स

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

मैंने एक फ़ंक्शन k लिखा है जो एक स्ट्रिंग s और एक पूर्णांक n को इनपुट के रूप में लेता है । उदाहरण के लिए:

k('Hello, World!',6)

देता है

 E001R"31$E

सबसे अधिक कष्टप्रद बात जो मुझे काम करनी थी, वह आधार n को परिवर्तित करते समय दिखा रहा है । इन वर्णों से बाहर निकलना जो कि प्रत्येक 2 वर्ण की लागत के बाद अलग-अलग होना था, काफी बाइट्स थे। निश्चित नहीं है कि क्या इस दृष्टिकोण का उपयोग करके किसी भी अधिक बाइट को बचाने के लिए संभव है।


0

PHP - 286 बाइट्स

में $sऔर पूर्णांक में स्ट्रिंग रखो $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)))));?>

मान को पास करें GET["s"]

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.