Dünya Kupası tahmin programı oluşturma


13

Bildiğiniz gibi, Dünya Kupası grup aşaması sona erdi ve yarından en iyi 16 takım nakavt aşamasına başlayacak:

  • Brezilya (BRA)
  • Meksika (MEX)
  • Hollanda (NED)
  • Şili (CHI)
  • Kolombiya (COL)
  • Yunanistan (GRE)
  • Kosta Rika (CRC)
  • Uruguay (URU)
  • Fransa (FRA)
  • İsviçre (SUI)
  • Arjantin (ARG)
  • Nijerya (NGA)
  • Almanya (GER)
  • Amerika Birleşik Devletleri (ABD)
  • Belçika (BEL)
  • Cezayir (ALG)

Nakavt aşamasında, her maçtan sonra kazanan bir sonraki tura geçer ve kaybeden eve gider (beraberlik yoktur). Nakavt aşaması hakkında daha fazla bilgi için burayı tıklayın .

Yeni bir bahis sitesi olan golfbet.com tarafından işe alındınız çünkü hem programlama hem de spor bahislerinde iyi olduğunuzu biliyorsunuz. Göreviniz bir maçın galibini tahmin edebilecek bir program veya işlev yazmaktır. Tabii ki, herkes farklı tahminler yapıyor, tahminleriniz tutarlı olduğu sürece önemli değil.

Tahmin etmek istemiyorsanız, aşağıdaki tahminleri kullanabilirsiniz:

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, takımların sırasına bakılmaksızın aynı kazananı çıkarmalıdır (BRA-CHI maçının kazananı CHI-BRA maçının kazananı ile aynı olmalıdır)
  2. Bir takım kaybederse, başka maç oynayamaz. Bu, gerçekleşmeyen maçlar için bunu belirtmeniz gerektiği anlamına gelir. Örneğin, programınız Brezilya'nın BRA-CHI maçını kazanacağını tahmin ederse, CHI-GER'in "sonuç" vermemesi gerekir, çünkü Şili Almanya'ya karşı oynamaz. Program için yukarıdaki bağlantıya bakın.

Sadelik için bronz kibritle uğraşmak zorunda değilsiniz (ama tabii ki yapabilirsiniz).

Programınız veya işleviniz girdi olarak iki dize alır: iki ekibin 3 harfli ülke kodu ve kazanan ekibin ülke kodunu döndürür (standart giriş / çıkış veya iki işlev parametresi / dönüş değeri kullanabilirsiniz). Verilen iki takım tahminlerinize göre oynamayacaksa, başka bir şey iade etmelisiniz (bu ülke kodları dışında bir şey olabilir, örneğin boş dize, boş, hata mesajı). Girişin doğru olduğunu varsayabilirsiniz (listedeki iki farklı ülke kodu).

Bu öncelikle bir kod golf, yani bayt en kısa program kazanır. Bununla birlikte, hoş ve zor çözümler de değerlidir.

Örnek (elbette, kendi tahminlerinizi yapabilirsiniz):

giriş: BRA CHI çıkışı: BRA

giriş: CHI BRA çıkışı: BRA

giriş: CHI GER çıktı: sonuç yok


Rastgele tahminler çıkaran bir [az kalmış] olmalıydım, ama her zaman favori takımınızın kazanmasına izin vermeliyiz;) (Gibi: rastgele bir tahmin ağacı
çıkarır

@ ɐɔıʇǝɥʇuʎs codegolf.stackexchange.com/questions/32092/… Buna çok benziyor
David Frank

4
@ ɐɔıʇǝɥʇuʎs, bu olduğu gibi çok daha ilginç. Üç bileşenli bir kümedeki hash işlevlerine kabaca karşılık gelen olası programlardan oluşan bir alan verilir ve bu alandaki herhangi bir programa eşdeğer olan en küçük programı bulmamız gerekir.
Peter Taylor

1
Girdi geçerli olması ya da olur varsaymak olabilir BRA BRAve HAZ CHEEZBURGERuygun bir şekilde işlenmesi gerekir?
Dennis

@Dennis benim düzenleme görmek - giriş her zaman geçerlidir
David Frank

Yanıtlar:


6

Python 2.x - 368 283

İlginç bir meydan okuma. Elbette FIFA'dan şimdiki sıralamaları almamız gerekiyor . Brezilya, "12'nci adam" olarak adlandırılan ev avantajına sahip olduğu için ağırlık 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'   

Yukarıda kısaltmak için ipuçları bekliyoruz :-).

