Tạo một chương trình đoán World Cup


13

Như bạn đã biết, vòng bảng World Cup đã kết thúc và từ ngày mai, 16 đội xuất sắc nhất sẽ bắt đầu vòng đấu loại trực tiếp:

  • Brazil (BRA)
  • Mexico (MEX)
  • Hà Lan (NED)
  • Chile (CHI)
  • Colombia (COL)
  • Hy Lạp (GRE)
  • Costa Rica (CRC)
  • Uruguay (URU)
  • Pháp (FRA)
  • Thụy Sĩ (SUI)
  • Argentina (ARG)
  • Nigeria (NGA)
  • Đức (GER)
  • Hoa Kỳ (Hoa Kỳ)
  • Bỉ (Bỉ)
  • Algeria (ALG)

Trong vòng loại trực tiếp, sau mỗi trận đấu, người chiến thắng sẽ vượt qua vòng tiếp theo và người thua sẽ về nhà (không có trận hòa nào). Nhấn vào đây để xem thêm về giai đoạn loại trực tiếp.

Bạn đã được golfbet.com, một trang web cá cược mới thuê vì bạn nổi tiếng là giỏi cả về lập trình và cá cược thể thao. Nhiệm vụ của bạn là viết một chương trình hoặc chức năng có thể đoán người chiến thắng trong trận đấu. Tất nhiên, mọi người đều đưa ra những dự đoán khác nhau, điều đó không quan trọng miễn là những dự đoán của bạn nhất quán.

Nếu bạn không muốn đoán, bạn có thể sử dụng các dự đoán sau:

BRA
        BRA
CHI
                BRA
COL
        COL
URU
                        GER
FRA
        FRA
NGA
                GER
GER
        GER
ALG
                                        GER
NED
        NED
MEX
                NED
CRC
        CRC
GRE
                        ARG
ARG
        ARG
SUI
                ARG
BEL
        BEL
USA
  1. Chương trình phải xuất ra cùng một người chiến thắng bất kể thứ tự của các đội (người chiến thắng trong trận đấu BRA-CHI phải giống với trận đấu CHI-BRA)
  2. Nếu một đội thua, nó không thể chơi thêm trận nào nữa. Điều này có nghĩa là đối với các trận đấu không diễn ra, bạn phải chỉ ra như vậy. Ví dụ: nếu chương trình của bạn đoán Brazil thắng trận BRA-CHI, thì CHI-GER phải trả lại "không có kết quả", vì Chile sẽ không đấu với Đức. Xem liên kết ở trên để biết lịch trình.

Để đơn giản, bạn không phải đối phó với trận đấu bằng đồng (tất nhiên bạn có thể).

Chương trình hoặc chức năng của bạn lấy hai chuỗi làm đầu vào: mã quốc gia gồm 3 chữ cái của hai đội và trả về mã quốc gia của đội chiến thắng (bạn có thể sử dụng đầu vào / đầu ra tiêu chuẩn hoặc hai tham số hàm / giá trị trả về). Nếu hai đội đã cho sẽ không chơi theo dự đoán của bạn, bạn phải trả lại một thứ khác (đây có thể là bất cứ thứ gì ngoại trừ mã quốc gia, ví dụ chuỗi rỗng, null, thông báo lỗi). Bạn có thể giả sử đầu vào là chính xác (hai mã quốc gia khác nhau trong danh sách).

Đây chủ yếu là một môn đánh gôn, vì vậy chương trình ngắn nhất tính bằng byte thắng. Tuy nhiên, giải pháp tốt đẹp và khó khăn cũng có giá trị.

Ví dụ (tất nhiên, bạn có thể đưa ra dự đoán của riêng mình):

đầu vào: đầu ra BRA CHI: BRA

đầu vào: đầu ra CHI BRA: BRA

đầu vào: đầu ra CHI GER: không có kết quả


Đáng lẽ phải là một [thủ công] đưa ra các dự đoán ngẫu nhiên, nhưng luôn để đội bóng yêu thích của bạn giành chiến thắng;) (Như trong: đưa ra một cây đoán ngẫu nhiên)
ɐɔIuʎs

@ ɐɔıʇǝɥʇuʎs codegolf.stackexchange.com/questions/32092/NH Cái này rất giống với cái đó
David Frank

