कोड गोल्फिनेटर -3000


22

जैसा कि सभी जानते हैं , inator-3000किसी भी संज्ञा के अंत में जोड़ देने से यह ठंडा हो जाता है। लेकिन और क्या एक शब्द कूलर बना सकता है?

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

शीतलता की गणना

किसी शब्द की शीतलता की गणना करने के लिए 4 तत्व हैं।

  • शब्द ही। आधार स्कोर 1000 से गुणा किए गए बड़े अक्षरों की संख्या है
  • अंतिम संख्या। शब्द के अंत में एक संख्या (जैसे कि बर्निनेटर- 3000 ) को आधार स्कोर में जोड़ा जाता है, लेकिन यदि संख्या 4 अंकों से अधिक है, तो वे बहुत लालची हो रहे हैं और संख्या को अनदेखा किया जाना चाहिए।
  • योजक। अंतिम संख्या से पहले एक स्थान 1000 जोड़ता है, जबकि एक हाइफ़न 2000 जोड़ता है, कोई अन्य प्रतीक, या कोई प्रतीक बिल्कुल भी नहीं है।
  • प्रत्यय। यदि शब्द समाप्त होता है ator, तो अंतिम स्कोर को दोगुना करें। यदि यह समाप्त होता है inator, तो स्कोर को तीन गुना कर दें। ये केस असंवेदनशील हैं।

इसलिए उदाहरण के लिए Burninator-3000गणना की जा सकती है:

1 Capital letter - Base Score: 1000
(1000(base) + 3000(number) + 2000(hyphen)) * 3(suffix) = 18000

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

Burninator-3000 -> 18000
Burnator3000 -> 8000
BurNinator 100 -> 9300
BuRnInAtOr-7253 -> 42759
burn -> 0
burn- -> 0
bUrn-1 -> 3001
inator-7 -> 6021
ator 56 -> 2112
burninators 1000 -> 2000
burn_1000 -> 1000
BURNINATOR-9999 -> 65997
burninator 99999 -> 3000
burninator_99999 -> 0
Code Golfinator-3000 -> 21000
inator ator hello world-1000 -> 3000
javaiscool_99999 -> 0
hypen-ated -> 0
1000 -> 1000
-1000 -> 3000
10000 -> 0
-10000 -> 2000
BURN1N470R-3000 -> 11000

स्कोरिंग

यह , इसलिए प्रत्येक भाषा में सबसे कम बाइट्स जीतता है!


3
टेस्ट केस: inator ator hello world-1000(या समान)
TheLethalCoder

@TheLethalCoder जोड़ा गया
स्किड्सदेव

@ Mr.Xcoder निश्चित नहीं है कि यह क्या कवर करता है जो पहले से ही कवर नहीं किया गया है, लेकिन यह अजीब है इसलिए मैं इसे वैसे भी जोड़
दूंगा

ठीक है, अब एक सहायक परीक्षण मामला है: 9028और -7282(केवल अंक)
श्री एक्सकोडर

1
नहीं है burninator 999993000 नहीं 1000? अंतरिक्ष 1000 और अंत में समाप्त होने के लिए तीन गुना बढ़ाता है।
द लीथेलकोडर

जवाबों:


13

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

s=>(([,a,b,,c,d]=s.match(/((in)?ator)?((\D?)(\d+))?$/i),s.split(/[A-Z]/).length-1+(c=='-'?2:c==' '))*1e3+(d<1e4&&+d))*(b?3:2-!a)

कैसे?

निम्नलिखित द्वारा बड़े अक्षरों की संख्या दी गई है:

s.split(/[A-Z]/).length - 1

अन्य सभी मानदंड निम्नलिखित नियमित अभिव्यक्ति के परिणाम से काटे जाते हैं, जिसे 4 चर में विभाजित किया जाता है:

/((in)?ator)?((\D?)(\d+))?$/i     criterion  | code                    | outcome
 \_________/  \___/\___/          -----------+-------------------------+----------
      a         c    d            end number | d < 1e4 && +d           | 0 or +d
  \___/                           connector  | c == '-' ? 2 : c == ' ' | 0, 1 or 2
    b                             suffix     | * (b ? 3 : 2 - !a)      | 1, 2 or 3

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


7

वेनिला सी, 447 बाइट्स

(पठनीयता के लिए लिपटा)

