Lời của tôi có thể đánh bại Lời của bạn


26

VẤN ĐỀ

Đưa ra hai từ, tìm người chiến thắng trong một trận chiến gốc kỹ thuật số .

Xác định gốc kỹ thuật số của một từ theo cách này:

  1. Mỗi chữ cái của bảng chữ cái được gán một số: A = 1, B = 2, C = 3, ..., Z = 26
  2. Thêm các giá trị cho mỗi chữ cái để tổng số từ. Lấy "CAT", ví dụ. C + A + T = 3 + 1 + 20 = 24
  3. Thêm tất cả các chữ số duy nhất tạo nên kết quả đó: 24 => 2 + 4 = 6
  4. Lặp lại bước # 3 cho đến khi bạn đạt được một chữ số. Chữ số duy nhất đó là gốc kỹ thuật số của từ này.

Quy tắc:

  1. Một người chiến thắng được tuyên bố nếu gốc kỹ thuật số của nó lớn hơn cái kia.
  2. Nếu các giá trị gốc kỹ thuật số bằng nhau, hãy rút ngắn các từ bằng cách xóa mọi trường hợp của chữ cái có giá trị cao nhất khỏi cả hai từ và tính toán lại.
  3. Lặp lại các bước # 1 và # 2 cho đến khi có một người chiến thắng hoặc một trong những từ chỉ còn lại một chữ cái (hoặc không có chữ cái).
  4. Nếu các giá trị gốc kỹ thuật số bằng nhau sau khi trải qua quá trình rút ngắn, từ dài hơn được tuyên bố là người chiến thắng.
  5. Nếu các từ có độ dài bằng nhau và không tìm thấy người chiến thắng sau khi trải qua quá trình rút ngắn, không có người chiến thắng nào được tuyên bố.

Quy tắc đặc biệt:

  1. Không sử dụng mô-đun được phép trong tính toán của gốc kỹ thuật số . Nó có thể được sử dụng bất cứ nơi nào khác.
  2. Giả sử các từ sẽ chỉ bao gồm các chữ cái viết hoa - không có dấu câu, không có dấu cách, v.v.

ĐẦU VÀO

Kéo các từ trong qua stdin (phân tách bằng dấu phẩy). tham số phương thức, hoặc tuy nhiên bạn muốn. Làm cho nó rõ ràng trong giải pháp của bạn hoặc mã làm thế nào các từ được phân tích cú pháp hoặc chuẩn bị.

ĐẦU RA

Hiển thị từ chiến thắng. Nếu không có người chiến thắng, hãy hiển thị "STALEMATE".

Ví dụ:

nội dung: CÓ THỂ, BAT

CAN = 18 = 9
BAT = 23 = 5 

đầu ra: CÓ THỂ

nội dung: Zoo, KHÔNG

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

OO = 30 = 3
N = 14 = 5

đầu ra: KHÔNG

CẬP NHẬT : Đầu vào phải được đọc bằng stdin với các từ dưới dạng chuỗi được phân tách bằng dấu phẩy.

CẬP NHẬT : Đã thêm một vài ví dụ để kiểm tra.

CẬP NHẬT : làm rõ việc loại bỏ chữ cái có giá trị cao nhất trong trường hợp hòa - điều này cũng làm thay đổi một chút điều kiện dừng - nếu một từ dài một chữ cái hoặc 0 chữ cái, quá trình rút ngắn được dừng lại


Bạn nên quyết định đầu vào, không để nó lựa chọn, vì nó tạo ra sự khác biệt rất lớn trong các chương trình. Bằng cách chọn một phương thức nhập liệu và chỉ định nó, bạn loại bỏ "các diễn giải sáng tạo" và đưa ra một thách thức tương đương với tất cả.
MtnViewMark

@MtnViewMark - Đã hiểu, nhưng thực sự tôi đang cố xóa phần đọc của đầu vào khỏi số ký tự. Tôi không quan tâm đến cách thông minh nhất hoặc ngắn nhất để đọc trong hai từ. Yêu cầu một phương pháp cụ thể cũng làm mất khả năng ngôn ngữ nhất định - Tôi đoán tôi chỉ đang cố gắng giải quyết vấn đề.
Steve

1
@Steve - Sau đó, bạn không nên chỉ định đầu ra là "hiển thị", vâng? Tuy nhiên, tôi nghĩ có lẽ bạn đang loại bỏ quá nhiều vấn đề. Một golf thông minh và ngắn thường bắt nguồn từ việc kết hợp các khía cạnh khác nhau của vấn đề theo những cách khó khăn, ví dụ như gấp một số xử lý vào đầu vào hoặc đầu ra. Đối với các ngôn ngữ dành cho người khuyết tật - khá nhiều trong số họ có thể đọc stdin và viết stdout.
MtnViewMark

@MtnViewMark - Điểm công bằng. Tôi sẽ thực hiện một bản cập nhật đơn giản và xóa nó đi. Ngôn ngữ lựa chọn của tôi chỉ có một cách đọc dài từ stdin, vì vậy tôi bị thiên vị. :)
Steve

