Buat program menebak Piala Dunia

13

Seperti yang Anda ketahui, babak grup Piala Dunia telah berakhir, dan mulai besok 16 tim terbaik akan memulai babak sistem gugur:

  • Brazil (BRA)
  • Meksiko (MEX)
  • Belanda (NED)
  • Chili (CHI)
  • Kolombia (COL)
  • Yunani (GRE)
  • Kosta Rika (CRC)
  • Uruguay (URU)
  • Prancis (FRA)
  • Swiss (SUI)
  • Argentina (ARG)
  • Nigeria (NGA)
  • Jerman (APK)
  • Amerika Serikat (AS)
  • Belgia (BEL)
  • Aljazair (ALG)

Di babak sistem gugur, setelah setiap pertandingan, pemenang lolos ke babak berikutnya, dan yang kalah pulang (tidak ada seri). Klik di sini untuk melihat lebih lanjut tentang babak sistem gugur.

Anda telah disewa oleh golfbet.com, situs web taruhan baru karena Anda dikenal pandai pemrograman dan taruhan olahraga. Tugas Anda adalah menulis program atau fungsi yang bisa menebak pemenang pertandingan. Tentu saja, semua orang membuat tebakan yang berbeda, tidak masalah selama tebakan Anda konsisten.

Jika Anda tidak ingin menebak, Anda dapat menggunakan tebakan berikut:

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. Program harus menampilkan pemenang yang sama terlepas dari urutan ke tim (pemenang pertandingan BRA-CHI harus sama dengan pertandingan CHI-BRA)
  2. Jika tim kalah, itu tidak dapat memainkan pertandingan lagi. Ini berarti untuk pertandingan yang tidak terjadi, Anda harus menunjukkannya. Misalnya jika program Anda menebak Brasil untuk memenangkan pertandingan BRA-CHI, maka CHI-GER harus mengembalikan "tidak ada hasil", karena Chili tidak akan bermain melawan Jerman. Lihat tautan di atas untuk jadwal.

Demi kesederhanaan Anda tidak harus berurusan dengan pertandingan perunggu (tapi tentu saja Anda bisa).

Program atau fungsi Anda mengambil dua string sebagai input: kode negara 3 huruf dari kedua tim dan mengembalikan kode negara dari tim yang menang (Anda dapat menggunakan input / output standar, atau dua parameter fungsi / nilai pengembalian). Jika dua tim yang diberikan tidak akan bermain sesuai dengan tebakan Anda, Anda harus mengembalikan sesuatu yang lain (ini bisa apa saja kecuali kode negara, mis. String kosong, nol, pesan kesalahan). Anda dapat menganggap inputnya benar (dua kode negara berbeda yang ada dalam daftar).

Ini terutama kode-golf, sehingga program terpendek dalam byte menang. Namun, solusi yang bagus dan rumit juga berharga.

Contoh (tentu saja, Anda bisa menebak sendiri):

input: output BRA CHI: BRA

input: CHI BRA output: BRA

input: CHI GER output: tidak ada hasil

David Frank
sumber
Seharusnya menjadi [curang] yang menghasilkan tebakan acak, tetapi selalu biarkan tim favorit Anda menang;) (Seperti dalam: mengeluarkan pohon tebakan acak)
Junıʇǝɥʇuʎ
@ ɐɔıʇǝɥʇuʎs codegolf.stackexchange.com/questions/32092/... Yang ini sangat mirip dengan itu
David Frank
4
@ ɐɔıʇǝɥʇuʎs, ini jauh lebih menarik. Kami diberi ruang program yang mungkin, kira-kira sesuai dengan fungsi hash ke set tiga elemen, dan kami harus menemukan program terkecil yang setara dengan program apa pun di ruang itu.
Peter Taylor
1
Dapat diasumsikan input akan valid atau harus BRA BRAdan HAZ CHEEZBURGERharus ditangani dengan benar?
Dennis
@Dennis lihat edit saya - input selalu valid
David Frank

Jawaban:

6