@TheRare ve @MrLemon sayesinde iyileştirmeler

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'

Bu, aşağıdaki sonuçlara yol açar:

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

Örnek çağrılar:

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

1. Kullanmazsınız j(her zaman sıfırdır). 2. sınırlayıcı for kkullanılarak bir satıra yazılabilir ;. 3. tryveya except4. gibi anahtar kelimelerden sonra boşluk a[k]if d[k]>d[k+1]else a[k+1]for n in 16,8,4,2def f(s):print s in m and m[s]or'no result'
bırakmanız gerekmez.

@TheRare Kullanıyor j, ancak ile küçük bir biçimlendirme hatası var j+=1. Ve [15,6,10,11,4,0,2,14,3,5,1,8,13,12,9,7]elbette FIFA verilerini yeniden kodlayarak çok sayıda karakter kaydedebilirsiniz .
MrLemon

@MrLemon Ah, kodu kendim denemedim, sadece baktım.
seequ

5

C, 182178133 (veya 126)

Buradaki en kısa program değil, tahminin kolayca değiştirilebileceği en kısa programdır. Artık tüm yarı finalistler bilindiğine göre güncelleme yapıyorum.

Kodda da bazı değişiklikler var. Dennis'in yorumlardaki önerilerinin yanı sıra, program bir işleve dönüştürüldü (yeniden okumada olduğu gibi kurallar tarafından izin verildiği gibi) ve karma kısaltılmıştır.

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

Nasıl çalışır

giriş ave bifadesi ile Hash *a-a[1]%16tek bir karakter (kadar *aolan kısa bir eşdeğer a[0]). Karma, takımlar için sonuç verir ave biçinde saklanır h. Örneğin BRA CHI olur @;. Karma değerler aşağıdaki gibidir (onaylanmış yarı finalistler ve tahmin edilen şampiyonum ile işaretlenmiştir *.)

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[]tahminlerimi saklar. 16 ve çeyrek final turunun sonuçları artık biliniyor. 4 takımdan oluşan her bir gruba, 1. ve 4. takımlar elenecek ve 3. takım yarı finalist olacak şekilde sıralanmıştır. Yarı finalistlere benzer şekilde, 1. ve 4. elemelerin eleneceğini ve 3. yarı finalistin genel kazanan olacağını tahmin ediyorum. Tahminlerime katılmıyorsanız, tabloyu yeniden sıralamanız yeterlidir.

Tahminler, kullanıcının takımlara her iki sırayla girme olasılığını karşılamak için palindromik bloklarda saklanır. Sıralama, her bir 4 takımın kazanan takımlarını üçüncü bir maç için bir araya getirir. Böylece ilk grupta GRE ECRC'ye ve MEX NED'e Hkaybetti. Bu, CRC'yi yazmayı tekrarlamak zorunda kalmadan çeyrek finalde ANED oynayacak şekilde ayarlar I. Dize, her biri 4 takım / 7 karakterden oluşan bir grupla doldurulur ve birbirleriyle oynamayan takımlar için çıktı olmadığından emin olun.

Aşağıdaki gibi 8 karakterden her gruptaki her olası Maçın galibi: invalid,b,a,a,b,b,a,invalid. Böylece kazanan doğru seçim pozisyonunu alarak yapılabilir hiçinde t VE 2 . Maalesef strstrbu bir işaretçi döndürür olarak işlev çoğu straighforward değil pbiz çıkarmak gerekir, bu yüzden pgelen tgerçek konumunu almak için t.maç (içinde bulunamaz geçersizse t), psıfırdır ve ifade no resultbasılır.

