एक चर-लंबाई की मात्रा को डिकोड करें


16

एक चर-लंबाई की मात्रा (जिसे वीएलक्यू या के रूप में भी जाना जाता है uintvar) 28 बिट पूर्णांक मान तक एनकोड करने का एक तरीका है जो केवल आवश्यक के रूप में कई बाइट्स का उपयोग करता है। यह MIDI फ़ाइल स्वरूप में कुछ ईवेंट डेटा के आकार को कम करने के तरीके के रूप में उपयोग किया गया था ।

जिस तरह से यह काम करता है वह काफी सरल है। बाइट्स की एक बड़ी-एंडियन श्रृंखला के रूप में, प्रत्येक बाइट का सबसे महत्वपूर्ण बिट (MSB) एक 1संकेत है कि एक और वीएलक्यू बाइट निम्नानुसार है। प्रत्येक बाइट के शेष 7 बिट्स डीकोड किए गए मान को बनाते हैं।

उदाहरण (विकिपीडिया से):

[ 0x86, 0xc3, 0x17 ] => 106903

यहां छवि विवरण दर्ज करें अतिरिक्त संदर्भ: विकिपीडिया , कुछ लड़के

चुनौती:

एक चर-लंबाई की मात्रा को देखते हुए, इसे पूर्णांक मान में परिवर्तित करें।

इनपुट:

एक से चार बाइट्स की सूची या एक पूर्णांक के एक वैध वीएलक्यू का प्रतिनिधित्व करने वाला 32-बिट मान प्रकार।

आउटपुट:

VLQ इनपुट का पूर्णांक मान।

नियम और स्कोरिंग:

  • यह कोड-गोल्फ है, इसलिए प्रत्येक भाषा की जीत के लिए बाइट्स में सबसे छोटा उत्तर है ।
  • मानक नियम और डिफ़ॉल्ट I / O नियम लागू होते हैं।
  • लूपोल्स निषिद्ध (बेशक)।
  • कृपया अपने कोड ( TIO.run , आदि) के लिए एक परीक्षण के साथ लिंक प्रदान करें ।
  • आपके उत्तर के लिए एक स्पष्ट व्याख्या की अत्यधिक अनुशंसा की जाती है।
  • बिल्ट-इन जो इस रूपांतरण को संभालते हैं, उन पर प्रतिबंध नहीं लगाया गया है, हालांकि उनका उपयोग नहीं करना बहुत अधिक दिलचस्प है।

परीक्षण के मामलों:

Input (VLQ)                   Output (int)

[                   0x00 ] => 0
[                   0x07 ] => 7
[                   0x7f ] => 127
[             0x81, 0x00 ] => 128
[             0xC0, 0x00 ] => 8192
[             0xff, 0x7f ] => 16383
[       0x81, 0x80, 0x00 ] => 16384
[       0x86, 0xc3, 0x17 ] => 106903
[       0xbd, 0x84, 0x40 ] => 1000000
[       0xff, 0xff, 0x7f ] => 2097151 
[ 0xC0, 0x80, 0x80, 0x00 ] => 134217728  
[ 0xFF, 0xFF, 0xFF, 0x7F ] => 268435455  

नोट: आपको अपने इनपुट या आउटपुट के रूप में बाइट का प्रतिनिधित्व करने के लिए हेक्स शाब्दिक का उपयोग करने की आवश्यकता नहीं है। यदि आप अपने प्लेटफ़ॉर्म के लिए बेहतर अनुकूल हैं तो आप दशमलव शाब्दिक ( [ 129, 128, 0 ]), पूर्णांक ( 0x80818000) या किसी अन्य उचित बाइट / ऑक्टेट प्रतिनिधित्व का उपयोग कर सकते हैं। जब तक यह 1-4 बाइट / ऑक्टेट का प्रतिनिधित्व करता है तब तक प्रारूप लचीला होता है।

गोल्फ दूर!


क्या इनपुट की अंतिम बाइट की गारंटी <128 है? या क्या हमें ऐसे मामलों का समर्थन करने की आवश्यकता है [0x01, 0x80, 0x02] => 1?
अरनौलड

