สร้างโปรแกรมทายผลฟุตบอลโลก


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 จะต้องส่งคืน "ไม่มีผล" เนื่องจากชิลีจะไม่เล่นกับเยอรมนี ดูลิงค์ด้านบนสำหรับตาราง

เพื่อความเรียบง่ายคุณไม่ต้องจัดการกับการแข่งขันบรอนซ์ (แต่คุณสามารถทำได้)

โปรแกรมหรือฟังก์ชั่นของคุณใช้สองสายเป็นอินพุต: รหัสประเทศ 3 ตัวอักษรของทั้งสองทีมและส่งกลับรหัสประเทศของทีมที่ชนะ (คุณสามารถใช้อินพุต / เอาท์พุตมาตรฐานหรือสองพารามิเตอร์ฟังก์ชัน / ค่าส่งคืน) หากทั้งสองทีมที่ได้รับจะไม่เล่นตามการคาดเดาของคุณคุณจะต้องส่งคืนสิ่งอื่น (ซึ่งอาจเป็นอะไรก็ได้ยกเว้นรหัสประเทศเช่นสตริงว่างเปล่า, null, ข้อความแสดงข้อผิดพลาด) คุณสามารถสมมติว่าอินพุตถูกต้อง (รหัสประเทศที่แตกต่างกันสองรหัสซึ่งอยู่ในรายการ)

นี่คือรหัสกอล์ฟเป็นหลักดังนั้นโปรแกรมที่สั้นที่สุดในหน่วยไบต์ชนะ อย่างไรก็ตามการแก้ปัญหาที่ดีและยุ่งยากก็มีค่าเช่นกัน

ตัวอย่าง (แน่นอนคุณสามารถเดาได้เอง):

อินพุต: BRA CHI เอาต์พุต: BRA

อินพุต: เอาต์พุต CHI BRA: BRA

อินพุต: เอาต์พุต CHI GER: ไม่มีผลลัพธ์


ควรจะได้รับการ [ซ่อนเร้น] ที่คาดเดาเอาท์พุทแบบสุ่ม แต่มักจะให้ชนะทีมโปรดของคุณ;) (ในขณะที่: เอาท์พุทแบบสุ่มเดาต้นไม้)
ɐɔıʇǝɥʇuʎs

@ ɐɔıʇǝɥʇuʎscodegolf.stackexchange.com/questions/32092/… อันนี้คล้ายกันมาก
เดวิดแฟรงค์

4
@ ɐɔıʇǝɥʇuʎsนี่น่าสนใจกว่านี้มาก เราได้รับพื้นที่ของโปรแกรมที่เป็นไปได้ซึ่งสอดคล้องกับฟังก์ชันแฮชลงในชุดสามองค์ประกอบและเราต้องค้นหาโปรแกรมที่เล็กที่สุดซึ่งเทียบเท่ากับโปรแกรมใด ๆ ในพื้นที่นั้น
Peter Taylor

1
สามารถสันนิษฐานได้ว่าอินพุตนั้นถูกต้องหรือไม่BRA BRAและHAZ CHEEZBURGERจะต้องจัดการอย่างเหมาะสมหรือไม่?
Dennis

@Dennis ดูการแก้ไขของฉัน - อินพุตถูกต้องเสมอ
David Frank

คำตอบ:


6

Python 2.x - 368 283

ความท้าทายที่น่าสนใจ แน่นอนว่าเราจำเป็นต้องได้รับการจัดอันดับในปัจจุบันจากฟีฟ่า บราซิลมีสิ่งที่เรียกว่า "ชายคนที่ 12" เนื่องจากพวกเขามีความได้เปรียบในบ้านดังนั้นจึงมีน้ำหนัก 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'   

เคล็ดลับการย่อด้านบนยินดีต้อนรับ :-)

การปรับปรุงต้องขอบคุณ @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สามารถเขียนในหนึ่งบรรทัดโดยใช้;ตัวคั่น 3. คุณไม่ต้องการช่องว่างหลังจากคำหลักเช่นtryหรือexcept4 คุณสามารถลบช่องว่างระหว่างวงเล็บและคำหลัก ( a[k]if d[k]>d[k+1]else a[k+1]ใช้ได้) 5. for n in 16,8,4,26.def f(s):print s in m and m[s]or'no result'
seequ

