ワールドカップ推測プログラムを作成する


13

ご存知のとおり、ワールドカップグループステージは終了し、明日から最高の16チームがノックアウトステージを開始します。

  • ブラジル(BRA)
  • メキシコ(MEX)
  • オランダ(NED)
  • チリ(CHI)
  • コロンビア(COL)
  • ギリシャ(GRE)
  • コスタリカ(CRC)
  • ウルグアイ(URU)
  • フランス(FRA)
  • スイス(SUI)
  • アルゼンチン(ARG)
  • ナイジェリア(NGA)
  • ドイツ(GER)
  • アメリカ(USA)
  • ベルギー(BEL)
  • アルジェリア(ALG)

ノックアウトステージでは、各試合の後、勝者は次のラウンドに進み、敗者は家に戻ります(引き分けはありません)。ノックアウトステージの詳細については、ここをクリックしてください。

あなたは、プログラミングとスポーツベッティングの両方が得意であることが知られているため、新しい賭けのウェブサイトであるgolfbet.comに雇われました。あなたの仕事は、試合の勝者を推測できるプログラムまたは関数を書くことです。もちろん、誰もが異なる推測を行います。推測が一貫している限り、それは問題ではありません。

推測したくない場合は、次の推測を使用できます。

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. プログラムは、チームの順序に関係なく同じ勝者を出力する必要があります(BRA-CHI試合の勝者はCHI-BRA試合の勝者と同じである必要があります)
  2. チームが負けた場合、それ以上試合をすることはできません。これは、行われないマッチについては、そうする必要があることを意味します。たとえば、ブラジルがBRA-CHIの試合に勝つとプログラムが推測する場合、チリはドイツと対戦しないため、CHI-GERは「結果なし」を返す必要があります。スケジュールについては上記のリンクをご覧ください。

簡単にするために、ブロンズマッチに対処する必要はありません(ただし、もちろんできます)。

プログラムまたは関数は、入力として2つの文字列を受け取ります。2つのチームの3文字の国コードと、勝ったチームの国コードを返します(標準入力/出力、または2つの関数パラメーター/戻り値を使用できます)。与えられた2つのチームがあなたの推測どおりにプレイできない場合、何か他のものを返さなければなりません(これは国コード以外、たとえば空の文字列、null、エラーメッセージ)。入力が正しいと想定できます(リストにある2つの異なる国コード)。

これは主にコードゴルフであるため、バイト単位の最短プログラムが優先されます。ただし、すてきでトリッキーなソリューションも重要です。

例(もちろん、独自の推測を行うことができます):

入力:BRA CHI出力:BRA

入力:CHI BRA出力:BRA

入力:CHI GER出力:結果なし


してきたはずです[人手不足]出力ランダム推測は、いつもの自分の好きなチームの勝利を聞かせていること;)(同様に:ランダムな推測ツリーを出力)
ɐɔıʇǝɥʇuʎs

@ɐɔıʇǝɥʇuʎscodegolf.stackexchange.com/ questions /32092/ これは非常に似ています
デビッドフランク14年

4
@ɐɔıʇǝɥʇuʎs、これは現状のままではるかに興味深いです。3要素セットのハッシュ関数にほぼ対応する可能なプログラムのスペースが与えられており、そのスペース内のプログラムと同等の最小のプログラムを見つける必要があります。
ピーターテイラー14年

1
入力が有効である、または適切に処理される必要があるBRA BRAと仮定できHAZ CHEEZBURGERますか?
デニス14年

@デニスは私の編集を見る-入力は常に有効です
デビッドフランク14年

回答:


6

Python 2.x- 368 283

興味深い挑戦。もちろん、FIFAから現在のランキングを取得する必要があります。ブラジルにはホームアドバンテージがあるため、いわゆる「12番目の男」がいます。

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'   

上記を短縮するためのヒントは大歓迎です:-)。

@TheRareと@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'

これにより、次の結果が得られます。

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

呼び出しの例:

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

