मेरा शब्द आपके शब्द को हरा सकता है


26

संकट

दो शब्दों को देखते हुए, विजेता को एक डिजिटल रूट लड़ाई में खोजें।

एक शब्द के डिजिटल रूट को इस तरह परिभाषित करें :

  1. वर्णमाला के प्रत्येक अक्षर को एक संख्या दी गई है: A = 1, B = 2, C = 3, ..., Z = 26
  2. शब्द को कुल करने के लिए प्रत्येक अक्षर के लिए मान जोड़ें। उदाहरण के लिए "CAT" को लें। C + A + T = 3 + 1 + 20 = 24
  3. उस परिणाम को बनाने वाले सभी एकल अंकों को जोड़ें: 24 => 2 + 4 = 6
  4. जब तक आप एक अंक तक नहीं पहुँचते तब तक चरण # 3 को दोहराएं। वह एकल अंक शब्द का डिजिटल रूट है।

नियम:

  1. एक विजेता घोषित किया जाता है अगर उसकी डिजिटल जड़ दूसरे से बड़ी हो।
  2. यदि डिजिटल रूट मान समान हैं, तो शब्दों और पुनर्गणना दोनों से उच्चतम मूल्य पत्र के प्रत्येक उदाहरण को हटाकर शब्दों को छोटा करें।
  3. # 1 और # 2 के चरणों को तब तक दोहराएं जब तक कि विजेता न हो या किसी एक शब्द में केवल एक अक्षर (या कोई अक्षर) शेष न हो।
  4. यदि छोटा करने की प्रक्रिया से गुजरने के बाद डिजिटल रूट मान बराबर होते हैं, तो लंबे शब्द को विजेता घोषित किया जाता है।
  5. यदि शब्द समान लंबाई के हैं और कोई भी विजेता छोटी प्रक्रिया से गुजरने के बाद नहीं मिलता है, तो कोई विजेता घोषित नहीं किया जाता है।

विशेष नियम:

  1. डिजिटल रूट की गणना में मापांक के किसी भी उपयोग की अनुमति नहीं है। इसे कहीं और भी इस्तेमाल किया जा सकता है।
  2. मान लें कि शब्दों में केवल अपरकेस अक्षर शामिल होंगे - कोई विराम चिह्न, कोई स्थान नहीं, आदि।

इनपुट

स्टड के माध्यम से शब्दों को खींचो (अल्पविराम से अलग)। विधि पैरामीटर, या फिर भी आप चाहते हैं। अपने समाधान या कोड में स्पष्ट करें कि शब्द कैसे पार्स या तैयार किए गए हैं।

आउटपुट

विजेता शब्द प्रदर्शित करें। यदि कोई विजेता नहीं है, तो "STALEMATE" प्रदर्शित करें।

उदाहरण:

intput: कर सकते हैं, बैट

CAN = 18 = 9
BAT = 23 = 5 

आउटपुट: कर सकते हैं

intput: चिड़ियाघर, सं

ZOO = 56 = 11 = 2
NO = 29 = 11 = 2

OO = 30 = 3
N = 14 = 5

आउटपुट: नहीं

अद्यतन : इनपुट को कॉमा-पृथक स्ट्रिंग के रूप में शब्दों के साथ स्टडिन का उपयोग करके पढ़ा जाना चाहिए।

अद्यतन : के खिलाफ परीक्षण करने के लिए कुछ उदाहरण जोड़े गए।

अद्यतन : एक टाई के मामले में सबसे अधिक मूल्यवान पत्र को हटाने को स्पष्ट किया - यह रोक की स्थिति को भी थोड़ा बदल देता है - यदि कोई शब्द एक अक्षर या शून्य अक्षर लंबा है, तो छोटा करने की प्रक्रिया बंद हो जाती है


आपको इनपुट पर निर्णय लेना चाहिए, इसे पसंद करने के लिए नहीं छोड़ना चाहिए, क्योंकि यह कार्यक्रमों में बहुत बड़ा बदलाव करता है। एक इनपुट विधि चुनकर, और इसे निर्दिष्ट करके, आप "रचनात्मक व्याख्या" को हटाते हैं, और एक चुनौती बनाते हैं जो सभी के लिए समान है।
मटनवार्क

@MtnViewMark - समझ गया, लेकिन प्रभावी रूप से मैं वर्ण गणना से इनपुट को पढ़ने की कोशिश कर रहा हूं। मुझे दो शब्दों में पढ़ने के लिए सबसे चतुर या कम से कम तरीके से दिलचस्पी नहीं है। एक विशिष्ट विधि की आवश्यकता भी कुछ भाषाओं में बाधा डालती है - मुझे लगता है कि मैं समस्या के मांस पर बस पाने की कोशिश कर रहा हूं।
स्टीव

