我的话可以打败你的话


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. 假设单词将仅由大写字母组成-没有标点符号,没有空格等。

输入

通过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

输出:无

更新:必须使用标准输入(stdin)读取输入,并将单词作为逗号分隔的字符串。

更新:添加了一些示例进行测试。

更新:阐明了在平局的情况下移除了最高价值的字母-这也会稍微改变停止条件-如果一个单词是一个字母或零个字母长,则缩短过程将停止


您应该决定输入,而不要让它选择,因为它在程序中会产生很大的不同。通过选择一种输入法并对其进行规范,您可以删除“创造性的解释”,并提出对所有人都平等的挑战。
MtnViewMark

@MtnViewMark-理解了,但是有效地我试图从字符计数中删除输入的读数。我对最聪明或最短的阅读这两个词的方式不感兴趣。要求一种特定的方法还会妨碍某些语言-我想我只是想弄清楚问题的实质。
史蒂夫

1
@Steve-那么您也不应该将输出指定为“ display”,是吗?但是,我认为您可能正在消除过多的问题。聪明而短暂的高尔夫通常源于以棘手的方式组合问题的不同方面,例如将某些处理过程合并到输入或输出中。至于障碍语言-几乎所有语言都可以读取stdin和写入stdout。
2011年

@MtnViewMark-公平点。我将进行简单的更新并清除它。我选择的语言只有很长的阅读stdin的方式,所以我有偏见。:)
史蒂夫

是否将输入的参数作为主计数来自stdin?哦,总的来说,如果您希望降低对杂物的要求,例如从stdin中读取内容,并且必须导入或包含其他模块或文件,那么解决难题需要一个功能而不是整个程序,这可能是最好的方法。
乔纳森·M·戴维斯

Answers:


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 2011年

为什么不通过使用其他单词来表示平局来进一步缩短呢?即“ TIE”与“ STALEMATE”
加菲2012年

@Gaffi,因为规范要求使用单词“ STALEMATE”。
保罗·普雷斯蒂奇

@chron感到羞耻,我在"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'2

减法做得好!
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')));用来获取输入。
艾丽卡

从头开始,$w=fgetcsv(STDIN);效果更好。
艾丽卡

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

Mathematica

一些细节仍然缺失

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

结果

由于响应不具有竞争性(太漫长了),因此我决定使用更适合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函数),但是if用于比较结果的s 却z相当长。

要使用它,请z用两个词(例如z 'FOO','BAR')来调用。它将对两个单词都评分并返回得分较高的单词。如果是平局,它将使用从x函数中获得的修饰词(保持原语最终返回,因此额外的两个参数)进行递归。

对那些有兴趣的人等效的(扩展的)javascript:

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))])))

取消高尔夫:

(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个字节。合并函数ab,合并为循环。

编辑4:-20个字节。转身c从递归进入循环。然后,删除函数c并将其代码放入全局名称空间。

编辑5:-2个字节。感谢@Titus提供了该-r标志。


1
不需要带有-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");
        }

上面的代码在出现平局的情况下替换了所有最大字符。是否需要?
2011年

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以及最后几行都可以缩短。无法轻松访问命令行args在这里也很痛苦。

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

在线尝试!

  • 通过将s与字符串进行比较来将s约束为字符串,从而节省了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,296281267字节

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年2月,当前的PHP版本是5.3.5。所以我不能

  • 使用速记列表分配([$a,$b]=fgetcsv(...)等)
  • 别名count_chars内联
  • 索引函数直接结果
  • 使用负字符串索引而不是 substr

但是,两者都不会节省很多。所以没关系。

最昂贵的东西是循环(当然)和规则4(40 36字节)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.