1.使用しませんj(常にゼロです)。2. 区切り文字for kを使用して、1行で記述できます;。3. tryまたはのようなキーワードの後に​​スペースは必要ありませんexcept。4.角括弧とキーワードの間のスペースを削除できます(a[k]if d[k]>d[k+1]else a[k+1]有効です)5 for n in 16,8,4,2. 6.def f(s):print s in m and m[s]or'no result'
seequ

@TheRare彼はを使用していますがj、にはわずかなフォーマットエラーがありj+=1ます。[15,6,10,11,4,0,2,14,3,5,1,8,13,12,9,7]もちろん、FIFAデータをに再エンコードすることで、多くのキャラクターを節約できます。
MrLemon

@MrLemonああ、私は自分でコードを試したのではなく、見ただけです。
seequ 14年

5

C、182 178 133(または126)

ここでは最短のプログラムではありませんが、予測を簡単に変更できる最短のプログラムです。すべての準決勝進出者がわかったので、更新します。

コードにもいくつかの変更があります。コメントでのデニスの提案とは別に、プログラムは関数に変換されており(再読み取りの場合はルールで許可されています)、ハッシュが短縮されています。

コード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);
}

使い方

入力abは、式によって*a-a[1]%16単一文字にハッシュされます(これ*aはに相当する短縮形ですa[0])。チームのハッシュ結果abに格納されていますh。たとえば、BRA CHIはになり@;ます。ハッシュ値は次のとおりです(確認済みのセミファイナリストと私の予想チャンピオンにはが付いてい*ます)。

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[]予測を保存します。16回戦および準々決勝の結果が判明しました。4チームの各グループは、1番目と4番目が排除され、3番目が準決勝進出者になるように注文されます。同様に、準決勝進出者についても、1番目と4番目が排除され、3番目の準決勝進出者が全体的な勝者になると予測しています。あなたが私の予測に同意しない場合は、単に表を並べ替えてください。

ユーザーがいずれかの順序でチームに入る可能性に対応するために、予測は回文ブロックに保存されます。順序付けにより、4組の各セットの勝利チームがまとめられ、3番目の試合が行われます。したがって、最初のグループでは、GRE EはCRCにH負け、MEX はNEDに負けました。これにより、タイピングを繰り返すことなく、四半期ファイナルでANEDをプレイするようにCRC が設定されIます。文字列には、4チーム/ 7文字の各グループの間にスペースが埋め込まれ、お互いにプレーしないチームの出力がないようにします。

8文字の各グループで可能な各マッチの勝者は次のとおりですinvalid,b,a,a,b,b,a,invalid。したがって、勝者の正しい選択は、位置取りすることによって行うことができるht と2を。残念ながらstrstr、それはポインタを返すよう関数が最もstraighforwardではありませんp、我々は減算する必要がありますので、pからtで実際の位置を取得するためにt.試合が(で見つけることができない無効な場合t)、pゼロで、フレーズがno resultプリントされています。

いくつかの疑わしい改善、126

改良されたハッシュ式により保存された2文字。残念ながら、これにはチームのケースが関数の下のテストプログラムに示されているようになっている必要があります(たとえば、上記のプログラムで使用されているもののBra代わりにBRA)。1人のオペレーターでこれを行う方法はありません。そのため、2つの演算子と1文字の定数で十分です。また、Uruマップするspaceため、|チームコードのグループを分離するために代替キャラクターが必要です。

t予測文字列を削除してリテラルとして処理することにより、5文字が節約されました。これは、文字列が保存されているアドレスを知ることが不可能であることを意味します。ただし、ゼロに格納されていないp&2場合は、アドレスが4で割り切れる場合にのみコードが機能することに関心があります(ポインターpを整数として直接扱うことは許可されていないため、別のポインターから減算する必要があります。ポインターを使用するaためa、4で割り切れる必要があります。)32ビットまたは64ビットのコンパイラー/アーキテクチャー文字列は、この方法で格納されると確信できます。これはGCC / cygwinでうまく機能していますが、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]);}  
}