#include<stdio.h>
int main(int c,char**a){char*v=a[1];while(*v++);int m=0,i=
0,bn=0,s=0,b=0,mul=1;char l[256],*lp=l;v--;while(a[1]<v--)
{if(!m){i=!i?1:(i*10),('0'<=*v&&*v<='9')?(bn=bn+i*(*v-'0')
):m++;}if(m==1){(*v=='-'||*v==' ')?(s+=bn?((*v=='-')?2000:
1000):0,v--):0,m++;}if(m==2){(*v>='A'&&*v<='Z')?(s+=1000,*
v+=32):0,*lp++=*v;}}s+=(bn<10000)?bn:0;for(i=0;i<lp-l;i++)
{if(*(l+i)=="rotani"[i]){mul=(i==5)?3:((i==3)?2:mul);}}s*=
mul;printf("%d\n",s);}

... या यहां तक ​​कि ... शुक्रवार मूड!

(मैंने कोड को प्राप्त करने के लिए किसी भी उपकरण का उपयोग नहीं किया। वास्तव में, मैं वास्तव में भाग्यशाली हूं कि मैंने बिना किसी पूर्वगामी के सही कॉलम चौड़ाई को चुना। और यह भी संकलन करता है!)

वेनिला सी, 789 बाइट्स

#include<stdio.h>
int main(int c,     char**a){char       *v=a[1];while      (*v++);int m=0,i=
        0,bn=0,     s=0,     b=0,       mul=1   ;char      l[256],    *lp=l;
          v--;      while  (a[1]<       v--)    {if(!      m){i=!i    ?1:(i*
          10),      ('0'   <=*v&&       *v<=    '9')?      (bn=bn+    i*(*v-
'0')):m++;}if(      m==1)  {(*v==       '-'||    *v==      ' ')?(s    +=bn?(
(*v=='-')?2000      :1000) :0,v--       ):0,m    ++;}      if(m==2     ){(*v
       >='A'&&      *v<=    'Z')?       (s+=    1000,      *v+=32)    :0,*lp
          ++=*      v;}}s  +=(bn<       10000   )?bn:      0;for(i     =0;i<
         lp-l;      i++){  if(*(l       +i)==   "rot"      "ani"[i]   ){mul=
(i==5) ?3: ((i      ==3)?2:mul);}       } s *= mul;        printf("%d\n",s);}

मूल कोड:

#include <stdio.h>
#include <math.h>

int main(int argc, char** argv) {
    char *v = argv[1];
    while(*v++);
    int m=0,i=-1;
    int bonus_number=0;
    int score=0;
    int b=0;
    int mul=1;
    char letters[256];
    char* lp=letters;
    v--;
    while(argv[1]<v--) {
        printf(" * %c %x\n", *v, *v);
        if (m == 0) {
            if ('0'<=*v&&*v<='9') {
                bonus_number=bonus_number+powl(10,++i)*(*v-'0');
                printf("Digit, bonus is now %d\n", bonus_number);
            } else {
                m++;
            }
        }
        if (m == 1) {
            if (*v=='-'||*v==' ') {
                printf("Dash/space\n");
                if (bonus_number) score += (*v=='-') ? 2000 : 1000;
                v--;
            }
            m++;
        }
        if (m == 2) {
            if(*v>='A'&&*v<='Z') {
                printf("Upper letter\n");
                score += 1000;
                *v += 32;
            }
            *lp++ = *v;
        }
    }
    score += (bonus_number<10000)?bonus_number:0;
    for(i=0;i<lp-letters;i++) {
        // printf("%d: %c\n\n", i, *(letters+i));
        if (*(letters+i) == "rotani"[i]) {
            if (i == 3) {
                printf("2x!\n");
                mul = 2;
            }
            if (i == 5) {
                printf("3x!\n");
                mul = 3;
            }
        }
    }
    score *= mul;
    printf("Score: \n%d\n", score);
}

1 न्यूनतम करने के बाद:

#include <stdio.h>

int main(int c, char** a) {
    char *v = a[1];while(*v++);
    int m=0,i=0,bn=0,s=0,b=0,mul=1;
    char l[256],*lp=l;
    v--;
    while(a[1]<v--) {
        if (!m) {
            i=!i?1:(i*10),
            ('0'<=*v&&*v<='9') ? (bn=bn+i*(*v-'0')) : m++;
        }
        if (m == 1) {
            (*v=='-'||*v==' ') ? (s += bn ? ((*v=='-') ? 2000 : 1000) : 0, v--):0,m++;
        }
        if (m == 2) {
            (*v>='A'&&*v<='Z') ? (s += 1000, *v += 32):0,
            *lp++ = *v;
        }
    }
    s += (bn<10000)?bn:0;
    for(i=0;i<lp-l;i++) {
        if (*(l+i) == "rotani"[i]) {
            mul=(i==5)?3:((i==3)?2:mul);
        }
    }
    s *= mul;
    printf("%d\n", s);
}

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

#!/usr/bin/env python3
import subprocess

