Word ของฉันสามารถเอาชนะ Word ของคุณได้


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. สมมติว่าคำจะประกอบด้วยตัวอักษรตัวพิมพ์ใหญ่เท่านั้น - ไม่มีเครื่องหมายวรรคตอนไม่มีช่องว่าง ฯลฯ

INPUT

ดึงคำผ่าน stdin (คั่นด้วยเครื่องหมายจุลภาค) พารามิเตอร์วิธีการหรือคุณต้องการ ทำให้ชัดเจนในการแก้ปัญหาของคุณหรือรหัสวิธีแยกคำหรือเตรียม

เอาท์พุท

แสดงคำที่ชนะ หากไม่มีผู้ชนะให้แสดง "STALEMATE"

ตัวอย่าง:

การป้อนข้อมูล: CAN, BAT

CAN = 18 = 9
BAT = 23 = 5 

เอาท์พุท: CAN

การป้อนข้อมูล: ZOO, NO

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

OO = 30 = 3
N = 14 = 5

เอาท์พุท: NO

UPDATE : อินพุตต้องอ่านโดยใช้ stdin โดยใช้คำว่าเป็นสตริงที่คั่นด้วยเครื่องหมายจุลภาค

UPDATE : เพิ่มตัวอย่างสองสามตัวอย่างเพื่อทดสอบ

UPDATE : ชี้แจงการลบตัวอักษรที่มีค่าสูงสุดในกรณีของเน็คไท - ซึ่งจะเปลี่ยนสภาพการหยุดเล็กน้อยเช่นกัน - หากคำหนึ่งตัวอักษรหรือตัวอักษรเป็นศูนย์ยาวกระบวนการตัดทอนจะหยุดลง


คุณควรตัดสินใจเลือกอินพุตอย่าปล่อยให้เป็นทางเลือกเนื่องจากมันสร้างความแตกต่างอย่างมากในโปรแกรม ด้วยการเลือกวิธีป้อนข้อมูลและการระบุคุณจะลบ "การตีความเชิงสร้างสรรค์" และสร้างความท้าทายที่เท่าเทียมกันสำหรับทุกคน
MtnViewMark

@MtnViewMark - เข้าใจ แต่มีประสิทธิภาพฉันพยายามลบการอ่านของอินพุตจากจำนวนตัวอักษร ฉันไม่สนใจที่จะอ่านคำสองคำที่ฉลาดหรือสั้นที่สุด การกำหนดวิธีการเฉพาะเจาะจงยังทำให้ภาษาต่าง ๆ เป็นอุปสรรค - ฉันเดาว่าฉันแค่พยายามทำให้เข้าใจปัญหา
Steve

1
@Steve - จากนั้นคุณไม่ควรระบุเอาต์พุตเป็น "display" ใช่หรือไม่ อย่างไรก็ตามฉันคิดว่าคุณอาจกำจัดปัญหามากเกินไป สนามกอล์ฟที่สั้นและชาญฉลาดมักเกิดจากการรวมแง่มุมที่แตกต่างกันของปัญหาในรูปแบบที่ยุ่งยากเช่นการพับการประมวลผลบางส่วนไปยังอินพุตหรือเอาต์พุต สำหรับภาษาแต้มต่อ - เกือบทั้งหมดสามารถอ่าน stdin และเขียน stdout ได้
MtnViewMark

@MtnViewMark - จุดยุติธรรม ฉันจะทำให้การปรับปรุงง่ายและชัดเจนขึ้น ภาษาที่ฉันเลือกใช้มีวิธีการอ่านที่ยาวนานจาก stdin ดังนั้นฉันจึงมีอคติ :)
Steve

การโต้แย้งอินพุตกับการนับหลักเป็นการมาจาก stdin หรือไม่ โอ้และโดยทั่วไปถ้าคุณต้องการที่จะลดความต้องการในสิ่งที่หลงทางเช่นการอ่านจาก stdin และต้องนำเข้าหรือรวมโมดูลหรือไฟล์อื่น ๆ การไขปริศนาจำเป็นต้องมีฟังก์ชั่นมากกว่าโปรแกรมทั้งหมดอาจเป็นวิธีที่ดีที่สุด .
Jonathan M Davis

คำตอบ:


9

J, 100

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

APL (Dyalog) ( 91 86)

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

คำอธิบาย (ตามลำดับของการดำเนินการ):

  • ⎕ML←3: ตั้งค่า ML เป็น 3 (ทำให้พาร์ทิชันเฉลี่ยหมายถึงสิ่งอื่น ๆ )
  • G←Z⊂⍨','≠Z←⍞: อ่านอินพุต, คั่นด้วยเครื่องหมายจุลภาค, เก็บใน G และส่งผ่านไปยังฟังก์ชัน
  • +/¨⎕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}ได้
Ventero

ทำไมไม่ย่อให้สั้นลงอีกโดยใช้คำอื่นเพื่อแสดงถึงเน็คไท? เช่น "TIE" กับ "STALEMATE"
Gaffi

@Gaffi เนื่องจากข้อมูลจำเพาะต้องการให้ใช้คำว่า "STALEMATE"
Paul Prestidge

@ ประสานความอัปยศกับฉันฉันหยุดอ่านได้ที่"If the words are of equal length and no winner is found after going through the shortening process, no winner is declared."
Gaffi

