स्ट्रिंगर्स में पूर्णांक का योग, गैर-संख्यात्मक द्वारा अलग किया जाता है जैसे 'ए' और 'वाई'


14

एक प्रोग्राम बनाएं जो एक स्ट्रिंग में पाए गए सभी पूर्णांकों को सोचे जो प्रोग्राम में एक चर के रूप में सेट किया गया है (इस प्रकार, प्रोग्राम को किसी इनपुट को संभालने की आवश्यकता नहीं है)। पूर्णांक संख्याओं को गैर-संख्यात्मक (कुछ भी लेकिन 0, 1, 2, 3 ... 9) द्वारा अलग किया जाता है।

उदाहरण:

  • e7rde f ,fe 43 jfj 54f4sD = 7 + 43 + 54 + 4 = 108
  • 5 = 5
  • 64 545,5445-32JIFk0ddk = 64 + 545 + 5445 + 32 + 0 = 6086
  • 0ab0 = 0 + 0 = 0

अतिरिक्त नोट:

  • यूनिकोड समर्थन आवश्यक नहीं है, लेकिन अनुमति दी गई है
  • -n(जहां nएक पूर्णांक है) को एक नकारात्मक के रूप में नहीं गिना जाता है n, लेकिन इसके बाद एक हाइफ़न के रूप में गिना जाता है n

उत्तर स्क्रीन पर मुद्रित किया जा सकता है (लेकिन आवश्यक नहीं)।

सबसे छोटा जवाब (पात्रों में) जीत जाता है।


क्या हमें परिणाम भी प्रिंट करना चाहिए? (आप उल्लेख नहीं I / O)।
विले ई। कोयोट

@ डोगबर्ट - मैंने उसके बारे में नहीं सोचा। क्षमा करें, हाँ। मैं पोस्ट अपडेट कर दूंगा।
Anto

इसे बदल दिया क्योंकि कुछ लोगों के पास पहले से ही उत्तर थे और वे उन्हें "चोट" नहीं देना चाहते थे। मुझे लगता है कि मुझे अब सोना चाहिए, इसलिए मैं थोड़ा स्पष्ट सोचूंगा;)
Anto

2
एंटो: एक कार्य जहां एक समाधान का कोई भी दुष्प्रभाव नहीं होता है, हालांकि यह बहुत अच्छा नहीं है।
जॉय

एक दिलचस्प परीक्षण का मामला है , जिसमें मैं भाग गया था 5a-3(मेरा कोड छोड़ देगा -यदि यह किसी संख्या का तुरंत अनुसरण करता है, लेकिन नहीं तो इससे पहले कोई गैर-संख्या नहीं थी)।
मार्टिन एंडर

जवाबों:



14

रूबी 1.9, 21 वर्ण

eval a.scan(/\d+/)*?+

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

p eval a.scan(/\d+/)*?+

और पूर्वनिर्धारित चर का उपयोग करने के बजाय स्टडिन से पढ़ने के लिए, अन्य 3 वर्णों का उपयोग करना होगा:

p eval gets.scan(/\d+/)*?+

रूबी 1.8 के लिए, की जगह ?+के साथ "+"22 अक्षरों में एक काम कर समाधान प्राप्त करने के लिए।


इनपुट को एक वैरिएबल से लिया जाना चाहिए, स्टड नहीं। से भी scanछोटा है split। तो आपका समाधान बन जाता है eval s.scan(/\d+/)*?+- 21 अक्षर।
sepp2k

@ sepp2k: हाँ, विवरण को सही ढंग से नहीं पढ़ा। मैं सिर्फ अन्य गोल्फ-कार्यों के लिए उपयोग किया जाता हूं, जहां आपको आमतौर पर स्टडिन और प्रिंट से स्टडआउट तक पढ़ना पड़ता है। के साथ अच्छा बिंदु scan, धन्यवाद!
वेंचरो

+1, का बहुत उपयोग evalऔर* '+'
Wile E. Coyote


5

रूबी - 36 34 वर्ण

s.scan(/\d+/).map(&:to_i).reduce:+

यदि आप परिणाम मुद्रित करना चाहते हैं तो 36 वर्ण।

p s.scan(/\d+/).map(&:to_i).reduce:+

मान लें कि इनपुट s में एक स्ट्रिंग के रूप में मौजूद है।


4

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

c=0,s.replace(/\d+/g,d=>c+=+d)

एनोटेट संस्करण:

// Store the sum.
c=0,
// Process every number found in the `s`.
s.replace(/\d+/g,
  // Convert the number into an integer.
  // Add it to the sum.
  d => c += +d
)

3

विंडोज पॉवरशेल, २३ २५ २ ९ ३१

आउटपुट के साथ।

$x-replace'\D','+0'|iex

वास्तव में, बिना आउटपुट बिल्कुल वैसा ही है, आप इसे कहीं और पाइप करेंगे जहां इसकी आवश्यकता है।


