Firman-Ku dapat mengalahkan Firman-Mu

26

MASALAH

Diberi dua kata, cari pemenang dalam pertarungan root digital .

Tetapkan akar digital dari sebuah kata dengan cara ini:

  1. Setiap huruf alfabet diberi nomor: A = 1, B = 2, C = 3, ..., Z = 26
  2. Tambahkan nilai untuk setiap huruf untuk total kata. Ambil "CAT", misalnya. C + A + T = 3 + 1 + 20 = 24
  3. Tambahkan semua digit tunggal yang membentuk hasil itu: 24 => 2 + 4 = 6
  4. Ulangi langkah # 3 sampai Anda mencapai satu digit. Angka tunggal itu adalah akar digital dari kata tersebut.

Aturan:

  1. Pemenang dinyatakan jika akar digitalnya lebih besar dari yang lain.
  2. Jika nilai-nilai akar digital sama, perpendek kata-kata dengan menghapus setiap instance dari surat nilai tertinggi dari kedua kata dan menghitung ulang.
  3. Ulangi langkah # 1 dan # 2 sampai ada pemenang atau salah satu kata hanya memiliki satu huruf (atau tidak ada huruf) yang tersisa.
  4. Jika nilai akar digital sama setelah melalui proses pemendekan, kata yang lebih panjang dinyatakan sebagai pemenang.
  5. Jika kata-katanya sama panjang dan tidak ada pemenang yang ditemukan setelah melalui proses pemendekan, tidak ada pemenang yang dinyatakan.

Aturan khusus:

  1. Tidak ada penggunaan modulus yang diizinkan dalam perhitungan akar digital itu sendiri. Dapat digunakan di tempat lain.
  2. Anggap kata-kata hanya terdiri dari huruf besar - tanpa tanda baca, tanpa spasi, dll.

MEMASUKKAN

Tarik kata-kata melalui stdin (dipisahkan koma). parameter metode, atau apa pun yang Anda inginkan. Jelaskan dalam solusi Anda atau kode bagaimana kata-kata diuraikan atau disiapkan.

KELUARAN

Tampilkan kata yang menang. Jika tidak ada pemenang, tampilkan "STALEMATE".

Contoh:

intput: BISA, BAT

CAN = 18 = 9
BAT = 23 = 5 

output: BISA

intput: ZOO, TIDAK

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

OO = 30 = 3
N = 14 = 5

output: TIDAK

UPDATE : Input harus dibaca menggunakan stdin dengan kata-kata sebagai string yang dipisahkan koma.

PEMBARUAN : Menambahkan beberapa contoh untuk diuji.

UPDATE : mengklarifikasi penghapusan surat bernilai tertinggi dalam kasus dasi - ini juga sedikit mengubah kondisi berhenti - jika sebuah kata panjang satu huruf atau nol huruf, proses pemendekan dihentikan

Steve
sumber
Anda harus memutuskan input, bukan menyerahkannya pada pilihan, karena itu membuat perbedaan besar dalam program. Dengan memilih metode input, dan menentukannya, Anda menghapus "interpretasi kreatif", dan membuat tantangan yang setara untuk semua.
MtnViewMark
@ MTnViewMark - Dipahami, tetapi secara efektif saya mencoba untuk menghapus pembacaan input dari jumlah karakter. Saya tidak tertarik dengan cara yang paling pintar atau terpendek untuk membaca dalam dua kata. Membutuhkan metode tertentu juga cacat bahasa tertentu - saya kira saya hanya mencoba untuk menyelesaikan masalah.
Steve
1
@Steve - Maka Anda tidak harus menentukan output sebagai "display", ya? Namun, saya pikir Anda mungkin menghilangkan terlalu banyak dari masalahnya. Golf pintar dan pendek sering kali berasal dari menggabungkan berbagai aspek masalah dengan cara yang rumit, misalnya melipat beberapa pemrosesan ke dalam input atau output. Adapun bahasa cacat - cukup banyak dari mereka semua dapat membaca stdin dan menulis stdout.
MtnViewMark
@MtnViewMark - Poin wajar. Saya akan membuat pembaruan sederhana dan menjernihkannya. Bahasa pilihan saya hanya memiliki cara membaca yang panjang dari stdin, jadi saya bias. :)
Steve
Apakah memasukkan input argumen ke hitungan utama berasal dari stdin? Oh, dan secara umum, jika Anda ingin menjaga persyaratan pada hal-hal yang menyimpang seperti membaca dari stdin dan harus mengimpor atau memasukkan modul atau file lain, membuat puzzle memerlukan fungsi daripada seluruh program mungkin akan menjadi cara terbaik untuk pergi .
Jonathan M Davis

