आपके सभी आधार 97 हमारे हैं


18

कई प्रोग्रामिंग भाषाओं को पूरी तरह से मुद्रण योग्य ASCII, टैब और newlines का उपयोग करके लिखा जाता है। इन 97 अक्षरों को फिर 8-बिट बाइट्स में संग्रहीत किया जाता है (जो वास्तव में 256 अलग-अलग वर्णों को धारण करने में सक्षम हैं!), जो कि बहुत ही अक्षम है - विशेष रूप से कोड-गोल्फिंग में, जहां हर बाइट मायने रखती है! इस चुनौती में, आप आधार रूपांतरण का उपयोग करके अपने स्कोर को कम करने में सक्षम होंगे।

चुनौती

आपका प्रोग्राम / फंक्शन इनपुट के रूप में एक स्ट्रिंग या कैरेक्टर ऐरे को लेता है, जो तब आधार -97 नंबर के रूप में व्याख्या करता है । यह तब इसे एक आधार-256 संख्या में परिवर्तित करता है , और इस संख्या का प्रतिनिधित्व करने के लिए आवश्यक प्रतीकों (यानी, बाइट्स) की संख्या को गिनता है। यह गणना आपके प्रोग्राम / फ़ंक्शन का आउटपुट / रिटर्न वैल्यू होगी।

बेस -2 और बेस -10 (बाइनरी और दशमलव) का उपयोग करके एक सरल उदाहरण: यदि इनपुट है 10110, तो आउटपुट 2 होगा, चूंकि 10110 2 = 22 10 (आउटपुट का प्रतिनिधित्व करने के लिए आवश्यक दो अंक)। इसी तरह, 1101 2 13 10 बनता है , साथ ही 2 का आउटपुट देता है, और 110 2 6 10 हो जाता है , इसलिए तब आउटपुट 1 होगा।

इनपुट स्ट्रिंग में सभी 95 मुद्रण योग्य ASCII वर्ण, साथ ही साथ नईलाइन \nऔर शाब्दिक टैब हो सकते हैं \t, जो आपके आधार रूपांतरण के लिए 97 प्रतीकों का स्रोत वर्णमाला बनाता है । सटीक वर्णमाला इस प्रकार किया जाएगा (प्रतिस्थापन \tऔर \nवास्तविक शाब्दिक टैब और न्यू लाइन के साथ; टिप्पणी न्यू लाइन निम्नलिखित शाब्दिक अंतरिक्ष) :

\t\n !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~

ध्यान दें कि इस वर्णमाला का क्रम महत्वपूर्ण है: उदाहरण के लिए, बेस -97 \tदशमलव से मेल खाती है 0, और !दशमलव से मेल खाती है 3

कुछ टेस्टकेस: (आपको खाली स्ट्रिंग को संभालने की आवश्यकता नहीं है)

Input                             Output
'example@domain.com'                  15
'All your base are belong to us!'     26
'       abcd'                          9
'~      abcd'                         10
'ABCDEFGHIJK'                          9
'zyxwvutsrpq'                         10
'{".~"}.~'                             7
'\t\t\t\t\t\t\t\t'                     1 (with \t a literal tab; the result is 0, which can be represented with 1 byte)
'!\t\t\t\t\t\t\t\t'                    7 (with \t a literal tab)

स्कोरिंग

  1. यदि आपकी प्रविष्टि केवल मुद्रण योग्य ASCII, newline और / या टैब का उपयोग करती है: आपके प्रोग्राम का स्कोर आपके प्रोग्राम का आउटपुट होगा, जब इनपुट के रूप में अपना स्वयं का सोर्स कोड दिया जाता है।

  2. यदि आपकी प्रविष्टि किसी ऐसे वर्ण का उपयोग करती है जो मुद्रण योग्य ASCII, newline या tab नहीं है: तो आपके प्रोग्राम का स्कोर तरह ही बाइट्स की संख्या है ।