Python 2.x - 368 283

Tantangan yang menarik. Tentu saja kita perlu mendapatkan peringkat sekarang dari FIFA . Brasil memiliki apa yang disebut "pemain ke-12" karena mereka memiliki keunggulan di kandang sendiri sehingga menjadi pembobolan 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'   

Tips untuk mempersingkat di atas dipersilahkan :-).

Perbaikan berkat @TheRare dan @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'

Ini mengarah pada hasil berikut:

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

Contoh panggilan:

f('BRA MEX')
no result
f('BRA CHI')
BRA
Willem
sumber
1. Anda tidak menggunakan j(selalu nol). 2. for kdapat ditulis dalam satu baris dengan menggunakan ;pembatas. 3. Anda tidak perlu spasi setelah kata kunci suka tryatau except4. Anda dapat menghapus spasi antara tanda kurung dan kata kunci ( a[k]if d[k]>d[k+1]else a[k+1]valid) 5. for n in 16,8,4,26.def f(s):print s in m and m[s]or'no result'
seequ
@TheRare Dia memang menggunakan j, tetapi ada sedikit kesalahan format dengan j+=1. Dan Anda dapat menyimpan banyak karakter dengan memasukkan kembali data FIFA ke [15,6,10,11,4,0,2,14,3,5,1,8,13,12,9,7], tentu saja.
MrLemon
@ McLemon Ah, saya tidak mencoba kode sendiri, hanya melihatnya.
seequ
5

C, 182 178 133 (atau 126)

Bukan program terpendek di sini, tetapi ini adalah terpendek di mana prediksi dapat diubah dengan mudah. Sekarang semua semifinalis sudah diketahui, saya memperbarui.

Ada beberapa perubahan pada kode juga. Terlepas dari saran Dennis dalam komentar, program ini telah dikonversi ke fungsi (seperti membaca ulang ini diizinkan oleh aturan) dan hashing telah dipersingkat.

Kode, 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);
}

Bagaimana itu bekerja

input adan bhash dengan ekspresi *a-a[1]%16ke satu karakter ( *alebih pendek setara dengan a[0]). Hasil hash untuk tim adan bdisimpan di h. Misalnya BRA CHI menjadi @;. Nilai-nilai hasrat adalah sebagai berikut (semifinalis yang dikonfirmasi dan juara prediksi saya ditandai dengan *.)

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[]menyimpan prediksi saya. Hasil babak 16 dan perempat final sekarang diketahui. Setiap kelompok dari 4 tim diperintahkan sedemikian rupa sehingga yang pertama dan keempat tersingkir, dan yang ketiga adalah semifinalis. Demikian pula dengan semifinalis, saya memprediksi bahwa 1st dan 4th akan dihilangkan dan semifinalis ke-3 akan menjadi pemenang keseluruhan. Jika Anda tidak setuju dengan prediksi saya, cukup pesan ulang tabelnya.

Prediksi disimpan dalam blok palindrom untuk mengakomodasi kemungkinan pengguna memasuki tim dalam urutan yang memungkinkan. Urutan menempatkan tim yang menang dari setiap set 4 bersama untuk memainkan pertandingan ketiga. Dengan demikian pada kelompok pertama, GRE Ehilang dari CRC dan MEX Hhilang dari NED. Ini mengatur CRC Auntuk memainkan NED Idi perempat final tanpa harus mengulang pengetikan. Tali diisi dengan ruang antara masing-masing kelompok 4 tim / 7 karakter untuk membantu memastikan tidak ada output untuk tim yang tidak akan saling bermain.

Pemenang setiap pertandingan mungkin dalam setiap kelompok 8 karakter adalah sebagai berikut: invalid,b,a,a,b,b,a,invalid. Dengan demikian pilihan pemenang yang tepat dapat dilakukan dengan mengambil posisi hdi t DAN 2 . Sayangnya strstrfungsi ini bukan yang paling straighforward karena mengembalikan pointer p, jadi kita harus mengurangi pdari tuntuk mendapatkan posisi aktual dalam t.Jika pertandingan tidak valid (tidak dapat ditemukan dalam t), padalah nol dan frasa no resultdicetak.

