अष्टाधारी, दशमलव, या हेक्साडेसिमल?


11

केवल अक्षरों और संख्याओं वाली एक इनपुट स्ट्रिंग को देखते हुए, एक प्रोग्राम या फ़ंक्शन लिखें जो संभव मुद्रण योग्य ASCII वर्ण (हेक्स 20-7 ई) को प्रिंट करता है जो स्ट्रिंग 8, 10 और 16 के स्ट्रिंग मान के साथ मेल खाता है (जहां संभव हो)। पात्रों को उन आधारों के संदर्भ में बढ़ते क्रम में लिखा जाना चाहिए जिनके साथ वे (आधार 8 प्रथम, आदि) पत्राचार करते हैं। आउटपुट सरणी प्रारूप में हो सकता है (जैसे [& . F]) या रिक्त स्थान या newlines (एक अनुगामी न्यूलाइन वैकल्पिक है) के नमूनों की तरह अलग।

यदि कोई संभावित मुद्रण योग्य ASCII वर्ण नहीं बन सकता है, तो प्रोग्राम में कोई आउटपुट नहीं होना चाहिए।

नमूने

31
==> 1

47
==> ' / G

69
==> E i

7A
==> z

100
==> @ d

156
==> n

189
==> <empty>

potaTO
==> <empty>

5G
==> <empty>

19
==> <empty>

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

जवाबों:


6

जावास्क्रिप्ट (स्पाइडरमैन 30+), 74 बाइट्स

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

आप और आपका ES7, माह ES6 o_o को मार रहे हैं
कॉनर ओ'ब्रायन

2
@ C @O'Bʀɪᴇɴ जब आप दोनों का उपयोग कर रहे हैं mapऔर filter, सरणी समझ वास्तव में उपयोगी है।
नील

@ नील का उपयोग करने का कोई कारण '0'+b+...जब bहमेशा एक तार होगा? 0+b+...
-lrc

@ देव-नल बाह, मैंने इसे कोडगॉल्फ.स्टैकएक्सचेंज . com/a/73323/17602 में तय किया, लेकिन यहां भी करना भूल गया।
नील

4

MATL , 23 24 28 बाइट्स

1 बाइट @David की बदौलत

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

इसे ऑनलाइन आज़माएं!

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

मुझे यकीन नहीं है कि क्या Dयह आवश्यक है, है? वेक्टर बनाने पर अच्छा काम, मैंने लगभग आपके जैसा ही किया, लेकिन वेक्टर को छोटा नहीं कर सका [8,10,16]
डेविड

@ डेविड धन्यवाद! मुझे लगा कि Dइस मामले में स्टैक खाली करना आवश्यक है। लेकिन तुम सही हो, यह नहीं है! धन्यवाद!
लुइस मेंडो

1
@ डेविड मुझे ' ':'~'अगली रिलीज़ के लिए पूर्वनिर्धारित शाब्दिक के रूप में शामिल करने की आवश्यकता है !
लुइस मेंडो

1
32:126mयह अच्छी तरकीब है!!
डेविड


3

पायथ, 23 21 20 18 बाइट्स

@rd\m.xCizd0[8T16

एक सरणी के रूप में आउटपुट। वहाँ पीछे \x80और सी के बीच एक शाब्दिक है, जिसे मैंने एक के साथ बदल दिया है

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

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



1

बैश + जीएनयू उपयोगिताओं + एशियासी , 36

सुनिश्चित नहीं है कि asciiउपयोगिता के उपयोग की अनुमति है या नहीं। इनपुट को एक कमांडलाइन पैरामीटर के रूप में लिया जाता है।

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

asciiके साथ Ubuntu पर स्थापित किया जा सकता है sudo apt-get install ascii


1

जावास्क्रिप्ट ईएस 6, 89 वर्ण

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

परीक्षा:

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

लुआ, 147 बाइट्स

मुझे नहीं लगता कि मैं इसे और अधिक नीचे ले जा सकता हूं, मैंने इसे करने के लिए बहुत सारे तरीकों का परीक्षण किया है, और यहां सबसे छोटा है। यहां तक ​​कि एक पुराने संकलक का उपयोग करते हुए जिसमें अपचयनित फ़ंक्शन table.foreach(table,function)होता है, कुछ बाइट्स को बंद नहीं करता है।

यह कार्यक्रम एक स्ट्रिंग को तर्क के रूप में लेता है, और रिक्त स्थान द्वारा अलग किए गए तालिका मानों के संयोजन को प्रिंट करता है।

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," "))

