सीरियल वोटिंग डिटेक्शन


51

स्टैक एक्सचेंज स्वचालित रूप से सीरियल वोटिंग का पता लगाता है (जब एक उपयोगकर्ता या तो किसी अन्य उपयोगकर्ता के कई पोस्ट को बढ़ाता या डाउनवोट करता है) और इसे उलट देता है। इस चुनौती में, आप एक बहुत ही सरल "सीरियल वोट" डिटेक्टर को लागू करेंगे।

इनपुट

इनपुट एक स्ट्रिंग है जो वोटों की सूची का प्रतिनिधित्व करता है। दो वर्णों का प्रत्येक समूह एक वोट का प्रतिनिधित्व करता है - पहला एक मतदाता है, और दूसरा वह है जिस पर उपयोगकर्ता को वोट दिया जा रहा है। उदाहरण के लिए, निम्नलिखित इनपुट

ababbccd

के रूप में पार्स किया जा सकता है ab ab bc cd, और दो बार aमतदान का प्रतिनिधित्व करता है b, एक बार bमतदान करता है c, और एक बार cमतदान करता है d

इनपुट में केवल लोअरकेस अक्षर होंगे, और यह हमेशा एक समान लंबाई वाला होगा। 0. आप स्वयं भी वोट नहीं दे सकते (इसलिए नहीं aaया नहीं hh)।

उत्पादन

इस चुनौती के उद्देश्यों के लिए, धारावाहिक मतदान को किसी भी अन्य उपयोगकर्ता को तीन या अधिक बार मतदान करने वाले उपयोगकर्ता के रूप में परिभाषित किया गया है।

आउटपुट यह है कि प्रत्येक उपयोगकर्ता के लिए कितने वोट उल्टे होने चाहिए (यानी, प्रत्येक उपयोगकर्ता पर कितने वोट उलट दिए गए थे, न कि कितने वोट जो उन्हें दिए गए थे), प्रारूप में [user][votes][user2][votes2]...। उदाहरण के लिए, abababab( चार बार aमतदान b) का एक इनपुट आउटपुट होना चाहिए b4(चार वोटों का उल्टा असर हुआ aहै b)।

आउटपुट किसी भी क्रम में हो सकता है जिसे आप पसंद करेंगे, लेकिन इनपुट और आउटपुट दोनों को एक तार होना चाहिए जैसा कि ऊपर वर्णित है।

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

In                            Out
---------------------------------------------------------------------------
abababcbcbcbcbbababa          b7a3
edfdgdhdfgfgfgih              g3
jkkjjkkjjkkjljljljmlmlnmnmnm  j6k3m3
opqrstuv                      <none>
vwvwwvwv                      <none>
xyxyxyxyxyxyxyzyzyzyxzxzxz    y10z3
nanananananananabatman        a8
banana                        <none>

16
nanananananananabatmanटेस्ट केस के लिए +1 ।
नौ

जवाबों:


6

पायथ, 22 बाइट्स

pM_srSsfttTtMM.gkcz2 8

इसे ऑनलाइन आज़माएँ: प्रदर्शन या टेस्ट सूट

स्पष्टीकरण:

pM_srSsfttTtMM.gkcz2 8
                 cz2     chop the input into pairs
              .gk        group these pairs by their value
           tMM           discard the first char in each pair in each group
       fttT              discard all groups, that contain less than three pairs
      s                  concatenate all groups to get a list of chars
     S                   sort all chars
    r                8   run-length-encoding
   s                     concatenate all (count,char) pairs 
  _                      reverse the order
pM                       print each element without separator

उदाहरण:

input:   ededgdhdfgfgfgihed
chop:    ['ed', 'ed', 'gd', 'hd', 'fg', 'fg', 'fg', 'ih', 'ed']
group:   [['ed', 'ed', 'ed'], ['fg', 'fg', 'fg'], ['gd'], ['hd'], ['ih']]
discard: [['d', 'd', 'd'], ['g', 'g', 'g'], ['d'], ['d'], ['h']]
discard: [['d', 'd', 'd'], ['g', 'g', 'g']]
concat.: ['d', 'd', 'd', 'g', 'g', 'g']
sort:    ['d', 'd', 'd', 'g', 'g', 'g']
rle:     [[3, 'd'], [3, 'g']]
concat.: [3, 'd', 3, 'g']
reverse: ['g', 3, 'd', 3]
print:   g3d3