5
@Arnauld मैं अब बेहतर देख रहा हूं कि आप क्या कर रहे थे, और आपके द्वारा उल्लेख किए गए मामले को फिर से तैयार करने में आपको अच्छा होना चाहिए था। उदाहरण के लिए, मिडी में, आप डेटा की एक धारा पढ़ रहे होंगे और इसलिए आपको जरूरी नहीं पता कि कौन सा बाइट अंतिम है। जिस तरह से लिखा गया है, गारंटी है कि सूची में अंतिम बाइट वीएलक्यू में अंतिम बाइट है जो एमएसबी को अप्रासंगिक बनाता है और वास्तव में वीएलक्यू के उद्देश्य को पराजित करता है। के रूप में, आप जरूरी मिडी फ़ाइल डिकोडिंग के लिए इन (चुनौती के लिए वैध) दिनचर्या का उपयोग करने में सक्षम नहीं होंगे। पूरी तरह से मेरा बुरा! सैंडबॉक्स में इसे अधिक समय तक रखना चाहिए था ...
640KB

5
यह आंशिक रूप से मेरा बुरा है क्योंकि मुझे लगता है कि मैंने सैंडबॉक्स में चुनौती देखी है और पर्याप्त ध्यान नहीं दिया है। लेकिन हां, यही मेरे मन में था: बाइट्स की एक सूची दी गई थी, या तो पहले वीएलक्यू मूल्य या आउटपुट सभी वीएलक्यू मानों का उत्पादन किया
अरनुलद

1
@ केविनक्रूजसेन, एक चर लंबाई की मात्रा को बाइट्स की एक धारा माना जाता है, जहां तकनीकी रूप से आप केवल तभी जानते हैं जब यह MSB = 0 मार्कर तक पहुंचकर समाप्त होता है। मुझे पता है कि नियमों ने इस पर काफी कब्जा नहीं किया था, लेकिन वीएलक्यू की परिभाषा से मेरा कहना है कि नहीं।
640KB

1
@gwaugh ओके, जो समझ में आता है और मैं तर्क को समझ सकता हूं। मैं अपने MathGolf जवाब को तदनुसार संशोधित करूंगा। :)
केविन क्रूज़सेन

जवाबों:





4

जे , 10 बाइट्स

128#.128|]

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

J Salle के APL उत्तर से प्रेरणा लेते हुए।

  • 128|] 128 से विभाजित इनपुट संख्याओं का अवशेष
  • 128#. एक आधार संख्या 128 के अंकों के रूप में व्याख्या की गई


3

05AB1E , 6 बाइट्स

žy%žyβ

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

12827


हाँ, वह बिलिन आजकल बेकार है। विरासत संस्करण में मैं इसके लिए कुछ उपयोग देख सकता था, केवल तभी जब आपके पास आपके कार्यक्रम में इससे पहले एक अंक हो। अन्यथा आप सिर्फ उपयोग कर सकते हैं 7o। आजकल आप [101,355]2 बाइट्स में कुछ 3-बाइट पूर्णांकों (श्रेणी ) को संपीड़ित कर सकते हैं , इसलिए 128 ƵRवैसे भी हो सकते हैं .. मैंने भी 16 के लिए 2-बाइट बिलिन के बारे में एक ही बात सोचा है .. आमतौर पर आप सिर्फ शाब्दिक उपयोग करेंगे , या अन्यथा हमारे पास 4o/ 4n/ होगा यदि कोई अंक कार्यक्रम में इसके पीछे है। केवल जब कोई अंक 16 से पहले होता है, जो मुझे नहीं लगता है कि होगा, तो
बिल्ट


2

जावास्क्रिप्ट (ईएस 6), 29 बाइट्स

-2 बाइट्स @ शुग्गी को धन्यवाद

इनपुट को बाइट्स के एक सरणी के रूप में लेता है।

a=>a.map(p=c=>p=p<<7|c&127)|p

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


2

एपीएल + विन, 22 बाइट्स

पूर्णांक के एक वेक्टर के लिए संकेत:

2⊥¯32↑,0 1↓⍉(8⍴2)⊤¯4↑⎕

इसे ऑनलाइन आज़माएं! दरियाल क्लासिक के सौजन्य से

स्पष्टीकरण:

¯4↑⎕ Pad the vector to 4 integers from the right.

⍉(8⍴2)⊤ Convert to a matrix of 8 bit values.

,0 1↓ drop the MSBs and flatten to a vector.