4
@ ıʇǝɥʇuʎs, điều này thú vị hơn nhiều. Chúng tôi được cung cấp một không gian các chương trình có thể, gần tương ứng với các hàm băm trên tập hợp ba phần tử và chúng tôi phải tìm chương trình nhỏ nhất tương đương với bất kỳ chương trình nào trong không gian đó.
Peter Taylor

1
Có thể giả định đầu vào sẽ có hiệu lực hoặc sẽ BRA BRAHAZ CHEEZBURGERphải được xử lý đúng cách?
Dennis

@Dennis xem chỉnh sửa của tôi - đầu vào luôn hợp lệ
David Frank

Câu trả lời:


6

Python 2.x - 368 283

Thử thách thú vị. Tất nhiên chúng tôi cần có được thứ hạng hiện tại từ FIFA . Brazil có cái gọi là "người đàn ông thứ 12" vì họ có lợi thế sân nhà do đó trọng số 12/11.

a='BRA CHI COL URU FRA NGA ALG GER MEX NED CRC GRE ARG SUI BEL USA'.split()
d=[1242*12/11,1026,1137,1147,913,640,858,1300,882,981,762,1064,1175,1149,1074,1035]
m={}
for n in[16,8,4,2]:
 j=0
 for k in range(0,n,2):
  s=a[k] if d[k]>d[k+1] else a[k+1]
  m[a[k]+' '+a[k+1]]=s
  a[j]=s    
  j+=1
def f(s): 
 try: print m[s] 
 except: print 'no result'   

Mẹo để rút ngắn những điều trên được chào đón :-).

Cải tiến nhờ @TheRare và @MrLemon

a='BRA CHI COL URU FRA NGA ALG GER MEX NED CRC GRE ARG SUI BEL USA'.split()
d=15,6,10,11,4,0,2,14,3,5,1,8,13,12,9,7
m={}
for n in 16,8,4,2:
 j=0
 for k in range(0,n,2):s=a[k]if d[k]>d[k+1]else a[k+1];m[a[k]+' '+a[k+1]]=s;a[j]=s;j+=1     
def f(s):print s in m and m[s]or'no result'

Điều này dẫn đến các kết quả sau:

BRA CHI: BRA
COL URU: URU
FRA NGA: FRA
ALG GER: GER
MEX NED: NED
CRC GRE: GRE
ARG SUI: ARG
BEL USA: BEL
------------
BRA URU: BRA
FRA GER: GER
NED GRE: GRE
ARG BEL: ARG
------------
BRA GER: BRA
GRE ARG: ARG
------------
BRA ARG: BRA

Các cuộc gọi ví dụ:

f('BRA MEX')
no result
f('BRA CHI')
BRA

1. Bạn không sử dụng j(nó luôn luôn bằng không). 2. for kcó thể được viết trong một dòng bằng cách sử dụng ;dấu phân cách. 3. Bạn không cần khoảng trắng sau các từ khóa như tryhoặc except4. Bạn có thể xóa khoảng trắng giữa dấu ngoặc và từ khóa ( a[k]if d[k]>d[k+1]else a[k+1]hợp lệ) 5. for n in 16,8,4,26.def f(s):print s in m and m[s]or'no result'
seequ

@TheRare Anh ấy có sử dụng j, nhưng có một lỗi định dạng nhỏ với j+=1. Và [15,6,10,11,4,0,2,14,3,5,1,8,13,12,9,7]dĩ nhiên, bạn có thể lưu rất nhiều ký tự bằng cách mã hóa lại dữ liệu FIFA .
MrLemon

@MrLemon Ah, tôi đã không tự mình thử mã, chỉ nhìn vào nó.
xem

5

C, 182 178 133 (hoặc 126)

Không phải là chương trình ngắn nhất ở đây, nhưng nó là chương trình ngắn nhất có thể thay đổi dễ dàng. Bây giờ tất cả các thí sinh bán kết đã biết, tôi đang cập nhật.

Có một số thay đổi đối với mã. Ngoài các đề xuất của Dennis trong các bình luận, chương trình đã được chuyển đổi thành một chức năng (vì khi đọc lại, điều này được cho phép bởi các quy tắc) và việc băm đã được rút ngắn.