34

अपठनीय , 1830 1796 1791 1771 1762 1745 1736 1727 1626 1606 1577 बाइट्स

आउटपुट रिवर्स अल्फाबेटिकल ऑर्डर ( zसे a) में है लेकिन आपके नियमों के अनुसार जो अनुमन्य प्रतीत होता है।

' "" "" "'" "" "" " '" "'" " '" ""' "" ' "" "" "" "" "" "" "" ""' "" "" " " '" "'" "" ' "" "" "" "" "'" "" "" "" "" "" "" "" "" "" "" "" "" ' " " '" "'" " '" ""' "" "" "" "" ' ""' "" " '" "" "" "" "" "" "" "" ""' ""' "" "" "" "" "" "" "" ' ""' "" ' ""' "" " '" "" "" "" "" "" "" "" ' ""' "" ' ""' "" " '" "" "" "" ""' "" ' "" "" "" "" ""' "" "" "" "" " ' "" ' ""' "" ' "" "" "" "" "" "" "" "" "'" "" "" "" "" ' ""' "" ' ""'"" "" "" "" "" "" "" "" ' "" "" "" "" "" "" "" "" "" "" "" "" "'" " "" "" " '" "" "" ""' "" ' "" "" "'" " '" "'" "" "" "" "" "" "" "" " '" "" ' ""' "" "" "" "" "" "" "" ' ""' "" "" "" "" " '" "'" " '" "'" "" '" "'" " '" "'" " '" "'" " '" "'" " '" "'" " '" "'" " '" "'" " '" "'" " ' "" ' ""' "" ' ""' "" ' ""' "" ' ""' "" ' ""' "" " '" "" ""' "" "" "" ' ""' "" ' ""' "" "" "" "" "" "" "" "" "" "" ' ""' "" ' "" "'" "" "" "" " '"" "" "" "" " '" "" "" "" "" "" "" "'" " '" ""' "" ' "" "" "" "" "" "" " ' "" "" "'" " '" "'" " '" "'" " '" "'" " '" "'" " '" "'" " '" "'" " '" "' "" ' ""' "" ' ""' "" ' ""' "" ' ""' "" ' ""' "" ' ""' "" ' ""' "" ' ""' ""' ""' "" ' ""' "" ' ""' "" ' ""' "" ' ""' "" ' ""' "" ' ""' "" ' ""' "" ' " " '" "'" " '" "'" " '" "'" " '" "'" " '" "'" " '" "'" " '" "'" " '" "'" " ' "" ' ""' "" ' ""' "" ' ""' "" ' ""' "" ' ""' "" ' ""' "" ' ""' "" ' ""' "" '"" ' ""' "" ' ""' "" ' ""' "" ' ""' "" ' ""' "" ' ""' "" ' ""' "" "" "" " ' "" ' ""' "" ' "" "'" ' "" "" "" "" ""' "" "" "" "" "" "" "" "" "" "" "" ' "" "" "" "" "" "'" "" "" "" "" ' "" "'" "" "" "" "" " '" ""' """" "" "" ' "" "'" "" "" "" "" ' "" "" ""' "" ' ""' "" " '" "" "" "" "'" "" "" "" "" ' ""' "" " '" "'" " '" "'" " '" "'" " '" "'" " '" "'" " '" "' "" ' ""' "" ' ""' "" ' ""' "" ' ""' "" ' ""' "" ' ""' "" ' ""' "" ' ""' ""' ""' "" ' ""' "" ' ""' "" ' ""' "" ' ""' "" ' ""' "" ' ""' "" ' ""' "" ' " " '" "'" " '" "" "" "" "" ""' "" "" "" "" "" " '" "" "" "" "" "" "" "" ' "" "" "" "" "" "'" "" "" "" "" ' "" "" "" "" "" "" "" "" "" "" """" ' "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ' "" "" "" "" "'" " '" "" "" ""' "" "" "" "" "" "" " '" "'" "" ' ""' "" "" "" "" " '" ""' "" "" ""' "" "" ""' "" "" " '" "" "" "" ""' "" ' "" "'" ' "" "" "" "" "" "" "" " '" "" "" "'" " '" "'" "" ' ""' "" "" "" "" " '" "'" """" ' ""' "" "" " '" "" "" ""' "" ' ""' "" """ ' ""' "" "" " '" "" "" ""' "" ' ""' "" "

व्याख्या

सबसे पहले, यह जानने के लिए कि अपठनीय क्या कर सकता है, यहां इसका मूल ऑपरेशन है:

  • आपके पास मनमाने आकार के पूर्णांक कोशिकाओं का एक अनंत टेप है
  • आपके पास ब्रेनफक में मेमोरी पॉइंटर नहीं है; इसके बजाय, आप टेप पर उनके स्थान से कोशिकाओं को हटाते हैं। इसका मतलब है कि आप "मूल्य # 4 पढ़ सकते हैं" या "पढ़ा मूल्य # (मूल्य # 4 पढ़ें)" (दोहरा-प्रसार)।
  • आप केवल मेमोरी सेल्स को पढ़ या लिख ​​सकते हैं (ब्रेनफक की तरह सीधे इन्क्रीमेंट / डिक्रीमेंट नहीं)।
  • आप एक अभिव्यक्ति के भीतर मूल्य वृद्धि / वृद्धि कर सकते हैं। इस प्रकार, एक मेमोरी सेल को बढ़ाने के लिए आपको पढ़ना , वेतन वृद्धि , लिखना या अलग-अलग रखना होगा write(x, inc(read(x))):।
  • जबकि लूप और टर्नरी स्थितियां हैं जो केवल शून्य बनाम गैर-शून्य की जांच कर सकते हैं।

यह प्रोग्राम निम्नानुसार टेप का उपयोग करता है। चर नामों का उपयोग नीचे बाद में छद्मकोड में किया जाएगा। इसके अलावा, यह पहला संस्करण दस्तावेज था (जो 1830 बाइट्स था); नीचे से जो बदलाव हुआ है उसके लिए संपादन देखें।

  • सेल 0: परिवर्तनशीलq
  • सेल 1: चर a, p,ch
  • सेल 2: चर hash,v
  • सेल 3: चर b,r
  • सेल 4: चर aa,l
  • सेल 5: दशमलव अंकों की स्ट्रिंग के "अंत" को चिह्नित करने के लिए 0 रहता है
  • कक्ष 6–95: दशमलव अंकों की स्ट्रिंग को पीछे की ओर संग्रहीत करें
  • कक्ष 96-121: उपयोगकर्ताओं a(96) से z(121) (पत्र का ASCII कोड माइनस एक) से काटे जाने वाले वोटों की संख्या को संग्रहीत करें ।
  • सेल 4657–7380: याद रखें कि कितनी बार मतदाता / मतदाता संयोजन का सामना किया गया है। इन कोशिकाओं के केवल 4 संभावित मान हैं: 0= अभी तक नहीं देखा गया, -1= एक बार -2देखा गया, -3= दो बार देखा गया, = किसी भी संख्या को 2 से अधिक बार देखा गया।

एल्गोरिथ्म अनिवार्य रूप से निम्नानुसार आगे बढ़ता है:

  • पात्रों में से जोड़े पढ़ते रहें aऔर b। हैश मान की गणना करें (a-2)*(a-1)+b-1, जो अक्षरों के प्रत्येक संयोजन के लिए अद्वितीय है — ए-जेड।
  • उस हैश मान ( *hash) पर मेमोरी सेल की जाँच करें । यदि यह है -3, तो उपयोगकर्ता पहले से ही वोट हटाने के लिए योग्य है, इसलिए वेतन वृद्धि *(b-1)। अन्यथा, क्षय *hash। यदि यह है अब -3 , उपयोगकर्ता बस गया है बन तीन आवृत्तियों के बाद वोट निकाले जाने के योग्य है, तो बढ़ा देते *(b-1)द्वारा 3
  • इस के बाद, वर्ण उलटे क्रम में (के माध्यम से जाने zके लिए a) और आउटपुट जो कि कटौती की वोट की जरूरत है। यह संख्या को दशमलव अंकों में अनुवाद करने के लिए मैन्युअल पूर्णांक विभाजन की आवश्यकता है।

यह सब स्पष्ट होने के साथ, यह वह प्रोग्राम है जो स्यूडोकोड जैसा दिखता है:

// Read pairs of characters
while (a = read) + 1 {
    b = read

    // Calculate hash = (a-1)*(a-2)/2 + b-1
    // This also sets a = b-1
    hash = 0
    while --a {
        aa = a
        while --aa {
            ++hash
        }
    }
    while --b {
        ++a
        ++hash
    }

    // If this combination has just been seen for the third time,
    // increment *a by 3; if more than third time, increment *a by 1
    *a = (*hash + 3) ? ((--*hash) + 3 ? *a : (*a+3)) : (*a+1)
}

// Loop through the characters z to a
l = 27
while --l {                     // l loops from 26 to 1 (not 0)
    (v = *(ch = l + 95)) ? {    // 'a' is ASCII 97, but cell 96
        print (ch+1)            // print the votee

        // Now we need to turn the number v into decimal.
        // p points to where we are storing decimal digits.
        p = 5

        while v {
            // Integer division by 10 (q=quotient, r=remainder)
            r = (q = 0)
            while v {
                --v
                (++r - 10) ? 1 : {
                    r = 0
                    ++q
                }
            }
            // Store digit ASCII character
            *(++p) = r + 48     // 48 = '0'
            v = q
        }

        // Now output all the digit ASCII characters in reverse order
        while *p {
            print *(--p + 1)
        }

    } : 1
}

संपादित करें 1, 1830 → 1796: एहसास हुआ कि मैं एक स्थान पर थोड़ी देर के लूप के रिटर्न मूल्य का फिर से उपयोग कर सकता हूं।

संपादित करें 2, 1796 → 1791: यदि प्रोग्राम 6–95 की कोशिकाओं का उपयोग करने के बजाए प्रोग्राम को थोड़ा छोटा कर देता है, तो मैं दशमलव अंकों को ऋणात्मक संख्या वाली कोशिकाओं (-1 बाद) में संग्रहीत करता हूं। अतिरिक्त बोनस के रूप में, कार्यक्रम अब 10! वोटों तक सीमित नहीं है!

संपादित 3, 1791 → 1771: के परिणाम बताए के बजाय *(ch = l + 95)करने के लिए v, मैं अब यह करने के लिए आवंटित qऔर फिर काम के लिए कदम v = qहै, जबकि हालत में, 1777 बाइट्स कोड लेने। फिर टेप पर qऔर उसके स्थान को स्वैप करें vक्योंकि qअब 1 से अधिक सामान्य है v

संपादित करें 4, 1771 → 1762: दुह। hash0 के बजाय 1 से प्रारंभ करना 9 बाइट्स छोटा है। हैश कोड अब 1 और है, जो मायने नहीं रखता है।

संपादित करें 5, 1762 → 1745: अगर मैं इनिशियलाइज़ करता हूं qऔर r0 के बजाय 1, मुझे -1इसे सही करने के लिए कुछ स्थानों में छिड़कना है , और यह सब रद्द करना प्रतीत होता है - सिवाय इसके कि while v { --v; [...] }लूप को अब एक कम पुनरावृत्ति निष्पादित करने की आवश्यकता है, जो मैं कहकर कर सकता हूं while --v { [...] }, जो कि 26 अक्षर छोटा है।

संपादित करें 6, 1745 → 1736: इसके बजाय { r = 1; ++q }, हम लिख सकते हैं q = *((r = 1)+1)+1। यह इस तथ्य पर निर्भर करता है कि qचर स्लॉट # 2 में है। यदि यह स्लॉट # 1 में होता तो यह और भी छोटा होता, लेकिन तब पूरा कार्यक्रम समग्र रूप से लंबा होता।

संपादित करें 7, 1745 → 1727: संपादित किया गया 6 संपादित करें और इसके बजाय उस अंतर को कम करते हुए बचत प्राप्त की, जो कि उस अभिव्यक्ति में लूप हो जो अंक ASCII कोड की गणना करता है, जो 1736 बाइट्स पर भी समाप्त होता है ... लेकिन फिर एक डिक्रीमेंट निर्देश (9 बाइट्स) बचाया ) बदलकर ((++r) - 11) ? r :करने के लिए (r - 10) ? ++r :

संपादित करें 8, 1727 → 1626: हैश गणना की गई। यह अब लूप करते समय एक कम का उपयोग करता है। सेल स्थान अब उनके वास्तविक ASCII कोड पर हैं (1 से बंद नहीं)। टेप पर विभिन्न स्थानों पर फेरबदल चर क्योंकि वे अब अलग आवृत्ति के साथ होते हैं।

9 संपादित करें, 1626 → 1606: अधिक पागल inlining। पहले जबकि लूप का शरीर अब कुछ इस तरह दिखता है:

// b = next char
*(b = (hash = read)) = {

    // hash = b + (a-1)*(a-2)/2
    while (a2 = --a) {
        while --a2 {
            ++hash
        }
    }

    // If this combination has just been seen for the third time,
    // increment *b by 3; if more than third time, increment *b by 1
    (*hash + 3) ? ((--*hash) + 3 ? *b : (*b+3)) : (*b+1)
}

और चर असाइनमेंट अब लगभग पूरी तरह से बदल गया है।

10 संपादित करें, 1606 → 1577: मुझे लगता है कि मनाया aऔर a2दोनों while लूप में 0 को कम कर रहे हैं, इसलिए यदि मैं जोड़ी सकता है pउन दोनों में से किसी के साथ है, लेकिन नहीं के साथ ch, मैं प्रारंभ करने की जरूरत नहीं होगी pकरने के लिए 0(जो 29 बाइट्स लागत)। मैं स्वैप करके ऐसा कर सकते हैं पता चला है pऔर r। अब नवीनतम परिवर्तनशील वर्गीकरण (और कोड में उनके होने की आवृत्ति) हैं:

0 = v (3)                    (total  3)
1 = hash (6), r (5), ch (2)  (total 13)
2 = b (4), q (5)             (total  9)
3 = a (3), p (5)             (total  8)
4 = a2 (3), l (4)            (total  7)

1
यह देखते हुए कि कैसे एक novmvigintillion वोटों को 2 * 10 ^ 90 बाइट्स की एक स्ट्रिंग की आवश्यकता होती है, और 10 ^ 24 बाइट्स की वर्तमान सबसे छोटी संभव मात्रा लगभग 1/3 गीज़ा के महान पिरामिड के आकार की है , मुझे नहीं लगता कि आपके पास है चिंता की कोई बात। ;)
ETHproductions

1
@ETHproductions: फिर भी, कार्यक्रम को सीमित करते हुए मैं उस सीमा को ठीक करने के लिए हुआ :)
तिमवी

22

सीजेएम, 23 बाइट्स

रन-लेंथ पार्टी!

q2/$e`{3a>},e~Wf=$e`Wf%

या

qW%2/$e`{3a>},e~:ce`Wf%

सभी परीक्षण मामलों को चलाएं

व्याख्या

q2/   e# Read input and split into pairs.
$e`   e# Sort and run-length encode - this tallies the pairs.
{     e# Filter the tallies...
  3a> e#   Keep only those which start with a 3 or greater.
},    e# Now we need to group the remaining pairs.
e~    e# Run-length decode the remaining pairs.
Wf=   e# Select the second character from each pair (the one being voted on).
$e`   e# Tally the characters by sorting and RLE'ing again.
Wf%   e# Reverse each pair, because CJam's RLE has the number first and the character last.

अन्य संस्करण जोड़े को उलटने से शुरू होता है, जो दो बाइट्स को कहीं और बचाता है: ए) प्रत्येक स्ट्रिंग में पहले वर्ण का चयन :cकरने के बजाय केवल Wf=दूसरा चुनने के लिए है। ख) हमें दूसरे आरएलई से पहले फिर से छाँटने की ज़रूरत नहीं है, क्योंकि जोड़े पहले से ही मुख्य रूप से शेष चरित्र द्वारा क्रमबद्ध थे।


Qआपके दूसरे उत्तर में FWIW qगैर-परीक्षण-आवरण उद्देश्यों के लिए होना चाहिए ।
पीटर टेलर

@PeterTaylor मैं हर समय ऐसा करता हूं।-
मार्टिन एंडर

मुझे पता है कि यह एक मामूली विवरण है, लेकिन 3तुलना के लिए एक सूची में परिवर्तित करना एक अच्छी चाल है। मैंने इसे सिर्फ अपने मनोरंजन के लिए हल किया, और वहाँ एक बाइट खो दी क्योंकि मैंने उपयोग किया था 0=2>। अन्यथा मैं आपके पहले समाधान के रूप में लगभग एक ही साथ समाप्त हुआ, अंतिम चरण के ::\ बजाय उपयोग करने के अलावा Wf%
रेटो कोराडी

10

बैश, 95 94 85 81 बाइट्स

fold -2|sort|uniq -c|awk '$1>2{c[substr($2,2)]+=$1}END{for(x in c)printf x c[x]}'

एक सुरुचिपूर्ण ईश लेकिन लंबे समय से शुरू करने के लिए पहला समाधान ...

धन्यवाद करने के लिए User112638726 के साथ एक बाइट को बचाने के लिए sedके साथ 9 को बचाने के लिए, DigitalTrauma fold, और रेनर पी के साथ 4 अधिक को बचाने के लिए awkकी substr!

यह कैसे काम करता है यह देखने के लिए, आइए इनपुट लेते हैं abababcbcbcbcbbababa

  • fold -2(2 की चौड़ाई तक लाइन को लपेटने के बाद ), हमारे पास है

    ab
    ab
    cb
    cb
    cb
    cb
    ba
    ba
    ba
    
  • के बाद sort | uniq -c( -cयह एक बहुत ही अलग झंडा है uniqजो इनपुट में प्रत्येक पंक्ति को कितनी बार गिनता है) की गणना करता है

          3 ab
          3 ba
          4 cb
    
  • अब अंतिम awkकमांड की जांच करते हैं :

    • $1>2: केवल आउटपुट सामग्री यदि रिकॉर्ड 1 (उर्फ समान वोटों की संख्या) 2 (यानी, record 3) से अधिक है। दूसरे शब्दों में, संख्या with 2 से शुरू होने वाली किसी भी रेखा को अनदेखा करें।

    • {c[substr($2,2)]+=$1}: यदि संख्या 2 से अधिक है, तो उस नंबर को cहैश तालिका में दर्ज करें, कुंजी के रूप में रिकॉर्ड 2 (उर्फ द वोट-ई) के दूसरे चार्ट का उपयोग कर। (हम सब कुछ शून्य करने के लिए शुरू करने की जरूरत नहीं है; awkवह हमारे लिए है।)

    • END{...}: इसका मतलब है "पूरी फाइल को प्रोसेस करने के बाद, यहाँ पर आगे क्या करना है।"

    • for(x in c)printf x c[x]: काफी स्व-व्याख्यात्मक। हर कुंजी और उसके संबंधित मूल्य को प्रिंट करें।


&करने के लिए बराबर है \0sed में
User112638726

@ User112638726 कि जानते नहीं, धन्यवाद
दरवाज़े

इसे थोड़ा कम करेंsed -r 's/.(.)/\1\n/g'|awk '{a[$1]++}END{for(i in a)printf (a[i]>2)?i a[i]:y}
User112638726

@ User112638726 इनपुट के लिए विफल रहता है bacada, उदाहरण के लिए।
दरवाज़े

अरे हाँ मेरी बुर!
User112638726

8

जावास्क्रिप्ट, 114 113 110

f=s=>eval('o={},s.replace(/../g,m=>s.search(`^((..)*${m}){3}`)?0:o[c=m[1]]=~~o[c]+1);r="";for(v in o)r+=v+o[v]');

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

एक उच्च स्तर पर, यह कोड कुंजी-मूल्य वाले जोड़े के साथ एक ऑब्जेक्ट को पॉप्युलेट करता है जो वोट प्राप्तकर्ताओं को वोटों की संख्या तक ले जाता है, जैसे { b:7, a:3 }और फिर उन्हें एक forलूप में स्ट्रिंग में शामिल करता है। कोड एक में है evalके उपयोग की अनुमति के लिए अभिव्यक्ति forपर खर्च बाइट्स की जरूरत के बिना एक तीर समारोह के भीतर { }और ;return r

( तीन बाइट्स बचाने के लिए user81655 को सहारा !)

evalकोड की व्याख्या :

o={},                             // object to hold name/vote mapping
s.replace(/../g,                  // for each pair of chars in input
  m=>s.search(`^((..)*${m}){3}`)  // see if pair appears 3 times
                                  //   (0 if true, -1 if not)
     ?0                           // if not, do nothing
     :o[c=m[1]]=~~o[c]+1          // if yes, increment the property named after
                                  //   the second character in the pair
);
r="";                       // return string
for(v in o)r+=v+o[v]        // populate string with characters and vote totals

6

हास्केल, 103 बाइट्स

import Data.Lists
f s|c<-chunksOf 2 s,b<-[e!!1|e<-c,countElem e c>2]=nub b>>= \q->q:show(countElem q b)

उपयोग उदाहरण: f "jkkjjkkjjkkjljljljmlmlnmnmnm"->"k3j6m3"

यह काम किस प्रकार करता है:

c<-chunksOf 2 s                      -- split the input into lists of 2 elements
b<-[e!!1|e<-c,countElem e c>2]       -- for every element e of that list take the 2nd
                                     -- char if there are more than 2 copies of e
nub b>>= \q->q:show(countElem q b)   -- take every uniq element thereof and append
                                     -- the number how often it appears 

6

जावास्क्रिप्ट (ईएस 6), 195 174 169 167 158 बाइट्स

s=v=>eval("a={},b={},e='';(v.match(/../g)).forEach(c=>{a[c]=(a[c]||0)+1});for(var k in a){d=k[1];a[k]>2&&(b[d]=(b[d]||0)+a[k])};for(var k in b){e+=k+b[k]};e")

परीक्षा


1
PPCG में आपका स्वागत है :) हम जे एस में गोल्फ के लिए कुछ सुझाव है यहाँ और यहाँ । मुझे नहीं पता कि जेएस खुद को अच्छी तरह से वास्तव में मदद करने के लिए पर्याप्त है, लेकिन खुश गोल्फिंग :)
FryAmTheEggman

1
एक बात के लिए, आप varएस हटा सकते हैं । कोड गोल्फ में वैश्विक दायरे को प्रदूषित करने की परवाह कौन करता है? ;)
दरवाज़े

इसके अलावा, /(\w{2})/gबस हो सकता है /../g- हम पहले से ही जानते हैं कि इनपुट केवल अक्षर हैं, और एक (या दो) वर्णों को दोहराना इससे छोटा है {2}। यदि आप रुचि रखते हैं, तो आप इस चुनौती का मेरे जावास्क्रिप्ट जवाब पर एक नज़र डाल सकते हैं (और प्रश्नों पर टिप्पणी कर सकते हैं)। PGCC में आपका स्वागत है!
अप्सिलर्स

4

गणितज्ञ, 110 100 99 बाइट्स

g=Cases[Tr@#,#2,All]&;""<>g[g[BlockMap[$,Characters@#,2],i_*_/;i>2]/.$->Last,i_*x_:>x<>ToString@i]&

3

पर्ल, 86 84 83 बाइट्स

s/../$h{$&}++/eg;@l=%l=map{/./;$h{$_}>2?($',${$'}+=$h{$_}):()}keys%h;$"="";$_="@l"

-pकमांडलाइन तर्क के लिए यह 82 बाइट्स प्लस 1 है:

$ echo xyxyxyxyxyxyxyxyzyzyzyxzxzxz | perl -p 86.pl
y11z3


कुछ हद तक असंयमी:

s/../$h{$&}++/eg;     # construct hash %h with pair counts

@l = %l = map         # assign to array via hash to filter dupes
{                     
  /./;                # match the first character

  $h{$_}>2?           # filter on 3 or more identical votes
  (                   # return a 2 element list (k/v pair for %l):
    $',               # $POSTMATCH: the 2nd character (votee)
    ${$'} += $h{$_}   # increment votee total votes, value is new total
  )
  :()
}
keys %h;              # iterate the unique pairs

$" = "";              # set $LIST_SEPARATOR to empty string
$_ = "@l"             # implicit join using $";  $_ gets printed with -p
  • अद्यतन 84 grep inlining द्वारा 2 बाइट्स सहेजें
  • 83 के${$'} बजाय वैश्विक अस्थायी var का उपयोग करके 1 सहेजें 1 बाइट को अद्यतन करें $g{$'}। दुर्भाग्य से, $$'काम नहीं करता है।

3

शुद्ध बैश, 151

मैं उम्मीद कर रहा था की तुलना में लंबा है, लेकिन यहाँ यह है।

declare -A a n
for((;v<${#1};v+=2));{((a[${1:v:2}]++));}
for u in ${!a[@]};{((a[$u]>2))&&((n[${u:1}]+=a[$u]));}
for u in ${!n[@]};{ printf $u${n[$u]};}

आवश्यक गिनती करने के लिए साहचर्य सरणी अनुक्रमण का उपयोग करता है। बश संस्करण 4.0 या अधिक से अधिक की आवश्यकता है।


1

PHP 247 अक्षर

(आउच)

$f='';for($i=0;$i<strlen($s);$i=$i+2){$a[]=$s[$i].$s[$i+1];}$r=[];for($i=0;$i<count($a);$i++){$t=array_count_values($a);$c=$t[$a[$i]];if($c>=3){$r[$a[$i][1]][$a[$i][0]]=$c;}}for($i=0;$i<count($r);$i++){$f.=key($r).array_sum(current($r));next($r);}

व्याख्या की

// Test Case
$s = 'nanananananananabatman';

// Final result here
$f = '';

// Seperate strings into array in 2 character chunks
for ($i = 0; $i < strlen($s); $i = $i + 2)
{
    $a[] = $s[$i] . $s[$i + 1];
}

// Make an array of data
// The first level of array has voted on user as key
// Inside of that array is a dictionary with the voter user as the key, and the number of votes as the value
$r = [];
for ($i = 0; $i < count($a); $i++)
{
    $t = array_count_values($a);
    $c = $t[$a[$i]];
    if ($c >= 3)
    {
        $r[$a[$i][1]][$a[$i][0]] = $c;
    }
}

// Combine votes from different users to the same user into the final result string
for ($i = 0; $i < count($r); $i++)
{
    $f .= key($r) . array_sum(current($r));
    next($r);
}

echo $f;

यह अन्य उत्तरों पर झांकने के बिना किया। यह सबसे कठिन कोड गोल्फ है जो मैंने अभी तक निबटाया है। मैं सभी आशाओं का स्वागत करता हूं।


0

आर, 221 बाइट्स

कोड

f=function(s){t=strsplit(gsub("(.{2})","\\1 ", s)," ")[[1]];z=table(t)[table(t)>2];n=substr(names(z),2,2);x=data.frame(y=z,t=n);a=aggregate(x$y,by=list(x$t),sum);for(i in nrow(a):1)cat(as.character(a[i,1]),a[i,2],sep="")}

ungolfed

f <- function(s){
  l <- gsub("(.{2})", "\\1 ", s)
  t <- strsplit(l," ")[[1]]
  z <- table(t)[table(t)>2]
  n <- substr(names(z),2,2)
  x <- data.frame(y=z,t=n)
  a <- aggregate(x$y, by=list(x$t),sum)
  for(i in nrow(a):1){
    cat(as.character(a[i,1]),a[i,2],sep="")
  }
}

यहां सुधार के लिए बहुत जगह है।

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