1
@Steve - तब आपको आउटपुट को "डिस्प्ले" के रूप में निर्दिष्ट नहीं करना चाहिए, हाँ? हालाँकि, मुझे लगता है कि आप शायद समस्या से बहुत अधिक दूर हो रहे हैं। एक चालाक और छोटा गोल्फ अक्सर समस्या के विभिन्न पहलुओं को मुश्किल तरीकों से संयोजित करने से उपजा होता है, उदाहरण के लिए कुछ प्रोसेसिंग को इनपुट या आउटपुट में तह करना। के रूप में विकलांग भाषाओं के लिए - बहुत उनमें से सभी स्टड पढ़ सकते हैं और स्टडआउट लिख सकते हैं।
मटनवार्क

@MtnViewMark - उचित बिंदु। मैं एक सरल अद्यतन करूँगा और इसे साफ़ करूँगा। मेरी पसंद की भाषा में सिर्फ स्टड से पढ़ने का लंबा तरीका है, इसलिए मैं पक्षपाती हूं। :)
स्टीव

क्या इनपुट को स्टड से होने के नाते मुख्य गणना के लिए एक तर्क है? ओह, और आम तौर पर, अगर आप आवारा सामानों को नीचे रखना चाहते हैं जैसे कि स्टड से पढ़ना और आयात करना या अन्य मॉड्यूल या फाइलें शामिल करना, तो पहेली को पूरे कार्यक्रम के बजाय एक फ़ंक्शन की आवश्यकता होती है जो कि जाने के लिए सबसे अच्छा तरीका होगा। ।
जोनाथन एम डेविस

जवाबों:


9

जे, १००