Mã số, 133

f(char*a,char*b){
  char*p,*t=" HIAEAIH N?=R=?N ;@4S4@; 5BDGDB5 B@?I?@B",h[3]={*a-a[1]%16,*b-b[1]%16};
  (p=strstr(t,h))&&puts(p-t&2?a:b);
}

Làm thế nào nó hoạt động

các đầu vào abđược băm bởi biểu thức *a-a[1]%16thành một ký tự ( *angắn hơn tương đương a[0]). Các kết quả băm cho các đội abđược lưu trữ trong h. Ví dụ BRA CHI trở thành @;. Giá trị băm như sau (các thí sinh bán kết được xác nhận và nhà vô địch dự đoán của tôi được đánh dấu *.)

GRE E   CRC A   *NED I   MEX H
USA R   BEL =   *ARG ?   SUI N
URU S   COL 4  **BRA @   CHI ;
NGA G   FRA D   *GER B   ALG 5

t[]lưu trữ dự đoán của tôi. Kết quả của vòng 16 và tứ kết hiện đã được biết. Mỗi nhóm gồm 4 đội được sắp xếp sao cho hạng 1 và 4 bị loại và nhóm thứ 3 là bán kết. Tương tự như các thí sinh bán kết, tôi dự đoán rằng hạng 1 và hạng 4 sẽ bị loại và bán kết thứ 3 sẽ là người chiến thắng chung cuộc. Nếu bạn không đồng ý với dự đoán của tôi, chỉ cần sắp xếp lại bảng.

Các dự đoán được lưu trữ trong các khối palindromic để phù hợp với khả năng người dùng tham gia vào các đội theo thứ tự có thể. Việc sắp xếp các đội chiến thắng của mỗi nhóm 4 người cùng chơi một trận thứ ba. Do đó, trong nhóm đầu tiên GRE Ethua CRC và MEX Hthua NED. Điều này thiết lập CRC Ađể chơi NED Itrong trận tứ kết mà không phải lặp lại việc gõ. Chuỗi được đệm với một khoảng trắng giữa mỗi nhóm 4 đội / 7 ký tự để giúp đảm bảo không có đầu ra cho các đội sẽ không chơi với nhau.

Người chiến thắng của mỗi trận đấu có thể có trong mỗi nhóm 8 ký tự như sau : invalid,b,a,a,b,b,a,invalid. Do đó, sự lựa chọn chính xác của người chiến thắng có thể được thực hiện bằng cách đảm nhận vị trí htrong t VÀ 2 . Thật không may là strstrchức năng không phải là straighforward nhất vì nó trả về một con trỏ p, vì vậy chúng ta phải trừ đi ptừ tđể có được vị trí thực tế trong t.Nếu trận đấu không hợp lệ (không thể được tìm thấy trong t), plà zero và cụm từ no resultđược in ra.

Một số cải tiến đáng ngờ, 126

2 ký tự được lưu bởi một biểu thức băm được cải thiện. Thật không may, điều này đòi hỏi trường hợp của các đội phải được hiển thị trong chương trình thử nghiệm bên dưới chức năng (ví dụ Brathay vì BRAđược sử dụng trong chương trình trên.) Tôi đã tự hài lòng rằng không có cách nào để làm điều này với một toán tử duy nhất, vì vậy 2 toán tử và hằng số ký tự đơn là tốt như nó được. Cũng lưu ý rằng Uruánh xạ tới spacemột ký tự thay thế |là cần thiết để phân tách các nhóm mã nhóm.

5 ký tự được lưu bằng cách loại bỏ tvà coi chuỗi dự đoán là một nghĩa đen. Điều này có nghĩa là không thể biết địa chỉ nơi chuỗi được lưu trữ. Tuy nhiên, với điều kiện là nó không được lưu trữ ở 0, chúng tôi chỉ quan tâm đến p&2việc mã sẽ hoạt động nếu địa chỉ chia hết cho 4. (Lưu ý rằng nó không được phép coi con trỏ ptrực tiếp như một số nguyên, nó phải được trừ khỏi một con trỏ khác . Tôi sử dụng con trỏ anên acũng phải chia hết cho 4.) Người ta có thể khá tự tin về trình biên dịch / kiến ​​trúc 32 hoặc 64 bit sẽ được lưu trữ theo cách này. Điều này đã làm việc tốt với tôi trên GCC / cygwin, mặc dù nó từ chối biên dịch trên studio / cửa sổ trực quan.