TESTCASES = '''
Burninator-3000 -> 18000
Burnator3000 -> 8000
BurNinator 100 -> 9300
BuRnInAtOr-7253 -> 42759
burn -> 0
burn- -> 0
bUrn-1 -> 3001
inator-7 -> 6021
ator 56 -> 2112
burninators 1000 -> 2000
burn_1000 -> 1000
BURNINATOR-9999 -> 65997
burninator 99999 -> 3000
burninator_99999 -> 0
Code Golfinator-3000 -> 21000
inator ator hello world-1000 -> 3000
javaiscool_99999 -> 0
hypen-ated -> 0
1000 -> 1000
-1000 -> 3000
10000 -> 0
-10000 -> 2000
BURN1N470R-3000 -> 11000
'''

TESTCASES = dict(map(lambda x: x.split(' -> '), filter(None, TESTCASES.split('\n'))))


def process(arg):
    return subprocess.Popen(['./a.out', arg], stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()[0].strip().split(b'\n')[-1].decode('utf-8')


for key, value in TESTCASES.items():
    assert value == process(key), '"{}" should yield {}, but got {}'.format(
        key, value, process(key)
    )

2

सी #, 322 317 बाइट्स

namespace System.Linq{s=>{var m=Text.RegularExpressions.Regex.Match(s,"(.*?)([- ])?(\\d+)$");string t=m.Groups[1].Value.ToLower(),c=m.Groups[2].Value,n=m.Groups[3].Value;return(s.Count(char.IsUpper)*1000+(n.Length>4|n==""?0:int.Parse(n))+(c==" "?1000:c=="-"?2000:0))*(t.EndsWith("inator")?3:t.EndsWith("ator")?2:1);}}

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

पूर्ण / स्वरूपित संस्करण:

namespace System.Linq
{
    class P
    {
        static void Main()
        {
            Func<string, int> f = s =>
            {
                var m = Text.RegularExpressions.Regex.Match(s, "(.*?)([- ])?(\\d+)$");
                string t = m.Groups[1].Value.ToLower(), c = m.Groups[2].Value, n = m.Groups[3].Value;

                return (
                           s.Count(char.IsUpper) * 1000 +
                           (n.Length > 4 | n == "" ? 0 : int.Parse(n)) +
                           (c == " " ? 1000 : c == "-" ? 2000 : 0)
                        )
                        * (t.EndsWith("inator") ? 3 : t.EndsWith("ator") ? 2 : 1);
            };

            string[] testCases =
            {
                "Burninator-3000", "Burnator3000", "BurNinator 100", "BuRnInAtOr-7253",
                "burn", "burn-", "bUrn-1", "inator-7", "ator 56", "burninators 1000",
                "burn_1000", "BURNINATOR-9999", "burninator 99999", "burninator_99999",
                "Code Golfinator-3000", "inator ator hello world-1000", "javaiscool_99999",
                "hypen-ated", "1000", "-1000", "10000", "-10000"
            };

            foreach (string testCase in testCases)
            {
                Console.WriteLine($"{testCase} -> {f(testCase)}");
            }

            Console.ReadLine();
        }
    }
}

रेगेक्स को स्वयं विधि में विभाजित करना अब 4 बाइट्स लंबा है (जब तक कि मैंने कुछ याद नहीं किया) केवल एक मेमने की अनुमति होने के कारण। यह 321 बाइट्स में आता है:

namespace System.Linq{string m(string s,int n)=>Text.RegularExpressions.Regex.Match(s,"(.*?)([- ])?(\\d+)$").Groups[1].Value.ToLower();s=>{string t=m(s,1),c=m(s,2),n=m(s,3);return(s.Count(char.IsUpper)*1000+(n.Length>4|n==""?0: int.Parse(n))+(c==" "?1000:c=="-"?2000:0))*(t.EndsWith("inator")?3:t.EndsWith("ator")?2:1);}}

मुझे नहीं पता कि यह अंतिम मेटा पोस्ट के बाद कानूनी है, लेकिन आप मानते हैं कि यह है। इस तरह एक और कार्य नहीं b=c=>d=>c.Groups[d].Valueबचा होगा ?
लिफडेवेन जू

@LiefdeWen अंतिम मेटा पोस्ट के बाद मेरा मानना ​​है कि मुझे इसे पूर्ण विधि के रूप में घोषित करना होगा। मैं कर सकता था, string m(string s,int n)=>Text.RegularExpressions.Regex.Match(s,"(.*?)([- ])?(\\d+)$").Groups[n].Value.ToLower();string t=m(s,1),c=m(s,2),n=m(s,3);लेकिन मेरा मानना ​​है कि तब यह 3 बाइट्स और अधिक कर देता है।
द लीथेलकोडर


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