z=:"."0@":@(+/)^:9@(64-~a.i.])@(#~' '&i.)"1
f=:*@-/"2@(z@((]#~]i.~{.@\:~)"1^:([:=/z))){'STALEMATE'&,

इस तरह चलता है:

f 'NO',:'ZOO'
NO       
f 'CAN',:'BAT'
CAN      
f 'FAT',:'BANANA'
FAT      
f 'ONE',:'ONE'
STALEMATE

यह अभी तक इनपुट को स्वीकार नहीं करता है जैसा कि पूछा गया है।


9

एपीएल (डायलॉग) ( 91 86)

⎕ML←3⋄{Z≡∪Z←{2>⍴⍕⍵:⍵⋄∇+/⍎¨⍕⍵}¨+/¨⎕A∘⍳¨⍵:G[↑⍒Z]⋄1∊↑¨⍴¨⍵:'STALEMATE'⋄∇1∘↓¨⍵}G←Z⊂⍨','≠Z←⍞

स्पष्टीकरण (निष्पादन के क्रम में):

  • ⎕ML←3: एमएल को 3 पर सेट करें ( इसका अर्थ विभाजन है, अन्य चीजों के बीच)।
  • G←Z⊂⍨','≠Z←⍞: इनपुट पढ़ें, अल्पविराम द्वारा अलग, जी में स्टोर करें और फ़ंक्शन को पास करें।
  • +/¨⎕A∘⍳¨⍵: प्रत्येक शब्द के लिए स्कोर की गणना करें। ( ⎕Aवर्णमाला से युक्त एक सूची है।)
  • Z←{2>⍴⍕⍵:⍵⋄∇+/⍎¨⍕⍵}¨: प्रत्येक अंक के लिए डिजिटल रूट की गणना करें (जब तक कि सभी अंक एक से अधिक अंक न हो जाएं) और उन्हें Z में संग्रहीत करें।
  • Z≡∪Z: यदि सभी स्कोर अद्वितीय हैं ...
  • :G[↑⍒Z]: ... तो उच्चतम स्कोर (मूल सूची से) शब्द का उत्पादन करें।
  • ⋄1∊↑¨⍴¨⍵:'STALEMATE': अन्यथा (यदि कोई टाई है), यदि किसी एक शब्द की लंबाई 1 है, तो आउटपुट STALEMATE।
  • ⋄∇1∘↓¨⍵: अन्यथा, प्रत्येक शब्द से पहले अक्षर को लें और फिर से फ़ंक्शन चलाएँ।

5

रूबी - 210

d,e=(a,b=$<.read.chop.split(/,/)).map{|w|w.bytes.sort}
r=->w,o=65{n=0;w.map{|c|n+=c-o};n>9?r[n.to_s.bytes,48]:n}
d.pop&e.pop while r[d]==r[e]&&d[1]&&e[1]
$><<[[:STALEMATE,a,b][a.size<=>b.size],a,b][r[d]<=>r[e]]

टेस्ट:

$ ruby1.9 1128.rb <<< CAN,BAT
CAN

$ ruby1.9 1128.rb <<< ZOO,NO
NO

$ ruby1.9 1128.rb <<< ZOO,ZOO
STALEMATE

पहली पंक्ति को छोटा किया जा सकता है d,e=(a,b=gets.split ?,).map{|w|w.bytes.sort}
वेंचरो

एक टाई को निरूपित करने के लिए किसी अन्य शब्द का उपयोग करके इसे और छोटा क्यों नहीं किया जाता है? "टीआईई" बनाम "स्टेटमेट"
गफ्फी

@ गफ्फी क्योंकि युक्ति के लिए आवश्यक है कि "STALEMATE" शब्द का प्रयोग किया जाए।
पॉल प्रेस्टिज

@ मेरे पर शर्म की बात है, मैंने "If the words are of equal length and no winner is found after going through the shortening process, no winner is declared."
गफ्फी

5

हास्केल, 205 अक्षर

import List
s b=d.sum.map((-b+).fromEnum)
d q|q<10=q|1<3=s 48$show q
f=map(s 64.concat).tails.group.reverse.sort
w(a,_:b)=f a#f b where x#y|x<y=b|x>y=a|1<3="STALEMATE"
main=getLine>>=putStrLn.w.span(/=',')

नमूना चलता है:

> ghc --make WordVsWord.hs 
[1 of 1] Compiling Main             ( WordVsWord.hs, WordVsWord.o )
Linking WordVsWord ...

> ./WordVsWord <<< CAN,BAT
CAN

> ./WordVsWord <<< ZOO,NO
NO

> ./WordVsWord <<< FAT,BANANA
FAT

> ./WordVsWord <<< ONE,ONE
STALEMATE

  • संपादित करें: (227 -> 219) विजेता को बेहतर तरीके से चुनना w, छोटे, छोटे मॉड्यूल में आयातित पैटर्न मैच को छोटा करना
  • संपादित करें: (219 -> 208) जेबी के सुझावों को शामिल करें
  • संपादित करें: (208 -> 205) नकारात्मक संख्या को संभालते हैं, हाइफन के बारे में हास्केल में विषम नियमों का शोषण करते हैं

1
सीधी सूची तुलना का उपयोग करना बहुत अच्छा स्पर्श है। कुछ ने "एट-ए-झलक" सुधार का सुझाव दिया: ',':b_:b(-2), यदि आप मल्टीलाइन प्रोसेसिंग से बहुत ज्यादा अटैच नहीं हैं interact$unlines.map([...]).linesputStr.[...]=<<getLine(-11), यदि आप अपने आप को लैक्स आउटपुट putStrprint(-1) की अनुमति देते हैं । मैं उन नकारात्मक कार्रवाइयों से घृणा करता हूं जो बहुत से वर्ण ले रहे हैं, लेकिन इसके आसपास कोई रास्ता नहीं खोज सकते।
JB

धन्यवाद, जेबी! मैंने ज्यादातर सुझावों को शामिल किया। मुझे लगा कि आउटपुट को कल्पना का पालन करना चाहिए, विशेष रूप से एक नई पंक्ति के साथ। लेकिन मैं उन दो पात्रों को बचाने के लिए तैयार हूँ अगर यह करीब हो गया! :-)
माउंटन व्यूमार्क

घटाव के साथ अच्छा काम!
जेबी

3

पर्ल, 224 225 229

बुनियादी गोल्फ (अभी तक कुछ भी स्मार्ट नहीं):