@TheRare เขาไม่ใช้แต่มีข้อผิดพลาดการจัดรูปแบบเล็กน้อยด้วยj j+=1และคุณสามารถบันทึกอักขระได้จำนวนมากโดยการเข้ารหัสข้อมูล FIFA [15,6,10,11,4,0,2,14,3,5,1,8,13,12,9,7]อีกครั้ง
MrLemon

@MrLemon อ่าฉันไม่ได้ลองใช้รหัสด้วยตัวเองแค่ดูมัน
seequ

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

มันทำงานอย่างไร

อินพุตaและbถูกแฮชโดยนิพจน์*a-a[1]%16เป็นอักขระเดียว ( *aเทียบเท่ากับที่สั้นกว่าa[0]) ผลกัญชาสำหรับทีมaและถูกเก็บไว้ในb 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 จะเป็นผู้ชนะโดยรวม หากคุณไม่เห็นด้วยกับการคาดการณ์ของฉันเพียงแค่เรียงลำดับตารางใหม่

การคาดการณ์จะถูกเก็บไว้ในบล็อก Palindromic เพื่อรองรับความเป็นไปได้ของผู้ใช้ที่เข้ามาในทีมตามลำดับที่เป็นไปได้ การเรียงลำดับทำให้ทีมที่ชนะของแต่ละชุด 4 ชุดรวมกันเพื่อเล่นนัดที่สาม ดังนั้นใน GRE กลุ่มแรกที่Eแพ้ CRC และ MEX Hแพ้ NED ชุดนี้ CRC Aเล่น NED Iในไตรมาสสุดท้ายโดยไม่ต้องพิมพ์ซ้ำ สตริงจะถูกเติมเต็มด้วยช่องว่างระหว่างแต่ละกลุ่มของ 4 ทีม / 7 ตัวละครเพื่อช่วยให้แน่ใจว่าไม่มีผลลัพธ์สำหรับทีมที่จะไม่เล่นกัน

ผู้ที่ชนะในการแข่งขันแต่ละครั้งเป็นไปได้ในแต่ละกลุ่ม 8 invalid,b,a,a,b,b,a,invalidตัวอักษรจะเป็นดังนี้: ดังนั้นการเลือกที่ถูกต้องของผู้ชนะสามารถทำได้โดยการสละตำแหน่งของhในt และ 2 แต่น่าเสียดายstrstrฟังก์ชั่นไม่ได้เป็น straighforward มากที่สุดเท่าที่จะกลับชี้pดังนั้นเราจึงต้องลบpจากtการได้รับตำแหน่งที่เกิดขึ้นจริงในt.หากการแข่งขันไม่ถูกต้อง (ไม่สามารถพบได้ในt) pเป็นศูนย์และวลีที่no resultถูกพิมพ์

การปรับปรุงบางอย่างน่าสงสัย 126

บันทึก 2 ตัวอักษรโดยปรับปรุงการแสดงออกของแฮช น่าเสียดายที่สิ่งนี้ต้องใช้กรณีของทีมที่จะแสดงในโปรแกรมทดสอบด้านล่างฟังก์ชั่น (เช่นBraแทนที่จะBRAใช้ในโปรแกรมด้านบน) ฉันพอใจกับตัวเองว่าไม่มีทางที่จะทำสิ่งนี้กับโอเปอเรเตอร์เดียว ดังนั้นโอเปอเรเตอร์ 2 ตัวและค่าคงที่หนึ่งตัวอักษรนั้นดีเท่าที่จะได้รับ โปรดทราบว่าUruต้องแม็พกับspaceอักขระตัวอื่น|เพื่อแยกกลุ่มของรหัสทีม

