Створіть програму здогадок на Кубку світу


13

Як відомо, груповий етап Чемпіонату світу закінчився, і вже від завтра найкращі 16 команд розпочнуть етап нокауту:

  • Бразилія (BRA)
  • Мексика (MEX)
  • Нідерланди (NED)
  • Чилі (CHI)
  • Колумбія (COL)
  • Греція (GRE)
  • Коста-Ріка (CRC)
  • Уругвай (URU)
  • Франція (FRA)
  • Швейцарія (SUI)
  • Аргентина (ARG)
  • Нігерія (NGA)
  • Німеччина (GER)
  • США (США)
  • Бельгія (БЕЛ)
  • Алжир (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 codegolf.stackexchange.com/questions/32092/… Цей дуже схожий на це
Девід Френк

4
@ ɐɔıʇǝɥʇuʎs, це набагато цікавіше. Нам надається простір можливих програм, що приблизно відповідає хеш-функціям на набір трьох елементів, і ми повинні знайти найменшу програму, еквівалентну будь-якій програмі в цьому просторі.
Пітер Тейлор

1
Може бути припустимо , що вхід буде діяти або буде BRA BRAі HAZ CHEEZBURGERповинні бути оброблені належним чином?
Денніс

@Денніс побачити мою редакцію - введення завжди дійсне
Девід Френк

Відповіді:


6

Python 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(це завжди дорівнює нулю). 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. І ви можете зберегти безліч символів [15,6,10,11,4,0,2,14,3,5,1,8,13,12,9,7], звичайно перекодувавши дані FIFA .
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-й півфіналіст стане загальним переможцем. Якщо ви не згодні з моїми прогнозами, просто переупорядкуйте таблицю.

Прогнози зберігаються у паліндромних блоках, щоб забезпечити можливість користувача входити до команд у будь-якому можливому порядку. Упорядкованість поєднує команди-переможці кожного набору по 4 разом, щоб зіграти третій матч. Таким чином, у першій групі GRE Eпрограв CRC, а MEX Hпрограв NED. Це налаштовує CRC Aдля відтворення NED Iу чвертьфіналі, не повторюючи набір тексту. Рядок забито пробілом між кожною групою з 4 команд / 7 символів, щоб упевнитись, що немає команд, які не гратимуть одна одну.

Переможець кожного можливого матчу в кожній групі з 8 символів виглядає наступним чином : invalid,b,a,a,b,b,a,invalid. Таким чином, правильний вибір переможця може бути зроблений, зайнявши позицію hв t AND 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, хоча він відмовляється компілювати на візуальну студію / 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. Крім того , питання говорить , що * якщо дані дві команди не гратимуть в відповідно до ваших припущеннями, ви повинні повернути що - то інше (це може бути що завгодно , але коди країн, наприклад , порожній рядок, порожній, повідомлення про помилку) , тому друк ніякого результату НЕ буде не потрібно , і ви могли б замінити puts(...)з (p=strstr(t,h))&&puts(p-t&2?a:b).
Денніс

Дякую за поради, особливо 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");}
Level River St

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

@Денніс ваш код відмінно працює як на GCC / cygwin, так і на VS / Windows на моїй машині. Також for(int i=0;i<1000;i++)printf("%d %c ",i,i[*argv])повторюється відповідь, що надрукується символом командного рядка на 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)

Підхід Реджекса - 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. Крім того, ви повинні мати можливість скинути ^і $якір.
Вентеро

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слід застосовувати лише в екстремальних обставинах (і хоча полезність футболу може обговорюватися, це не екстремальний вид спорту). Як правило, ви хочете максимально використовувати трубопровід.
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/&,*

У наведеному вище використані карета та повідомлення, оскільки код містить недруковані символи.

Ціною шести додаткових байтів цих символів можна уникнути:

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, щоб бути справедливим.
Девід Френк

1
@DavidFrank: Я включив сценарій Bash, щоб показати доказ того, що моя програма забезпечує вихід лише для 15 матчів, які мають місце. Він працює самостійно і не вимагає зовнішніх програм.
Денніс

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*має таку ж довжину, як непаліндромна форма моєї рядка передбачення, "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)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.