3
यदि आपके पास इस पुराने मेमे की तुलना में बेहतर शीर्षक सुझाव है , तो इसे टिप्पणियों में पोस्ट करने के लिए स्वतंत्र महसूस करें!
Sanchises

क्या आपको पता है कि इस चुनौती को केवल टैब से मिलकर एक पेंगुइन जवाब के साथ जीता जा सकता है।
पिपरी

@ppperry ईमानदार होने के लिए, मेरे पास ऐसे उत्तरों के लिए बहुत कम धैर्य है। हां, मुझे इसका एहसास था, लेकिन जब तक कोई वास्तव में अपने सिस्टम पर प्रोग्राम स्टोर नहीं कर सकता, तब तक यह मेरे उत्थान के लिए नहीं होगा।
Sanchises

जवाबों:


7

पायथन 2 , स्कोर 73 72 71

संपादित करें: -1 @ जोनाथन एलन को धन्यवाद

def f(l,z=0):
	for i in map(ord,l):z+=i-[30,9][i<32];z*=97
	print(len(bin(z))-2)/8or 1

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


बस एक /ठीक होना चाहिए मुझे लगता है
जोनाथन एलन

or 1|1इस उदाहरण के साथ प्रतिस्थापित किया जा सकता है ।
जोनाथन एलन

1
@JonathanAllan जो अलग (गलत) परिणाम देता है।
Sanchises

ओह, हाँ, यह होगा। <- सोच रहा था कि वहाँ केवल एक शून्य मिलेगा लेकिन यह बिटवाइज़ होगा या अन्य संख्याओं के साथ भी।
जोनाथन एलन

@JonathanAllan बिल्कुल। यह विषम परिणामों के लिए काम करेगा, लेकिन यह परिणामों को एक जोड़ देगा।
Sanchises

5

जाप , स्कोर 19 (23 बाइट्स)

nHo127 uA9 md)sG l /2 c

इसे ऑनलाइन टेस्ट करें!

संयोग से, मुझे नहीं लगता कि यह गैर- ASCII वर्णों के साथ बहुत अधिक गोल्फ हो सकता है ...

व्याख्या

UnHo127 uA9 md)sG l /2 c   Implicit: U = input string, A = 10, G = 16, H = 32
  Ho127                    Create the range [32, 33, ..., 126].
        uA9                Insert 9 and 10 at the beginning of this range.
            md             Map each to a character, yielding ["\t", "\n", " ", "!", ... "~"].
Un            )            Convert U to a number via this alphabet ("\t" -> 0, "~" -> 96, etc.)
               sG          Convert this number to a base-16 (hexadecimal) string.
                  l        Take the length of this string.
                    /2 c   Divide by two and round up to get the length in base-256.
                           Implicit: output result of last expression

5

जेली ,  18  17 बाइट्स - स्कोर  18  17

-1 बाइट के लिए धन्यवाद आउटगीरफर (अनुवाद के लिए सूचियों की सूची की कोई आवश्यकता नहीं)

O“µœ½þ‘y_30ḅ97b⁹L

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

कैसे?

O“µœ½þ‘y_30ḅ97b⁹L - Link: list of characters
O                 - convert from characters to ordinals
 “µœ½þ‘           - code-page indices = [9,30,10,31]
       y          - translate (9->30 and 10->31)
        _30       - subtract 30
           ḅ97    - convert from base 97
               ⁹  - literal 256
              b   - convert to base
                L - length of the result

- एएससीआईआई के साथ मुझे जो सर्वश्रेष्ठ मिला है वह केवल 29 का स्कोर है :

O10,31,9,30y_30Ux"J_1 97*$$$SSb256L