2⊥¯32↑ pad bit vector to 32 bits starting at LSB and convert back to integer.

2

स्टैक्स , 12 बाइट्स

ü╫ôà¡k2Wù}a☺

भागो और इसे staxlang.xyz पर डीबग करें!

अनपैक्ड (14 बाइट्स) और स्पष्टीकरण:

rk128%128i^#*+
r                 Reverse 'cuz big-endian
 k                Fold from the left using block:
  128%              Modulize by 128
      128i^#        Push 128 to the power of (one plus the iteration index)
            *       Multiply
             +      Add to the total
                  Implicit print

स्टैक्स में बेस रूपांतरण है, लेकिन यह केवल स्ट्रिंग्स पर काम करता है। यह लगभग पूर्णांक की सूची पर काम करता है, हालांकि; समस्या है Stax के निपटने में 0

एक स्ट्रिंग पूर्णांकों की एक सूची है। जब आप ऐसी सूची को एक स्ट्रिंग के रूप में उपयोग कर रहे हैं, तो कोई भी शून्य स्वचालित रूप से 32 के लिए रिक्त स्थान के लिए एक अच्छा शॉर्टहैंड के रूप में परिवर्तित हो जाता है। चूंकि |bबेस कन्वर्जन के लिए बिलिन अपने ऑपरैंड को पूर्णांक की कच्ची सूची के बजाय एक स्ट्रिंग के रूप में मानता है, शून्य के साथ कोई भी मामला विफल हो जाएगा।

10 बाइट्स, जीरो पर विफल

