शब्दों की एक स्ट्रिंग को शब्दों से पूर्णांक में बदलें


19

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

उदाहरण

  • "four two"-> 42
  • "zero zero zero one"-> 1

मान्यताओं

प्रस्तुतियाँ मान सकती हैं कि:

  1. इनपुट स्ट्रिंग में अंतरिक्ष से अलग किए गए अंकों के शब्द होते हैं।
  2. सभी शब्द मान्य हैं (सीमा में "शून्य" .. "नौ") और लोअरकेस। खाली इनपुट के लिए व्यवहार अपरिभाषित है।
  3. इनपुट स्ट्रिंग हमेशा की श्रेणी के भीतर एक अहस्ताक्षरित संख्या का प्रतिनिधित्व करती है intऔर कभी भी खाली स्ट्रिंग नहीं होती है।

स्कोरिंग

उत्तर बाइट्स में कम बाइट के साथ बेहतर स्कोर किए जाएंगे।


3
साइट पर आपका स्वागत है। ऐसी कुछ चीजें हैं जो हम आमतौर पर उन सवालों से उम्मीद करते हैं जो यहां गायब हैं। सबसे महत्वपूर्ण एक उद्देश्य स्कोरिंग मानदंड होगा जो सभी चुनौतियों का होना चाहिए।
पोस्ट रॉक गार्फ हंटर

3
इसके अलावा विनिर्देश पर यह प्रश्न बहुत विरल है। आपको वास्तव में निर्दिष्ट करना चाहिए कि अस्पष्टता के बिना सबमिशन की क्या आवश्यकता है। एक वाक्य और एक उदाहरण सिर्फ चुनौतियों के लिए हमारे स्पष्टता मानकों तक नहीं है।
पोस्ट रॉक गार्फ हंटर

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

3
पांडित्य होने के जोखिम पर, मैं यह बताना चाहता हूं कि range "zero".."nine"यह पूरी तरह से निर्दिष्ट नहीं है।
असंबद्ध स्ट्रिंग

4
Interpreter@"SemanticNumber"वास्तव में , बिल्ट मैथेमेटिका में ठीक यही करता है - सिवाय इसके कि यह शुरू होने वाले तार पर विफल रहता है zero zero
ग्रेग मार्टिन

जवाबों:


22

PHP , 74 बाइट्स

foreach(explode(' ',$argn)as$w)$n.='793251_8640'[crc32($w)%20%11];echo+$n;

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

ऐसा समाधान प्राप्त करने की कोशिश की जो मौजूदा उत्तरों की नकल न करे। मैं प्रत्येक शब्द के लिए 32-बिट लंबाई ( crc32 ) का चक्रीय अतिरेक चेकसम बहुपद प्राप्त करता हूं और फिर प्रत्येक अंक के लिए 0 से 10 (अनुपस्थित 6) से अद्वितीय मानों को मिलाने के लिए उस पर एक मॉड 20 और मॉड 11 करता हूं। फिर उस अद्वितीय मूल्य का उपयोग करके मैं वास्तविक अंक प्राप्त करता हूं।

| Word  | CRC32      | %20 | %11 | Equivalent digit |
|-------|------------|-----|-----|------------------|
| zero  | 2883514770 | 10  | 10  | 0                |
| one   | 2053932785 | 5   | 5   | 1                |
| two   | 298486374  | 14  | 3   | 2                |
| three | 1187371253 | 13  | 2   | 3                |
| four  | 2428593789 | 9   | 9   | 4                |
| five  | 1018350795 | 15  | 4   | 5                |
| six   | 1125590779 | 19  | 8   | 6                |
| seven | 2522131820 | 0   | 0   | 7                |
| eight | 1711947398 | 18  | 7   | 8                |
| nine  | 2065529981 | 1   | 1   | 9                |

एक और 74 बाइट्स CRC32 विकल्प का उपयोग करके %493%10: इसे ऑनलाइन आज़माएं!

एक और 74 बाइट्स CRC32 विकल्प का उपयोग करके %2326%11: इसे ऑनलाइन आज़माएं!


PHP , 74 बाइट्स

foreach(explode(' ',$argn)as$w)$n.=strpos(d07bfe386c,md5($w)[21]);echo+$n;

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

एक ही लंबाई के साथ एक और विकल्प, md5शब्द में 22 वां चरित्र लेता है (केवल वर्ण जो प्रत्येक शब्द के लिए एक अद्वितीय मूल्य देता है) और फिर उस चरित्र को एक अंक में मैप करने के लिए उपयोग करता है।