- यह बेहद अक्षम भी है। यह ऊपर की तरह अध्यादेशों का अनुवाद करता है, लेकिन आधार 97 का रूपांतरण सीधे गुणन का उपयोग करने के बजाय मूल्यों और योग को दोहराने के द्वारा प्राप्त किया जाता है - अर्थात {".~"}.~इसे परिवर्तित करने के लिए समायोजित अनुक्रमणिका मिलती है, [93,4,16,96,4,95,16,96]फिर उलट जाती है ( U) और उन्हें दोहराता है [[96,96,..., 97⁷ times ...,96],[16,16,... 97⁶ times ...16],[95,95,... 97⁵ times ...95],[4,4,... 97⁴ times ...4],[96,96,... 97³ times ...96],,[16,16,... 97² times ...,16],[4,4,... 97 times ...4],[93]]और फिर योग करता है। आधार 256 में परिवर्तित होता है और लंबाई मिलती है (यदि यह मेमोरी से बाहर नहीं चला है: पी)।


3

जे , 36 बाइट्स, स्कोर = 30

256#@(#.inv)97x#.(u:9,10,32+i.95)&i.

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

J अपने आदिम के लिए केवल 7-बिट ASCII वर्ण का उपयोग करता है।

व्याख्या

256#@(#.inv)97x#.(u:9,10,32+i.95)&i.  Input: string S
                 (              )     Form 7-bit ASCII alphabet
                            i.95        Range [0, 95)
                         32+            Add 32
                    9,10,               Prepend 9 and 10
                  u:                    Convert to characters
                                 &i.  Index of each char in S in that alphabet
            97x#.                     Convert from base 97 to decimal
256   #.inv                           Convert to base 256
   #@                                 Length

3

गैया , 14 बाइट्स, स्कोर 14

9c₸c₵R]$;B₵rBl

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

व्याख्या

9c              Push a tab character. (done like this since tab isn't in the codepage)
  ₸c            Push a linefeed character.
    ₵R          Push all printable ASCII characters.
      ]$        Concatenate everything together.
        ;       Copy second-from-top, implicitly push input. Stack is now [ASCII input ASCII]
         B      Convert input from the base where the ASCII string is the digits.
          ₵rB   Convert that to the base where the code page is the digits (base 256).
             l  Get the length of the result.
                Implicitly output top of stack.

केवल ASCII

यह सबसे अच्छा मैं केवल ASCII का उपयोग करके आ सकता है, 19 का स्कोर दे रहा है:

9c10c8373c'R+e]$;B256Bl

कठिनाई इनपुट के रूपांतरण में है। आधार -97 प्रणाली से परिवर्तित करने का एकमात्र उचित तरीका उपयोग करना है B, क्योंकि मैपिंग के लिए गैर-एएससीआईआई की आवश्यकता होती है ¦। इसके अतिरिक्त, वर्तमान में cनंबर रेंज पर मैप किए बिना कैरेक्टर रेंज बनाने का कोई तरीका नहीं है , जो एक ही समस्या से ग्रस्त है। सबसे अच्छा समाधान जो मैं देख सकता था वह स्ट्रिंग का निर्माण ₵Rऔर इसे विकसित करना था।


क्या आपने एएससीआईआई का केवल संस्करण बनाने का प्रयास किया था? यह आपके स्कोर में सुधार नहीं कर सकता है (मुझे लगता है ₵Rऔर ₵rइसे बदलना आसान नहीं है, हालांकि स्पष्ट रूप से है), लेकिन यह देखना दिलचस्प हो सकता है कि यह कैसे तुलना करता है।
Sanchises

@Sanchises मैंने किया था, लेकिन सबसे छोटा मैं 19 साल की उम्र के साथ आया, क्योंकि कोड पॉइंट 8373 है और मैं केवल ASCII में कैरेक्टर रेंज नहीं कर सकता, जो कि इस कार्यक्रम के अधिकांश ASCII के बाद से थोड़ा निराशा होती है।
बिजनेस कैट

हां, यह केवल ASCII होने के करीब है। त्वरित प्रश्न: मैं गिया को नहीं जानता, लेकिन अभी थोड़ा सा इसके साथ खेला है, लेकिन क्या संख्याओं की सूची को बदलने का कोई तरीका है? (जैसे cकि प्रत्येक वर्ण पर लागू होता है, $बस सभी संख्याओं को दिखाता है)
Sanchises