5

Haskell, 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) รวมคำแนะนำของ JB
  • แก้ไข: (208 -> 205) จัดการกับจำนวนลบ, ใช้ประโยชน์จากกฎแปลก ๆ ใน Haskell เกี่ยวกับยัติภังค์

1
การใช้การเปรียบเทียบรายการแบบตรงเป็นสิ่งที่ดีมาก การปรับปรุงที่ "แนะนำโดยสรุป": ',':b_:b(-2) หากคุณไม่ได้ยึดติดกับการประมวลผลหลายบรรทัดinteract$unlines.map([...]).linesputStr.[...]=<<getLine(-11) หากคุณยอมให้ตัวเองหย่อนเอาต์พุตputStrprint(-1) ฉันเกลียดการปฏิเสธเหล่านั้นโดยใช้ตัวอักษรจำนวนมาก แต่ไม่สามารถหาทางแก้ไขได้
JB

ขอบคุณ JB! ฉันรวมคำแนะนำส่วนใหญ่ไว้ด้วย ฉันรู้สึกว่าผลลัพธ์ควรเป็นไปตามข้อมูลจำเพาะโดยเฉพาะอย่างยิ่งกับการขึ้นบรรทัดใหม่ แต่ฉันยินดีที่จะช่วยตัวละครทั้งสองถ้ามันเข้าใกล้! :-)
MtnViewMark

ทำได้ดีด้วยการลบ!
JB

3

Perl, 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]}]

Perl 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

K, 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')));สำหรับการป้อนข้อมูล
Élektra

เกาว่าใช้$w=fgetcsv(STDIN);งานได้ดีกว่า
Élektra

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

Mathematica 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"]

ผล

เนื่องจากการตอบสนองไม่ได้แข่งขัน (ยืดเยื้อมานาน) ฉันจึงตัดสินใจใช้รูปแบบอินพุตที่เป็นที่พอใจของ Mathematica มากกว่า


1

CoffeeScript - 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ฟังก์ชั่น) แต่ifs เพื่อเปรียบเทียบผลลัพธ์ (ใน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]);}

แก้ไข 1 : +71 ไบต์ ใช้STDINแทนfopen('php://stdin','r');แท็กสั้น ๆ นอกจากนี้ยังเป็นไปตามข้อกำหนด

แก้ไข 2 : -28 ไบต์ ใช้fgetcsv(STDIN)แทนexplode(',',trim(fgets(STDIN)))และใช้forลูปแทนwhileลูป

แก้ไข 3 : -23 ไบต์ ฟังก์ชั่นที่ผสานaและbผสานเข้าด้วยกัน

แก้ไข 4 : -20 ไบต์ เปลี่ยนcจากวนซ้ำเป็นลูป จากนั้นลบฟังก์ชั่นcและใส่รหัสในเนมสเปซส่วนกลาง

แก้ไข 5 : -2 ไบต์ ขอบคุณ @Titus สำหรับการ-rตั้งค่าสถานะ


1
ไม่จำเป็นต้องใช้แท็ก PHP พร้อม-rค่าสถานะ
Titus

0

JAVA

    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");
        }

รหัสข้างต้นแทนที่ตัวอักษรสูงสุดทั้งหมดในกรณีที่ผูก .. เป็นสิ่งที่จำเป็น?
Aman ZeeK Verma

0

C ++, 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;}

ฉันแน่ใจว่าฉันสามารถทำให้สั้นลงได้ แต่ฉันก็เหนื่อย

แก้ไข: เดิมเอาอาร์กิวเมนต์บรรทัดคำสั่งปรับเปลี่ยนเพื่อใช้ cin ตอนนี้อาจเป็นตัวละครไม่กี่ตัว แต่ฉันก็เหนื่อยเกินกว่าจะเล่าเรื่อง


0

Python: 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

F #, 559 533 530 ไบต์

ยังไม่สามารถแข่งขันได้ ฉันแน่ใจว่าcสามารถทำให้สั้นลงเช่นเดียวกับสองสามบรรทัดสุดท้าย การที่ไม่สามารถเข้าถึงบรรทัดคำสั่งได้ง่ายขึ้นก็ทำให้เจ็บที่นี่ด้วย

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 ไบต์โดย จำกัด s กับสตริงโดยเปรียบเทียบกับสตริง

เวอร์ชันที่ไม่ดี

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 รวมถึงการแยกย่อย)

ย้อนกลับไปเมื่อเดือนกุมภาพันธ์ 2554 เวอร์ชั่น PHP ปัจจุบันคือ 5.3.5; ดังนั้นฉันไม่สามารถ

  • ใช้การกำหนดรายการชวเลข ( [$a,$b]=fgetcsv(...)และอื่น ๆ )
  • นามแฝงcount_charsแบบอินไลน์
  • ฟังก์ชั่นดัชนีผลโดยตรง
  • ใช้ดัชนีสตริงเชิงลบแทน substr

แต่จะไม่ได้ช่วยอะไรมากมาย ดังนั้นมันจึงไม่สำคัญมาก

สิ่งที่มีค่าใช้จ่ายมากที่สุดคือลูป (แน่นอน) และกฎ # 4 ( 40 36 ไบต์)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.