अपुष्ट और स्पष्टीकरण

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

यदि आप भटक रहे हैं कि एक चर सेट क्यों है, लेकिन इसका उपयोग गोल्फ कोड ( _लूप के लिए चर ) में नहीं किया गया है , तो यहां क्यों है:

लुआ में एक सरणी पर पुनरावृति करने के लिए आपके पास 2 तरीके हैं, या तो शैली के लिए:

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

या एक फूटी शैली में:

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

मुझे सारणी में निहित मूल्यों की आवश्यकता थी {8,10,16}क्योंकि वे विभिन्न आधार हैं जिन पर मुझे चलना है। लेकिन कई रिटर्न वाले फ़ंक्शंस आपको यह चुनने की अनुमति नहीं देंगे कि आप वास्तव में किसे लौटना चाहते हैं, वे एक आदेश का पालन करते हैं। चर valueसेट करने के लिए, मुझे keyभी मूल्य पकड़ने की आवश्यकता है: जिसे हम डमी कहते हैं _


1

सी (समारोह), 76

  • 2 बाइट्स @anatolyg की बदौलत बच गए।
  • 5 बाइट्स ने @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।


आपका लूप "वेतन वृद्धि" बयान बहुत बढ़िया है! हालांकि इसे छोटा किया जा सकता है।
अनातोली

j*=j,j/=6के रूप में अधिक स्पष्ट रूप से लिखा हैj=j*j/6
अनातोलीग

@anatolyg of -thanks! मैं संचालकों के संयोजन के साथ चतुर होने की कोशिश कर रहा था - कुछ ऐसा, j*=j/6लेकिन पूर्णांक विभाजन के दौरान सटीक नुकसान के कारण काम नहीं किया गया
डिजिटल ट्रॉमा

j<20,अल्पविराम ऑपरेटर इस के पूरे प्रभाव का खुलासा करता है।
लूसर 10

@luserdroog हाँ - धन्यवाद!
डिजिटल ट्रॉमा

0

जावास्क्रिप्ट ईएस 6, 89 88 बाइट्स

नील को धन्यवाद देकर 1 बाइट बचाया!

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

एक सरणी देता है। यदि यह ठीक नहीं है, तो यह अतिरिक्त 8 बाइट्स के लिए काम करता है, जो संभावित मैचों को प्रदर्शित करता है।

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


हम्म, कितने पुराने एक जावास्क्रिप्ट की जरूरत है कि आपको ओक्टल के रूप में 0 पार्स से शुरू होने वाले नंबरों की आवश्यकता है?
नील

@ नील फ़ायरफ़ॉक्स इसके साथ ठीक काम करता है।
कॉनर ओ'ब्रायन

के साथ काम करने के लिए प्रतीत नहीं होता है 47
नील

@ नील फिर से वापस लौटने का काम करता है ...
कॉनर ओ'ब्रायन

आह, की Number()आवश्यकता है 0oलेकिन evalबस के साथ खुश है 0। गलतफहमी के लिए खेद है।
नील

0

आर, 84 बाइट्स

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

strtoiप्रत्येक आधार में परिवर्तित करने के लिए उपयोग करता है और फिर उपयुक्त सीमा में यदि चरित्र में परिवर्तित होता है। catयदि हम वर्णों के डिफ़ॉल्ट मुद्रण (इसमें लिपटे हुए "") को हटाने की अनुमति देकर 4 और बाइट्स बचा सकते हैं

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