Ç┘_A♥∙QZ►╣
{128%m128|b    Unpacked
{128%m         Modulize each by 128
      128|b    Convert from base 128

भागो और इसे staxlang.xyz पर डीबग करें!


1
मैं देखता हूं कि वह मुद्दा कहां से आया। {:B7)m$:b8 से पैक करता है, और साथ ही साथ काम करने लगता है, हालांकि यह एक विदेशी उपयोग की तरह है $
पुनरावर्ती

@recursive यह चतुर है। इसे एक अलग उत्तर के रूप में पोस्ट करें।
खुल्द्रेसथ ना'बरिया


2

सी (जीसीसी) , 48 बाइट्स

इनपुट के रूप में बड़े-एंडियन ऑर्डर में पूर्णांक लेता है, जो बाइट सरणी के समान क्रम है।

f(i,j){for(j=0;j|=i&127,i&128;j<<=7,i>>=8);i=j;}

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

सी (जीसीसी) , 53 बाइट्स

यदि एक बाइट सरणी की आवश्यकता है:

f(c,j)char*c;{for(j=0;j|=*c&127,*c++&128;j<<=7);c=j;}

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


जब मैं आपके TIO परीक्षण कोड को -Os के साथ संकलित करता हूं तो यह केवल पिछले दो मामलों को संभालता है। मुझे यह बताने के लिए पर्याप्त सी नहीं पता है कि क्यों।
qwr

@qwr TIO डिफॉल्ट करता है -O0, जो आपको (आमतौर पर) पहले पैरामीटर में रिटर्न वैल्यू स्टोर करने की अनुमति देता है। यह एक क्विक ^ कोड गोल्फिंग में Wfeature है, लेकिन उच्च अनुकूलन स्तरों के साथ काम नहीं करता है।
एरिकएफ

आप के &128साथ बदलकर एक बाइट दाढ़ी कर सकते हैं >>7
जी। स्लीपेन

2

मठगोल्फ , १४ बाइट्स

ê♣%hrx♣▬^mÅε*Σ

पूर्णांक के रूप में इनपुट।

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

मुझे लग रहा है कि यह छोटा हो सकता है .. यह थोड़ा परेशान करने वाला है कि मैथॉल्फ के पास कंटिन्यू के लिए 1-बाइट बिलिन है 128 , लेकिन कोई बेस-कन्वर्जन (बाइनरी / हेक्साडेसिमल को छोड़कर) नहीं है।

स्पष्टीकरण:

ê              # Take the inputs as integer-array
 ♣%            # Take modulo-128 on each value in this array
   h           # Push the length of the array (without popping the array itself)
    r          # Pop and push a list in the range [0, length)
     x         # Reverse the array to (length, 0]
      ♣▬       # Take 128 to the power of each value in this array
        ^      # Zip the two lists together to create pairs
         mÅ    # Map each pair to (using the following two commands):
           ε*  #  Reduce by multiplication (so basically the product of the pair)
             Σ # After multiplying each pair, take the total sum
               # (after which the entire stack joined together is output implicitly)

बेस कन्वर्जन 1 दिन से टेबल पर है, लेकिन बेस कन्वर्जन के संबंध में कुछ अन्य ओवरहॉल हैं जिन्हें मैं उसी समय संबोधित करना चाहता हूं। उदाहरण के लिए, मैं विभिन्न ऑपरेटरों को हेक्साडेसिमल स्ट्रिंग्स से / में परिवर्तित नहीं करना चाहता।
अधिकतम

2

पायथन 3 , 58 49 बाइट्स

-9 बाइट्स @Chas और @ ar4093 के लिए धन्यवाद

lambda x:int("".join(bin(a|128)[3:]for a in x),2)

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

या

lambda x:int("".join(f"{a%128:07b}"for a in x),2)

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

पूर्णांकों की सूची के माध्यम से इनपुट।

पायथन के binकार्य में स्ट्रिंग की शुरुआत में "0 बी" जोड़ा जाता है, इसलिए उन्हें संक्षिप्त होने से पहले उतार दिया जाना चाहिए। यह भी अग्रणी शून्य नहीं रखता है, इसलिए यदि कोई भी (उर्फ अंतिम बाइट) नहीं है, तो उन्हें वापस जोड़ा जाना चाहिए। और यदि कोई अग्रणी (उर्फ सभी लेकिन अंतिम बाइट) है, जिसे हटाया जाना चाहिए। कुंआ।यह जानने के लिए @Chas का धन्यवाद कि हमेशा पहला बिट सेट करके, मैं पहले तीन अक्षरों को हटा सकता हूं और किया जा सकता हूं।

जाहिर है (@ ar4093 के अनुसार) formatफ़ंक्शन न केवल '0 बी' उपसर्ग होने की अनुमति देता है, बल्कि पहले बिट को हटाकर और एक ही समय में 7 वर्णों को पैडिंग करता है।


CGCC में आपका स्वागत है, जो आपको बहुत खराब प्रोग्रामर बना देगा! :)। मैंने आपके साथ पहले जैसा ही सोचा था। आप के bin(a|128)[3:]रूप में आप के साथ 9 बाइट्स बचा सकते हैं तो की जरूरत नहीं है zfill
चास ब्राउन

जैसा कि आपने कहा, प्रारूप फ़ंक्शन से आप 9 बाइट्स बचा सकते हैं: bin(a)[2:].zfill(8)[1:]->f"{a%128:07b}"
ar4093


1

जाप , 10 8 बाइट्स

पूर्णांक के एक सरणी के रूप में इनपुट लेता है।

muIÑ ìIÑ

यह कोशिश करो या सभी परीक्षण मामलों को चलाएं (चुनौती में उपयोग किए गए इनपुट प्रारूप से दोनों कन्वर्टर्स में हेडर)

एलेफाल्फा के घोल से प्रेरणा लेकर 2 बाइट्स बचाए

muIÑ ìIÑ     :Implicit input of integer array
m            :Map
 u           :  Modulo
  I          :    64
   Ñ         :    Multiply by 2
     ì       :Convert to decimal
      IÑ     :  From base 64*2

1

चारकोल , 11 बाइट्स

I↨﹪θ¹²⁸¦¹²⁸

इसे ऑनलाइन आज़माएं! लिंक कोड के वर्बोज़ संस्करण के लिए है। एक सरणी के रूप में इनपुट लेता है। स्पष्टीकरण:

   θ        Input array
  ﹪ ¹²⁸    Elementwise modulo 128
 ↨      ¹²⁸ Convert from base 128
I          Cast to string for implicit print


1

विंडोज बैच, 76 बाइट्स

:a
@set/ax="%1&127",y=y*128+x
@if %2. neq . @shift&goto:a
@echo %y%

"0x" और (0xC0 0x80 0x80 0x00 जैसे) के बीच के स्थान के साथ उपसर्ग पैरामीटर।


अच्छी तरह से किया। जाहिर है किसी और के लिए इसका परीक्षण करने के लिए, आपको @set y=,ax=रन बनाने के बीच सुनिश्चित करना होगा ।
640KB

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