split",",<>;$_=[sort map-64+ord,/./g]for@a=@_;{for(@b=@a
){while($#$_){$s=0;$s+=$_ for@$_;$_=[$s=~/./g]}}($a,$b)=
map$$_[0],@b;if($a==$b){pop@$_ for@a;@{$a[1]}*@{$a[0]}&&
redo}}say+("STALEMATE",@_)[$a<=>$b||@{$a[0]}<=>@{$a[1]}]

पर्ल 5.10 और इसके बाद के संस्करण, के साथ perl -M5.010 <file>याperl -E '<code here>'

$ perl -M5.010 word.pl <<<CAN,BAT
CAN
$ perl -M5.010 word.pl <<<ZOO,NO
NO

$ perl -M5.010 word.pl <<<NO,ON
STALEMATE

2

के, 106

{a::x;@[{$[(>). m:{+/"I"$'$+/@[;x].Q.A!1+!26}'x;a 0;(<). m;a 1;.z.s 1_'x@'>:'x]};x;"STALEMATE"]}[","\:0:0]

स्टैक त्रुटियों को पकड़ने के लिए अपवाद हैंडलिंग का उपयोग करता है, जिसके परिणामस्वरूप गतिरोध के मामले होते हैं।


2

VBA ( 242 462)

Function s(q,Optional l=0)
s=-1:t=Split(q,","):r=t:m=t
For j=0 To 1
m(j)=0:w=t(j)
While Len(w)>1 Or Not IsNumeric(w)
b=0
For i=1 To Len(w)
a=Mid(w,i,1):a=IIf(IsNumeric(a),a,Asc(a)-64):b=b+a
If m(j)+0<a+0 Then m(j)=a
Next
w=b
Wend
r(j)=b
Next
s=IIf(r(0)>r(1),0,IIf(r(0)<r(1),1,s))
For j=0 To 1
r(j)=Replace(t(j),Chr(m(j)+64),"",,1)
Next
If s<0 And Len(t(0))+Len(t(1))>2 Then s=s(r(0) & "," & r(1),1)
If l=0 Then If s>=0 Then s=t(s) Else s="STALEMATE"
End Function

नीचे दिया गया कोड कल्पना से मेल नहीं खाता, इसलिए मुझे फिर से काम करना पड़ा, और अधिक लंबाई जोड़कर (ऊपर देखें)। : - / यह आगे गोल्फ होने में सक्षम हो सकता है, लेकिन यह पहले से ही बहुत कॉम्पैक्ट है और मुझे संदेह है कि मैं इसे एक प्रतिस्पर्धी स्कोर पर वापस लाने में सक्षम होऊंगा।

मूल (नीचे) ने टाई होने पर शब्दों से उच्चतम-मूल्यवान अक्षर को नहीं हटाया था।

Sub s(q)
t=Split(q,",")
r=t
For j=0 To 1
w=t(j):b=0
For i=1 To Len(w)
b=b+Asc(Mid(w,i,1))-64
Next
While Len(b)>1
d=0
For i=1 To Len(b)
d=d+Mid(b,i,1)
Next
b=d
Wend
r(j)=b
Next
MsgBox IIf(r(0)>r(1),t(0),IIf(r(0)<r(1),t(1),"STALEMATE"))
End Sub

2

यह वास्तव में मेरे फैंस को लगा और यह मेरी पहली पोस्ट है। हालांकि यह पुराना है, मैंने देखा कि किसी ने भी php संस्करण नहीं किया है इसलिए यहाँ मेरा है।

<?php $f='CAN,CBN';$w=explode(',',$f);$a=$ao=$w[0];$b=$bo=$w[1];$c='';
function splice($a,$t){$s=$h=0;$y=array();$x=str_split($a);
foreach($x as $k=>$v){$s=$s+ord($v)-64;if($v>$h){$h=$k;}}
$y[0]=$s;if($t==1){unset($x[$h1]);$y[1]=$x;}return $y;}
while($c==''){$y1=splice($a,0);$y2=splice($b,0);$y3=splice($y1[0],1);
$y4=splice($y2[0],1);if($y3[0]>$y4[0]){$c=$ao;}else if($y3[0]<$y4[0]){$c=$bo;
}else if((strlen($a)<1)OR(strlen($b)<1)){if(strlen($a)<strlen($b)){$c=$ao;}
else if(strlen($b)<strlen($a)){$c=$bo;}else{$c='STALEMATE';}}}
echo $c;
?>

534 वर्ण।

अब मैं शुरू करने के नियमों के अनुसार अनिश्चित हूं इसलिए मैंने अपने इनपुट के रूप में $ f = 'CAN, CBN' के साथ शुरुआत की। मुझे उम्मीद है कि यह सही था। मैंने सभी परीक्षण चलाए हैं और यह उन सभी को पारित करता है, हालांकि यह विशेष रूप से सुरुचिपूर्ण नहीं है। मुझे वास्तव में अब कुछ नींद मिलनी चाहिए, लेकिन मुझे इस काम में बहुत मज़ा आया - एक महान पहेली के लिए धन्यवाद।

Http://codepad.org/ZSDuCdin पर कोड किया गया


आप $f=trim(fgets(fopen('php://stdin')));इनपुट लेने के लिए उपयोग कर सकते हैं ।
26lektra

स्क्रैच कि, $w=fgetcsv(STDIN);बेहतर काम करता है।
27lektra

1

D: 326 वर्ण

import std.algorithm,std.array,std.conv,std.stdio;void main(string[]a){alias reduce r;auto b=array(splitter(a[1],","));auto s=map!((a){int n=r!"a+b"(map!"cast(int)(a-'A')+1"(a));while(n>9)n=r!"a+b"(map!"cast(int)(a-'0')"(to!string(n)));return n;})(b);int v=r!"a>b?a:b"(s);writeln(count(s,v)>1?"STALEMATE":b[countUntil(s,v)]);}

अधिक कानूनी रूप से:

import std.algorithm, std.array, std.conv, std.stdio;

void main(string[] a)
{
    alias reduce r;

    auto b = array(splitter(a[1], ","));
    auto s = map!((a){int n = r!"a + b"(map!"cast(int)(a - 'A') + 1"(a));

                      while(n > 9)
                          n = r!"a+b"(map!"cast(int)(a - '0')"(to!string(n)));

                      return n;
                     })(b);
    int v = r!"a > b ? a : b"(s);

    writeln(count(s, v) > 1 ? "STALEMATE" : b[countUntil(s, v)]);
}

1

मेथेमेटिका

कुछ विवरण अभी भी गायब हैं

a = {"ZOO"}; b = {"NO"}
f = FixedPoint[IntegerDigits@Total@# &, #] &

If[(s = f /@ 
        NestWhile[(# /. Max@# -> 0 &) /@ # &, (ToCharacterCode @@ # - 64) & /@ #, 
        f[#[[1]]] == f[#[[2]]] &, 1, 5] &@{a, b})[[1, 1]] > s[[2, 1]], 
   a, b, "STALMATE"]  

{"NO"}

1

गणितज्ञ 220 207

इसे लिखने के बाद, मैंने देखा कि यह उसी तर्क का अनुसरण करता है जो बेलिसरियस ने किया था,

h@u_ := ToCharacterCode@u - 64;
m@w_ := FromCharacterCode[Most@Sort@h@w + 64];
f@v_ := FixedPoint[Tr@IntegerDigits@# &, Tr@h@v];
x_~g~y_ := If[f@x == f@y, g[m@x, m@y], If[f@x > f@y, 1, 2]];
x_~z~x_ := "STALEMATE";
x_~z~y_ := {x, y}[[x~g~y]] 

प्रयोग

z["ZOO", "NO"]
z["CAN", "BAT"]
z["FAT", "BANANA"]
z["ONE", "ONE"]

परिणाम

क्योंकि प्रतिक्रिया प्रतिस्पर्धी नहीं है (इतनी लंबी-घुमावदार होने के नाते), मैंने मैथमेटिका के लिए अधिक जन्मजात इनपुट इनपुट का उपयोग करने का निर्णय लिया।


1

कॉफ़ीस्क्रिप्ट - 335

z=(a,b,g=a,h=b)->c=y a;d=y b;e=a.length;f=b.length;return g if(c>d);return h if(d>c);return g if(e<2&&f>1);return h if(f<2&&e>1);return "STALEMATE" if(f==e&&f<2);z(x(a),x(b),a,b)
y=(a)->t=0;t+=c.charCodeAt(0)-1 for c in a;t-=9 while 9<t;t
x=(a)->for i in[90..65]
 b=new RegExp(String.fromCharCode(i));return a.replace b, "" if b.test a

इस से उतना खुश नहीं हूँ जितना कि मैं हो सकता था, लेकिन मैं इसे वैसे भी रखूँगा। वास्तविक स्कोरिंग बहुत संक्षिप्त ( yफ़ंक्शन) है, लेकिन ifपरिणामों की तुलना करने के लिए ( zबहुत) लंबे समय तक मिलते हैं।

इसका उपयोग करने के लिए zअपने दो शब्दों (जैसे z 'FOO','BAR') के साथ कॉल करें । यह दोनों शब्दों को स्कोर करेगा और उच्च स्कोरिंग शब्द लौटाएगा। यदि यह एक टाई है, तो यह संशोधित शब्दों (मूल को अंतिम रूप देने के लिए रखते हुए, इसलिए अतिरिक्त दो मापदंडों को ध्यान में रखते हुए) से फिर से xउठेगा।

रुचि रखने वालों के लिए समकक्ष (विस्तारित) जावास्क्रिप्ट:

var x, y, z;

z = function(a, b, g, h) {
  var c, d, e, f;
  if (g == null) {
    g = a;
  }
  if (h == null) {
    h = b;
  }
  c = y(a);
  d = y(b);
  e = a.length;
  f = b.length;
  if (c > d) {
    return g;
  }
  if (d > c) {
    return h;
  }
  if (e < 2 && f > 1) {
    return g;
  }
  if (f < 2 && e > 1) {
    return h;
  }
  if (f === e && f < 2) {
    return "STALEMATE";
  }
  return z(x(a), x(b), a, b);
};

y = function(a) {
  var c, t, _i, _len;
  t = 0;
  for (_i = 0, _len = a.length; _i < _len; _i++) {
    c = a[_i];
    t += c.charCodeAt(0) - 1;
  }
  while (9 < t) {
    t -= 9;
  }
  return t;
};

x = function(a) {
  var b, i, _i;
  for (i = _i = 90; _i >= 65; i = --_i) {
    b = new RegExp(String.fromCharCode(i));
    if (b.test(a)) {
      return a.replace(b, "");
    }
  }
};

1

रैकेट 479 बाइट्स

(define(dl n)(let p((ol '())(n n))(let-values(((q r)(quotient/remainder n 10)))(if(= q 0)(cons r ol)(p(cons r ol)q)))))
(define(dr N)(let p2((n N))(define s(apply +(dl n)))(if(< s 10)s(p2 s))))
(let p3((l(for/list((i(string->list s)))(-(char->integer i)64)))(k(for/list((i(string->list t)))(-(char->integer i)64))))
(let((a(dr(apply + l)))(b(dr(apply + k))))(cond[(> a b)s][(< a b)t][(equal? l k)"STALEMATE"][else(p3(remove*(list(apply max l))l)(remove*(list(apply max k))k))])))

Ungolfed:

(define (f s t)

  (define (getDigitList n)                     ; sub-fn  to get digit list
    (let loop ((ol '())
               (n n))
      (let-values (((q r) (quotient/remainder n 10)))
        (if (= q 0) (cons r ol)
            (loop (cons r ol) q)))))

  (define (digit_root N)                       ; sub-fn to get digital root of a number
    (let loop2 ((n N))                        
      (define s (apply + (getDigitList n)))    
      (if (< s 10)
          s
          (loop2 s))))

  (let loop3 ((l (for/list ((i (string->list s)))  ; actual fn to compare 2 strings
                   (- (char->integer i) 64)))
              (k (for/list ((i (string->list t)))
                   (- (char->integer i) 64))))
    (let ((a (digit_root (apply + l)))
          (b (digit_root (apply + k))))
      (cond
        [(> a b) s]
        [(< a b) t]
        [(equal? l k) "STALEMATE"]
        [else (loop3 (remove* (list (apply max l)) l)
                     (remove* (list (apply max k)) k)
                     )]
        ))))

परिक्षण:

(f "CAN" "BAT")
(f "ZOO" "NO")

आउटपुट:

"CAN"
"NO"

1

PHP, 339 (कल्पना नहीं), 410 382 359 339 337 बाइट्स

$b=$w=fgetcsv(STDIN);function a($c){for(;a&$g=$c[$p++];)$f+=ord($g)-64;$f=trim($f);for(;$f[1]&a;$f=$h)for($h=0;a&$r=$f[$q++];$h=bcadd($h,$r));return$f;}function d($f){return strtr($f,[max(str_split($f))=>'']);}for(;$c==$d;$b=[$e,$f]){$x=$z++?d:trim;$e=$x($b[0]);$f=$x($b[1]);$c=a($e);$d=a($f);$e||die(STALEMATE);$c!=$d&&die($w[$c<=$d]);}

EDIT 1 : +71 बाइट्स। के STDINबजाय fopen('php://stdin','r');और लघु टैग का उपयोग करना । इसके अलावा, कल्पना के लिए पूर्ण अनुरूपता।

EDIT 2 : -28 बाइट्स। का उपयोग fgetcsv(STDIN)करने के बजाय explode(',',trim(fgets(STDIN))), और उपयोग forकरने के बजाय पाश whileपाश।

EDIT 3 : -23 बाइट्स। मर्ज किए गए कार्य aऔर b, लूप के लिए मर्ज किए गए।

EDIT 4 : -20 बाइट्स। cएक पुनरावर्ती से एक लूप में बदल गया । फिर, फ़ंक्शन को हटा दिया cऔर इसके कोड को वैश्विक नामस्थान में डाल दिया।

EDIT 5 : -2 बाइट्स। -rझंडे के लिए @Titus का धन्यवाद ।



0

जावा

    public static void main(String args[]) throws Exception{
        String input=(new BufferedReader(new InputStreamReader(System.in)).readLine());
        StringTokenizer st = new StringTokenizer(input, ",");
        String w1 = st.nextToken();String w2 = st.nextToken();int s1=0;int s2=0;
        String flag="";
        do{ Integer sum1=0;Integer sum2=0;
        for (int i=0;i<w1.length();i++)
            sum1+=((int)w1.charAt(i) - 64);
        for (int i=0;i<w2.length();i++)
            sum2+=((int)w2.charAt(i) - 64);
        while (sum1.toString().length()>1){
            s1=0;
            for (int i=0;i<sum1.toString().length();i++)
                s1+=((int)sum1.toString().charAt(i)-48);
            sum1=s1;
        }
        while (sum2.toString().length()>1){
            s2=0;
            for (int i=0;i<sum2.toString().length();i++)
                s2+=((int)sum2.toString().charAt(i)-48);
            sum2 =s2;
        }
        flag=(s1>s2)?w1:(s1!=s2)?w2:"";
        if (flag!="")
            {st = new StringTokenizer(input,",");
                if (s1>s2)
                    System.out.println(st.nextToken());  
                else{
                    st.nextToken();
                    System.out.println(st.nextToken());
                }
            }
        int max=0;
        for (int i=0;i<w1.length();i++){
            max=((int)w1.charAt(i)>max)?(int)w1.charAt(i):max;
        }
        w1 = w1.replace((char)max, (char)64);
        max=0;
        for (int i=0;i<w2.length();i++){
            max=((int)w2.charAt(i)>max)?(int)w2.charAt(i):max;
        }
        w2 = w2.replace((char)max, (char)64);
            }while(flag=="" && !w1.equals(w2)); 
    if (flag.length()<1)
        System.out.println("STALEMATE");
        }

उपरोक्त कोड टाई के मामले में सभी अधिकतम चरित्र को बदल देता है .. क्या यह आवश्यक है?
अमन ZeeK वर्मा

0

सी ++, 473 (मैं एक कोर्स लोहा उधार ले रहा हूं)

#include<iostream>
#define $ string
#define _ return
using namespace std;$ S($&s){int i=-1,m=i,x=0;while(++i<s.length())if(s[i]-'@'>x)m=i,x=s[i];s.erase(m,1);_ s;}int M($ w){int i,v=0;for(i=0;i<w.length();++i)v+=w[i]-'@';while(v>9){i=0;while(v)i+=v-v/10*10,v/=10;v=i;}_ v;}$ B($ x, $ y){while(!(M(x)-M(y)))S(x),S(y);if(M(x)>M(y))_ x;if(M(x)<M(y))_ y;_"STALEMATE";}int main(int c,char**v){$ s;cin>>s;$ x=s.substr(0,s.find(',')),y=s.substr(s.find(',')+1);cout<<B(x,y)<<endl;_ 0;}

मुझे यकीन है कि मैं इसे किसी तरह छोटा कर सकता हूं, लेकिन मैं थक गया हूं।

संपादित करें: मूल रूप से कमांड लाइन तर्क ले लिया, संशोधित करने के लिए सिनेमा का उपयोग करें। यह शायद अब कुछ वर्ण है, लेकिन मैं इसे याद करने के लिए बहुत थक गया हूँ।


0

पायथन: 383 वर्ण

फ़ंक्शन चलाएँ c('CAN','BAT'):

def k(j):
 l=list(j);l.remove(max(j));return''.join(l)
def f(x):
 x=str(x)
 if len(x)==1 and x.isdigit():return int(x)
 return f(sum('ABCDEFGHIJKLMNOPQRSTUVWXYZ'.index(y)+1 for y in x)) if x.isalpha() else f(sum(map(int,x)))
def c(a,b):
 v=f(a);u=f(b);
 if v>u:return a
 if v<u:return b
 return'STALEMATE' if v==u and (len(a)==1 or len(b)==1)else c(k(a),k(b))

0

एफ #, 559 533 530 बाइट्स

अभी तक प्रतिस्पर्धी नहीं है। मुझे यकीन है कि को छोटी और साथ ही अंतिम कुछ पंक्तियों में बनाया जा सकता है। कमांड लाइन आर्ग्स के लिए आसान पहुँच न होना भी यहाँ कष्ट दे रहा है।

open System
let m=Seq.map
let a s=s="";s.ToUpper()|>m(fun c->int c-64)
let rec c i=if i>9 then string i|>m(int>>(-))|>m(fun x->x 48)|>Seq.sum|>c else i
let b i=Seq.fold(fun(r,a)j->(Seq.sum i-a)::r,a+j)([],0)(Seq.sortBy(~-)i)|>fst|>m c
[<EntryPoint>]
let x z=
 let y=z.[0].Split(',')
 let u,v=y.[0].Length,y.[1].Length
 printf"%s"(Seq.fold2(fun s l r->if l=r then 3::s else if l>r then 0::s else 1::s)[](b<|a y.[0])(b<|a y.[1])|>Seq.tryFind((>)3)|>function|None when u>v->y.[0]|None when u<v->y.[1]|Some x->y.[x]|_->"STALEMATE")
 0

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

  • तार के साथ तुलना करके स्ट्रिंग को विवश करके 3 बाइट्स सहेजे गए

अनप्लग्ड संस्करण

open System
let m=Seq.map // this is just to save some characters and I'll use Seq.map for this version

let toIntList s =
    s = "" // constrain s to type string
    s.ToUpper()
    |>Seq.map (fun c -> int c - 64) // converts char value to int and offsets it so that A=1

let rec digitSumUntilSingle i =
    if i > 9 then
        string i                // convert number to string
        |>Seq.map ( int>>(-) )  // convert individual char to int and partially apply substraction
                                // this returns a function
        |>Seq.map (fun x -> x 48) // provide last parameter for substraction, this is equivalent to
                                  // charValue - 48
        |>Seq.sum                 // sum over all digits
        |>digitSumUntilSingle     // recursively call this function again in case we are >9
    else
        i

let calculateDigitalRoot input =
    Seq.fold(fun (result, acc) current ->       // calculate digital root for all possible iterations
                (Seq.sum input - acc)::result,  // basically, this calculates Rule 3 until the end for a given word
                acc + current
            ) ([], 0) (Seq.sortBy (~-) input) // sort input by value descending
    |>fst   // only interested in the lits, not the final accumulator
    |>Seq.map digitSumUntilSingle

[<EntryPoint>]
let main (args) =
    let y = args.[0].Split(',')
    let leftLength = y.[0].Length
    let rightLength = y.[1].Length

    Seq.fold2 (fun state left right ->
                if left = right then
                    3::state
                else if left > right then
                    0::state                // 0 is chosen because this represents y[0] index
                else
                    1::state
               ) [] (calculateDigitalRoot (toIntList y.[0])) (calculateDigitalRoot (toIntList y.[1]))
    |> Seq.tryFind ((>) 3)                  // try to find first variation where left and right digital root isn't equal
    |> function
        | None when leftLength > rightLength -> y.[0]
        | None when leftLength < rightLength -> y.[1]
        | Some x -> y.[x]
        | _ ->"STALEMATE"
    |>printf "%s" 
    0

0

PHP, 296 281 267 बाइट्स

function f(&$s){for(;$c=$s[$i++];$m>$c||$m=$c)$p+=ord($c)&31;for($s=str_replace($m,'',$s);9<$p=array_sum(str_split($p)););return$p;}for(list($a,$b)=$x=fgetcsv(STDIN);$s==$t&&$a&$b;$t=f($b))$s=f($a);echo($s-=$t)||($s=strlen($x[0])-strlen($x[1]))?$x[+($s<0)]:STALEMATE;

इसे ऑनलाइन चलाएं -nया प्रयास करें (TiO में ब्रेकडाउन शामिल है)।

फ़रवरी 2011 में वापस, वर्तमान PHP संस्करण 5.3.5 था; इसलिए मैं नहीं कर सका

  • आशुलिपि सूची असाइनमेंट का उपयोग करें ( [$a,$b]=fgetcsv(...)और ऐसे)
  • उर्फ count_charsइनलाइन
  • सूचकांक समारोह सीधे परिणाम
  • इसके बजाय नकारात्मक स्ट्रिंग इंडेक्स का उपयोग करें substr

लेकिन न तो बहुत कुछ बचाया होगा; इसलिए यह ज्यादा मायने नहीं रखता है।

सबसे महंगी चीजें लूप थीं (बेशक) और नियम # 4 ( 40 36 बाइट्स)।

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