2

जे - ४० ३ characters अक्षर

आलसी संस्करण। स्ट्रिंग लाइब्रेरी की आवश्यकता है।

+/".(,' ',.~a.-.'0123456789')charsub y

यूनिकोड का समर्थन करता है। एन्कोडिंग का समर्थन करता है, यह सोचने के लिए आओ!
MPelletier

2

जावा

प्रतियोगिता से बाहर;)

public static long sum(String s) {
    long sum = 0;
    String p = "";
    char[] ch = s.toCharArray();
    for (int i = 0; i < ch.length; i++) {
        boolean c = false;
        if (Character.isDigit(ch[i])) {
            if (i + 1 < ch.length) {
                if (Character.isDigit(ch[i + 1])) {
                    p += ch[i];
                    c = true;
                }
            }
            if (!c) {
                p += ch[i];
                sum += Integer.valueOf(p);
                p = "";
                c = false;
            }
        }
    }
    return sum;
}


2

भूलभुलैया , 29 21 बाइट्स

(अस्वीकरण: भूलभुलैया इस चुनौती से नया है।)

इसके अलावा, भूलभुलैया के पास चर नहीं हैं, इसलिए मैं एक सामान्य इनपुट / आउटपुट प्रोग्राम के साथ गया।

)_"+`
( "?"
";;,;;(!@

यह उस तरह से काफी सरल था जिस तरह से भूलभुलैया के इनपुट कमांड काम करते हैं। ?STDIN से एक हस्ताक्षरित पूर्णांक पढ़ने की कोशिश करता है और पहले गैर-अंक पर रुक जाता है। यदि यह एक पूर्णांक नहीं पढ़ सकता है (क्योंकि अगला वर्ण -एक अंक, या किसी अन्य गैर-अंक के बाद नहीं है, या हम ईओएफ पर पहुंच गए हैं), तो 0इसके बजाय वापस आ जाएगा। ,दूसरी ओर किसी भी बाद की बाइट को पढ़ता है और बाइट मान को आगे बढ़ाता है। यदि इसे EOF पर बुलाया जाता है, तो -1इसके बजाय वापस आ जाएगा।

तो यहाँ समाधान के लिए कुछ छद्मकोड हैं:

running total = 0
while(true)
  while(true)
    try reading a non-zero integer N with ?
    if(N < 0)
      running total -= N
    else if(N > 0)
      running total += N
    else
      break
  // We've either read a zero or hit a something that isn't a number
  try reading a character with ,
  if(that returned -1)
    break
print running total

नकारात्मक संख्याओं से निपटना इस समाधान को काफी जटिल बनाता है। यदि यह उन लोगों के लिए नहीं थे, तो मेरे पास यह 8-बाइट समाधान होगा:

?+
;,;!@


1

पर्ल, 16 वर्ण

s/\d+/$r+=$&/ge;

इनपुट लेता है $_, आउटपुट चालू होता है $r। अंतिम अर्धविराम अतिरेकपूर्ण है, लेकिन कार्यक्रम के अधिक काम करने पर इसकी आवश्यकता होगी। say$rआउटपुट के लिए जोड़ें ।


ओह, जब मैंने पोस्ट किया तो आपका सटीक उत्तर नहीं देखा। हालांकि मैंने एक चरित्र को अर्धविराम के बिना भी गिना।
जेबी

@ जेबी: मैं गिन नहीं सकता! : पी। दरअसल, मैंने एक डबल कोटेड स्ट्रिंग को इको करने की गलती की wc -c
नवजाल

1

जे - 23 चार

विजेता नहीं, लेकिन हमें कार्रवाई में एक दुर्लभ दुर्लभ आदिम देखने को मिलता है।

+/".(,_=_"."0 y)}y,:' '

व्याख्या की:

  • _"."0 y- इनपुट स्ट्रिंग में प्रत्येक वर्ण के लिए y, इसे संख्या के रूप में पढ़ने का प्रयास करें। यदि आप नहीं कर सकते हैं, तो _इसके बजाय डिफ़ॉल्ट मान (अनन्तता) का उपयोग करें।

  • ,_=- समानता के लिए प्रत्येक परिणाम की जाँच करें _, और फिर एक वेक्टर में 0s और 1s के अंतिम सरणी को चलाएँ। ( "."0हमेशा परिणाम में एक बहुत अधिक आयाम जोड़ता है, इसलिए हम यहां उसके लिए सही हैं।)

  • y,:' ' - इनपुट स्ट्रिंग के नीचे रिक्त स्थान की एक पंक्ति जोड़ें।

  • }- जैसा कि यहाँ है, इसका उपयोग आइटम संशोधन} कहा जाता है , और यह दाईं ओर तर्क में ड्रा करने के लिए पंक्ति का चयन करने के लिए सूचक के रूप में बाईं ओर 0s और 1s की सूची का उपयोग करता है। तो क्या होता है, दाहिने पक्ष में प्रत्येक कॉलम के लिए, हम मूल चरित्र लेते हैं यदि इसे एक संख्या के रूप में पढ़ा जा सकता है, और अन्यथा हम इसके नीचे स्थान लेते हैं। इसलिए, हम रिक्त स्थान के साथ किसी भी गैर-संख्यात्मक वर्ण को कवर करते हैं।

  • +/". - अब इस पूरे स्ट्रिंग को संख्याओं की सूची में बदलें, और उन्हें योग करें।


