월드컵 추측 프로그램 만들기


13

아시다시피 월드컵 그룹 스테이지는 끝났으며 내일부터 최고의 16 팀이 녹아웃 스테이지를 시작할 것입니다.

  • 브라질 (BRA)
  • 멕시코 (MEX)
  • 네덜란드 (NED)
  • 칠레 (CHI)
  • 콜롬비아 (COL)
  • 그리스 (GRE)
  • 코스타리카 (CRC)
  • 우루과이 (URU)
  • 프랑스 (FRA)
  • 스위스 (SUI)
  • 아르헨티나 (ARG)
  • 나이지리아 (NGA)
  • 독일 (GER)
  • 미국 (미국)
  • 벨기에 (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ʎs codegolf.stackexchange.com/questions/32092/… 이것과 매우 유사합니다
David Frank

4
@ ɐɔıʇǝɥʇuʎs, 이것은 훨씬 더 흥미 롭습니다. 우리는 가능한 3 개의 요소 집합에 해시 함수에 해당하는 가능한 프로그램 공간을 제공받으며, 그 공간에있는 모든 프로그램과 동등한 가장 작은 프로그램을 찾아야합니다.
피터 테일러

1
입력이 유효 또는 것 것으로 가정 할 수 BRA BRAHAZ CHEEZBURGER적절하게 처리 할 수 있나요?
Dennis

@Dennis 내 편집을 참조 - 입력이 항상 유효
데이비드 프랭크

답변:


6

파이썬 2.x- 368 283

재미있는 도전. 물론 우리는 FIFA 로부터 현재 순위를 얻어야합니다 . 브라질은 소위 "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(항상 0입니다). 2. 구분자 for k를 사용하여 한 줄에 쓸 수 있습니다 ;. 3. 같은 키워드 후 공간이 필요하지 않습니다 try또는 except당신은 괄호와 키워드 (사이에 공백을 제거 할 수 있습니다 4. 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 He는을 사용 j하지만에 약간의 형식 오류가 있습니다 j+=1. [15,6,10,11,4,0,2,14,3,5,1,8,13,12,9,7]물론 FIFA 데이터를로 다시 인코딩하여 많은 문자를 저장할 수 있습니다 .
MrLemon

@ MrLemon 아, 나는 코드를 직접 시도하지 않고 그냥 보았습니다.
seequ

5

C, 182178133 (또는 126)

여기서 가장 짧은 프로그램은 아니지만 예측을 쉽게 변경할 수있는 가장 짧은 프로그램입니다. 이제 모든 준결승 진출자가 알려 졌으므로 업데이트 중입니다.

코드도 일부 변경되었습니다. 의견에 대한 Dennis의 제안과는 별도로 프로그램은 함수로 변환되었으며 (규칙을 다시 읽으면 규칙이 허용됨) 해싱이 단축되었습니다.

코드, 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]). 해시 팀에 대한 결과 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 세트의 승리 팀을 구성하여 세 번째 경기를합니다. 따라서 첫 번째 그룹에서 GRE E는 CRC에서 H손실 되고 MEX 는 NED에서 손실되었습니다. 이것은 타이핑을 반복하지 않고 쿼터 파이널에서 ANED를 플레이하도록 CRC 를 설정합니다 I. 문자열은 4 팀 / 7 자 그룹 사이에 공백으로 채워져 서로 플레이하지 않는 팀에 대한 출력이 없는지 확인합니다.

각 8 자 그룹에서 가능한 일치 항목의 승자는 다음과 같습니다 invalid,b,a,a,b,b,a,invalid.. 따라서 승자의 올바른 선택은의 위치를 고려하여 할 수 h있는 t 및 2 . 불행하게도 strstr그것은 포인터를 반환으로 기능이 가장 straighforward 아닌 p우리가 빼해야한다, 그래서 p에서 t의 실제 위치를 얻기 위해 t.경기가 (에서 찾을 수 없습니다 유효하지 않은 경우 t), p0이고 문구가 no result인쇄되어 있습니다.

모호한 개선, 126

개선 된 해시 표현식으로 2 자 절약. 불행히도 이것은 팀의 경우 함수 아래 테스트 프로그램에 표시된 것과 같아야합니다 (예 : 위의 프로그램에서 사용되는 Bra대신 BRA). 한 명의 운영자 로이 작업을 수행 할 수있는 방법이 없다는 것을 스스로 만족했습니다. 따라서 2 연산자와 단일 문자 상수가 얻는만큼 좋습니다. 또한 팀 코드 그룹을 분리하려면 대체 문자 가 Uru매핑 되어야합니다.space|