Jawaban:

9

J, 100

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

berjalan seperti ini:

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

itu tidak belum menerima masukan persis seperti yang diminta.

Eelvex
sumber
9

APL (Dyalog) ( 91 86)

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

Penjelasan (sesuai urutan eksekusi):

  • ⎕ML←3: atur ML ke 3 (ini membuat partisi berarti, antara lain).
  • G←Z⊂⍨','≠Z←⍞: baca input, pisahkan dengan koma, simpan di G dan berikan fungsi.
  • +/¨⎕A∘⍳¨⍵: hitung skor untuk setiap kata. ( ⎕Aadalah daftar yang berisi alfabet.)
  • Z←{2>⍴⍕⍵:⍵⋄∇+/⍎¨⍕⍵}¨: menghitung root digital untuk setiap skor (dengan menjumlahkan semua digit selama masih ada lebih dari satu digit) dan menyimpannya dalam Z.
  • Z≡∪Z: jika semua skor unik ...
  • :G[↑⍒Z]: ... lalu keluarkan kata dengan skor tertinggi (dari daftar asli).
  • ⋄1∊↑¨⍴¨⍵:'STALEMATE': dinyatakan (jika ada dasi), jika salah satu kata adalah panjang 1, hasilkan STALEMATE.
  • ⋄∇1∘↓¨⍵: jika tidak, lepaskan huruf pertama dari setiap kata dan jalankan kembali fungsinya.
marinus
sumber
5

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

Tes:

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

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

$ ruby1.9 1128.rb <<< ZOO,ZOO
STALEMATE
Arnaud Le Blanc
sumber
Baris pertama dapat disingkat menjadi d,e=(a,b=gets.split ?,).map{|w|w.bytes.sort}.
Ventero
Mengapa tidak mempersingkat ini lebih jauh dengan menggunakan kata lain untuk menunjukkan dasi? yaitu "TIE" vs. "STALEMATE"
Gaffi
@ Gaffi karena spek mensyaratkan bahwa kata "STALEMATE" digunakan.
Paul Prestidge
@ Sink Malu pada saya, saya berhenti membaca di"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 karakter

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

Sampel berjalan:

> 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

  • Sunting: (227 -> 219) pemilihan pemenang yang lebih baik, kecocokan pola yang pendek w, impor yang lebih lama, modul yang lebih pendek
  • Sunting: (219 -> 208) Masukkan saran JB
  • Sunting: (208 -> 205) menangani angka negatif, mengeksploitasi aturan aneh di Haskell tentang tanda hubung
MtnViewMark
sumber
1
Menggunakan perbandingan daftar langsung adalah sentuhan yang sangat bagus. Beberapa saran untuk perbaikan "sekilas": ',':b_:b(-2), jika Anda tidak terlalu terikat dengan pemrosesan multiline interact$unlines.map([...]).linesputStr.[...]=<<getLine(-11), jika Anda membiarkan diri Anda mengurangi output putStrprint(-1). Aku benci operasi negasi yang mengambil begitu banyak karakter, tetapi tidak bisa menemukan jalan keluarnya.
JB
Terima kasih, JB! Saya memasukkan sebagian besar saran. Saya merasa output harus mengikuti spesifikasi, khususnya akhir dengan baris baru. Tapi aku rela menyelamatkan dua karakter itu jika sudah dekat! :-)
MtnViewMark
Kerja bagus dengan pengurangan!
JB
3

Perl, 224 225 229

Golf dasar (belum ada yang pintar):

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 ke atas, jalankan dengan perl -M5.010 <file>atauperl -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
JB
sumber
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]

Menggunakan penanganan pengecualian untuk menangkap kesalahan tumpukan, yang mengakibatkan kasus jalan buntu.

tmartin
sumber
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

Ternyata kode di bawah ini tidak cocok dengan spek, jadi saya harus bekerja kembali, menambahkan banyak panjang (lihat di atas). : - / Ini mungkin bisa bermain golf lebih jauh, tapi sudah cukup kompak dan saya ragu saya akan bisa membawanya kembali ke skor kompetitif.

Dokumen asli (di bawah) tidak menghapus surat bernilai tertinggi dari kata-kata saat ada dasi.

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
Gaffi
sumber
2

Ini benar-benar disukai saya dan merupakan posting pertama saya. Meskipun sudah tua saya perhatikan tidak ada yang melakukan versi php jadi di sini adalah milik saya.

<?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 Karakter.