यह एक अच्छा जवाब है
जुआन सेबेस्टियन लोज़ानो



6

जेली ,  19  17 बाइट्स

Ḳµ7ị“*;nÄƲ]³Ṙ»i)Ḍ

एक मोनडिक लिंक वर्णों की एक सूची को स्वीकार करता है जो पूर्णांक देता है।

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

मेरे पायथन 2 उत्तर का बहुत अधिक पोर्ट।


पिछला

ḲŒ¿€i@€“©¥q£½¤MÆÑ‘Ḍ

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

नहीं है बहुत संभव है एक छोटा रास्ता है, लेकिन यह एक तरीका है कि पहले मन में आया है।


विलोपन से बचने के लिए एन्कलेक्ट स्ट्रिंग से शून्य को हटाना, क्योंकि नहीं मिला शून्य शून्य है ... चतुर!
असंबंधित स्ट्रिंग

1
आह, मैं देख रहा हूँ कि आप एक ही तरीका है, अच्छा है।
जोनाथन एलन

5

पायथन 3 , 107 , 91 , 77 , 90 बाइट्स

श्रीकोटिलिज्म ओ'जैसिक द्वारा -16 बाइट्स

+13 बाइट्स प्रमुख जीरो को हटाने के लिए

lambda s:int(''.join(map(lambda w:str('zeontwthfofisiseeini'.index(w[:2])//2),s.split())))

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



अच्छा है! इस तरह, मैं भी पूरी तरह से सीमांकक ड्रॉप कर सकते हैं :)
movatica

1
चुनौती के अपडेट के साथ यह अब मान्य नहीं है क्योंकि इसमें अग्रणी शून्य शामिल हैं। :(
पोस्ट रॉक गार्फ हंटर


1
@movatica आपका फिक्स गलत है। lstripविधि स्ट्रिंग जो यह तर्क के रूप में दिया जाता है के प्रत्येक वर्ण स्ट्रिप्स, इसलिए "आठ दो" "दो ight", हो जाता है "e" छीन हो जाता है। इसके अलावा, "शून्य शून्य शून्य" को "0" प्रिंट करना चाहिए, एक त्रुटि नहीं देना चाहिए।
नेमपलेयर



3

05AB1E , 18 16 बाइट्स

#ε6è}.•ƒ/ÿßÇf•Åβ

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

स्पष्टीकरण:

#                 # Split the (implicit) input-string on spaces
 ε  }             # Map each string to:
  6è              #  Get the character at 0-based index 6 (with automatic wraparound)
     .•ƒ/ÿßÇf    # Push compressed string "rothuvsein"
              Åβ  # Convert the characters from custom base-"rothuvsein" to an integer
                  # (after which the top of the stack is output implicitly as result)

मेरा यह 05AB1E टिप देखें (अनुभाग संपीड़ित तार शब्दकोश का हिस्सा नहीं कैसे? ) को समझने के लिए क्यों .•ƒ/ÿßÇf•है "rothuvsein"



3

05AB1E , 17 16 बाइट्स

•D±¾©xWÄ0•I#HèTβ

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

अन्य 05AB1E उत्तर के साथ परफेक्ट टाई , लेकिन पूरी तरह से अलग दृष्टिकोण का उपयोग करके।

•D±¾©xWÄ0•               # compressed integer 960027003010580400
          I#             # split the input on spaces
            H            # convert each word from hex (eg "one" => 6526)
             è           # index (with wrap-around) into the digits of the large integer
              Tβ         # convert from base 10 to integer

3

रेटिना 0.8.2 , 46 45 बाइट्स

\w+
¶$&$&$&
%7=T`r\ot\huvs\ein`d`.
\D

^0+\B

इसे ऑनलाइन आज़माएं! लिंक में परीक्षण के मामले शामिल हैं। स्पष्टीकरण:

\w+
¶$&$&$&

प्रत्येक शब्द को अपनी लाइन पर रखें और इसे तीन गुना करें।

%7=T`r\ot\huvs\ein`d`.

@ UnrelatedString के स्ट्रिंग का उपयोग करके प्रत्येक पंक्ति के 7 वें चरित्र का अनुवाद करें।

\D

शेष सभी गैर-अंक वर्ण हटाएं।

^0+\B

प्रमुख शून्य हटाएं (लेकिन कम से कम एक अंक छोड़ें)।

पिछला 46-बाइट अधिक पारंपरिक समाधान:

T`z\wuxg`E
on
1
th
3
fi
5
se
7
ni
9
\D

^0+\B

इसे ऑनलाइन आज़माएं! लिंक में परीक्षण के मामले शामिल हैं। स्पष्टीकरण:

T`z\wuxg`E

शब्द zero, two, four, sixऔर eightविशिष्ट अक्षर हो zwuxg। यहां तक ​​कि अंकों को भी अनूदित करें।

on
1
th
3
fi
5
se
7
ni
9

विषम अंकों के लिए, प्रत्येक शब्द के पहले दो अक्षरों को व्यक्तिगत रूप से मिलाएं।

\D

शेष सभी गैर-अंक वर्ण हटाएं।

^0+\B

प्रमुख शून्य हटाएं (लेकिन कम से कम एक अंक छोड़ें)।


2

जेली , 20 18 17 बाइट्स

Ḳ7ị“*;nÄƲ]³Ṙ»iƲ€Ḍ

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

User202729 के स्ट्रिंग कंप्रेसर के माध्यम से "रथुवेसीन" चलाने से -2 बाइट्स ।

जोनाथन एलन के शून्य-मुक्त एन्क्लेक्ट स्ट्रिंग को चोरी करने और इसे मामूली रूप से अलग संरचित कार्यक्रम में रखने से -1 बाइट।

Ḳ                    Split the input on spaces,
              Ʋ€     for each word
             i       find the 1-based index (defaulting to 0)
   “*;nÄƲ]³Ṙ»        in "othuvsein"
 7ị                  of the element at modular index 7,
                Ḍ    and convert from decimal digits to integer.


2

जाप , 13 बाइट्स

¸mg6 ì`Ψuv 

कोशिश करो

ऐसा लगता है कि हर किसी ने मुझे एक ही विचार के लिए हरा दिया - खुद को सम्पीडन के लिए इष्टतम स्ट्रिंग को बल देने के लिए स्क्रिप्ट लिखने की परेशानी से खुद को बचाया जा सकता था, केवल यह खोजने के लिए, सूचकांक तक 1,000,000(यह जल्दी था, मैंने अपना नहीं किया था कैफीन अभी तक!), "रोथुवेसीन" एकमात्र संभव स्ट्रिंग है!

¸mg6 ì`...     :Implicit input of string
¸              :Split on spaces
 m             :Map
  g6           :  Character at index 6 (0-based, with wrapping)
     ì         :Convert from digit array in base
      `...     :  Compressed string "rothuvsein"

संकुचित स्ट्रिंग कोड पॉइंट्स पर वर्ण हैं 206, 168, 117, 118, 160और 136


1
... क्या आपने सचमुच 1000000 तक की कोशिश की? अंकों के नाम की लंबाई का एलएमएक्स 60 है, इसलिए इससे परे कोई बिंदु नहीं है (60 0, 61, 1 से 1, आदि के बराबर है)।
ग्रिम्मी

1
@ चिकना, यह जल्दी था, मैं अभी तक मेरी कैफीन नहीं था! सभी संभावनाओं को उत्पन्न करने के लिए मैंने जो स्क्रिप्ट लिखी थी, उसमें एक लाख को शामिल करना किसी भी अन्य संख्या की तरह आसान था और मुझे एलसीएम पर गणित करने से बचाया।
झबरा

2

रूबी , 63 बाइट्स , 52 बाइट्स , 50 बाइट्स

p $*.map{|d|'rothuvsein'.index (d*3)[6]}.join.to_i

-2 स्याही की नोक के लिए धन्यवाद


कोड गोल्फ में आपका स्वागत है! रूबी में, के $*लिए एक उपनाम है ARGV, इसलिए अतिरिक्त बाइट को बचाने के लिए उपयोग करने के लिए स्वतंत्र महसूस करें।
मूल्य इंक

2

टी-एसक्यूएल, 110 बाइट्स

SELECT 0+STRING_AGG(CHARINDEX(LEFT(value,2),'_ontwthfofisiseeini')/2,'')
FROM STRING_SPLIT((SELECT*FROM i),' ')

लाइन ब्रेक केवल पठनीयता के लिए है।

इनपुट तालिका के माध्यम से लिया जाता है मैं, हमारे IO नियमों के अनुसार । मैं एक स्ट्रिंग चर को पूर्व-आबाद करके 14 बाइट्स बचा सकता था, लेकिन यह केवल तभी अनुमति दी जाती है जब भाषा में कोई अन्य इनपुट विधियां न हों।

स्पष्टीकरण:

  1. STRING_SPLIT इनपुट स्ट्रिंग लेता है और इसे रिक्त स्थान पर अलग करता है
  2. CHARINDEXपहले 2 अक्षर लेता है और स्ट्रिंग में (1-आधारित) स्थिति देता है '_ontwthfofisiseeini''ze'शून्य में स्ट्रिंग के लिए नहीं है और "नहीं मिला" के लिए 0 देता है। अंडरस्कोर सुनिश्चित करता है कि हम केवल दो के गुणक प्राप्त करें।
  3. अंतिम अंक प्राप्त करने के लिए 2 से भाग दें
  4. STRING_AGG बिना किसी विभाजक के साथ अंकों को वापस स्मैश करता है
  5. 0+INT के लिए एक अंतर्निहित रूपांतरण को बल देता है और किसी भी अग्रणी शून्य को गिराता है। 1*काम भी करेगा।

2

x86 मशीन कोड, 46 बाइट्स

Hexdump:

57 53 33 c0 33 ff f6 01 0f 75 15 6a 0a 5b 99 f7
f3 6b ff 0a 03 fa 33 c0 38 01 75 0f 97 5b 5f c3
69 c0 26 2b aa 6e 32 01 c1 e8 02 41 eb d8

यह एक fastcallफ़ंक्शन है - स्ट्रिंग में एक पॉइंटर को प्राप्त करता है ecx, और परिणाम को वापस करता है eax

हैशिंग फ़ंक्शन एक जादुई संख्या से गुणा 1856645926करता है, एक XORइनपुट बाइट के साथ करता है , और 2 बिट्स द्वारा सही बदलता है।

Noclobber रजिस्टरों को सहेजना और पुनर्स्थापित करना ( ediऔर ebx) 4 बाइट्स लेता है , लेकिन मुझे इसे लागू करने के लिए अधिक कुशल तरीका नहीं मिला। निरंतर 10 में भंडारणebx विशेष रूप से कष्टप्रद था!

संबंधित कोड बाइट्स के साथ डिसआर्डर

57                   push        edi  ; edi = result
53                   push        ebx  ; we use ebx to store the constant 10
33 C0                xor         eax,eax  
33 FF                xor         edi,edi  
    myloop:
F6 01 0F             test        byte ptr [ecx],0Fh  ; check for end of word
75 15                jne         myhash
6A 0A                push        0Ah  
5B                   pop         ebx  
99                   cdq              ; prepare 64-bit dividend in edx:eax
F7 F3                div         eax,ebx  ; find the remainder of division by 10
6B FF 0A             imul        edi,edi,0Ah
03 FA                add         edi,edx  ; update the result
33 C0                xor         eax,eax  ; reset the hash temporary variable
38 01                cmp         byte ptr [ecx],al  ; check for end of input (here al=0)
75 0F                jne         mycontinue
97                   xchg        eax,edi  ; set the return register
5B                   pop         ebx  ; restore registers
5F                   pop         edi  ; restore registers
C3                   ret  
    myhash:
69 C0 26 2B AA 6E    imul        eax,eax,6EAA2B26h  ; hashing...
32 01                xor         al,byte ptr [ecx]  ; hashing...
C1 E8 02             shr         eax,2  ; hashing...
    mycontinue:
41                   inc         ecx  ; next input byte
EB D8                jmp         myloop

समतुल्य सी कोड:

int doit(const char* s)
{
    int result = 0;
    unsigned temp = 0;
    while (true)
    {
        int c = *s++;
        if ((c & 15) == 0)
        {
            temp %= 10;
            result = result * 10 + temp;
            temp = 0;
            if (c == 0)
                break;
            else
                continue;
        }
        temp *= 1856645926;
        temp ^= c;
        temp >>= 2;
    }
    return result;
}

आपको मैजिक नंबर कैसे मिले?
स्पार्कलर

मैंने अपने सी कोड का उपयोग करके एक खोज की - सभी 32-बिट संख्या और सभी पारियों की कोशिश की। केवल कुछ संभावनाएं हैं - कोड 2000000000 तक की सीमा में केवल एक पाया गया।
अनातोलीग

आप एक बाइट को बचाने के लिए edi के बजाय edx का उपयोग कर सकते हैं (idiv से पहले edx, pop eax इसके बाद, eul के साथ imul, eax को edx जोड़ें)।
पीटर फैरी



1

VBA, 160 बाइट्स

Function e(s)
s = Split(s, " ")
For i = LBound(s) To UBound(s)
s(i) = Int((InStr("ontwthfofisiseeini", Left(s(i), 2)) + 1) / 2)
Next
e = Val(Join(s, ""))
End Function

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


(1/3) यहाँ बढ़िया तरीका है, लेकिन ऐसा लगता है कि आप बाइट्स के रूप में नईलाइन्स को गिनने में असफल रहे, और यदि आप कुछ ट्रिक्स का उपयोग करते हैं तो आप बाईटेकाउंट को नीचे ला सकते हैं। अर्थात्, डिफॉल्ट मान " "के Splitरूप में डिक्लेयर करने की कोई आवश्यकता नहीं है , Lbound(s)हमेशा शून्य रहेगा और (...)+1यदि आप InStrडेटा की शुरुआत में कोई स्थान जोड़ते हैं तो आप ड्रॉप कर सकते हैं । इसके अलावा, आप स्टेटमेंट से निकलने वाले डेटा को संभालने के लिए एक स्ट्रिंग या वेरिएंट का उपयोग करना बेहतर समझते हैं InStrक्योंकि आपको इसका उपयोग करने की आवश्यकता नहीं है (i)या नहीं Join(s,"")। ओह और के Int(a/b)रूप में ही है a\b
टेलर स्कॉट

(2/3) इनका उपयोग करते हुए, और एक for eachलूप से आप अपने कार्य को 101 बाइट्स के रूप में Function G(x):For Each c In Split(x):G=10*G+InStr(" ontwthfofisiseeini",Left(c,2))\2:Next:End Functionया 101 बाइट्स के रूप में प्राप्त कर सकते हैं, जैसा कि एक उप thet स्पष्ट रूप से डिबग विंडो में आउटपुट प्रिंट करता है Sub F(x):For Each c In Split(x):v=10*v+InStr(" ontwthfofisiseeini",Left(c,2))\2:Next:Debug.?v:End Sub। यदि आप अपने उत्तर को प्रतिबंधित करते हैं, तो आप इसे 81 बाइट्स के रूप में एक्सेल वीबीए तत्काल विंडो फ़ंक्शन के रूप में भी प्राप्त कर सकते हैं For Each c In Split([A1]):v=10*v+InStr(" ontwthfofisiseeini",Left(c,2))\2:Next:?v
टेलर स्कॉट

(3/3) मैं अत्यधिक अनुशंसा करता हूं कि आप इन दृष्टिकोणों के बारे में अधिक जानकारी के लिए VBA पेज में गोल्फिंग के लिए हमारी युक्तियों पर एक नज़र डालें । चीयर्स
टेलर स्कॉट

1

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

I⍘⭆⪪S §ι⁶rothuvsein

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

    S               Input string
   ⪪                Split on spaces
  ⭆                 Map over words and join
       ι            Current word
      §             Cyclically indexed
        ⁶           Literal `6`
 ⍘       rothuvsein Custom base conversion
I                   Cast to string for implicit print

1

पॉवरशेल , 48 बाइट्स

+-join($args|%{'rothuvsein'.indexof(($_*3)[6])})

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

rothuvseinजोनाथन एलन के लिए धन्यवाद, दूसरों के समान चाल का उपयोग करता है । बंटवारे के माध्यम से इनपुट तर्कों की अपेक्षा करता है, जो TIO पर अलग-अलग कमांड-लाइन तर्कों के रूप में प्रकट होता है।


1

कोटलिन, 83 बाइट्स

fun String.d()=split(' ').fold(""){a,b->a+"rothuvsein".indexOf((b+b+b)[6])}.toInt()

यदि आप के साथ समर्थन करना चाहते हैं तो +1 बाइट toLong()

अन्य rothuvsein चाल दूसरों के रूप में, कुछ कीमती बाइट्स को कोटलिन की अच्छी toInt()और धन्यवाद के लिए बचा रहा है fold()। मैं अभी यह महसूस नहीं कर सकता कि कुछ और बाइट्स का मुंडन किया जा सकता है ...



1

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

@setlocal enabledelayedexpansion
@set z=zeontwthfofisiseeini
:a
@set b=%1
@for /l %%c in (0,2,18)do @if "!b:~0,2!"=="!z:~%%c,2!" set/aa=a*10+%%c/2&shift&goto a
@echo %a%


0

बाकोन , 83 72 बाइट्स

मान लें कि स्ट्रिंग $ w में प्रदान की गई है, यह कोड "zeontwthfofisiseeini" में प्रत्येक शब्द के अनूठे पहले 2 वर्णों के आधार पर एक नियमित अभिव्यक्ति का उपयोग करके सूचकांक को देखता है। इंडेक्स को फिर सही परिणाम प्रदान करते हुए 2 से विभाजित किया जाता है।

FOR x$ IN w$:r=r*10+REGEX("zeontwthfofisiseeini",LEFT$(x$,2))/2:NEXT:?r
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.