g(char*a,char*b){
  char*p,h[3]={*a^a[1]+3,*b^b[1]+3};
  (p=strstr("|%&626&%|+4*#*4+|(71 17(|./3$3/.|/74&47/",h))&&puts(p-a&2?a:b);
}

main(){
  char team[16][4]={"Gre","Crc","Ned","Mex", "Usa","Bel","Arg","Sui", "Uru","Col","Bra","Chi", "Nga","Fra","Ger","Alg"}; 
  int i;
  for(i=1;i<16;i++){printf("%s %s \n",team[i-1],team[i]);g(team[i],team[i-1]);g(team[i-1],team[i]);}  
}

Cách tiếp cận thú vị! Bạn có thể tiết kiệm một vài byte bằng cách loại bỏ các khoảng trống giữa char*pvà thay thế a[0], b[0]h[0]với *a, b` và *h. Ngoài ra, câu hỏi nói rằng * nếu hai đội đã cho sẽ không chơi theo dự đoán của bạn, bạn phải trả lại một cái gì đó khác (đây có thể là bất cứ thứ gì ngoại trừ mã quốc gia, ví dụ chuỗi rỗng, null, thông báo lỗi) , vì vậy việc in không có kết quả là không bắt buộc và bạn có thể thay thế puts(...)bằng (p=strstr(t,h))&&puts(p-t&2?a:b).
Dennis

Cảm ơn những lời khuyên, đặc biệt a[0]->*a! Sẽ cập nhật sớm. Chỉ cần tự hỏi, có cách nào để truy cập vào một mảng nhiều chiều với một số duy nhất? Tôi đã viết phiên bản dòng lệnh này có độ dài giống hệt nhau (có thể tiết kiệm 1 byte bằng a #define.) Thật tốt khi tránh các đăng ký kép trong trường hợp này và các trường hợp tương tự:char *p,h[2],*t="-LgRrRgL bA9j9Ab hp535ph OKYtYKO KpAgApK";main(int c,char**v){h[0]=v[1][1]*3-v[1][0]*2;h[1]=v[2][1]*3-v[2][0]*2;puts((p=strstr(t,h))?v[1+!(p-t&2)]:"no result");}
Level River St

1. Tôi tìm thấy một lỗi nhỏ. hnên được chấm dứt null, vì vậy nó phải được h[3]. 2. Nếu bạn đặt p=v[1], bạn có thể truy cập v[i][j]dưới dạng p[4*(i-1)+j]. Nó hoạt động trên máy của tôi, nhưng tôi không biết nó có di động không ... 3. Bạn sẽ có thể khởi tạo hnếu bạn khai báo bên trong main:main(int c,char**v){char*t="-LgRrRgL bA9j9Ab hp535ph OKYtYKO KpAgApK",*p=v[1],h[3]={p[1]*3-*p*2,p[5]*3-p[4]*2};(p=strstr(t,h))&&puts(v[1+!(p-t&2)]);}
Dennis

@Dennis mã của bạn hoạt động tốt trên cả GCC / cygwin và VS / Windows trên máy của tôi. Cũng for(int i=0;i<1000;i++)printf("%d %c ",i,i[*argv])lặp lại ký tự có thể in được của dòng lệnh trên VS, nhưng trên GCC, tên chương trình là 0, đối số thứ nhất là 40 và không thể thấy đối số thứ hai (tôi đã lên tới 1000.) Tò mò. Dù sao, tôi đã thay đổi một chức năng nằm trong quy tắc, ngoài việc cập nhật dự đoán của tôi (tôi chỉ chờ kết quả tối nay để xác nhận chúng trước khi đăng.) Cảm ơn một lần nữa và chúc may mắn chống lại Brazil vào thứ ba.
Cấp sông St

3

JavaScript 215 206 120 116

Rất nhiều phòng để cải thiện:

ES5 - 215

a=prompt().split(' ');("BRACHI0COLURU0FRANGA0GERALG0NEDMEX0CRCGRE0ARGSUI0BELUSA0BRACOL0FRAGER0NEDCRC0ARGBEL0BRAGER0NEDARG0BRANED".split(0).filter(function(x){return x.match(a[0])&&x.match(a[1])})[0]||"").substr(0,3)


ES6 - 206

a=prompt().split(' ');("BRACHI0COLURU0FRANGA0GERALG0NEDMEX0CRCGRE0ARGSUI0BELUSA0BRACOL0FRAGER0NEDCRC0ARGBEL0BRAGER0NEDARG0BRANED".split(0).filter((x)=>{return x.match(a[0])&&x.match(a[1])})[0]||"").substr(0,3)

Phương pháp tiếp cận Regex - 116

Nhờ ɐɔıʇǝɥʇuʎs cho đăng liên kết này , nó đã giúp tôi làm cho regex

a=prompt().split(' ').sort();a.join('').match(/LG(.R(A|G)|GE)|RG(S|BE|CR)|ELUS|AC(H|O)|OLUR|CGR|CM|FRANG|XNE/)&&a[0]

1
Bạn có thể rút ngắn các giải pháp của mình bằng cách chuyển đổi split(' ')sang split``join('')sang join``.
Arjun

2

Python ( 179 148 139 cq quá dài)

f=lambda *l:sorted(l)[0]if"".join(sorted(l))in"BRACHI COLURU FRANGA ALGGER MEXNED CRCGRE ARGSUI BELUSA BRACOL ALGFRA CRCMEX ARGBEL BRAFRA CRCMEX ARGBEL BRAFRA ARGCRC ARGBRA"else 0

Mọi người đều biết đất nước với cái tên đứng đầu trong bảng chữ cái sẽ giành chiến thắng. (Câu trả lời này chỉ tồn tại để bắt đầu mọi thứ)

Nhờ vào lòng từ thiện của anh chàng ở đây , tôi có thể rút ngắn câu trả lời của mình một chút:

import re;f=lambda *l:sorted(l)[0]if re.match('RGB|CM|RGS|CGR|L.F|XNE|EL.S|O.UR|RGCR|B.AF|L.GE|^BRACHI$|^FRANGA$|^BRACOL$',"".join(sorted(l)))else 0

Điều này không giả sử các đội hợp lệ, nhưng không cần một đội hình hợp lệ ( f('BRA','NED')sẽ trả về 0 (trận đấu không hợp lệ), nhưng f('XNE')sẽ trở lại 'XNE'. Tôi không nhận được câu hỏi của bạn rằng đây là một vấn đề. regex này khi bạn thấy phù hợp.

Cảm ơn @Ventero, tôi không biết gì về regexes.

import re;f=lambda*l:sorted(l)[0]if re.match('RGB|CM|RGS|CGR|L.F|XNE|EL.S|O.UR|RGCR|B.AF|L.GE|BRACHI|FRANGA|BRACOL',"".join(sorted(l)))else 0

Bạn có thể muốn re.searchtrong phiên bản golf, không re.match. Ngoài ra, bạn sẽ có thể thả ^$neo.
Ventero

2

Scala (150)

type s=String;var m=Map[s,s]();def f(x:(s,s))={var a=x._1;var b=x._2;if(b<a){b=a;a=x._1};if(m.getOrElse(a,a)=="")m.getOrElse(b,b)else{m=m+(b->"");a}}

Dưới đây là các trận đấu giữa "foo" và "bar" có thể, các đội sẽ không chơi thực sự với nhau trong các vòng đầu tiên sẽ có kết quả. (Ví dụ: bắt đầu bằng BRA, ARG)

Nó chỉ ghi lại những đội thua cuộc.

type s=String //just aliasing for saving characters
var m=Map[s,s]() //map for storing loosing teams, a set would do too
def f(x:(s,s))={
  var a=x._1 var b=x._2
  if(b<a){b=a;a=x._1};//swap if b<a lexographically
  if(m.getOrElse(a,a)=="")//if a has loosed previously
     m.getOrElse(b,b)// return b if b was not in the map else return ""
  else{
    m=m+(b->"") //add b to the map, because a will definitly win this amazing match
    a //and return a
  }
}

Được gọi với:

f(("GER","BRA"))

2

PowerShell ( 261 221)

$a=Read-Host;$b=Read-Host;$x="CHIBRA","URUCOL","FRANGA","ALGGER","MEXNED","CRCGRE","SUIARG","BELUSA";0..($x.Length-2)|%{$x+=$x[2*$_].Substring(3)+$x[2*$_+1].Substring(3)};$x|?{"$a$b","$b$a"-eq$_}|%{$_.Substring(3);exit};0

Là một người dùng PowerShell tương đối mới, tôi thấy đường ống hoàn toàn tuyệt vời. Tôi nghĩ tiếp theo có thể là thử và mân mê mảng để hy vọng loại bỏ tất cả các cuộc gọi chuỗi con này. (Tôi đã phải thêm một cuộc gọi vào cuối nếu không nó đã kết thúc cả hai đội)

Thành viên mới, nỗ lực đầu tiên tại mã golf!

Có thể đã mã hóa cứng tứ kết, bán kết và chung kết để cứu một vài nhân vật, nhưng> điều đó sẽ không thú vị lắm.

Cần đủ đơn giản để giải mã, nhưng nó đáp ứng cả hai điều kiện: cho cùng một người chiến thắng> bất kể đơn hàng nào được nhập và chỉ trả về một người chiến thắng cho các trận đấu thực sự diễn ra> diễn ra!

Bất kỳ lời khuyên để cải thiện sẽ được đánh giá rất cao, cảm ơn!

Nguyên

$a=Read-Host;$b=Read-Host;$x=("CHIBRA","URUCOL","FRANGA","ALGGER","MEXNED","CRCGRE","SUIARG","BELUSA");for($c=0;$c-lt$x.length-1;$c+=2){$x+=$x[$c].Substring(3)+$x[$c+1].Substring(3)}foreach($i in $x){if($i-match$a-and$i-match$b){return $i.Substring(3)}}return 0

1
Một vài điều (sửa lỗi này hoàn toàn sẽ mất nhiều thời gian hơn): Đừng viết PowerShell như thể đó là C hoặc C #. Điều này có nghĩa, returnlà không cần thiết trong hầu hết các trường hợp. foreachvà hầu hết các vòng lặp rõ ràng được đánh giá cao và vô dụng. Các phương pháp như .Substringchỉ nên được sử dụng trong hoàn cảnh khắc nghiệt (và trong khi tiện ích của bóng đá có thể được tranh luận, thì đó không phải là một môn thể thao khắc nghiệt). Nói chung bạn muốn sử dụng các đường ống càng nhiều càng tốt.
Joey

1
Thay vì viết một forvòng lặp dài như for($c=0;$c-lt$x.length-1;$c+=2){$x+=$x[$c].Substring(3)+$x[$c+1].Substring(3)}bạn chỉ có thể sử dụng một đường ống có phạm vi và ForEach-Object(bí danh %) : 0..($x.Length/2)|%{$x+=$x[2*$_].Substring(3)+$x[2*$_+1].Substring(3)}. Bằng cách xem xét cẩn thận cách dữ liệu của bạn được thể hiện, bạn rất có thể thoát khỏi các Substringcuộc gọi. Các dấu ngoặc đơn xung quanh mảng ban đầu là không cần thiết. Đối với các mảng lớn hơn, cũng có thể có ý nghĩa khi sử dụng ký tự phân tách và sử dụng -split(đơn nhất -splittrong trường hợp dấu phân cách là khoảng trắng hoặc tab).
Joey

1
Trận chung kết foreachvòng lặp ví dụ có thể được viết như một đường ống cũng như ( ?Where-Object): $x|?{$_-match$a-and$_-match$b}|%{$_;exit};0trong đó chủ yếu nói »Lọc mọi phần tử trong $xcho dù nó phù hợp với cả hai $a$bvà đầu ra đầu tiên, thoát sau đó. Nếu không thể tìm thấy, đầu ra 0. «. Vì bạn biết định dạng của chuỗi của bạn, bạn cũng có thể sử dụng -match"$a$b|$b$a", tôi đoán vậy. Bởi vì chúng chỉ phải xuất hiện theo thứ tự trong chuỗi. Điều đó cũng có nghĩa là chúng ta có thể sử dụng một mẹo nhỏ ở đây: "$a$b","$b$a"-eq$_để đánh gôn thêm một byte.
Joey

2

CJam, 64 58 byte

lS/$_0=\:+4b256b1>:ca"oM-YtM-mM-^@}gM-^VM-^U8tM-=nM-^MfM-]oM-xgM-)tM-|m@gim{g_"2/&,*

Ở trên sử dụng dấu mũ và ký hiệu M, vì mã chứa các ký tự không thể in được.

Với chi phí sáu byte bổ sung, những ký tự đó có thể tránh được:

lS/$_0=\:+4b95b1>32f+:c"I8Vyv)2~N{VIEh1$IW32W)B82QBs2G"2/N*\#W>*

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

Chạy thử nghiệm

$ base64 -d > worldcup.cjam <<< \
> bFMvJF8wPVw6KzRiMjU2YjE+OmNhIm/ZdO2AfWeWlTh0vW6NZt1v+GepdPxtQGdpbXtnXyIyLyYsKg==
$ wc -c worldcup.cjam
58 worldcup.cjam
$ for A in ALG ARG BEL BRA CHI COL CRC FRA GER GRE MEX NED NGA SUI URU USA; do
> for B in ALG ARG BEL BRA CHI COL CRC FRA GER GRE MEX NED NGA SUI URU USA; do
> [[ $A < $B ]] && echo $A - $B : $(LANG=en_US cjam worldcup.cjam <<< "$A $B")
> done; done | grep ': .'
ALG - ARG : ALG
ALG - BRA : ALG
ALG - FRA : ALG
ALG - GER : ALG
ARG - BEL : ARG
ARG - CRC : ARG
ARG - SUI : ARG
BEL - USA : BEL
BRA - CHI : BRA
BRA - COL : BRA
COL - URU : COL
CRC - GRE : CRC
CRC - MEX : CRC
FRA - NGA : FRA
MEX - NED : MEX

Làm thế nào nó hoạt động

lS/$    " Read one line from STDIN, split at spaces and sort the resulting array.         ";
_0=\    " Extract the first element of a copy of the array and swap it with the array.    ";
:+      " Concatenate the strings.                                                        ";
4b      " Convert the resulting string into an integer by considering it a base 4 number. ";
256b    " Convert the integer into an array by considering it a base 256 number.          ";
1>:ca   " Drop the first element, convert into a string and create a singleton array.     ";
"…"     " Push a string of all matches encoded as explained above.                        ";
2/      " Split the string into an array of two-character strings.                        ";
&       " Intersect the two arrays. If the array is non-empty, the teams play.            ";
,*      " Multiply the string on the stack by the length of the array.                    ";

Bạn nên thêm kích thước của tập lệnh bash của bạn vào kích thước của chương trình CJam để công bằng.
David Frank

1
@DavidFrank: Tôi đã bao gồm tập lệnh Bash để hiển thị bằng chứng rằng chương trình của tôi chỉ cung cấp đầu ra cho 15 trận đấu diễn ra. Nó tự hoạt động và không yêu cầu các chương trình bên ngoài.
Dennis

2

CJam, 49 48 byte

lS/$_0="^\16@&^^/+(^]^W^Y,>O?"{_2%+}3*@{2b91%c}%#1&!*

Ở trên sử dụng ký hiệu dấu mũ, vì mã chứa các ký tự không thể in được.

Với chi phí của hai byte bổ sung, những ký tự đó có thể tránh được:

lS/$_0="(=BL2*;74)#%8J[K"{_2%+}3*@{2b91%C+c}%#1&!*

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

Chạy thử nghiệm

$ base64 -d > wc.cjam <<< bFMvJF8wPSIcMTZAJh4vKygdFxksPk8/IntfMiUrfTMqQHsyYjkxJWN9JSMxJiEq
$ wc -c wc.cjam
48 wc.cjam
$ for A in ALG ARG BEL BRA CHI COL CRC FRA GER GRE MEX NED NGA SUI URU USA; do
> for B in ALG ARG BEL BRA CHI COL CRC FRA GER GRE MEX NED NGA SUI URU USA; do
> [[ $A < $B ]] && echo $A - $B : $(cjam wc.cjam <<< "$A $B"); done; done | grep ': .'
ALG - ARG : ALG
ALG - BRA : ALG
ALG - FRA : ALG
ALG - GER : ALG
ARG - BEL : ARG
ARG - CRC : ARG
ARG - SUI : ARG
BEL - USA : BEL
BRA - CHI : BRA
BRA - COL : BRA
COL - URU : COL
CRC - GRE : CRC
CRC - MEX : CRC
FRA - NGA : FRA
MEX - NED : MEX

Lý lịch

Chúng tôi bắt đầu bằng cách gán và ký tự ASCII cho mỗi nhóm bằng cách xem tên của nó là số 2 cơ sở, lấy số nguyên modulo 91, thêm 12 (để tránh các ký tự không thể in được) và chọn ký tự tương ứng với mã ASCII kết quả. Trong mã CJam, điều này đạt được bằng cách 2b91%c.

Ví dụ: mã ký tự ALG65 76 71 . Kể từ khi (4 × 65 + 2 × 76 + 71) = 483, 483 % 91 + 12 = 40và 40 nếu mã ký tự của (.

Điều này đưa ra ánh xạ sau:

ALG (    ARG 4    BEL #    BRA 2    CHI *    COL ;    CRC 8    FRA B
GER =    GRE J    MEX [    NED K    NGA L    SUI )    URU 7    USA %

Bây giờ, chúng ta có thể mã hóa các trận đấu của vòng 16 như sau:

(=BL2*;74)#%8J[K

Nếu chúng tôi cho rằng đội đầu tiên theo thứ tự bảng chữ cái luôn thắng, các trận đấu của vòng tứ kết như sau:

(B2;4#8[

Lưu ý rằng chuỗi này có thể được lấy từ đầu tiên bằng cách chọn mỗi ký tự thứ hai, bắt đầu bằng ký tự đầu tiên. Trong mã CJam, điều này đạt được bằng cách 2%.

Sử dụng cùng một ý tưởng, các trận đấu của vòng bán kết và trận chung kết như sau:

(248
(4

Mật mã

"(=BL2*;74)#%8J[K"{_2%+}3*

đẩy chuỗi chứa các trận đấu của vòng 16, sau đó thực hiện ba lần sau: nhân đôi chuỗi, trích xuất mỗi ký tự thứ hai của bản sao, nối. Kết quả là chuỗi

(=BL2*;74)#%8J[K(B2;4#8[(B2;4#8[(248(B2;4#8[(248(248(4

trong đó có tất cả các kết quả khớp (một số trong số chúng nhiều lần).

Làm thế nào nó hoạt động

lS/$        " Read one line from STDIN, split at spaces and sort the resulting array.     ";
_0=         " Extract the first element of a copy of the array.                           ";
"…"         " Push the string containing the matches of the round of 16.                  ";
{_2%+}3*    " Push the remaining matches.                                                 ";
@           " Rotate the input array on top of the stack.                                 ";
{2b91%C+c}% " Perform the mapping for each team in the input array.                       ";
#           " Push the index of the match in the array of all matches (-1 for not found). ";
1&!         " Push 1 if the index is even (valid match) and 0 if it is odd.               ";
,*          " Repeat the string on the stack that many times.                             ";

Thật tuyệt vời với những gì bạn làm với Cjam. Bất cứ khi nào tôi nghĩ rằng bạn có thể mượn một trong những ý tưởng của tôi, bạn nghĩ ra một cái gì đó tốt hơn! mã dự đoán của bạn "(=BL2*;74)#%8J[K"{_2%+}3*có cùng độ dài với dạng không phân nhánh của chuỗi dự đoán của tôi "rRgL j9Ab 35ph tYKO gApK"nhưng dễ xử lý hơn rất nhiều.
Cấp sông St

0

JavaScript 271

t=prompt('Match?').split('-')
x=t[0],y=t[1],T='BRACHICOLURUFRANGAGERALGNEDMEXCRCGREARGSUIBELUSA'
v='\n',R='',W='No Game'
for(z=1;T!='USA';++z,T=n){R+=v+z+v,n='',r=/(...)(...)/g
while(m=r.exec(T))a=m[1],n+=b=m[2],R+=a+'-'+b+v,W=a==x&&b==y||a==y&&b==x?b:W
}
alert(W+'\n'+R)
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.