Sekarang saya tidak yakin dengan aturan untuk memulai jadi saya mulai dengan $ f = 'CAN, CBN' sebagai input saya. Saya harap itu benar. Saya telah menjalankan semua tes dan lulus semuanya meskipun tidak terlalu elegan. Saya benar-benar harus tidur sekarang tetapi saya sangat senang mengerjakannya - terima kasih untuk teka-teki yang bagus.

Dikodekan pada http://codepad.org/ZSDuCdin

Paul Drewett
sumber
Anda dapat menggunakan $f=trim(fgets(fopen('php://stdin')));untuk mengambil input.
Élektra
Gores itu, $w=fgetcsv(STDIN);bekerja lebih baik.
Élektra
1

D: 326 Karakter

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

Lebih Jelas:

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)]);
}
Jonathan M Davis
sumber
1

Mathematica

Beberapa detail masih hilang

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"}
Belisarius
sumber
1

Mathematica 220 207

Setelah menulis ini, saya perhatikan bahwa ini mengikuti alasan yang sama yang digunakan Belisarius,

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

Pemakaian

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

hasil

Karena responsnya tidak kompetitif (terlalu bertele-tele), saya memutuskan untuk menggunakan format input yang lebih cocok untuk Mathematica.

DavidC
sumber
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

Tidak setenang ini, tapi saya tetap akan melakukannya. Skor aktual sangat ringkas ( yfungsi), tetapi ifuntuk membandingkan hasil (dalam z) cukup lama.

Untuk menggunakannya, panggil zdengan dua kata Anda (mis z 'FOO','BAR'.). Ini akan skor kedua kata dan mengembalikan kata skor yang lebih tinggi. Jika ini adalah seri, itu akan muncul kembali dengan kata-kata yang diubah (menjaga aslinya untuk kembali pada akhirnya, maka dua parameter tambahan) yang didapat dari xfungsi.

Avascript yang setara (diperluas) untuk mereka yang tertarik:

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, "");
    }
  }
};
Johno
sumber
1

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

Tidak Disatukan:

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

Pengujian:

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

Keluaran:

"CAN"
"NO"
juga
sumber
1

PHP, 339 (bukan untuk spesifikasi), 410 382 359 339 337 Bytes

$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. Menggunakan STDINbukan fopen('php://stdin','r');dan tag pendek. Juga, kesesuaian penuh dengan spesifikasi.

EDIT 2 : -28 byte. Menggunakan fgetcsv(STDIN)alih-alih explode(',',trim(fgets(STDIN))), dan menggunakan forlingkaran sebagai ganti whilelingkaran.

EDIT 3 : -23 byte. Fungsi digabung adan b, digabung untuk loop.

EDIT 4 : -20 byte. Berubah cdari rekursif menjadi loop. Kemudian, hapus fungsi cdan masukkan kodenya ke namespace global.

EDIT 5 : -2 byte. Terima kasih kepada @Titus untuk -rbenderanya.

Élektra
sumber
1
tidak perlu untuk tag PHP dengan -rbendera
Titus
0

JAWA

    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
sumber
Kode di atas menggantikan semua karakter maks dalam kasus tie .. apakah itu diperlukan?
Aman ZeeK Verma
0

C ++, 473 (Saya meminjam besi saja)

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

Saya yakin saya bisa memperpendeknya, tapi saya lelah.

Edit: awalnya mengambil argumen baris perintah, dimodifikasi untuk menggunakan cin Mungkin beberapa karakter lebih lama sekarang tapi saya terlalu lelah untuk menceritakannya.

Wug
sumber
0

Python: 383 karakter

jalankan fungsinya 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))
Ashwini Chaudhary
sumber
0

F #, 559 533 530 byte

Belum kompetitif. Saya yakin c dapat dibuat lebih pendek serta beberapa baris terakhir. Tidak memiliki akses yang lebih mudah ke args baris perintah juga menyakitkan di sini.

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

Cobalah online!

  • Disimpan 3 byte dengan membatasi s ke string dengan membandingkannya dengan string

Versi tidak disatukan

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
Brunner
sumber
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;

jalankan dengan -natau coba online (TiO termasuk kerusakan).

Kembali pada Februari 2011, versi PHP saat ini adalah 5.3.5; jadi saya tidak bisa

  • menggunakan penugasan daftar steno ( [$a,$b]=fgetcsv(...)dan semacamnya)
  • alias count_chars sebaris
  • hasil fungsi indeks secara langsung
  • gunakan indeks string negatif sebagai ganti substr

Tetapi tidak ada yang akan menabung banyak; jadi tidak masalah.

Hal yang paling mahal adalah loop (tentu saja) dan aturan # 4 ( 40 36 bytes).

Titus
sumber