Có phải lấy đầu vào một đối số để tính chính là từ stdin? Ồ, và nói chung, nếu bạn muốn giảm bớt các yêu cầu về những thứ đi lạc như đọc từ stdin và phải nhập hoặc bao gồm các mô-đun hoặc tệp khác, làm cho câu đố yêu cầu một chức năng thay vì toàn bộ chương trình sẽ là cách tốt nhất để đi .
Jonathan M Davis

Câu trả lời:


9

J, 100

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

chạy như thế này:

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

nó không chưa chấp nhận đầu vào chính xác như yêu cầu.


9

APL (Dyalog) ( 91 86)

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

Giải thích (theo thứ tự thực hiện):

  • ⎕ML←3: đặt ML thành 3 (điều này có nghĩa là phân vùng, trong số những thứ khác).
  • G←Z⊂⍨','≠Z←⍞: đọc đầu vào, phân tách bằng dấu phẩy, lưu trong G và chuyển đến hàm.
  • +/¨⎕A∘⍳¨⍵: tính điểm cho mỗi từ. ( ⎕Alà một danh sách chứa bảng chữ cái.)
  • Z←{2>⍴⍕⍵:⍵⋄∇+/⍎¨⍕⍵}¨: tính toán gốc kỹ thuật số cho mỗi điểm số (bằng cách tính tổng tất cả các chữ số miễn là vẫn còn nhiều hơn một chữ số) và lưu trữ chúng trong Z.
  • Z≡∪Z: nếu tất cả các điểm là duy nhất ...
  • :G[↑⍒Z]: ... sau đó xuất từ ​​có số điểm cao nhất (từ danh sách gốc).
  • ⋄1∊↑¨⍴¨⍵:'STALEMATE': nếu không (nếu có một cà vạt), nếu một trong các từ có độ dài 1, hãy xuất STALEMATE.
  • ⋄∇1∘↓¨⍵: nếu không, hãy bỏ chữ cái đầu tiên ra khỏi mỗi từ và chạy lại hàm.

5

Hồng ngọc - 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]]

Các xét nghiệm:

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

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

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

Dòng đầu tiên có thể được rút ngắn thành d,e=(a,b=gets.split ?,).map{|w|w.bytes.sort}.
Ventero

Tại sao không rút ngắn điều này hơn nữa bằng cách sử dụng một số từ khác để biểu thị một cà vạt? tức là "TIE" so với "STALEMATE"
Gaffi

@Gaffi vì thông số kỹ thuật yêu cầu từ "STALEMATE" được sử dụng.
Paul Prestidge

@ Sync Thật xấu hổ cho tôi, tôi đã ngừng đọc tại"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 ký tự

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(/=',')

Chạy mẫu:

> 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

  • Chỉnh sửa: (227 -> 219) chọn người chiến thắng tốt hơn, rút ​​ngắn mẫu phù hợp trong w, mô đun cũ hơn, nhập khẩu ngắn hơn
  • Chỉnh sửa: (219 -> 208) Kết hợp các đề xuất của JB
  • Chỉnh sửa: (208 -> 205) xử lý số âm, khai thác các quy tắc lẻ trong Haskell về dấu gạch nối

1
Sử dụng so sánh danh sách thẳng là một liên lạc rất tốt đẹp. Một vài cải tiến "trong nháy mắt" được đề xuất: ',':b_:b(-2), nếu bạn không quá gắn bó với xử lý đa dòng interact$unlines.map([...]).linesputStr.[...]=<<getLine(-11), nếu bạn cho phép bản thân lỏng lẻo đầu ra putStrprint(-1). Tôi ghét những hoạt động phủ định mất quá nhiều ký tự, nhưng không thể tìm ra cách nào khác.
JB

Cảm ơn, JB! Tôi kết hợp hầu hết các đề xuất. Tôi cảm thấy đầu ra nên theo thông số kỹ thuật, đặc biệt là kết thúc với một dòng mới. Nhưng tôi sẵn sàng cứu hai nhân vật đó nếu nó đến gần! :-)
MtnViewMark

Làm tốt với các phép trừ!
JB

3

Perl, 225 225 229

Chơi golf cơ bản (chưa có gì thông minh):

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 trở lên, chạy với perl -M5.010 <file>hoặcperl -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]

Sử dụng xử lý ngoại lệ để bắt lỗi stack, dẫn đến trường hợp bế tắc.


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

Hóa ra đoạn mã dưới đây không khớp với thông số kỹ thuật, vì vậy tôi phải làm việc lại, thêm nhiều độ dài (xem bên trên). : - / Điều này có thể có thể được chơi gôn hơn nữa, nhưng nó đã khá nhỏ gọn và tôi nghi ngờ tôi sẽ có thể đưa nó trở lại điểm số cạnh tranh.

Bản gốc (bên dưới) không xóa chữ có giá trị cao nhất khỏi các từ khi có cà vạt.

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

Điều này thực sự lấy sự ưa thích của tôi và là bài viết đầu tiên của tôi. Mặc dù nó đã cũ nhưng tôi nhận thấy không ai đã làm một phiên bản php nên đây là của tôi.