@ सेंचुरीज़ आपको cसूची में जगह देनी होगी , जो होगी
बिजनेस कैट

वास्तव में ₵rइसे बदलना आसान है क्योंकि मैं 256इसके बजाय उपयोग कर सकता था , मैंने केवल इसका इस्तेमाल किया क्योंकि यह 1 बाइट छोटा है और कार्यक्रम केवल ASCII नहीं था।
व्यवसाय बिल्ली

3

पायथन 2 , स्कोर 60

lambda s:len(bin(reduce(lambda a,c:a*97+ord(c)-[30,9][c<' '],s,0)))+5>>3

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

बेस -97 को मैपिंग

किसी वर्ण का मान ord(c)-[30,9][c<' ']इसके द्वारा प्राप्त किया जाता है : इसका ASCII कोड, टैब के लिए माइनस 9 और नईलाइन (जो पूर्व में ' 'शाब्दिक रूप से), या बाकी सब के लिए माइनस 30।

किसी नंबर पर परिवर्तित करना

हम reduceस्ट्रिंग को संख्या में बदलने के लिए उपयोग करते हैं । यह कंप्यूटिंग के बराबर है

a = 0
for c in s: a = a*97+ord(c)-[30,9][c<' ']
return a

कम्प्यूटिंग बेस- 256 लंबाई

का रिटर्न मान binएक स्ट्रिंग है, जो कुछ इस तरह दिखता है:

"0b10101100111100001101"

इसकी लंबाई को बुलाओ L। एक -इन- nबाइनरी प्रतिनिधित्व वाले एक मान में एक ceil(n/8)-बिट बेस-256 प्रतिनिधित्व है। हम गणना कर सकता है nके रूप में L-2; भी, = के ceil(n/8)रूप में लिखा जा सकता है , इसलिए हमारा उत्तर = है ।floor((n+7)/8)n+7>>3L-2+7>>3L+5>>3

जिस मामले में इनपुट स्ट्रिंग का मान 0 है, उसे सही तरीके से हैंडल किया जाता binहै "0b0", इसलिए हम रिटर्न 3+5>>3= 1 देते हैं ।



@HalvardHummel यह निश्चित रूप से सुनिश्चित करें कि आपको होना चाहिए c>=' 'या आप इसके बजाय 23 के स्थान पर मैप करें। साधारण कोड गोल्फ में c>'\x1f'(एक कच्ची बाइट) ने मेरी मदद की होगी, लेकिन वह प्रिंट करने योग्य ASCII नहीं है ...
Lynn

आप सही कह रहे हैं, मेरा बुरा
Halvard Wil

2

एपीएल, स्कोर 24 (बाइट्स *)

⌈256⍟97⊥97|118|¯31+⎕AV⍳⍞

डिफ़ॉल्ट मान ⎕IO←1लेता है, अन्यथा बस ¯31 से otherwise30 बदल दें।

स्पष्टीकरण:

                   ⎕AV⍳⍞  Read a string and convert it to ASCII codepoints + 1
               ¯31+       Subtract 31, so that space = 2, bang = 3, etc.
           118|           Modulo 118, so that tab = 97, newline = 98
        97|               Modulo 97, so that tab = 0, newline = 1
     97⊥                  Decode number from base 97
⌈256⍟                     Ceiling of log base 256, to count number of digits

उदाहरण:

      ⌈256⍟97⊥97|118|¯31+⎕AV⍳⍞
example@domain.com
15
      ⌈256⍟97⊥97|118|¯31+⎕AV⍳⍞
All your base are belong to us!
26
      ⌈256⍟97⊥97|118|¯31+⎕AV⍳⍞
       abcd
9
      ⌈256⍟97⊥97|118|¯31+⎕AV⍳⍞
~      abcd
10

