কোড গল্ফিনেটর -3000


22

যেমনটি সবাই জানে , inator-3000যে কোনও বিশেষ্যের শেষে যুক্ত করা এটি শীতল করে তোলে makes তবে কী আর একটি শব্দ ঠান্ডা করতে পারেন?

ইনপুট হিসাবে একটি এএসসিআইআই স্ট্রিং দেওয়া হয়েছে, শব্দের শীতলতা আউটপুট দেয় ।

শীতলতা গণনা করা হচ্ছে

একটি শব্দের শীতলতা গণনা করার জন্য 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

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

স্কোরিং

এটি , তাই প্রতিটি ভাষায় স্বল্পতম বাইট জিততে পারে!


3
পরীক্ষার কেস: inator ator hello world-1000(বা অনুরূপ)
TheLethalCoder

@ দ্য লেথলকোডার যুক্ত হয়েছে
স্কিডেদেব

@ মিঃ এক্সকোডার নিশ্চিত হন না যে এটি কীটি কভার করে যা ইতিমধ্যে আচ্ছাদন করা হয়নি, তবে এটি মজাদার তাই আমি এটিকে যাইহোক যোগ করব
স্কিডসদেব

ঠিক আছে, এখন একটি সহায়ক পরীক্ষার কেস: 9028এবং -7282(কেবলমাত্র সংখ্যা)
মিস্টার এক্সকোডার

1
নন burninator 999993000 কোন 1000? স্থানটি 1000 যুক্ত করে এবং ইনেটরটি শেষ হওয়ার জন্য তিনগুণ বেড়ে যায়।
TheLethalCoder

উত্তর:


13

জাভাস্ক্রিপ্ট (ES6), 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);}

... বা এমনকি ... শুক্রবারের মেজাজ!

(কোডটি সংযোজন করার জন্য আমি কোনও সরঞ্জাম ব্যবহার করিনি Act আসলে, আমি সত্যিই ভাগ্যবান আমি কোনও পূর্বনির্মাণ ছাড়াই ডান কলাম প্রস্থগুলি বেছে নিয়েছি And এবং এটি সংকলনও!)

ভ্যানিলা সি, 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);}}

আমি জানি না যে শেষ মেটা পোস্টের পরে এটি আইনী কিনা, তবে আপনি বিশ্বাস করেন যে এটি is এই মত অন্য ফাংশন 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 বাইট করে।
TheLethalCoder


আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.