Beberapa perbaikan yang meragukan, 126

2 karakter disimpan oleh ekspresi hash yang ditingkatkan. Sayangnya, ini mengharuskan kasus tim seperti yang ditunjukkan dalam program uji di bawah fungsi (misalnya, Brabukan BRAseperti yang digunakan dalam program di atas.) Saya sudah puas sendiri bahwa tidak ada cara untuk melakukan ini dengan satu operator, jadi 2 operator dan konstanta satu karakter sama baiknya dengan yang didapat. Perhatikan juga bahwa Urupeta untuk spacekarakter alternatif |diperlukan untuk memisahkan kelompok kode tim.

5 karakter disimpan dengan menghilangkan tdan memperlakukan string prediksi sebagai literal. Ini berarti tidak mungkin untuk mengetahui alamat tempat string disimpan. Namun, asalkan tidak disimpan pada nol, kami hanya tertarik p&2sehingga kode akan berfungsi jika alamatnya dapat dibagi dengan 4. (Perhatikan bahwa tidak diperbolehkan untuk memperlakukan pointer psecara langsung sebagai bilangan bulat, harus dikurangi dari pointer lain Saya menggunakan pointer ajadi ajuga harus habis dibagi 4.) Orang dapat cukup percaya diri pada kompiler 32/64 bit / arsitektur string akan disimpan dengan cara ini. Ini telah bekerja dengan baik untuk saya di GCC / cygwin, meskipun menolak untuk dikompilasi di visual studio / windows.

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]);}  
}
Level River St
sumber
Pendekatan yang menarik! Anda dapat menyimpan beberapa byte dengan menghapus spasi di antara chardan *pdan mengganti a[0], b[0]dan h[0]dengan *a, b` dan *h. Juga, pertanyaan mengatakan bahwa * jika diberikan dua tim tidak akan bermain sesuai dengan tebakan Anda, Anda harus kembali sesuatu yang lain (ini bisa apa saja tapi kode negara, misalnya string kosong, null, pesan kesalahan) , sehingga pencetakan tidak ada hasil adalah tidak diperlukan dan Anda bisa menggantinya puts(...)dengan (p=strstr(t,h))&&puts(p-t&2?a:b).
Dennis
Terima kasih atas tipsnya, terutama a[0]->*a! Akan segera diperbarui. Hanya ingin tahu, apakah ada cara untuk mengakses array multidimensi dengan satu nomor? Saya menulis versi baris perintah ini dengan panjang yang identik (dapat menghemat 1 byte dengan a #define.) Akan lebih baik untuk menghindari subskripsi ganda dalam kasus ini dan yang serupa: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. Saya menemukan bug kecil. hharus diakhiri null, jadi harus demikian h[3]. 2. Jika Anda mengatur p=v[1], Anda dapat mengakses v[i][j]sebagai p[4*(i-1)+j]. Ini bekerja pada mesin saya, tapi saya tidak tahu apakah itu portabel ... 3. Anda harus dapat menginisialisasi hjika Anda mendeklarasikannya di dalam 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 kode Anda berfungsi dengan baik pada GCC / cygwin dan VS / Windows pada mesin saya. Juga for(int i=0;i<1000;i++)printf("%d %c ",i,i[*argv])menggemakan kembali setiap karakter yang dapat dicetak dari baris perintah pada VS, tetapi pada GCC nama programnya adalah 0, argumen pertama adalah pada 40 dan argumen kedua tidak terlihat (saya naik ke 1000.) Penasaran. Lagi pula, saya mengubah ke fungsi yang ada dalam aturan, selain memperbarui prediksi saya (saya hanya menunggu hasil malam ini untuk mengkonfirmasi mereka sebelum memposting.) Terima kasih lagi dan semoga sukses melawan Brasil pada hari Selasa.
Level River St
3

JavaScript 215 206 120 116

Banyak ruang untuk perbaikan:

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)

Pendekatan Regex - 116

Berkat ɐɔıʇǝɥʇu karena memposting tautan ini , ini membantu saya membuat 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]
William Barbosa
sumber
1
Anda dapat mempersingkat solusi dengan mengonversikan split(' ')ke split``dan join('')ke join``.
Arjun
2

Python ( 179 148 139 cq terlalu lama)

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

Semua orang tahu negara dengan nama yang muncul pertama dalam alfabet akan menang. (Jawaban ini hanya ada untuk memulai sesuatu)

Berkat amal pria di sini , saya bisa mempersingkat jawaban saya:

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

Ini memang menganggap tim yang valid, tetapi tidak memerlukan susunan yang valid ( f('BRA','NED')akan mengembalikan 0 (pertandingan tidak valid), tetapi f('XNE')akan kembali 'XNE'. Saya tidak mendapatkan dari pertanyaan Anda bahwa ini adalah masalah. Jangan ragu untuk kembali menyalahgunakan regex ini sesuai keinginan Anda.

Terima kasih @Ventero, saya tidak tahu tentang regex.

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
ɐɔıʇǝɥʇu
sumber
Anda mungkin ingin re.searchdalam versi golf, bukan re.match. Juga, Anda harus bisa menjatuhkan ^dan $jangkar.
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}}

Berikut adalah pertandingan antara "foo" dan "bar" yang mungkin, juga tim yang tidak akan bermain secara nyata satu sama lain di babak pertama akan mendapatkan hasil (misalnya mulai dengan BRA, ARG)

Hanya merekam tim yang kalah.

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

Disebut dengan:

f(("GER","BRA"))
ini gg
sumber
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

Sebagai pengguna PowerShell yang relatif baru, saya merasa pipeline benar-benar luar biasa. Saya pikir selanjutnya mungkin mencoba dan mengutak-atik array untuk mudah-mudahan menghilangkan semua panggilan substring ini. (Saya harus menambahkan panggilan di akhir atau kalau tidak itu menghasilkan kedua tim)

Anggota baru, percobaan pertama pada kode golf!

Bisa memiliki kode-sulit perempat final, semifinal, dan final untuk menyimpan beberapa karakter, tetapi itu tidak akan menyenangkan.

Seharusnya cukup sederhana untuk menguraikan, tetapi memenuhi kedua kondisi: memberikan pemenang yang sama> terlepas dari pesanan yang dimasukkan, dan hanya mengembalikan pemenang untuk pertandingan yang benar-benar terjadi>!

Setiap saran untuk perbaikan akan sangat dihargai, terima kasih!

Asli

$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
fuandon
sumber
1
Beberapa hal (memperbaiki ini sepenuhnya akan memakan waktu lebih banyak): Jangan menulis PowerShell seolah-olah itu C atau C #. Ini berarti, returntidak perlu dalam banyak kasus. foreachdan sebagian besar loop eksplisit dinilai berlebihan dan tidak berguna. Metode seperti .Substringhanya boleh digunakan dalam keadaan ekstrem (dan sementara kegunaan sepak bola bisa diperdebatkan, itu bukan olahraga ekstrem). Umumnya Anda ingin menggunakan pipa sebanyak mungkin.
Joey
1
Alih-alih menulis bertele-tele forloop seperti for($c=0;$c-lt$x.length-1;$c+=2){$x+=$x[$c].Substring(3)+$x[$c+1].Substring(3)}Anda hanya dapat menggunakan pipa dengan berbagai dan ForEach-Object(alias %): 0..($x.Length/2)|%{$x+=$x[2*$_].Substring(3)+$x[2*$_+1].Substring(3)}. Dengan hati-hati mempertimbangkan bagaimana data Anda diwakili, Anda kemungkinan besar bisa menyingkirkan Substringpanggilan. Tanda kurung di sekitar array awal tidak diperlukan. Untuk array yang lebih besar itu juga masuk akal untuk menggunakan karakter pemisah dan penggunaan -split(unary -splitdalam hal pemisah adalah spasi atau tab).
Joey
1
foreachLoop terakhir misalnya dapat ditulis sebagai pipeline juga ( ?is Where-Object): $x|?{$_-match$a-and$_-match$b}|%{$_;exit};0yang pada dasarnya mengatakan »Filter setiap elemen $xuntuk apakah cocok dengan keduanya $adan $bdan output yang pertama, keluar setelah itu. Jika tidak ada yang dapat ditemukan, hasilkan 0. «. Karena Anda tahu format string Anda, Anda juga bisa menggunakannya -match"$a$b|$b$a", saya kira. Karena mereka hanya harus tampil dalam urutan dalam string. Yang juga berarti bahwa kita dapat menggunakan sedikit trik di sini: "$a$b","$b$a"-eq$_untuk golf lagi 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/&,*

Di atas menggunakan tanda sisipan dan notasi, karena kode mengandung karakter yang tidak patut.

Dengan biaya tambahan enam byte, karakter tersebut dapat dihindari:

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

Cobalah online.

Uji coba

$ 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

Bagaimana itu bekerja

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.                    ";
Dennis
sumber
Anda harus menambahkan ukuran skrip bash Anda ke ukuran program CJam agar adil.
David Frank
1
@ DavidFrank: Saya sudah memasukkan skrip Bash untuk menunjukkan bukti bahwa program saya hanya menghasilkan keluaran untuk 15 pertandingan yang terjadi. Ini bekerja sendiri dan tidak memerlukan program eksternal.
Dennis
2

CJam, 49 48 byte

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

Di atas menggunakan notasi tanda kuret, karena kode mengandung karakter yang tidak patut.

Dengan mengorbankan dua byte tambahan, karakter tersebut dapat dihindari:

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

Cobalah online.

Uji coba

$ 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

Latar Belakang

Kami mulai dengan menetapkan dan karakter ASCII untuk setiap tim dengan mempertimbangkan namanya sebagai nomor basis 2, mengambil bilangan bulat modulo 91 yang dihasilkan, menambahkan 12 (untuk menghindari karakter yang tidak diinginkan) dan memilih karakter yang sesuai dengan kode ASCII yang dihasilkan. Dalam kode CJam, ini dicapai oleh 2b91%c.

Misalnya, kode karakter ALGare 65 76 71. Sejak (4 × 65 + 2 × 76 + 71) = 483, 483 % 91 + 12 = 40dan 40 jika kode karakter (.

Ini memberikan pemetaan berikut:

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

Sekarang, kita dapat menyandikan pertandingan babak 16 sebagai berikut:

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

Jika kami menganggap bahwa tim pertama dalam urutan abjad selalu menang, pertandingan perempat final adalah sebagai berikut:

(B2;4#8[

Perhatikan bahwa string ini dapat diperoleh dari yang pertama dengan memilih setiap karakter kedua, dimulai dengan yang pertama. Dalam kode CJam, ini dicapai oleh 2%.

Menggunakan ide yang sama, pertandingan semifinal dan pertandingan final adalah sebagai berikut:

(248
(4

Kode

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

mendorong string yang berisi kecocokan dari babak 16, lalu melakukan tiga kali berikut: duplikat string, ekstrak setiap karakter kedua salinan, digabungkan. Hasilnya adalah string

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

yang berisi semua kecocokan (beberapa diantaranya lebih dari satu kali).

Bagaimana itu bekerja

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.                             ";
Dennis
sumber
Sungguh menakjubkan apa yang Anda lakukan dengan Cjam. Kapan pun saya berpikir Anda mungkin meminjam salah satu ide saya, Anda menemukan sesuatu yang lebih baik! kode prediksi Anda "(=BL2*;74)#%8J[K"{_2%+}3*sama panjangnya dengan bentuk nonpalindromic dari string prediksi saya "rRgL j9Ab 35ph tYKO gApK"tetapi jauh lebih mudah untuk ditangani.
Level River 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)
wolfhammer
sumber