________________
*: एपीएल ⎕AVको यूनीकोड ​​के बजाय अपने स्वयं के विरासत चार्टसेट (द्वारा परिभाषित ) में लिखा जा सकता है ; इसलिए एक एपीएल प्रोग्राम जो केवल एएससीआईआई के पात्रों और एपीएल प्रतीकों का उपयोग करता है, उसे 1 चार = 1 बाइट के रूप में स्कोर किया जा सकता है।


नहीं सभी एपीएल प्रतीकों में हैं ⎕AVजैसे, (कम से कम Dyalog के लिए) । हालांकि आपके सभी प्रतीक एक-एक बाइट के रूप में गिने जाते हैं। तो हर APL सिंबल = 1 बाइट जैसा आप फुटनोट में नहीं रखते हैं। (बस सोचा था कि मैं आपको बता दूंगा।) इसके अलावा, आप कौन सी एपीएल बोली का उपयोग कर रहे हैं?
जचारि

2

पर्ल 5 , 76 + 1 (-F) = 77 बाइट्स

}{$d+=97**(@F+--$i)*((ord)-(/	|
/?9:30))for@F;say!$d||1+int((log$d)/log 256)

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

कैसे?

-Fअवैध रूप से, इनपुट के वर्णों को अलग करें ( ), @ एफ में उन सभी को संग्रहीत करते हुए। निहित whileलूप को बंद करें और एक नया ब्लॉक शुरू करें ( }{) , धन्यवाद, @ डैम हेस्टिंग्स! )। प्रत्येक वर्ण के लिए, उसके मूल्य को 97 तक उचित शक्ति से गुणा करें। लघुगणक का उपयोग करके आधार 256 में योग का आकार ज्ञात करके वर्णों की संख्या की गणना करें।




1

MATL (19 बाइट्स), स्कोर 16

9=?1}G9tQ6Y2hh8WZan

इनपुट स्ट्रिंग में गैर-मुद्रण योग्य वर्ण (टैब, न्यूलाइन) को शेष स्ट्रिंग के साथ अपने ASCII कोड ( 9, 10) के विपरीत करके दर्ज किया जाता है ।

प्रारंभिक भाग 9=?1}Gकेवल Za(आधार रूपांतरण) फ़ंक्शन में बग के कारण आवश्यक है , जो तब विफल हो जाता है जब इनपुट में केवल "शून्य" (यहां टैब) होते हैं। इसे भाषा की अगली रिलीज में तय किया जाएगा।

व्याख्या

9=      % Implicitly input a string. Compare each entry with 9 (tab)
?       % If all entries were 9
  1     %   Push 1. this will be the ouput
}       % Else
  G     %   Push input string again
  9     %   Push 9 (tab)
  tQ    %   Duplicate, add 1: pushes 10 (newline)
  6Y2   %   Push string of all printable ASCII chars
  hh    %   Concatenate twice. This gives the input alphabet of 97 chars
  8W    %   Push 2 raised to 8, that is, 256. This represents the output
        %   alphabet, interpreted as a range, for base conversion
  Za    %   Base conversion. Gives a vector of byte numbers
  n     %   Length of that vector
        % End (implicit). Display (implicit)

1

बेफुज -93, 83 79 बाइट्स, स्कोर 74 65

<v_v#-*52:_v#-9:_v#`0:~
 5v$
^6>>1>\"a"* +
 >*- ^   0$<
0_v#:/*4*88\+1\ $<
.@>$

यहाँ कोशिश करो!

कार्यक्रम पहले इनपुट को आधार -97 नंबर में परिवर्तित करता है, और फिर यह गिनता है कि आधार-256 नंबर के लिए कितने अंकों की आवश्यकता है। जैसे, आधार -97 संख्या बहुत बड़ी है, इतना बड़ा कि TIO बड़े मानों के लिए अधिकतम 8 का उत्पादन करेगा; हालाँकि, JS दुभाषिया परवाह नहीं करता है और सही मूल्य का उत्पादन करेगा।

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