<?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 Nhân vật.

Bây giờ tôi không chắc chắn về các quy tắc bắt đầu nên tôi đã bắt đầu với $ f = 'CAN, CBN' làm đầu vào của mình. Tôi hy vọng điều đó là đúng. Tôi đã chạy tất cả các bài kiểm tra và nó vượt qua tất cả chúng mặc dù nó không đặc biệt thanh lịch. Tôi thực sự phải ngủ một chút bây giờ nhưng tôi đã rất vui khi làm việc này - cảm ơn bạn vì một câu đố tuyệt vời.

Được mã hóa trên http://codepad.org/ZSDuCdin


Bạn có thể sử dụng $f=trim(fgets(fopen('php://stdin')));để lấy đầu vào.
Élektra

Cào đó, $w=fgetcsv(STDIN);hoạt động tốt hơn.
Élektra

1

D: 326 Nhân vật

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

Dễ đọc hơn:

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

Toán học

Một số chi tiết vẫn còn thiếu

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

Toán học 220 207

Sau khi viết nó, tôi nhận thấy rằng điều này tuân theo cùng một lý do mà Belisarius đã sử dụng,

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

Sử dụng

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

các kết quả

Vì phản hồi không cạnh tranh (quá dài dòng), tôi quyết định sử dụng định dạng đầu vào phù hợp hơn với Mathicala.


1

Cà phê - 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

Không hài lòng với điều này như tôi có thể có được, nhưng dù sao tôi cũng sẽ đưa nó lên. Điểm thực tế rất ngắn gọn ( ychức năng), nhưng ifs để so sánh kết quả (trongz ) trở nên khá dài.

Để sử dụng nó gọi zvới hai từ của bạn (ví dụ z 'FOO','BAR'). Nó sẽ ghi cả hai từ và trả lại từ có điểm cao hơn. Nếu đó là một cà vạt, nó sẽ lặp lại với các từ đã sửa đổi (giữ cho bản gốc trở lại cuối cùng, do đó có thêm hai tham số) mà nó nhận được từx hàm.

Các javascript tương đương (mở rộng) cho những người quan tâm:

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

Vợt 479 byte

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

Ung dung:

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

Kiểm tra:

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

Đầu ra:

"CAN"
"NO"

1

PHP, 339 (không phải thông số kỹ thuật), 410 382 359 339 337 Byte

$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 byte. Sử dụng STDINthay vì fopen('php://stdin','r');và các thẻ ngắn. Ngoài ra, sự phù hợp đầy đủ với các thông số kỹ thuật.

EDIT 2 : -28 byte. Sử dụng fgetcsv(STDIN)thay vì explode(',',trim(fgets(STDIN)))và sử dụng forvòng lặp thay vì whilevòng lặp.

EDIT 3 : -23 byte. Các hàm được hợp nhất ab, được hợp nhất cho các vòng lặp.

EDIT 4 : -20 byte. Biến ctừ một đệ quy thành một vòng lặp. Sau đó, loại bỏ chức năng cvà đưa mã của nó vào không gian tên toàn cầu.

EDIT 5 : -2 byte. Cảm ơn @Titus cho -rcờ.


1
không cần thẻ PHP có -rcờ
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");
        }

Đoạn mã trên thay thế tất cả các ký tự tối đa trong trường hợp hòa .. có bắt buộc không?
Aman ZeeK Verma

0

C ++, 473 (Tôi đang mượn một khóa học về sắt)

#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;}

Tôi chắc chắn rằng tôi có thể rút ngắn nó bằng cách nào đó, nhưng tôi mệt mỏi.

Chỉnh sửa: ban đầu lấy đối số dòng lệnh, sửa đổi để sử dụng cin. Bây giờ có lẽ là một vài ký tự nhưng tôi quá mệt mỏi để kể lại.


0

Python: 383 ký tự

chạy chức năng 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 byte

Chưa cạnh tranh. Tôi chắc chắn c có thể được thực hiện ngắn hơn cũng như một vài dòng cuối cùng. Không có quyền truy cập dễ dàng hơn vào dòng lệnh args cũng gây tổn thương ở đây.

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

Hãy thử trực tuyến!

  • Đã lưu 3 byte bằng cách ràng buộc s với chuỗi bằng cách so sánh nó với chuỗi

Phiên bản ung dung

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 byte

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;

chạy với -nhoặc thử trực tuyến (TiO bao gồm sự cố).

Trở lại vào tháng 2 năm 2011, phiên bản PHP hiện tại là 5,3,5; vì vậy tôi không thể

  • sử dụng phân công danh sách tốc ký ( [$a,$b]=fgetcsv(...)và như vậy)
  • bí danh count_chars nội tuyến
  • kết quả chức năng chỉ số trực tiếp
  • sử dụng chỉ mục chuỗi âm thay vì substr

Nhưng cũng không tiết kiệm được nhiều; Vì vậy, nó không quan trọng lắm.

Hầu hết mọi thứ tốn kém là các vòng lặp (tất nhiên) và quy tắc số 4 ( 40 36 byte).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.