1

gs2, 4 बाइट्स

W#Θd

CP437 में एन्कोडेड ; तीसरा बाइट है E9

W/-?\d+/एक स्ट्रिंग से सभी संख्याओं को पढ़ता है , निरपेक्ष मान को मैप करता है, dरकम।

(gs2, भी, इस चुनौती से नया है, लेकिन इसकी read-numsकमान कुल संयोग है।)


0

स्मॉलटॉक (स्मॉलटाक / एक्स) (51 वर्ण)

रेगेक्स पैक्ज का उपयोग:

(s regex:'\d+' matchesCollect:[:n|n asNumber])sum

wo regex:

((s asCollectionOfSubCollectionsSeparatedByAnyForWhich:[:c|c isDigit not]) map:#asNumber)sum

इनपुट इन एस



0

जावास्क्रिप्ट - 43 वर्ण

मुझे पता है कि यह लंबा है, लेकिन जेएस समाधान नहीं था इसलिए :)

c=0
a=a.split(/[^\d]/g)
for(i in a)c+=+a[i]

aस्ट्रिंग है। cउत्तर होता है।


0

Tcl, 30

expr [regsub -all \\D+ $a.0 +]

यह मानता है कि इनपुट चर $a(औपचारिक रूप से a) में है और दुभाषिया परिणाम में उत्तर को संग्रहीत करता है। I / O को एक अभ्यास के रूप में छोड़ दिया जाता है।


0

एपीएल, 16 बाइट्स

{+/⍎b\⍵/⍨b←⍵∊⎕d}

⎕dएक अंतर्निहित अंकों (0-9) से युक्त है। bको 0/1 के एक वेक्टर को सौंपा गया है जहां 1 उन अक्षरों को दिया जाता है जो अंक हैं। bदिए गए वर्ण सरणी को संपीड़ित करने के लिए उपयोग किया जाता है और फिर इसका विस्तार करने के लिए पुन: उपयोग किया जाता है, जो रिक्त स्थान सम्मिलित करता है। एपीएल का निष्कासन है जो इस मामले में एक स्ट्रिंग को वेक्टर में पूर्णांक में परिवर्तित करता है। +/योग की गणना करता है।


समान लंबाई, लेकिन दिलचस्प:+/2⊃⍞⎕VFI⍨⎕AV~⎕D
एडम जूल 20'16

0

स्विफ्ट 3, 78

s.characters.split{!("0"..."9"~=$0)}.flatMap{Int(String($0))}.reduce(0){$0+$1}

sस्ट्रिंग कहाँ है


0

पर्ल - 24 वर्ण

warn eval join'+',/\d+/g

इनपुट $ _ में है


0

दरअसल, 14 बाइट्स (गैर-प्रतिस्पर्धात्मक)

9u▀8╙r♂┌-@s♂≈Σ

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

यह प्रस्तुतिकरण गैर-प्रतिस्पर्धात्मक है क्योंकि वास्तव में इस चुनौती की तुलना में काफी नया है।

यह प्रोग्राम इनपुट के लिए CP437 कोड पेज का समर्थन करता है।

स्पष्टीकरण:

9u▀8╙r♂┌-@s♂≈Σ
9u▀             base 10 digits (0-9)
   8╙r♂┌        all characters in CP437 (map(ord_cp437, range(2**8)))
        -       set difference
         @s     split input on any value in the resulting list
           ♂≈Σ  convert to ints and sum

0

सी 100

t=0;main(i,v)char**v;{for(char*q,*s=v[1];i=strtol(s,&q,0),*s;q>s?t+=abs(i),s=q:s++);printf("%d",t);}

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

पहले वाला 85 बाइट संस्करण जो प्रोग्राम के अंदर स्ट्रिंग को हार्डकोड करके थोड़ा धोखा दे रहा है:

t=0;main(i){for(char*q,*s;i=strtol(s,&q,0),*s;q>s?t+=abs(i),s=q:s++);printf("%d",t);}

वास्तव में 85 बाइट प्रोग्राम का उपयोग करने के लिए आपको चर को असाइन करने की आवश्यकता है जैसे:

t=0;main(i){for(char*q,*s="text";i=strtol(s,&q,0),*s;q>s?t+=abs(i),s=q:s++);printf("%d",t);}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.