t예측 문자열을 제거 하고 리터럴로 처리하여 5자를 절약했습니다 . 이것은 문자열이 저장된 주소를 알 수 없다는 것을 의미합니다. 그러나 0으로 저장되지 않으면 p&2주소가 4로 나눌 수있는 경우에만 코드가 작동하므로 관심 이 있습니다. (포인터를 p정수로 직접 처리 할 수 ​​없으므로 다른 포인터에서 빼야합니다. 포인터를 사용 a하므로 a4로 나눌 수 있어야합니다.) 32 또는 64 비트 컴파일러 / 아키텍처 문자열에 대해 상당히 확신 할 수 있으므로이 방법으로 저장됩니다. 이것은 비주얼 스튜디오 / 창에서 컴파일을 거부하지만 GCC / cygwin에서 나에게 잘 작동했습니다.

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! 곧 업데이트됩니다. 궁금한 점은 단일 숫자로 다차원 배열에 액세스 할 수있는 방법이 있습니까? 나는 같은 길이의이 명령 행 버전을 썼다 #define. ( 와 함께 1 바이트를 절약 할 수있다.) 이것과 비슷한 경우에 이중 첨자를 피하는 것이 좋을 것이다 :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. 작은 버그를 발견했습니다. hnull로 끝나야하므로이어야 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])VS에서 명령 줄의 인쇄 가능한 문자를 다시 에코하지만 GCC에서 프로그램 이름은 0이고 첫 번째 인수는 40이며 두 번째 인수는 표시되지 않습니다 (나는 1000까지 올라갔습니다). 어쨌든, 나는 예측을 업데이트하는 것 외에도 규칙 내에있는 함수로 변경했습니다 (공지하기 전에 오늘 밤 결과를 확인하기 위해 기다리고있었습니다.) 화요일에 브라질에 대해 다시 한 번 감사드립니다.
Level River St

3

자바 스크립트 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``.
Arjun

2

파이썬 ( 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입니다. 또한, 당신은 드롭 할 수 있어야 ^하고 $앵커.
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 ( 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

비교적 새로운 PowerShell 사용자로서 파이프 라인이 정말 놀랍습니다. 다음에는 배열을 사용하여 바이올린을 사용하여 이러한 하위 문자열 호출을 모두 제거하는 것이 좋습니다. (끝에 전화를 추가해야했습니다. 그렇지 않으면 두 팀이 모두 출력했습니다)

신입 회원, 첫 번째 코드 골프 시도!

몇 개의 문자를 저장하기 위해 8 강, 준결승 및 결승을 하드 코딩했을 수 있지만 그렇게 재미 있지는 않습니다.

해독 할 수있을만큼 단순해야하지만 두 가지 조건을 모두 충족해야합니다. 입력 한 순서에 관계없이 동일한 승자에게만 제공하고 실제로 경기에 참가한 경기에 대해서만 승자를 반환합니다!

개선에 대한 조언은 대단히 감사하겠습니다!

기발한

$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은 극단적 인 상황에서만 사용해야합니다 (축구의 유용성이 논쟁의 여지가 있지만 극단적 인 스포츠는 아닙니다). 일반적으로 파이프 라인을 가능한 많이 사용하려고합니다.
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단항 을 사용하는 것이 좋습니다 -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 표기법을 사용합니다.

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 프로그램의 크기에 추가하여 공정해야합니다.
David Frank

1
@DavidFrank : Bash 스크립트를 포함시켜 내 프로그램이 15 개의 일치 항목에 대해서만 출력을 제공한다는 증거를 보여주었습니다. 자체적으로 작동하며 외부 프로그램이 필요하지 않습니다.
Dennis

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.

예를 들어의 문자 코드 ALG65 76 71입니다. 이후 (4 × 65 + 2 × 76 + 71) = 483, 483 % 91 + 12 = 4040의 문자 코드 경우 (.

이것은 다음과 같은 매핑을 제공합니다.

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

알파벳 순서로 첫 번째 팀이 항상 승리한다고 가정하면 8 강전의 경기는 다음과 같습니다.

(B2;4#8[

이 문자열은 첫 번째 문자부터 시작하여 두 번째 문자를 모두 선택하여 첫 번째 문자에서 얻을 수 있습니다. CJam 코드에서 이는에 의해 달성됩니다 2%.

같은 생각으로 준결승전과 마지막 경기는 다음과 같습니다.

(248
(4

코드

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

16의 라운드 일치 항목을 포함하는 문자열을 푸시 한 후 다음 3 번을 수행합니다. 문자열을 복제하고 사본의 두 번째 문자를 모두 추출하여 연결합니다. 결과는 문자열입니다

(=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*는 내 예측 문자열의 비 회문 형태와 길이는 같지만 "rRgL j9Ab 35ph tYKO gApK"다루기가 훨씬 쉽습니다.
레벨 리버 St

0

자바 스크립트 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.