Bazı şüpheli gelişmeler, 126

Geliştirilmiş bir karma ifadeyle 2 karakter kaydedildi. Ne yazık ki, bu, ekiplerin, işlevin altındaki test programında gösterildiği gibi olmasını gerektirir (örneğin , yukarıdaki programda kullanılanlar Brayerine BRA). Bunu tek bir operatörle yapmanın hiçbir yolu olmadığından kendim memnun oldum, 2 operatör ve tek karakterlik bir sabit elde ettiği kadar iyidir. Ayrıca , ekip kodu gruplarını ayırmak Uruiçin spacebu şekilde alternatif bir karaktere |ihtiyaç duyulduğunu da unutmayın.

tTahmin dizesini ortadan kaldırarak ve gerçek olarak ele alarak 5 karakter kaydedildi . Bu, dizenin saklandığı adresi bilmenin imkansız olduğu anlamına gelir. Bununla birlikte, sıfıra depolanmadığı sürece, sadece p&2adres 4'e bölünebilirse kodun çalışması için ilgileniriz. (İşaretçiye pdoğrudan bir tamsayı muamelesi yapılmasına izin verilmediğine dikkat edin, başka bir işaretçiden çıkarılmalıdır. Ben işaretçi kullanın bu ayüzden ade 4 ile bölünebilir olmalıdır.) Bir 32 veya 64 bit derleyici / mimari dizeleri bu şekilde saklanacak oldukça emin olabilirsiniz. Görsel stüdyo / pencerelerde derlemeyi reddetmesine rağmen, bu benim için GCC / cygwin'de iyi çalışıyor.

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