興味深いアプローチ!あなたは、間にスペースを削除することによって、いくつかのバイトを保存することができますcharし、*pおよび交換a[0]b[0]及びh[0]とともに*aB`と*h。また、質問は、*与えられた2つのチームがあなたの推測通りにプレイしない場合、何か他のもの(これは国コード以外、たとえば空文字列、null、エラーメッセージ)を返さなければならないので、結果は出力されません必要に応じて、あなたは置き換えることができないputs(...)(p=strstr(t,h))&&puts(p-t&2?a:b)
デニス14年

特にヒントをありがとうa[0]->*a!間もなく更新されます。ただ疑問に思って、単一の数値で多次元配列にアクセスする方法はありますか?私は(と1つのバイトを保存することができ、同一の長さのこのコマンドラインバージョンを書きました#define。)この中に二重の添字と似たようなケースを避けるためにいいだろう: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");}
レベル川セント

1.小さなバグを見つけました。hnullで終了する必要があるため、である必要がありますh[3]。2.設定するとp=v[1]v[i][j]としてアクセスできますp[4*(i-1)+j]。それは私のマシン上で動作しますが、私はそれが... 3.ポータブルだ場合は、初期化することができるはず知らないhあなたの中にそれを宣言した場合mainmain(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のコードは、私のマシンのGCC / cygwinとVS / Windowsの両方で正常に動作します。またfor(int i=0;i<1000;i++)printf("%d %c ",i,i[*argv])、VSのコマンドラインの印刷可能な各文字をエコーバックしますが、GCCではプログラム名は0、最初の引数は40、2番目の引数はどこにも表示されません(私は1000になりました)。とにかく、予測を更新することに加えて、ルール内の関数に変更しました(投稿する前に今夜の結果を確認するのを待っていました)。火曜日にブラジルに感謝します。
レベルリバーセント14

3

JavaScriptの215 206 120 116

改善の余地がたくさんあります:

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)

正規表現アプローチ-116

このリンクを投稿してくれたɐɔıʇǝɥʇuʎsのおかげで、正規表現を作るのに役立ちました

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
およびに変換するsplit(' ')ことにより、ソリューションを短縮できます。split``join('')join``
アルジュン

2

Python(179 148 139 cqが長すぎる)

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

誰もがアルファベットで最初に来る名前を持つ国が勝つことを知っています。(この答えは、物事を始めるために存在しています)

ここの男の慈善のおかげで、少し答えを短くすることができました:

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

これは有効なチームを前提としていますが、有効なラインナップは必要ありません(f('BRA','NED')0(無効な一致)f('XNE')を返し'XNE'ますが、戻ることになります。あなたが合うと思うこの正規表現。

@Venteroに感謝します。正規表現については何も知りません。

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

あなたはおそらくre.searchゴルフバージョンではなく、欲しいですre.match。また、あなたがドロップすることができるはず^$アンカーを。
ヴェンテロ14年

2

スカラ(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}}

「foo」と「bar」の一致が可能です。また、最初のラウンドでお互いに実際に対戦しないチームには結果があります(たとえば、BRA、ARGで始まる)

負けたチームを記録しているだけです。

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

と呼ばれる:

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

比較的新しいPowerShellユーザーとして、私はパイプラインが非常に素晴らしいと感じています。次は、配列をいじって、これらすべての部分文字列呼び出しを削除することを望んでいます。(私は最後に呼び出しを追加する必要がありました、さもなければ両方のチームを出力しました)

新メンバー、コードゴルフの最初の試み!

準々決勝、準決勝、決勝戦をハードコーディングして数文字を節約できたかもしれませんが、それはそれほど面白くないでしょう。

解読するのに十分単純である必要がありますが、両方の条件を満たします。入力された順序に関係なく同じ勝者を与え、実際に行われる試合に対してのみ勝者を返します。

改善のためのアドバイスは大歓迎です、ありがとう!

元の

$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
いくつかのこと(これを完全に修正するには時間がかかります):PowerShellをCやC#のように記述しないでください。つまり、returnほとんどの場合、これは不要です。foreachそして、ほとんどの明示的なループは過大評価され、役に立たない。のような方法.Substringは、極端な状況でのみ使用する必要があります(サッカーの実用性は議論されるかもしれませんが、極端なスポーツではありません)。一般的に、パイプラインを可能な限り使用する必要があります。
ジョーイ14年

1
長いforループを作成する代わりにfor($c=0;$c-lt$x.length-1;$c+=2){$x+=$x[$c].Substring(3)+$x[$c+1].Substring(3)}、範囲とForEach-Object(エイリアス化された%)でパイプラインを使用することができます0..($x.Length/2)|%{$x+=$x[2*$_].Substring(3)+$x[2*$_+1].Substring(3)}。データがどのように表されるかを慎重に検討することで、Substring呼び出しをなくすことができます。初期配列の周りの括弧は不要です。大きな配列の場合、区切り文字を使用して使用することも意味があります-split-split区切り文字がスペースまたはタブの場合は単項)。
ジョーイ14年

1
最終foreach例えばループはよく(ASパイプラインのように書くことができる?であるWhere-Object。)$x|?{$_-match$a-and$_-match$b}|%{$_;exit};0本質的にすべての要素をフィルタ»言い$x、それは両方と一致するかどうかをするため$a及び$bその後出ると、出力最初のもの。何も見つからない場合は、0。«を出力します。文字列の形式がわかっているので-match"$a$b|$b$a"、単に使用することもできます。文字列内でどちらかの順序で表示される必要があるだけです。これは、ここでちょっとしたトリックを使用できることも意味し"$a$b","$b$a"-eq$_ます。もう1バイトゴルフをすることです。
ジョーイ14年

2

CJam、64 58バイト

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

コードには印刷できない文字が含まれているため、上記ではキャレットとM表記を使用しています。

追加の6バイトのコストで、これらの文字を回避できます。

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

オンラインでお試しください。

テスト走行

$ 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

使い方

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スクリプトのサイズをCJamプログラムのサイズに追加する必要があります。
デビッドフランク14年

1
@DavidFrank:Bashスクリプトを含めて、私のプログラムが15のマッチのみの出力を提供するという証拠を示しました。それ自体で動作し、外部プログラムを必要としません。
デニス14年

2

CJam、49 48バイト

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

コードには印刷できない文字が含まれているため、上記ではキャレット表記を使用しています。

追加の2バイトのコストで、これらの文字を回避できます。

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

オンラインでお試しください。

テスト走行

$ 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

バックグラウンド

まず、各チームにASCII文字を割り当てます。名前に2を底とする数値を考慮し、91を法とする整数を取得し、12(印刷できない文字を避けるため)を追加し、結果のASCIIコードに対応する文字を選択します。CJamコードでは、これはによって達成され2b91%cます。

たとえば、の文字コードはALGです65 76 71。以来(4 × 65 + 2 × 76 + 71) = 483483 % 91 + 12 = 40および40の文字コードの場合(

これにより、次のマッピングが得られます。

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

これで、次のように16ラウンドの一致をエンコードできます。

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

アルファベット順の最初のチームが常に勝利すると仮定した場合、準々決勝の試合は次のとおりです。

(B2;4#8[

この文字列は、最初から2文字ごとに選択することで最初から取得できることに注意してください。CJamコードでは、これはによって達成され2%ます。

同じ考えを使用すると、準決勝の試合と最終試合は次のようになります。

(248
(4

コード

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

16ラウンドの一致を含む文字列をプッシュし、次の3回を実行します。文字列を複製し、コピーの2文字ごとに抽出し、連結します。結果は文字列です

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

これにはすべての一致が含まれます(一部は複数回一致します)。

使い方

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を使って何をするかは驚くべきことです。あなたが私のアイデアの1つを借りるかもしれないと思うときはいつでも、あなたはより良い何かを思いつきます!あなたの予測コード"(=BL2*;74)#%8J[K"{_2%+}3*は、私の予測文字列の非パリンドローム形式と同じ長さですが、"rRgL j9Ab 35ph tYKO gApK"はるかに扱いやすいです。
レベル川セント14年

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)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.