บันทึกได้ 5 ตัวอักษรโดยการกำจัดtและรักษาสตริงการทำนายตามตัวอักษร ซึ่งหมายความว่าเป็นไปไม่ได้ที่จะทราบที่อยู่ที่เก็บสตริง อย่างไรก็ตามหากไม่ได้เก็บไว้ที่ศูนย์เราสนใจเพียง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]ด้วย*a, b` *hและ นอกจากนี้ยังมีคำถามที่บอกว่า * ถ้าให้ทั้งสองทีมจะไม่เล่นตามการคาดเดาของคุณคุณจะต้องกลับอย่างอื่น (ซึ่งสามารถเป็นอะไรก็ได้ แต่รหัสประเทศเช่นสตริงว่าง null ข้อผิดพลาด)เพื่อพิมพ์ผลไม่เป็น ไม่จำเป็นต้องใช้และคุณสามารถแทนที่ด้วยputs(...) (p=strstr(t,h))&&puts(p-t&2?a:b)
Dennis

ขอบคุณสำหรับเคล็ดลับโดยเฉพาะอย่างยิ่งa[0]->*a! จะอัปเดตในไม่ช้า เพียงแค่สงสัยว่ามีวิธีใดบ้างในการเข้าถึงอาเรย์หลายมิติด้วยหมายเลขเดียว? ฉันเขียนเวอร์ชันบรรทัดคำสั่งนี้ที่มีความยาวเท่ากัน (สามารถบันทึก 1 ไบต์ด้วย a #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. ฉันพบข้อบกพร่องเล็ก ๆ ควรจะเป็นโมฆะเป็นสิ้นสุดดังนั้นมันจะต้องมีh h[3]2. ถ้าคุณตั้งค่าp=v[1]นี้คุณสามารถเข้าถึงเป็นv[i][j] p[4*(i-1)+j]มันใช้งานได้บนเครื่องของฉัน แต่ฉันไม่รู้ว่ามันพกพาได้หรือไม่ ... 3. คุณควรจะเริ่มต้นได้hถ้าคุณประกาศภายใน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 รหัสของคุณทำงานได้ดีทั้ง GCC / cygwin และ VS / Windows บนเครื่องของฉัน นอกจากนี้ยังfor(int i=0;i<1000;i++)printf("%d %c ",i,i[*argv])สะท้อนกลับ evey ตัวอักษรพิมพ์บรรทัดคำสั่งใน VS แต่ใน GCC ชื่อโปรแกรมที่ 0, อาร์กิวเมนต์แรกคือที่ 40 และอาร์กิวเมนต์ที่สองคือไม่มีที่ไหนเลยที่จะเห็น (ผมไปถึง 1000) อยากรู้อยากเห็น อย่างไรก็ตามฉันเปลี่ยนไปใช้ฟังก์ชั่นที่อยู่ในกฎนอกเหนือจากการอัพเดทการคาดการณ์ของฉัน (ฉันรอผลคืนนี้เพื่อยืนยันพวกเขาก่อนโพสต์) ขอบคุณอีกครั้งและขอให้โชคดีกับบราซิลในวันอังคาร
เลเวลริเวอร์เซนต์

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)

วิธีการ Regex - 116

ขอบคุณɐɔıʇǝɥʇuʎsสำหรับการโพสต์ลิงค์นี้มันช่วยให้ฉันสร้าง 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
คุณสามารถลดระยะการแก้ปัญหาของคุณโดยการแปลงsplit(' ')ไปsplit``และจะjoin('') join``
Arjun

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'ฉันไม่ได้รับจากคำถามของคุณว่านี่เป็นปัญหา regex นี้ตามที่เห็นสมควร

ขอบคุณ @Ventero ฉันไม่รู้อะไรเกี่ยวกับ 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

คุณอาจต้องการในรุ่นแข็งแรงเล่นกอล์ฟไม่re.search re.matchนอกจากนี้คุณควรจะสามารถปล่อย^และ$จุดยึด
Ventero

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 ที่ค่อนข้างใหม่ฉันพบว่าท่อส่งน้ำมันนั้นยอดเยี่ยมมาก ฉันคิดว่าถัดไปอาจจะลองทำเล่น ๆ กับอาเรย์เพื่อหวังว่าจะกำจัดการเรียกซับสตริงทั้งหมด (ฉันต้องเพิ่มการโทรเมื่อสิ้นสุดมิฉะนั้นจะแสดงผลทั้งสองทีม)

สมาชิกใหม่พยายามครั้งแรกที่รหัสกอล์ฟ!

อาจกำหนดรหัสประจำตัวของรอบรองชนะเลิศ semis และรอบชิงชนะเลิศเพื่อบันทึกตัวละครไม่กี่ตัว แต่> นั่นคงไม่สนุกเท่าไหร่

ควรจะง่ายพอที่จะถอดรหัส แต่มันตอบสนองทั้งสองเงื่อนไข: ให้ผู้ชนะคนเดียวกัน> โดยไม่คำนึงถึงคำสั่งซื้อและส่งคืนผู้ชนะสำหรับการแข่งขันที่เกิดขึ้นจริง> เท่านั้น!

คำแนะนำสำหรับการปรับปรุงใด ๆ ที่จะได้รับการชื่นชมอย่างมากขอบคุณ!

เป็นต้นฉบับ

$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และลูปที่ชัดเจนที่สุดคือ overrated และไร้ประโยชน์ วิธีการเช่นนี้.Substringควรใช้ในสถานการณ์ที่รุนแรงเท่านั้น (และในขณะที่ยูทิลิตี้ฟุตบอลอาจถูกนำมาถกเถียงกัน โดยทั่วไปคุณต้องการใช้ไปป์ไลน์ให้มากที่สุด
Joey

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(unary -splitในกรณีที่ตัวคั่นเป็นช่องว่างหรือแท็บ)
Joey

1
สุดท้ายforeachห่วงสำหรับตัวอย่างเช่นสามารถเขียนเป็นท่อเช่นกัน ( ?เป็นWhere-Object): $x|?{$_-match$a-and$_-match$b}|%{$_;exit};0ซึ่งเป็นหลักว่า»กรองทุกองค์ประกอบใน$xสำหรับไม่ว่าจะตรงกับทั้งสอง$aและ$bเอาท์พุทครั้งแรกหนึ่งออกหลังจากนั้น หากไม่พบไม่พบผลลัพธ์ 0 « เมื่อคุณรู้ว่ารูปแบบของสตริงของคุณคุณสามารถใช้-match"$a$b|$b$a"ฉันเดา เพราะพวกเขาเพียงแค่ต้องปรากฏในลำดับใดก็ได้ในสตริง ซึ่งหมายความว่าเราสามารถใช้เคล็ดลับเล็กน้อยที่นี่: "$a$b","$b$a"-eq$_เพื่อเล่นกอล์ฟอีกไบต์
Joey

2

CJam, 64 58 ไบต์

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

ด้านบนใช้เครื่องหมายรูปหมวกและเครื่องหมาย M เนื่องจากรหัสมีอักขระที่ไม่สามารถพิมพ์ได้

ด้วยค่าใช้จ่ายเพิ่มเติมหกไบต์ตัวอักขระเหล่านี้สามารถหลีกเลี่ยงได้:

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 script ของคุณให้เท่ากับขนาดของโปรแกรม CJam เพื่อให้มีความยุติธรรม
David Frank

1
@DavidFrank: ฉันได้รวมสคริปต์ Bash ไว้เพื่อแสดงว่าโปรแกรมของฉันให้ผลลัพธ์เพียง 15 รายการที่เกิดขึ้นเท่านั้น มันทำงานได้ด้วยตัวเองและไม่ต้องใช้โปรแกรมภายนอก
Dennis

2

CJam, 49 48 ไบต์

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

ด้านบนใช้เครื่องหมายรูปหมวกเนื่องจากรหัสมีอักขระที่ไม่สามารถพิมพ์ได้

ด้วยค่าใช้จ่ายเพิ่มเติมสองไบต์อักขระเหล่านั้นสามารถหลีกเลี่ยงได้:

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) = 483, 483 % 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[

โปรดทราบว่าสตริงนี้สามารถรับได้จากตัวแรกโดยเลือกทุก ๆ ตัวอักษรเริ่มต้นด้วยตัวแรก ในรหัส CJam 2%นี้จะทำได้โดย

การใช้แนวคิดเดียวกันการแข่งขันรอบรองชนะเลิศและนัดสุดท้ายจะเป็นดังนี้:

(248
(4

รหัส

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

ผลักสตริงที่มีการแข่งขันของรอบที่ 16 จากนั้นทำสามต่อไปนี้: ทำซ้ำสตริงดึงทุกตัวละครที่สองของการคัดลอกเชื่อมต่อกัน ผลลัพธ์คือสตริง

(=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 เมื่อใดก็ตามที่ฉันคิดว่าคุณอาจยืมความคิดของฉันคุณคิดอะไรบางอย่างที่ดีกว่า! รหัสการทำนายของคุณมี"(=BL2*;74)#%8J[K"{_2%+}3*ความยาวเท่ากับรูปแบบ nonpalindromic ของสตริงการทำนายของฉัน"rRgL j9Ab 35ph tYKO gApK"แต่ง่ายต่อการจัดการมาก
เลเวลริเวอร์เซนต์

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.