İlginç bir yaklaşım! Sen arasındaki boşluğu kaldırarak birkaç byte kaydedebilirsiniz charve *pve değiştirme a[0], b[0]ve h[0]ile *a, b` ve *h. Ayrıca, soru verilen iki takım tahminlerinizin göre çalmıyor eğer *, başka bir şey (bu şey ama ülke kodları, örneğin boş dize null, hata mesajı olabilir) döndürmesi gerekir diyor yazdırmakta, hiçbir sonuç olduğunu gerekli değildir ve puts(...)ile değiştirebilirsiniz (p=strstr(t,h))&&puts(p-t&2?a:b).
Dennis

Özellikle ipuçları için teşekkürler a[0]->*a! Yakında güncellenecek. Sadece merak ediyorum, tek bir sayı ile çok boyutlu bir diziye erişmenin herhangi bir yolu var mı? Ben aynı uzunlukta bu komut satırı sürümünü yazdım (a ile 1 bayt kaydedebilirsiniz #define.) Bu ve benzeri durumlarda çift abonelik önlemek için iyi olurdu: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. Küçük bir hata buldum. hnull sonlandırılmalıdır, bu yüzden olmalıdır h[3]. 2. Ayarladıysanız p=v[1], v[i][j]olarak erişebilirsiniz p[4*(i-1)+j]. Makinemde çalışıyor, ancak taşınabilir olup olmadığını bilmiyorum ... 3. İçinde hbeyan ederseniz başlayabilmeniz gerekir 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

@ Kodunuz makinemdeki hem GCC / cygwin hem de VS / Windows üzerinde iyi çalışıyor. Ayrıca for(int i=0;i<1000;i++)printf("%d %c ",i,i[*argv])VS üzerindeki komut satırının her yazdırılabilir karakterini geri yansıtır, ancak GCC'de program adı 0'dır, ilk argüman 40'tır ve ikinci argüman hiçbir yerde görülmez (1000'e kadar çıktım.) Meraklı. Her neyse, tahminlerimi güncellemenin yanı sıra kurallar dahilinde bir işleve geçtim (sadece bu gecenin sonucunu göndermeden önce onaylamak için bekliyordum.) Tekrar teşekkürler ve Salı günü Brezilya'ya karşı iyi şanslar.
Level River St

3

JavaScript 215220120 116

İyileştirilecek çok yer var:

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)

Normal İfade Yaklaşımı - 116

Linkıʇǝɥʇuʎs bu bağlantıyı yayınladığı için teşekkürler, normal ifadeyi yapmama yardımcı oldu

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
Sen dönüştürerek çözüm kısaltabilirsiniz split(' ')için split``ve join('')için join``.
Arjun

2

Python ( 179 148 139 cq yol çok uzun)

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

Herkes ülkeyi tanıyarak adını alfabesinde kazanan isim kazanacak. (Bu cevap sadece işleri başlatmak için var)

Buradaki adamların hayırseverliği sayesinde, cevabımı biraz kısaltabilirim:

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

Bu geçerli takımları varsayar, ancak geçerli bir dizilime ihtiyaç duymaz ( f('BRA','NED')0 döndürür (geçersiz eşleşme), ancak f('XNE')geri döner 'XNE'.) Sorunuzdan bunun bir sorun olduğunu düşünmüyorum. uygun gördüğünüz gibi bu normal ifade.

Teşekkürler @Ventero, normal ifadeler hakkında hiçbir şey bilmiyorum.

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

Muhtemelen re.searchgolf versiyonunda istersiniz , değil re.match. Ayrıca, ^ve $çapaları bırakabilmelisiniz .
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}}

İşte "foo" ve "bar" arasındaki eşleşmeler, ilk turlarda birbirlerine karşı gerçekte oynamayacak takımların da bir sonucu olacaktır. (Örneğin, BRA, ARG ile başlayarak)

Sadece kaybedilen takımları kaydediyor.

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

Aranan:

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

2

PowerShell ( 261221 )

$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

Nispeten yeni bir PowerShell kullanıcısı olarak, boru hattını kesinlikle şaşırtıcı buluyorum. Bir sonraki kadar denemek ve umarım tüm bu alt dize çağrıları ortadan kaldırmak için dizi ile keman olabilir düşünüyorum. (Sonunda bir çağrı eklemek zorunda kaldım, yoksa her iki takımı da çıkardı)

Yeni üye, ilk kod golf denemesi!

Birkaç karakter kaydetmek için çeyrek finali, yarı finalleri ve finalleri zor kodlamış olabilirdi, ama bu kadar eğlenceli olmazdı.

Deşifre etmek için yeterince basit olmalı, ancak her iki koşulu da yerine getiriyor: girilen sıradan bağımsız olarak aynı kazananı> veriyor ve sadece gerçekten gerçekleşen maçlar için bir kazanan döndürüyor!

İyileştirme için herhangi bir tavsiye çok takdir edilecektir, teşekkürler!

orijinal

$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
Birkaç şey (bunu tamamen düzeltmek daha fazla zaman alacaktır): PowerShell'i sanki C veya C # gibi yazmayın. Bu, returnçoğu durumda gereksizdir. foreachve çoğu açık döngü abartılı ve işe yaramaz. Gibi yöntemler .Substringsadece aşırı durumlarda kullanılmalıdır (ve futbolun kullanımı tartışılırken, bu aşırı bir spor değildir). Genellikle boru hattını mümkün olduğunca kullanmak istersiniz.
Joey

1
Sizin forgibi uzun soluklu bir döngü yazmak yerine, for($c=0;$c-lt$x.length-1;$c+=2){$x+=$x[$c].Substring(3)+$x[$c+1].Substring(3)}sadece aralıklı ve ForEach-Object(diğer ad %) bir boru hattı kullanabilirsiniz 0..($x.Length/2)|%{$x+=$x[2*$_].Substring(3)+$x[2*$_+1].Substring(3)}. Verilerinizin nasıl temsil edildiğini dikkatlice değerlendirerek büyük olasılıkla Substringçağrılardan kurtulabilirsiniz . İlk dizinin etrafındaki parantezler gereksizdir. Daha büyük diziler için ayırıcı karakter kullanmak ve kullanmak da mantıklı olabilir -split( -splitayırıcının boşluk veya sekme olması durumunda tek ).
Joey

1
Nihai foreachörneğin döngü de (bir boru hattı gibi yazılabilir ?olduğunu Where-Object:) $x|?{$_-match$a-and$_-match$b}|%{$_;exit};0esasen her eleman Filtre »diyor $xhem eşleşip için $ave $bsonradan çıkan ve çıkış birincisi. Hiçbiri bulunamazsa, çıkış 0 «. Dizelerinizin biçimini bildiğiniz için sadece kullanabilirsiniz -match"$a$b|$b$a". Çünkü dizede iki sırada görünmeleri gerekir. Bu da burada küçük bir numara kullanabileceğimiz anlamına geliyor: "$a$b","$b$a"-eq$_başka bir bayt golf yapmak.
Joey

2

CJam, 64 58 bayt

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

Kod yazdırılamaz karakterler içerdiğinden yukarıdakiler düzeltme işareti ve M işareti kullanır.

Altı ek bayt pahasına, bu karakterlerden kaçınılabilir:

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

Çevrimiçi deneyin.

Test sürüşü

$ 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

Nasıl çalışır

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.                    ";

Bash betiğinizin boyutunu adil olmak için CJam programının boyutuna eklemelisiniz.
David Frank

1
@DavidFrank: Programımın yalnızca gerçekleşen 15 maç için çıktı sağladığına dair kanıt göstermek için Bash komut dosyasını ekledim. Kendi başına çalışır ve harici program gerektirmez.
Dennis

2

CJam, 49 48 bayt

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

Yukarıdaki kod, yazdırılamayan karakterler içerdiğinden düzeltme işareti kullanmaktadır.

İki ek bayt pahasına, bu karakterlerden kaçınılabilir:

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

Çevrimiçi deneyin.

Test sürüşü

$ 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

Arka fon

Her takıma adını bir taban 2 numarası düşünerek, sonuçta elde edilen tamsayı modulo 91'i alarak, 12 ekleyerek (yazdırılamayan karakterlerden kaçınmak için) ve sonuçtaki ASCII koduna karşılık gelen karakteri seçerek her takıma ASCII karakteri atayarak başlarız. CJam kodunda bu ile elde edilir 2b91%c.

Örneğin, karakter kodları ALGvardır 65 76 71. Yana (4 × 65 + 2 × 76 + 71) = 483, 483 % 91 + 12 = 40ve 40 karakter kodu ise (.

Bu, aşağıdaki eşlemeyi verir:

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

Şimdi, 16 raundun maçlarını şu şekilde kodlayabiliriz:

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

Alfabetik sırayla ilk takımın her zaman kazandığını varsayarsak, çeyrek finallerin maçları aşağıdaki gibidir:

(B2;4#8[

Bu dizenin, ilkinden başlayarak her ikinci karakteri seçerek ilkinden elde edilebileceğini unutmayın. CJam kodunda bu ile elde edilir 2%.

Aynı fikri kullanarak yarı final ve final maçlarının maçları aşağıdaki gibidir:

(248
(4

Kod

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

16 raundundaki eşleşmeleri içeren dizgiyi iter, ardından üç kez yapar: dizeyi çoğaltır, kopyanın her ikinci karakterini çıkarır, birleştirir. Sonuç dizedir

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

tüm maçları içerir (bazıları bir kereden fazla).

Nasıl çalışır

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.                             ";

Cjam ile yaptıklarınız inanılmaz. Fikirlerimden birini ödünç alabileceğinizi düşündüğümde, daha iyi bir şey bulursunuz! tahmin kodunuz "(=BL2*;74)#%8J[K"{_2%+}3*, tahmin dizemizin palindromik olmayan formuyla aynı uzunlukta "rRgL j9Ab 35ph tYKO gApK"ancak kullanımı çok daha kolay.
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)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.